后端与接口
用 Grafana Tempo +…
有 Docker/Kubernetes、对象存储桶、OTLP/Jaeger/Zipkin 数据源和 Grafana Tempo datasource 时,用 Tempo 低成本存储分布式 trace,并用 TraceQL 查慢请求、错误链路、服务图和多租户数据。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Grafana Tempo + 对象特定
解决思路
- 本地快速启动:`git clone https://github.com/grafana/tempo.git`,`cd tempo/example/docker-compose/local`,`mkdir -p tempo-data`,`docker compose up -d`。
- 验证 Tempo 就绪:`curl -sf http://localhost:3200/ready`,期望返回 `ready`。
- 发送合成 OTLP span 验证写入:`curl -X POST -H 'Content-Type: application/json' http://localhost:4318/v1/traces -d '{...}'`,payload 中设置 `resource.service.name`、`traceId`、`spanId`、`name`、`startTimeUnixNano`、`endTimeUnixNano`、`kind` 等字段。
- 验证 trace 已落地:`curl -s http://localhost:3200/metrics | grep tempo_distributor_spans_received_total | head`,再 `curl -s http://localhost:3200/api/v2/traces/5B8EFFF798038103D269B633813FC700 | jq '.batches | length'`,期望大于 0。
- 在 Grafana → Explore → Tempo 运行 TraceQL:`{resource.service.name="my-service"}` 验证查询。
- 用 Alloy 从应用转发 traces:配置 `otelcol.receiver.otlp "default"`,gRPC endpoint `0.0.0.0:4317`,HTTP endpoint `0.0.0.0:4318`,输出到 `otelcol.exporter.otlp.tempo.input`。
- 配置 Alloy 的 Tempo exporter:`otelcol.exporter.otlp "tempo"` 客户端 endpoint `tempo:4317`,`tls { insecure = true }`。
- 验证 Alloy 转发:`curl -s http://localhost:12345/metrics | grep otelcol_exporter_sent_spans`,再到 Grafana Explore Tempo 检查。
- 编写 TraceQL 查慢请求:`{ resource.service.name = "frontend" && duration > 1s }`。
- 编写 TraceQL 查有下游错误的 server span:`{ kind = server } >> { status = error }`。
- 编写 TraceQL 指标查每服务错误率:`{ status = error } | rate() by (resource.service.name)`。
- 查阅 `references/traceql.md` 获取完整操作符、scope 速查表、intrinsics 列表和 metric functions。
- 通过 API 运行 TraceQL:`curl -sG --data-urlencode 'q={resource.service.name="frontend" && duration > 1s}' --data-urlencode "start=$(date -d '1h ago' +%s)" --data-urlencode "end=$(date +%s)" http://localhost:3200/api/search | jq '.traces | length'`。
- Kubernetes 部署:`helm repo add grafana https://grafana.github.io/helm-charts`。
- 安装 `tempo-distributed`:`helm install tempo grafana/tempo-distributed --version 1.61.3 --set storage.trace.backend=s3 --set storage.trace.s3.bucket=my-tempo-bucket --set storage.trace.s3.region=us-east-1`。
- 验证 K8s pod Ready:`kubectl get pods -n default -l app.kubernetes.io/instance=tempo`,检查 distributor、ingester、querier、query-frontend、compactor。
- 验证 K8s 查询前端:`kubectl port-forward svc/tempo-query-frontend 3200:3200 &`,`curl -sf http://localhost:3200/ready`。
- 开启多租户:配置 `multitenancy_enabled: true`。
- 多租户请求必须带 header:`X-Scope-OrgID: <tenant-id>`。
- 需要完整架构、端口、性能调优、metrics-generator 配置、多租户客户端片段、traces-to-logs/metrics/profiles datasource links 时,查阅 `references/architecture-and-operations.md`。
- 排查 `/ready` 返回 503:ingester 仍在加入;检查 `tempo_ingester_*` metrics 和日志。
- 排查 push 返回 429:提高 `max_outstanding_per_tenant` 或每租户 ingest limits。
- 排查 Explore 无 traces:确认写入方和 Grafana datasource 的 `X-Scope-OrgID` 一致。
- 排查 TraceQL 慢:缩小 `start`/`end`,增加 `service.name` 过滤,为热属性启用专用 Parquet columns。
- 参考 Tempo 文档:https://grafana.com/docs/tempo/latest/ 和 TraceQL 文档:https://grafana.com/docs/tempo/latest/traceql/。
- 按 Tempo 架构配置写入路径:接收 OTLP / Jaeger / Zipkin / OpenCensus / Kafka,经 distributor → live-store → block-builder → object-storage,将 Parquet blocks 存入 S3/GCS/Azure。
- 需要 metrics-generator 时,启用其 RED spanmetrics 和 service graphs 配置(细节见 `references/architecture-and-operations.md`)。
- 需要 trace ↔ log ↔ metric ↔ profile 关联时,配置 traces-to-logs / metrics / profiles datasource links(细节见 `references/architecture-and-operations.md`)。
- TraceQL 支持 span / resource / event scopes,结构化操作符 `>>`、`<<`,指标函数 `rate()`、`quantile_over_time`;按 `references/traceql.md` 使用。
适用边界 · 注意事项
- 没有对象存储 bucket(S3/GCS/Azure)且要部署 Tempo 分布式/生产模式时,不适用。
- 没有 Grafana 或无法配置 Tempo datasource,只想用其他追踪 UI 查询时,本技能的 Explore/TraceQL 工作流不适用。
- 不需要分布式追踪、TraceQL 或 trace 关联日志/指标/Profile,仅做普通日志/指标监控时,不适用。