博客/工程

使用OpenTelemetry, Tempo和Grafana Cloud测试一个。net web API

2021年2月11日7分钟

OpenTelemetry是一个CNCF项目,它标准化了跨多种语言和工具的可观察性(日志、度量和跟踪)。

今天我们来看看如何使用OpenTelemetry .NET库工具。net 5.0 web API,卸载跟踪到节奏并记录到洛基Grafana云.Grafana云现在有一个免费的计划.建立您的帐户,并遵循!

开始

首先让我们使用内置模板和dotnet命令创建一个web API项目。如果你有一个现有的项目,这是没有问题的。这里使用的代码示例和库与. net 3.1和5.0兼容。

Mkdir app CD app dotnet新的webapi

这将创建一个包含. net项目的子文件夹应用程序。运行应用程序并验证Swagger UI在http://localhost:5000/swagger上可用。该模板包含一个API,即GET /WeatherForecast。这是我们将要使用的API。

跟踪

现在我们有了web API,让我们开始使用OpenTelemetry nuget包跟踪HTTP请求。这些版本是撰写本文时的最新版本。

< PackageReference包括= " OpenTelemetry.Extensions。Hosting" Version="1.0.0-rc1.1" />  

接下来,在Startup.cs中配置OpenTelemetry:

使用OpenTelemetry;使用OpenTelemetry.Resources;使用OpenTelemetry.Trace;…public void ConfigureServices(IServiceCollection services){服务。AddOpenTelemetryTracing((builder) => builder .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("example-app")) . addaspnetcorestrumentation (). addconsoleexport ());...}

这段代码执行三个任务:

  1. 允许跟踪基本的AspNet活动,包括所有传入的http请求。
  2. 将服务名称设置为“example-app”,这是在跟踪中标识此服务的方式。
  3. 添加控制台导出器,该导出器将跟踪记录到标准输出。

现在调用/WeatherForecast API并在控制台中查找以下内容。检测库将为每个HTTP请求创建跟踪并打印它:

活动。Id: 00-024a2e1780a54e4baeae297523e1da85-4c65904b34efe14e-01活动。DisplayName:天气预报活动。类型:服务器活动。开始时间:2021-01-22T14:08:20.3891870Z活动。持续时间:00:00:00.0609742活动。TagObjects: http。主机:localhost:5000 http。方法:GET http。路径:/天气预报。url: http://localhost:5000/WeatherForecast http。user_agent: Mozilla/5.0 (Macintosh;Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML,如Gecko) Version/14.0 Safari/605.1.15 http。路由:天气预报http。Status_code: 200 otel。status_code: 0与Activity关联的资源:telemetry.sdk.name: opentelemetry telemetry.sdk.language: dotnet telemetry.sdk.version: 1.0.0.1 service.name: example-app service.instance.id: 1efffa65-727f-4bd7-825c-03bb55c0e90b

向Grafana Cloud发送跟踪

将跟踪数据打印到stdout是很好的练习,但现在让我们将跟踪上传到Grafana Cloud并在Tempo中查看它们!

可以通过运行Grafana代理并重新配置应用程序以将跟踪发送给它。为了让每个人都能可靠地使用docker-compose,本演练将使用docker-compose运行所有内容,包括上面创建的. net项目。

创建一个docker-compose。在/app的父文件夹中添加Yaml,并添加以下内容。这将在/app文件夹中构建和运行. net项目,并将其托管在相同的http://localhost:5000上。

版本:"3"服务:app: image: McR.microsoft.com/dotnet/sdk:5.0命令:bash -c "dotnet恢复&& dotnet构建&& dotnet运行——url http://+:5000" working_dir: /app volumes: - ./app:/app ports: - "5000:5000" grafana-agent: image: grafana/agent:最新命令:"-config.file=/etc/agent-config. txt "- ./agent-config.yaml:/etc/agent-config.yaml

接下来,创建代理配置。yaml,它是Grafana Agent的配置文件(上面挂载的卷)。这将启用OpenTelemetryProtocol (OTLP) gRPC侦听器。接下来将填写凭证。

tempo: configs: - name: default push_config: endpoint: tempo-us-central1.grafana.net:443 basic_auth: username: 密码: receivers: otlp: protocols: grpc:

Tempo的Grafana Cloud凭据可以在我的帐户页面下找到。选择堆栈,然后Send Traces以查看您的用户名。API密钥在Security -> API密钥部分下进行管理。将这些值添加到agent-config.yaml。

最后,让我们更新应用程序,将跟踪导出到OTLP中的Grafana Agent。

  1. 将以下两个包添加到项目中。Grpc。这里手动设置了Core reference,以确保我们包含一个.NET 5.0的最新修复
