当你在你的代码中完成了插桩相关的任务后,你肯定希望将采集到的遥测数据导出到某些后端服务从而能够进行管理和实现。在本文中,我们将会针对上述内容来展开说明。

采样

采样是指一个系统为了有效控制存储的 traces 数量而提供的一种机制。具体选择什么样的采样机制与你的业务需求息息相关。不过,你通常需要提前确定好采样策略,同时将对应的采样策略决定传播到其他的服务。

采样策略的设置需要在 TracerProvider 中进行设置,示例如下:

  1. provider := sdktrace.NewTracerProvider(
  2. sdktrace.WithSampler(sdktrace.AlwaysSample()),
  3. )

AlwaysSample 和 NeverSample 是很容易理解的。AlwaysSample 表示针对每个 trace 数据都进行采样;NeverSample 正好与之相反。例如,在开发环境中,建议你可以设置为 AlwaysSample。
其他的一些常用的采样策略包括:

  • TraceIDRatioBased:按指定的比例进行采样,例如如果设置为 0.5,则针对 50% 的 Trace 数据进行采样。
  • ParentBased:根据传入的 span 配置来判断是否进行采样,如果传入的父 span 已经采样,则它也采样,反之则也不采样。

在生产环境中,您应该考虑将 TraceIDRatioBased 采样器与 ParentBased 采样器组合使用。

资源标识

资源标识是一类特殊的属性,资源标识在一个进程中所有的 span 中是一致的。因此,资源标识可以用于一些关于进程相关的描述,例如机器名称、实例 ID 等等。
资源标识应该在 TracerProvider 创建的时候进行配置,使用方式与属性类似:

  1. resources := resource.NewWithAttributes(
  2. semconv.SchemaURL,
  3. semconv.ServiceNameKey.String("myService"),
  4. semconv.ServiceVersionKey.String("1.0.0"),
  5. semconv.ServiceInstanceIDKey.String("abcdef12345"),
  6. )
  7. provider := sdktrace.NewTracerProvider(
  8. ...
  9. sdktrace.WithResource(resources),
  10. )

可以看到我们使用了 semconv 包,这个包中提供了 opentelemetry 语义规范中的一些名称,符合这些语义规范可以是的所有产生的 span 数据可以安装统一的规范进行处理和理解。
Resources 也可以通过 resource.Detector 来自动检测。这些 Detector 可以自动获取当前的进程信息、操作系统、云服务商提供的实例信息等等,使用方式如下:

  1. resources := resource.New(context.Background(),
  2. // Builtin detectors provide default values and support
  3. // OTEL_RESOURCE_ATTRIBUTES and OTEL_SERVICE_NAME environment variables
  4. resource.WithBuiltinDetectors(),
  5. resource.WithProcess(), // This option configures a set of Detectors that discover process information
  6. resource.WithDetectors(thirdparty.Detector{}), // Bring your own external Detector implementation
  7. resource.WithAttributes(attribute.String("foo", "bar")), // Or specify resource attributes directly
  8. )

OTLP Exportor

OTLP 是 opentelemetry 中官方支持的数据格式,可以将数据导出到 Collector Proxy 中进行处理。
关于 OTLP 相关的依赖库,可以使用:

  1. go get go.opentelemetry.io/otel/exporters/otlp/otlptrace
  2. go get go.opentelemetry.io/otel/exporters/otlp/otlpmetrics

Jaeger Exporter

Jaeger Export 可以将数据直接导出给 Jaeger 服务,其依赖的安装方式如下:

  1. go get go.opentelemetry.io/otel/exporters/jaeger

Prometheus Exporter

Prometheus Exporter 的依赖安装方式如下:

  1. go get go.opentelemetry.io/otel/exporters/prometheus