路由跟踪
从路由收集跟踪信息
的GraphOS 路由器以及Apollo 路由核心支持收集拥有OpenTelemetry,包含以下导出器
- Jaeger
- Zipkin
- Datadog
- New Relic
- OpenTelemetry 协议 (OTLP)通过 HTTP 或 gRPC
该路由器生成跨度,包含处理请求和关联依赖的各个阶段。这有助于显示响应时间如何受到以下因素的影响:
- 子请求响应时间
- 查询形状(子请求依赖关系)
- 路由器后处理
跨度数据发送到诸如Jaeger等收集器,可以将跨度组合成甘特图进行分析。
💡 提示
为了充分利用分布式跟踪,所有系统组件都应该进行仪表化。
跟踪常见配置
跟踪的常见配置包含所有导出器的全局设置。
服务名称
为您的router跟踪设置一个服务名称,以便您可以在外部指标仪表板上轻松定位它们。
服务名称可以通过环境变量或以下顺序设置:
OTEL_SERVICE_NAME
环境变量OTEL_RESOURCE_ATTRIBUTES
环境变量telemetry.exporters.tracing.common.service_name
在router.yaml
telemetry.exporters.tracing.common.resource
在router.yaml
中:
如果服务名称未显式设置,默认为 unknown_service:router
或 unknown_service
(如果无法确定可执行程序的名称)。
资源
资源属性是提供额外信息给导出器的一组键值对。应用性能监控器(APM)可能会解析和显示资源信息。
在 router.yaml
中,资源属性在 telemetry.exporters.tracing.common.resource
中设置。例如:
telemetry:exporters:tracing:common:resource:"environment.name": "production""environment.namespace": "{env.MY_K8_NAMESPACE_ENV_VARIABLE}"
有关 OpenTelemetry 的资源约定,请参阅 资源语义约定。
采样率
您可以为跟踪配置采样率以匹配应用程序性能监控器(APM)的速率。要启用采样配置,在 router.yaml
中设置 telemetry.exporters.tracing.common.sampler
和 telemetry.exporters.tracing.common.parent_based_sampler
:
telemetry:exporters:tracing:common:sampler: always_on # (default) all requests are sampled (always_on|always_off|<0.0-1.0>)parent_based_sampler: true # (default) If an incoming span has OpenTelemetry headers then the request will always be sampled.
sampler
设置采样率作为小数百分比,always_on
,或always_off
。例如,设置sampler: 0.1
采样 10% 的请求。parent_based_sampler
启用客户端进行采样决策。这确保了从客户端开始的跟踪也将具有在 router 上的跨度。如果您直接将 router 暴露给互联网,则可能需要禁用它(设置parent_based_sampler: false
)。
传播
telemetry.exporters.tracing.propagation 部分允许您配置除了使用导出器自动激活的传播器之外,还激活哪些传播器。
通常情况下,仅当您使用支持多种跟踪ID格式的导出器时,才需要指定显式的传播,例如OpenTelemetry Collector、Jaeger或OpenTracing兼容的导出器。
例如
telemetry:exporters:tracing:propagation:# https://www.w3.org/TR/baggage/baggage: false# https://www.datadoghq.com/datadog: false# https://jaeger.golang.ac.cn/ (compliant with opentracing)jaeger: false# https://www.w3.org/TR/trace-context/trace_context: false# https://zipkin.io/ (compliant with opentracing)zipkin: false# https://aws.amazon.com/xray/ (compliant with opentracing)aws_xray: false# If you have your own way to generate a trace id and you want to pass it via a custom request headerrequest:header_name: my-trace-id
限制
您可以对跟踪设置限制,以防止向您的APM发送过多的数据。例如
telemetry:exporters:tracing:common:max_attributes_per_event: 128max_attributes_per_link: 128max_attributes_per_span: 128max_events_per_span: 128max_links_per_span: 128
超过限制的属性、事件和链接将被静默丢弃。
max_attributes_per_event
事件用来描述在跟踪上下文中发生的某个事物。例如,一个异常或发送的消息。这些事件可以具有作为键值对的属性,提供通过APM显示的附加信息。
max_attributes_per_link
跟踪可能链接到相同或不同跟踪中的其他跟踪。例如,一个跟踪可能链接到一个父跟踪,或者一个跟踪可能链接到另一个跟踪中的跟踪,以表示该跟踪的父跟踪。这些链接可以具有作为键值对的属性,提供通过APM显示的附加信息。
max_attributes_per_span
跟踪用于在跟踪上下文中描述活动。例如,对一个子图或一个查询计划的请求。跟踪可以具有键值对形式的属性,提供通过APM显示的附加信息。
max_events_per_span
跟踪可以具有描述跟踪上下文中发生的事物的事件。例如,一个异常或发送的消息。每个跟踪的事件数量可以受到限制,以防止跟踪变得非常大。
max_links_per_span
跟踪可以链接到相同或不同跟踪中的其他跟踪。例如,一个跟踪可能链接到一个父跟踪,或者一个跟踪可能链接到另一个跟踪中的跟踪,以表示该跟踪的父跟踪。每个跟踪的链接数量可以受到限制,以防止跟踪变得非常大。
experimental_response_trace_id
此功能是 实验性的。您的疑问和反馈备受珍视—不要犹豫,联系您的Apollo联系人. 您还可以在GitHub上的讨论上发表反馈。
如果您想在响应头中公开生成的跟踪ID或您使用传播头提供的跟踪ID,则可以使用此配置
telemetry:exporters:tracing:experimental_response_trace_id:enabled: true # default: falseheader_name: "my-trace-id" # default: "apollo-trace-id"
使用此配置,您将拥有一个名为my-trace-id
的响应头,其中包含跟踪ID。如果您想使用此跟踪ID来grep日志以获得更多上下文,这可能有助于您调试特定的查询。
experimental_response_trace_id
参考
属性 | 默认值 | 描述 |
---|---|---|
enabled | false | 设置为true以返回响应头上方的跟踪ID。 |
header_name | apollo-trace-id | 响应头的名称。 |
跟踪通用参考
属性 | 默认值 | 描述 |
---|---|---|
service_name | unknown_service:router | OpenTelemetry服务名称。 |
service_namespace | The OpenTelemetry namespace. | |
资源 | The OpenTelemetry resource to attach to traces. | |
experimental_response_trace_id | 在响应头中返回追踪ID。 | |
max_attributes_per_event | 128 | 每个事件的最大属性数量。 |
max_attributes_per_link | 128 | 每个链接的最大属性数量。 |
max_attributes_per_span | 128 | 每个Span的最大属性数量。 |
max_events_per_span | 128 | 每个Span的最大事件数量。 |
max_links_per_span | 128 | 每个Span的最大链接数量。 |