bin/kc.[sh|bat] start --tracing-enabled=true --features=opentelemetry
本指南介绍的是当前处于预览状态的功能。在我们继续开发此功能期间,请提供您的反馈。 |
本指南解释了如何通过利用 OpenTelemetry (OTel) 在 Keycloak 中启用和配置分布式跟踪。跟踪允许详细监控每个请求的生命周期,这有助于快速识别和诊断问题,从而实现更有效的调试和维护。
它还提供有关性能瓶颈的宝贵见解,并有助于优化系统的整体效率。Keycloak 使用受支持的 Quarkus OTel 扩展,该扩展提供了应用程序跟踪的无缝集成和公开。
可以使用构建时选项 tracing-enabled
启用公开跟踪,并按如下方式启用 opentelemetry
功能。
bin/kc.[sh|bat] start --tracing-enabled=true --features=opentelemetry
默认情况下,跟踪导出器使用 gRPC
协议和端点 http://127.0.0.1:4317
以批处理方式发送数据。
默认服务名称为 keycloak
,通过 tracing-service-name
属性指定,该属性优先于 tracing-resource-attributes
属性中定义的 service.name
。
有关可通过 tracing-resource-attributes
属性提供的资源属性的更多信息,请参见 Quarkus OpenTelemetry 资源 指南。
有关更多跟踪设置,请参见以下所有可能的配置。
为了查看捕获的 Keycloak 跟踪,可以使用利用 Jaeger 跟踪平台的基本设置。出于开发目的,可以使用 Jaeger-all-in-one 来尽可能轻松地查看跟踪。
Jaeger-all-in-one 包括 Jaeger 代理、OTel 收集器以及查询服务/UI。您不需要安装单独的收集器,因为您可以直接将跟踪数据发送到 Jaeger。 |
podman|docker run --name jaeger \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
jaegertracing/all-in-one
:16686
- Jaeger UI
:4317
- OpenTelemetry 协议 gRPC 接收器(默认)
:4318
- OpenTelemetry 协议 HTTP 接收器
您可以访问 http://127.0.0.1:16686/
上的 Jaeger UI 以查看跟踪信息。Jaeger UI 可能如下所示,其中包含任意 Keycloak 跟踪。
启用跟踪后,跟踪信息将包含在所有已启用日志处理程序的日志消息中(有关详细信息,请参见 配置日志记录)。这对于将日志事件与请求执行相关联可能很有用,这可以提供更好的可跟踪性和调试功能。来自同一请求的所有日志行在日志中将具有相同的 traceId
。
日志消息还包含 sampled
标志,该标志与下面描述的采样相关,并指示跨度是否已采样(已发送到收集器)。
日志记录的格式可能如下所示。
2024-08-05 15:27:07,144 traceId=b636ac4c665ceb901f7fdc3fc7e80154, parentId=d59cea113d0c2549, spanId=d59cea113d0c2549, sampled=true WARN [org.keycloak.events] ...
您可以通过指定其关联的 Keycloak 选项 log-<handler-name>-include-trace
在特定日志处理程序中隐藏跟踪信息,其中 <handler-name>
是日志处理程序的名称。例如,要禁用 console
日志中的跟踪信息,您可以按如下方式将其关闭。
bin/kc.[sh|bat] start --tracing-enabled=true --features=opentelemetry --log=console --log-console-include-trace=false
当您明确覆盖特定日志处理程序的日志格式时,*-include-trace 选项将不起作用,并且不包含跟踪信息。 |
采样器决定是否应丢弃或转发跟踪,通过限制发送到收集器的已收集跟踪的数量来有效地降低开销。它有助于管理资源消耗,这将有助于避免对每个请求进行跟踪的巨大存储成本以及潜在的性能损失。
对于生产就绪环境,应适当地设置采样以最大程度地减少基础设施成本。 |
Keycloak 支持几种内置的 OpenTelemetry 采样器,例如
always_on
always_off
traceidratio(默认)
parentbased_always_on
parentbased_always_off
parentbased_traceidratio
可以使用 tracing-sampler-type
属性更改使用的采样器。
Keycloak 的默认采样器是 traceidratio
,它根据通过 tracing-sampler-ratio
属性配置的指定比率控制跟踪采样的速率。
默认跟踪比率为 1.0
,这意味着所有跟踪都已采样(已发送到收集器)。该比率是 (0,1]
范围内的浮点数。例如,当比率为 0.1
时,仅采样 10% 的跟踪。
对于生产就绪环境,跟踪比率应为较小的数字,以防止跟踪存储基础设施的巨大成本并避免性能开销。 |
采样器根据当前已采样跨度比率做出自己的采样决策,而不管对父跨度的决策如何,就像使用 parentbased_traceidratio
采样器一样。
parentbased_traceidratio
采样器可能是首选的默认类型,因为它可以确保父跨度和子跨度之间的采样一致性。具体而言,如果采样了父跨度,则其所有子跨度也将被采样——所有跨度都使用相同的采样决策。这有助于将所有跨度保持在一起并防止存储不完整的跟踪。
但是,这可能会引入某些导致 DoS 攻击的安全风险。外部调用者可以操纵跟踪标头,可以注入父跨度,并且跟踪存储可能会不堪重负。需要评估适当的 HTTP 标头(尤其是 tracestate
)过滤和调用者信任的适当措施。
有关更多信息,请参见 W3C 跟踪上下文 文档。
在使用 Keycloak 运算符时启用跟踪时,有关部署的某些信息将传播到底层容器。
Keycloak CR 目前不支持跟踪配置,因此可以使用 additionalOptions 将其用于 tracing-enabled 属性和其他跟踪选项。 |
您可以根据跟踪的标签在跟踪后端中过滤出所需的跟踪。
service.name
- Keycloak 部署名称
k8s.namespace.name
- 命名空间
host.name
- Pod 名称
Keycloak 运算符会自动为其管理的 Pod 中包含的每个 Keycloak 容器设置 KC_TRACING_SERVICE_NAME
和 KC_TRACING_RESOURCE_ATTRIBUTES
环境变量。
值 | |
---|---|
仅在激活控制台日志处理程序和跟踪时可用 |
|
仅在激活文件日志处理程序和跟踪时可用 |
|
仅在激活 Syslog 处理程序和跟踪时可用 |
|
仅在启用“opentelemetry”功能和跟踪时可用 |
|
仅在启用“opentelemetry”功能时可用 |
|
仅在启用“opentelemetry”功能和跟踪时可用 |
(默认) |
仅在启用“opentelemetry”功能和跟踪时可用 |
|
仅在启用“opentelemetry”功能和跟踪时可用 |
|
仅在启用“opentelemetry”功能和跟踪时可用 |
|
仅在启用“opentelemetry”功能和跟踪时可用 |
(默认) |
仅在启用“opentelemetry”功能和跟踪时可用 |
|
仅在启用“opentelemetry”功能和跟踪时可用 |
(默认) |