博客/工程

插装一个. net web API使用OpenTelemetry,节奏,Grafana云

2021年2月11日 7分钟

OpenTelemetry是CNCF项目标准化可观察性(日志、度量和痕迹)在许多语言和工具。

今天我们要看我们如何使用OpenTelemetry。net库仪器。net 5.0 web API,将痕迹节奏和日志洛基Grafana云。Grafana云现在有一个免费的计划。设置您的账户和跟随!

开始

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

mkdir应用cd应用dotnet新之前

这将创建一个文件夹与。net应用程序项目。运行该应用程序,并验证大摇大摆UI可以在http://localhost: 5000 /昂首阔步。模板包括一个API,它是GET /天气预报。这是我们将使用的API。

跟踪

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

< PackageReference包括= " OpenTelemetry.Extensions。举办“Version = " 1.0.0-rc1.1 " / > < PackageReference包括= " OpenTelemetry.Instrumentation。AspNetCore“Version = " 1.0.0-rc1.1 " / > < PackageReference包括= " OpenTelemetry.Exporter。控制台“Version = " 1.0.0-rc1.1 " / >

接下来,配置OpenTelemetry Startup.cs:

使用OpenTelemetry;使用OpenTelemetry.Resources;使用OpenTelemetry.Trace;…公共空ConfigureServices (IServiceCollection服务){服务。AddOpenTelemetryTracing ((builder) = > builder .SetResourceBuilder (ResourceBuilder.CreateDefault () .AddService(“范例应用”)).AddAspNetCoreInstrumentation () .AddConsoleExporter ());…}

这段代码所做的三个任务:

  1. 为基本的AspNet使跟踪活动,包括所有传入的http请求。
  2. 服务名称设置为“范例应用”,这是如何确定这个服务的痕迹。
  3. 添加一个控制台出口国,这将日志发送到stdout痕迹。

现在所称的/天气预报API,然后寻找以下在控制台。仪表库将创建一个跟踪每个HTTP请求和打印:

活动。Id: 00 - 024 - a2e1780a54e4baeae297523e1da85 - 4 - c65904b34efe14e - 01年活动。DisplayName:预报活动。:服务器活动。开始时间:2021 - 01 - 22 t14:08:20.3891870z活动。持续时间:00:00:00.0609742活动。TagObjects: http。主持人:localhost: 5000 http。方法:获取http。路径:/预报http。http url: http://localhost: 5000 /天气预报。user_agent: Mozilla / 5.0(麦金塔电脑;Intel Mac OS X 10 _15_7) AppleWebKit / 605.1.15 (KHTML,像壁虎)/ 14.0版Safari / 605.1.15 http。路线:预报http。status_code: 200 otel。status_code: 0资源与活动有关:telemetry.sdk.name: opentelemetry telemetry.sdk。语言:dotnet telemetry.sdk。版本:1.0.0.1 service.name:范例应用service.instance。id: 1 efffa65 - 727 f - 4 - bd7 - 825 c - 03 bb55c0e90b

发送Grafana云痕迹

打印到stdout的跟踪数据是很好的锻炼,但是现在让我们上传Grafana云痕迹,把它们在节奏!

这是通过运行Grafana代理在本地和重新配置应用程序发送的痕迹。为了保持可靠的对每个人来说,这与docker-compose介绍将运行一切,包括上面创建的. net项目。

创建一个docker-compose。yaml的父文件夹/应用以下内容。这将构建并运行. net项目/ app文件夹和主机上的相同的http://localhost: 5000。

版本:“3”服务:应用:形象:mcr.microsoft.com/dotnet/sdk:5.0命令:bash - c”dotnet恢复& & & & dotnet运行dotnet构建——url http:// +: 5000”working_dir: / app卷:- / app: / app港口:——“5000:5000”grafana-agent:形象:grafana /代理:最新的命令:“-config.file = / etc / agent-config。卷:yaml”。/ agent-config.yaml: / etc / agent-config.yaml

接下来,创建agent-config。yaml, Grafana代理的配置文件(卷上面安装)。这使得OpenTelemetryProtocol OTLP gRPC侦听器。凭证将被填满。

节奏:配置:名称:默认push_config:端点:tempo-us-central1.grafana.net: 443 basic_auth:用户名:< Grafana.com节奏用户名>密码:< Grafana.com API key >接收器:otlp:协议:grpc:

你Grafana云的凭证可以找到节奏在我的帐户页面。选择堆栈,然后发送跟踪查看你的用户名。API密钥管理的安全- >的API密钥。将这些值添加到agent-config.yaml。

最后,让我们来更新应用程序导出OTLP Grafana剂的痕迹。

  1. 添加以下两个包的项目。Grpc。核心参考这里手动设置以确保我们包括最近修为。net 5.0:
