最近在学习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中查看