EKS集群中Loki无法填充Tempo内部追踪链接问题求助
一、修正Loki数据源的Derived Fields匹配规则
你当前Loki数据源配置的matcherRegex: "traceID=(\\w+)",需要和日志里实际的TraceID字段格式完全匹配:
- 如果你的应用日志里用的是
trace_id而非traceID,直接把正则改成trace_id=(\\w+) - 确认Tempo数据源的
uid确实是tempo,和Derived Fields里的datasourceUid: tempo保持一致
调整后的Loki数据源片段:
- name: Loki type: loki access: proxy orgId: 1 uid: loki url: http://loki:3100 isDefault: false editable: true jsonData: derivedFields: - datasourceName: Tempo matcherRegex: "trace_id=(\\w+)" # 匹配日志里实际的字段名 name: TraceID url: "$${__value.raw}" datasourceUid: tempo
二、修复Fluent Bit的TraceID传递配置
你的Fluent Bit配置里label_keys: $trace_id存在错误:
label_keys不需要加$前缀,直接写字段名即可- 确保应用日志里确实包含
trace_id字段,且Fluent Bit能正确解析
修改后的Fluent Bit OUTPUT配置:
[OUTPUT] Name loki Match kube.* Host "loki-svc.monitoring-loki" tenant_id "" Port "3100" label_keys trace_id auto_kubernetes_labels on
如果应用日志是JSON格式,还需要在Fluent Bit的INPUT段添加Parser: json,确保能解析出trace_id字段:
[INPUT] Name tail Path /var/log/*.log Parser json # 替换原有的docker parser Tag kube.* Refresh_Interval 5 Mem_Buf_Limit 5MB Skip_Long_Lines On
三、调整Tempo数据源的访问模式
你当前Tempo数据源用的access: browser,但通过Ingress访问Grafana时,浏览器无法直接解析集群内部的tempo:3100地址,改成access: proxy让Grafana作为代理转发请求:
- name: Tempo type: tempo access: proxy # 替换为proxy模式 orgId: 1 uid: tempo url: http://tempo:3100 isDefault: true editable: true
四、验证Tempo的Trace接收状态
检查Tempo是否确实收到了otel-collector发送的追踪数据:
kubectl logs -n <tempo命名空间> <tempo-pod名> | grep "received trace"
如果没有收到,排查otel-collector配置:
- 确认Tempo的OTLP端口是否正确:新版本Tempo的OTLP gRPC端口默认是4317,HTTP是4318,你当前用的55680是旧版本端口,需对应调整
- 升级otel-collector到较新版本(你当前用的0.29.0过于老旧,建议升级到v0.80+)
五、确认Promtail的日志收集配置(若启用)
你配置里开启了Promtail但禁用了Fluent Bit,需确保Promtail能提取TraceID:
在Promtail的scrape配置中添加relabel规则,把日志里的trace_id转为标签:
scrape_configs: - job_name: kubernetes-pods kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_container_log_file] action: keep regex: /var/log/containers/.*\.log - action: labelmap regex: ^trace_id=(.*)$ # 提取日志中的trace_id字段作为标签
六、测试正则匹配有效性
在Grafana的Loki查询页面,找到一条带TraceID的日志,复制内容后测试正则是否能命中:
比如日志内容为2024-05-20 10:00:00 INFO trace_id=abc123456789 message=test,用trace_id=(\\w+)应能匹配到abc123456789,若匹配失败则调整正则表达式适配实际日志格式。
内容的提问来源于stack exchange,提问作者Harsh Vardhan