< PackageReference包括= " OpenTelemetry.Exporter。OpenTelemetryProtocol" Version="1.0.0-rc1.1" /> 
  1. 在启动。cs,添加新的出口国和直接Grafana代理:
服务。AddOpenTelemetryTracing ((builder) = > builder .SetResourceBuilder (ResourceBuilder.CreateDefault () .AddService(“范例应用”)).AddAspNetCoreInstrumentation () .AddConsoleExporter () .AddOtlpExporter(选择= > {opt.Endpoint =“grafana-agent: 55680”;}));

运行所有docker-compose再次调用/天气预报的API。因为我们还有控制台出口国,我们可以使用输出跟踪ID和把它在Grafana云。

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

app_1 |活动。Id: 00-a9164cf669d52a4eb6a689f8a5db8370-34d824b7bcde6546-01 app_1 |活动。DisplayName:天气预报app_1 |活动。:服务器app_1 |活动。开始时间:2021 - 01 - 22 t15:44:09.8240910z app_1 |活动。持续时间:00:00:00.1302539

登录你的Grafana云堆栈( .grafana.net),去探索。选择节奏数据源和粘贴跟踪ID。现在我们正在查看的痕迹在节奏!

发送日志Grafana云

接下来让我们发送应用程序日志Grafana云使用洛基日志司机和更新应用程序的日志输出让我们迅速从日志来跟踪。

注意:洛基驱动程序是非常有用的对于当地的码头工人工作负载和特定的体系结构。然而,对于Kubernetes生产工作负载,推荐使用Promtail

安装日志司机通过运行:

码头工人插件安装最新grafana / loki-docker-driver:——别名洛基——grant-all-permissions

更新docker-compose。yaml文件使用洛基司机,并添加你的洛基用户名,从Grafana云API密匙和URL。你的洛基用户名和URL类似节奏进入我的账户,选择堆栈,然后点击发送日志(见截图)。

应用:图像:mcr.microsoft.com/dotnet/sdk:5.0命令:bash - c”dotnet恢复& & & & dotnet运行dotnet构建——url http:// +: 5000”working_dir: / app卷:- / app: / app港口:——“5000:5000”日志:司机:洛基选项:loki-url: https:// <用户名>:< api key > @logs-prod-us-central1.grafana.net/api/prom/push

现在我们可以为我们的应用程序在云Grafana查看日志 .grafana.net - >探索。使用以下LogQL查询来找到我们的应用程序的日志消息:

{compose_service = "应用"}

连接日志和跟踪

还好,现在我们都跟踪和日志被送到Grafana云,让我们使用洛基的连接它们导出字段功能。

首先,让我们更新我们的应用程序的日志输出到日志跟踪标识的格式“traceID =…”

  1. 在启动。cs,删除控制台出口国,我们不再需要它。
  2. 在WeatherForecastController。cs、更新的API处理程序打印跟踪ID。示踪剂。CurentSpan静态属性,永远进步的跨度。
使用OpenTelemetry.Trace;…(HttpGet)公共IEnumerable <预报> Get(){控制台。WriteLine($“天气预报traceID = {Tracer.CurrentSpan.Context.TraceId.ToHexString ()} ");…

日志输出将看起来像下面的:

获取天气预报traceID = b0ed5093e99b514b912dbd213436b518

接下来,创建的洛基导出字段Grafana云。这个导出字段是如何把“traceID =…”日志部分变成一个可点击的链接可以查看日志和跟踪。看到上面的博客链接,但也在这里重复清晰的步骤:

  1. 配置您的洛基数据源通过浏览 .grafana.net,设置- >数据来源。

  2. 对配置页面的底部添加一个新的导出字段有以下属性:

    名称:traceID

    Regex: traceID = (\ w +)

    c。查询:$ {__value.raw}

    d。内部链接:是的,指向您的节奏数据源。这是相同的数据源从上面当浏览痕迹。

最后,让我们再来看看我们的日志。扩大的一个日志行,现在我们有一个可点击的链接跳转从日志来跟踪和把它们并排!

结束

这里我们看到了一个快速介绍如何从. net web API发送日志和跟踪使用新的OpenTelementry Grafana云。net库和Grafana代理。所有示例代码和文件中可以找到这里的库。这个介绍使用。net 5.0,但可以很容易地用于。net 3.1。

了解更多关于节奏,看“开始使用跟踪和Grafana节奏”研讨会在需求。

Grafana云是最简单的方法开始观察指标、日志、痕迹,仪表板,和我们吗刚刚宣布新的免费和付费Grafana云计划适合每个用例-现在免费注册!