< PackageReference包括= " OpenTelemetry.Exporter。OpenTelemetryProtocol" Version="1.0.0-rc1.1" /> 
  1. 在Startup.cs中,添加新的导出器并将其定向到Grafana代理:
服务。AddOpenTelemetryTracing((builder) => builder .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("example-app")) . addaspnetcorestrumentation (). addconsoleexport (). addotlpexport (opt => {opt. endpoint = " grafna -agent:55680";}));

使用docker-compose up运行所有内容,并再次调用/WeatherForecast API。因为我们仍然有控制台导出器,所以我们可以使用输出来获得跟踪ID,并在Grafana Cloud中查看它。

寻找Activity.Id。第二段是跟踪ID。

app_1 |活动。Id: 00-a9164cf669d52a4eb6a689f8a5db8370-34d824b7bcde6546-01 app_1 |活动。DisplayName:天气预报app_1 |活动。Kind: Server app_1 | Activity。StartTime: 2021-01-22 t15: 44:9 . 8240910z app_1 |活动。持续时间:00:00:00.1302539

登录到您的Grafana云堆栈( .grafana.net)然后去探索。选择Tempo数据源并粘贴跟踪ID。现在我们正在Tempo中查看轨迹!

向Grafana Cloud发送日志

接下来,让我们将应用程序日志发送到Grafana Cloud洛基日志驱动器并更新应用程序的日志输出,以便快速地从日志跳转到跟踪。

注意:Loki驱动程序对于本地Docker工作负载和某些架构非常有用。但是,对于Kubernetes中的生产工作负载,建议使用它Promtail

执行以下命令安装日志驱动:

Docker插件安装grafana/ Loki - Docker -driver:latest——alias Loki——grant-all-permissions

更新docker-compose。yaml文件使用Loki驱动程序,并添加您的Loki用户名,API密钥和来自Grafana Cloud的URL。你的Loki用户名和URL被查看类似于Tempo,进入我的账户,选择堆栈,然后点击发送日志(见上面的截图)。

App: image: McR.microsoft.com/dotnet/sdk:5.0 command: bash -c "dotnet restore && dotnet build && dotnet run——urls http://+:5000" working_dir: / App volumes: - ./ App:/ App ports: - "5000:5000" logging: driver: Loki options: Loki -url: https://:@logs-prod-us-central1.grafana.net/api/prom/push

现在我们可以在Grafana Cloud中查看应用程序的日志 探索。使用下面的LogQL查询来查找应用程序的日志消息:

{compose_service = "应用"}

连接日志和跟踪

好了,现在我们已经把痕迹和日志都发送到格拉夫纳云了,让我们用洛基的连接起来导出字段功能。

首先,让我们更新应用程序的日志输出,以“traceID=…”格式记录跟踪ID。

  1. 在Startup.cs中,删除控制台导出器,因为我们不再需要它。
  2. 在WeatherForecastController.cs中,更新API处理程序以打印跟踪ID。示踪剂。CurentSpan是一个静态属性,它总是指向正在进行的span。
使用OpenTelemetry.Trace;...[HttpGet] public IEnumerable Get(){控制台。WriteLine($"获取天气预报traceID={trace . currentspan . context . traceID . tohexstring ()}");...

日志输出如下所示:

获取天气预报traceID=b0ed5093e99b514b912dbd213436b518

接下来,在Grafana Cloud中创建Loki衍生字段。通过这个派生字段,我们可以将“traceID=…”日志部分转换为可单击的链接,以并排查看日志和跟踪。参见上面的博客文章链接,但为了清晰起见,这里也重复了步骤:

  1. 通过浏览到配置Loki数据源 .grafana.net,设置->数据源。

  2. 在配置页面的底部,添加一个具有以下属性的新派生字段:

    a.名称:traceID

    b. Regex: traceID=(\w+)

    c.查询:${__value.raw}

    d.内部链接:是的,并指向Tempo数据源。在查看跟踪时,这与上面相同的数据源。

最后,让我们再看看日志。展开其中一条日志行,现在我们有了一个可单击的链接,可以快速地从日志跳转到跟踪,并并排查看它们!

结束

在这里,我们已经看到了如何使用新的OpenTelementry . net库和Grafana代理从。net web API发送日志和跟踪到Grafana Cloud的快速演示。所有示例代码和文件都可以在这里是存储库.本演练使用。net 5.0,但可以很容易地适应。net 3.1。

要了解更多关于Tempo的信息,请观看“开始追踪和Grafana Tempo”网络研讨会在需求。

Grafana云开始观察指标、日志、跟踪和仪表板是最简单的方法吗刚刚发布了新的免费和付费的Grafana Cloud计划以适应每个用例-现在免费注册