Skip to content
Back to skills

Distributed Tracing

ASecurity

当需要排查微服务链路延迟/依赖/错误传播时使用;用 OpenTelemetry 埋点并部署 Jaeger/Tempo 输出可查询的链路与服务依赖图;不适用于单体无跨服务调用或仅需指标/日志的场景;触发词:分布式追踪、链路、Jaeger、Tempo、OpenTelemetry、span、trace

  • 3 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
ai-agentsjavascriptpythongojavabashnodeexpressflaskdockerkubernetes

Works with

  • cursor
  • cli
  • api

Security analysis

A100/100

Scanned September 19, 2026

npx -y skills add findscripter/everything-skills --skill distributed-tracing --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Distributed Tracing?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Distributed Tracing
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/findscripter-distributed-tracing/badge)](https://www.skillsdirectory.com/skills/findscripter-distributed-tracing)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: distributed-tracing
title: Jaeger/Tempo 分布式链路追踪
description: 当需要排查微服务链路延迟/依赖/错误传播时使用;用 OpenTelemetry 埋点并部署 Jaeger/Tempo 输出可查询的链路与服务依赖图;不适用于单体无跨服务调用或仅需指标/日志的场景;触发词:分布式追踪、链路、Jaeger、Tempo、OpenTelemetry、span、trace
domain: 研发/observability
triggers: [分布式追踪, 链路追踪, Jaeger, Tempo, OpenTelemetry, trace, span, context propagation, 服务依赖图, 链路延迟排查, trace_id 关联日志, 采样策略]
tags: [可观测性, 分布式追踪, jaeger, tempo, opentelemetry, 微服务, kubernetes, 研发]
level: 进阶
status: stable
agents: [claude-code, codex, cursor, gemini-cli]
tools: [OpenTelemetry, Jaeger, Grafana Tempo, kubectl, Docker Compose]
requires: []
related: [observability-strategy-designer, performance-profiler, grafana-dashboards, prometheus-configuration]
combines_with: [microservices-patterns, devops-troubleshooter, slo-sli-implementation]
license: MIT
source: sickn33/agentic-awesome-skills
source_license: MIT
---
## 何时使用

适用于跨多个微服务的请求需要端到端观测时:排查链路延迟、梳理服务依赖、定位性能瓶颈、追踪错误在调用链上的传播、还原完整请求路径。

不该用:
- 单体应用或无跨服务调用,没有可串联的 trace;
- 只需聚合指标(用 Prometheus)或集中日志(用日志系统),不关心单请求逐跳路径;
- 任务与分布式追踪无关,或需要本 scope 之外的工具/领域。

核心概念:Trace(一次请求的端到端旅程)由若干 Span(链路中的单个操作)组成;Span 之间通过 Context(跨服务传播的元数据)串联;Tags(键值对,用于过滤)、Logs(Span 内带时间戳的事件)补充细节。典型结构 frontend → api-gateway →(auth-service / user-service → database),各跳带耗时。

## 步骤

1. 选型与部署后端:开发用 Jaeger all-in-one;生产用 Jaeger production 策略(Elasticsearch 存储)或 Grafana Tempo(对象存储 + Grafana 查询)。
2. 应用埋点:统一用 OpenTelemetry,配置 TracerProvider、资源(service.name)和 BatchSpanProcessor + Exporter。
3. 跨服务传播 context:在所有出站请求注入 traceparent/tracestate 头,下游自动续接。
4. 配置采样:生产建议 1%–10%,结合概率/限速/自适应(ParentBased)。
5. 关联日志:把 trace_id 写入日志,打通链路与日志。
6. 在 Jaeger/Tempo UI 查询慢请求、错误、服务依赖图并验证。

## 指令

- 先澄清目标、约束和必需输入;缺少必要权限/输入/成功标准时停下来询问。
- 应用埋点最佳实践并验证产物,给出可执行步骤与验证方法。
- 输出不能替代针对具体环境的验证、测试与专家评审。

## 示例

Jaeger 部署(Kubernetes Operator + production 实例):

```bash
kubectl create namespace observability
kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.51.0/jaeger-operator.yaml -n observability

kubectl apply -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: jaeger
  namespace: observability
spec:
  strategy: production
  storage:
    type: elasticsearch
    options:
      es:
        server-urls: http://elasticsearch:9200
  ingress:
    enabled: true
EOF
```

Docker Compose 快速起步(关键端口:16686 UI、14268 Collector、14250 gRPC、9411 Zipkin):

```yaml
services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "6831:6831/udp"
      - "16686:16686"  # UI
      - "14268:14268"  # Collector
      - "14250:14250"  # gRPC
      - "9411:9411"    # Zipkin
    environment:
      - COLLECTOR_ZIPKIN_HOST_PORT=:9411
```

Python(Flask)OpenTelemetry 埋点:

```python
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from flask import Flask

resource = Resource(attributes={SERVICE_NAME: "my-service"})
provider = TracerProvider(resource=resource)
provider.add_span_processor(BatchSpanProcessor(
    JaegerExporter(agent_host_name="jaeger", agent_port=6831)))
trace.set_tracer_provider(provider)

app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)

@app.route('/api/users')
def get_users():
    tracer = trace.get_tracer(__name__)
    with tracer.start_as_current_span("get_users") as span:
        span.set_attribute("user.count", 100)
        return {"users": fetch_users_from_db()}
```

Node.js(Express)要点:用 NodeTracerProvider + JaegerExporter(endpoint http://jaeger:14268/api/traces),registerInstrumentations 注册 Http/Express,手动 span 用 try/finally 保证 span.end()。Go 要点:jaeger.WithCollectorEndpoint 构造 exporter,sdktrace.NewTracerProvider 设置 service.name,tracer.Start 配 defer span.End(),错误用 span.RecordError(err) 记录。

跨服务传播 context:

```python
from opentelemetry.propagate import inject
headers = {}
inject(headers)  # 注入 traceparent/tracestate
requests.get('http://downstream-service/api', headers=headers)
```

```javascript
const { propagation } = require('@opentelemetry/api');
const headers = {};
propagation.inject(context.active(), headers);
axios.get('http://downstream-service/api', { headers });
```

W3C 头格式:`traceparent: 00-<trace-id>-<span-id>-01`,`tracestate: congo=t61rcWkgMzE`。

采样配置:

```yaml
# 概率采样:1%
sampler: { type: probabilistic, param: 0.01 }
# 限速采样:每秒最多 100 条
sampler: { type: ratelimiting, param: 100 }
```

```python
# 自适应/确定性采样(按 trace ID)
from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased
sampler = ParentBased(root=TraceIdRatioBased(0.01))
```

Grafana Tempo(K8s ConfigMap 关键片段):distributor 接收 jaeger(thrift_http/grpc)与 otlp(http/grpc),storage.trace.backend 用 s3(bucket: tempo-traces),server.http_listen_port 3200;Deployment 用镜像 grafana/tempo:latest,args `-config.file=/etc/tempo/tempo.yaml`。

链路分析查询(Jaeger):找慢请求 `service=my-service` + `duration > 1s`;找错误 `service=my-service` + `error=true` + `tags.http.status_code >= 500`。Jaeger 自动生成服务依赖图(服务关系、请求率、错误率、平均延迟)。

链路与日志关联:

```python
import logging
from opentelemetry import trace
logger = logging.getLogger(__name__)

def process_request():
    span = trace.get_current_span()
    trace_id = span.get_span_context().trace_id
    logger.info("Processing request",
                extra={"trace_id": format(trace_id, '032x')})
```

## 注意事项

最佳实践:
1. 合理采样(生产 1%–10%);
2. 加有意义的 tag(user_id、request_id);
3. 在所有服务边界传播 context;
4. 在 Span 中记录异常;
5. 操作命名保持一致;
6. 监控追踪开销(CPU 影响 <1%);
7. 为链路错误设告警;
8. 用 baggage 实现分布式上下文;
9. 关键里程碑用 span event 标记;
10. 文档化埋点规范。

排障:
- 无 trace:检查 collector endpoint、网络连通性、采样配置,并查应用日志;
- 延迟开销高:降低采样率、使用 batch span processor、检查 exporter 配置。

风险提示:源标记 risk=critical(生产可观测性链路改动需谨慎,避免高采样拖垮服务、避免泄露敏感 tag)。

## 互见

- prometheus-configuration(指标采集)
- grafana-dashboards(可视化)
- slo-implementation(延迟 SLO)

---
采编自 sickn33/antigravity-awesome-skills(MIT 许可证)。

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…