OpenTelemetry .NET 中的资源

了解资源以及如何在 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 将自动检测这些资源。

以下示例通过环境变量添加了 ServiceHostOS 资源属性,运行像 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.nameteam.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.nameservice.version 的值也在代码中设置。此外,service.instance.id 获得了一个默认值。

如果您运行与 使用环境变量添加资源 中相同的命令,但这次不包含 service.nameservice.versionservice.instance.id,您将在资源列表中看到 environment.nameteam.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 规范