OpenTelemetry .NET 中的资源
一个 资源 代表产生遥测数据的实体,并以资源属性的形式表示。例如,一个在 Kubernetes 容器中运行并产生遥测数据的进程,会拥有进程名、Pod 名、命名空间,以及可能的部署名。这四个属性都可以包含在资源中。
在您的可观测性后端,您可以使用资源信息更好地调查有趣的现象。例如,如果您的跟踪或指标数据表明系统中存在延迟,您可以将其缩小到特定的容器、Pod 或 Kubernetes 部署。
什么是资源?
在 OpenTelemetry 中,资源是产生遥测数据的实体的不可变表示。例如,一个资源可以代表一个 Kubernetes 容器、一个 Linux 或 Windows 进程,或者一个运行在进程中的应用程序。
资源是 OpenTelemetry 中的一个基本概念,用于描述遥测数据的来源。这些信息对于调试和分析遥测数据非常有价值。
资源属性
资源属性是键值对,提供有关资源的元数据。OpenTelemetry 定义了一套资源属性的 语义约定,在适用时应使用这些约定。
常见的资源属性包括
service.name:生成遥测数据的服务的名称service.version:服务的版本service.namespace:服务的命名空间service.instance.id:服务实例的唯一标识符host.name:主机的名称deployment.environment:部署环境(例如,生产、暂存)
设置
请按照 入门指南 中的说明进行操作,以便您有一个正在运行的 .NET 应用程序将数据导出到控制台。
使用环境变量添加资源
您可以使用 OTEL_RESOURCE_ATTRIBUTES 环境变量将资源注入到您的应用程序中。.NET SDK 将自动检测这些资源。
以下示例通过环境变量添加了 Service、Host 和 OS 资源属性,运行像 uname 这样的 Unix 程序来生成资源数据。
$ env OTEL_RESOURCE_ATTRIBUTES="service.name=resource-tutorial-dotnet,service.namespace=tutorial,service.version=1.0,service.instance.id=`uuidgen`,host.name=`HOSTNAME`,host.type=`uname -m`,os.name=`uname -s`,os.version=`uname -r`" dotnet run
Activity.TraceId: d1cbb7787440cc95b325835cb2ff8018
Activity.SpanId: 2ca007300fcb3068
Activity.TraceFlags: Recorded
Activity.ActivitySourceName: tutorial-dotnet
Activity.DisplayName: SayHello
Activity.Kind: Internal
Activity.StartTime: 2022-10-02T13:31:12.0175090Z
Activity.Duration: 00:00:00.0003920
Activity.Tags:
foo: 1
bar: Hello, World!
baz: [1,2,3]
Resource associated with Activity:
service.name: resource-tutorial-dotnet
service.namespace: tutorial
service.version: 1.0
service.instance.id: 93B14BAD-813D-48EE-9FB1-2ADFD07C5E78
host.name: myhost
host.type: arm64
os.name: Darwin
os.version: 21.6.0
在代码中添加资源
您也可以通过将自定义资源附加到 ResourceBuilder 来在代码中添加它们。
以下示例基于 入门指南 示例,并在代码中添加了两个自定义资源:environment.name 和 team.name。
using System.Diagnostics;
using System.Collections.Generic;
using OpenTelemetry;
using OpenTelemetry.Trace;
using OpenTelemetry.Resources;
var serviceName = "resource-tutorial-dotnet";
var serviceVersion = "1.0";
var resourceBuilder =
ResourceBuilder
.CreateDefault()
.AddService(serviceName: serviceName, serviceVersion: serviceVersion)
.AddAttributes(new Dictionary<string, object>
{
["environment.name"] = "production",
["team.name"] = "backend"
});
var sourceName = "tutorial-dotnet";
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource(sourceName)
.SetResourceBuilder(resourceBuilder)
.AddConsoleExporter()
.Build();
var MyActivitySource = new ActivitySource(sourceName);
using var activity = MyActivitySource.StartActivity("SayHello");
activity?.SetTag("foo", 1);
activity?.SetTag("bar", "Hello, World!");
activity?.SetTag("baz", new int[] { 1, 2, 3 });
在此示例中,service.name 和 service.version 的值也在代码中设置。此外,service.instance.id 获得了一个默认值。
如果您运行与 使用环境变量添加资源 中相同的命令,但这次不包含 service.name、service.version 和 service.instance.id,您将在资源列表中看到 environment.name 和 team.name 资源。
$ env OTEL_RESOURCE_ATTRIBUTES="service.namespace=tutorial,host.name=`HOSTNAME`,host.type=`uname -m`,os.name=`uname -s`,os.version=`uname -r`" dotnet run
Activity.TraceId: d1cbb7787440cc95b325835cb2ff8018
Activity.SpanId: 2ca007300fcb3068
Activity.TraceFlags: Recorded
Activity.ActivitySourceName: tutorial-dotnet
Activity.DisplayName: SayHello
Activity.Kind: Internal
Activity.StartTime: 2022-10-02T13:31:12.0175090Z
Activity.Duration: 00:00:00.0003920
Activity.Tags:
foo: 1
bar: Hello, World!
baz: [1,2,3]
Resource associated with Activity:
environment.name: production
team.name: backend
service.name: resource-tutorial-dotnet
service.namespace: tutorial
service.version: 1.0
service.instance.id: 28976A1C-BF02-43CA-BAE0-6E0564431462
host.name: pcarter
host.type: arm64
os.name: Darwin
os.version: 21.6.0
注意:如果您同时使用环境变量和代码设置资源属性,代码中的值将优先。
下一步
还有更多资源探测器可以添加到您的配置中,例如获取有关您的 Cloud 环境或 Deployment 的详细信息。
了解更多
有关 OpenTelemetry 中资源的更多信息,请参阅 资源 SDK 规范。