OpenTelemetry尾部采样

最近在学习OpenTelemetry、Jaeger,为微服务集群提供可观测能力,方便性能监控、预警和线上bug排查。

是否需要采样

对于生成的trace,如果大多数请求都成功了,并且以一个能够接受的时延完成,那么我们就不需要 100% 的trace来观察应用程序和系统。我们只需要收集部分能够代表总体的trace即可,在实现有效观测的前提下,来降低采集和存储成本。官方文档:OpenTelemetry-Sampling

采样方式

OpenTelemetry提供的采样方式有两种:

  • 头部采样

  • 尾部采样

有很多供应商也实现了比较有特色的采样方式,比如Jaeger的自适应采样。

头部采样用于尽早地做出采样决策,采样或丢弃某个跨度或迹线的决策不是通过检查整个迹线来做出的,而是通过概率、速率的方式进行采样。这种采样方式配置简单,缺少灵活性,不能满足复杂的采样需求。比如:不能够对采集到状态为errr的trace,不能够通过对trace的时延大小进行采样。头部采样通过OpenTelemetry-SDK配置即可,Python这部分的内容有些不完整直接看对应的包即可。

尾部采样通过考虑trace内的所有或大部分span来决定对trace进行采样。尾部采样可让您选择根据从trace的不同部分得出的特定标准对trace进行采样,而头部采样则不提供此选项。比如:针对发生错误的trace进行采样、针对高时延的trace采样。尾部采样需要在Collector收集器中进行配置,应用将所有的trace上传到Collector,然后有Collector来决定是否对trace进行采样,如果采样的话,就写入存储后端中,不采样的话,就丢弃。尾部采样规则

操作步骤

1.启动Collector 

Collector收集器,我们可以使用Opentelemetry-Collector也可以使用Jaeger-Collector,两者的配置文件兼容,不同的是OpenTelemetry收集器能够traces、logs、metrics类型的数据,而Jeager-Collector只能够收集traces类型的数据,并提供UI查询界面。如果你导出的数据有logs、metrics类型的数据,请使用Opentelemetry-Collector。由于我仅仅导出traces类型的数据,并需要可视化展示,所以选择使用Jaeger-Collector。

# 规则一:对所有traces的10%进行采样。
# 规则二:对traces中的span属性total_duration > 5.5S的进行采样。total_duration表示用户说话结束到agnt回复的总时长。
# 规则一和规则二相互独立,互不影响。通过这两种规则既保证了对高耗时的监控,也采集了部分正常耗时。
# 注意对decision_wait: 100s的配置,如果我们第一个span产生的时间比较长,把wait时间相应配置长一点。
service:
  extensions: [jaeger_storage, jaeger_query, healthcheckv2]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [tail_sampling]
      exporters: [jaeger_storage_exporter]
  telemetry:
    resource:
      service.name: jaeger
    metrics:
      level: detailed
      readers:
        - pull:
            exporter:
              prometheus:
                host: 0.0.0.0
                port: 8888
    logs:
      level: debug
    # TODO Initialize telemetry tracer once OTEL released new feature.
    # https://github.com/open-telemetry/opentelemetry-collector/issues/10663

extensions:
  healthcheckv2:
    use_v2: true
    http:
  jaeger_query:
    storage:
      traces: some_storage
  jaeger_storage:
    backends:
      some_storage:
        memory:
          max_traces: 100000

receivers:
  otlp:
    protocols:
      grpc:
      http:
        endpoint: "0.0.0.0:4318"

processors:
  tail_sampling:
    decision_wait: 100s
    policies: [
      {
            name: test-policy-1,
            type: probabilistic,
            probabilistic: {sampling_percentage: 50}
      },
      {
        name: test-policy-2,
              type: ottl_condition,
              ottl_condition: {
                   error_mode: ignore,
                   span: [
                        "attributes[\"total_duration\"] > 5.5 ",
                   ]
              }
      }
      ]

exporters:
  jaeger_storage_exporter:
    trace_storage: some_storage
docker run --rm --name jaeger \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 5778:5778 \
  -p 9411:9411 \
  -v /path/to/local/config.yaml:/jaeger/config.yaml \
  jaegertracing/jaeger:2.3.0 \
  --config /jaeger/config.yaml

2.启动被检测的程序

3.观察Collector上的日志

在应用处理请求的过程中,如果产生了trace,会发送到我们的Collector上,并由收集器进行相关决策。

4.Jaeger-UI中查看

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值