Writing Skills
writing-skills
效率与协作技能,来自 obra/superpowers,查看原文获取完整用途和操作说明。
jaeger【部署与运维】Deploys and manages Jaeger distributed tracing infrastructure on Kubernetes with configuration, querying, health monitoring, and troubleshooting for production microservice observability.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: jaeger description: Deploys and manages Jaeger distributed tracing infrastructure on Kubernetes with configuration, querying, health monitoring, and troubleshooting for production microservice observability. license: MIT compatibility: opencode metadata: version: "1.0.0" domain: cncf triggers: jaeger, distributed tracing, kubernetes deployment, trace query, span debugging, collector configuration, hotrod demo, APM infrastructure role: reference scope: infrastructure output-format: manifests content-types: [guidance, examples, config, do-dont] archetypes: [tactical, orchestration] anti_triggers: [brainstorming, vague ideation, long-form architecture planning] response_profile: verbosity: medium directive_strength: high abstraction_level: operational
Deploys and manages Jaeger distributed tracing infrastructure on Kubernetes. Covers namespace setup, collector configuration, query service deployment, health monitoring, trace querying via API, and troubleshooting common issues.
/api/traces, /api/services) to query traces programmaticallyJaeger is an open-source distributed tracing system from CNCF. It helps track requests as they flow through microservices, identifying bottlenecks, failures, and latency issues across service boundaries.
Use Jaeger when:
Alternatives: For simpler setups, consider OpenTelemetry with Zipkin or commercial APM tools (Datadog, New Relic). Use Jaeger when you need a self-hosted CNCF-native tracing solution.
Jaeger follows a three-component architecture:
Data flow: Application → Agent/Collector → Storage (Cassandra/Elasticsearch/Memory) → Query → Dashboard
# Install the Jaeger Operator from Helm
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update
helm install jaeger jaegertracing/jaeger -n jaeger --create-namespace \
--set installAllComponents=true \
--set storage.type=elasticsearch \
--set storage.elasticsearch.host=elasticsearch-master \
--set storage.elasticsearch.port=9200
# Verify all components are running
kubectl get pods -n jaeger
---
# Jaeger Namespace
apiVersion: v1
kind: Namespace
metadata:
name: jaeger
labels:
app.kubernetes.io/name: jaeger
---
# Jaeger Query Service (for programmatic access)
apiVersion: v1
kind: Service
metadata:
name: jaeger-query
namespace: jaeger
labels:
app.kubernetes.io/name: jaeger
spec:
ports:
- port: 16686
targetPort: 16686
name: ui
- port: 14269
targetPort: 14269
name: grpc-query
selector:
app.kubernetes.io/name: jaeger
component: query
---
# Jaeger Collector Service (receives traces)
apiVersion: v1
kind: Service
metadata:
name: jaeger-collector
namespace: jaeger
labels:
app.kubernetes.io/name: jaeger
spec:
ports:
- port: 14250
targetPort: 14250
name: grpc
- port: 14268
targetPort: 14268
name: http-ingest
- port: 9411
targetPort: 9411
name: zipkin
selector:
app.kubernetes.io/name: jaeger
component: collector
---
# Jaeger Agent DaemonSet (sidecar-style trace collection)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: jaeger-agent
namespace: jaeger
labels:
app.kubernetes.io/name: jaeger
spec:
selector:
matchLabels:
name: jaeger-agent
template:
metadata:
labels:
name: jaeger-agent
spec:
containers:
- name: jaeger-agent
image: jaegertracing/jaeger-agent:latest
args:
- "--collector.host-port=jaeger-collector:14267"
- "--reporter.grpc.parent-based=true"
- "--reporter.grpc.timeout=1s"
ports:
- containerPort: 5778
name: config-rest
- containerPort: 6831
protocol: UDP
name: jg-compact-compact
- containerPort: 6832
protocol: UDP
name: jg-binary-binary
- containerPort: 5779
name: admin-http
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
COLLECTOR_QUEUE_SIZE_MAX and enable batch processing. Monitor queue depth metrics.# Create namespace for Jaeger deployment
kubectl create namespace jaeger --dry-run=client -o yaml | kubectl apply -f -
# Create a ConfigMap for custom collector settings
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: jaeger-collector-config
namespace: jaeger
data:
collector.yaml: |
queue_size: 2000
batch_size: 100
processor:
tracing_spans:
workers: 10
EOF
# List all services traced by Jaeger
curl -s http://localhost:16686/api/services | jq .
# Get traces for a specific service within a time range
SERVICE="orders-service"
TRACE_ID=$(curl -s "http://localhost:16686/api/traces?service=${SERVICE}&limit=1&lookback=1h" \
| jq -r '.data[0].traceID // empty')
if [[ -n "$TRACE_ID" ]]; then
echo "Found trace ID: $TRACE_ID"
curl -s "http://localhost:16686/api/traces/${TRACE_ID}" | jq .
else
echo "No traces found for service: $SERVICE in the last hour"
fi
# Query spans by operation name across all services
curl -s "http://localhost:16686/api/services" \
| jq -r '.data[]' > /tmp/all_services.txt
for service in $(cat /tmp/all_services.txt); do
curl -s "http://localhost:16686/api/traces?service=${service}&operation=processOrder&limit=5&lookback=30m" \
| jq ".data[]?.traceID" 2>/dev/null
done
# Port-forward to Jaeger query service for local access
kubectl port-forward -n jaeger svc/jaeger-query 16686:16686 &
open http://localhost:16686
#!/bin/bash
# check_jaeger_health.sh — Comprehensive health check for Jaeger service
set -euo pipefail
HOST="${1:-localhost}"
PORT="${2:-16686}"
TIMEOUT=5
echo "=== Jaeger Health Check ==="
# Check 1: UI accessibility
echo -n "UI (HTTP $PORT): "
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time $TIMEOUT \
"http://$HOST:$PORT/" 2>/dev/null || echo "000")
if [[ "$HTTP_CODE" -ge 200 && "$HTTP_CODE" -lt 400 ]]; then
echo "✅ OK (HTTP $HTTP_CODE)"
else
echo "❌ FAILED (HTTP $HTTP_CODE)"
fi
# Check 2: API health
echo -n "API (/healthz): "
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time $TIMEOUT \
"http://$HOST:$PORT/healthz" 2>/dev/null || echo "000")
if [[ "$HTTP_CODE" -eq 200 ]]; then
echo "✅ OK (HTTP $HTTP_CODE)"
else
echo "❌ FAILED (HTTP $HTTP_CODE)"
fi
# Check 3: Services endpoint
echo -n "Services API: "
SERVICE_COUNT=$(curl -s --max-time $TIMEOUT \
"http://$HOST:$PORT/api/services" 2>/dev/null | jq '.data | length' 2>/dev/null || echo "0")
if [[ "$SERVICE_COUNT" -gt 0 ]]; then
echo "✅ OK (${SERVICE_COUNT} services)"
else
echo "⚠️ DEGRADED (0 services — no traces received recently)"
fi
echo ""
echo "=== Jaeger Health Check Complete ==="
COLLECTOR_HOST_PORT correctly — traces will be silently dropped| Skill | Purpose |
|---|---|
cncf-opentelemetry | OpenTelemetry instrumentation for sending traces to Jaeger |
cncf-grafana | Visualize Jaeger metrics alongside other observability data |
coding-distributed-tracing-patterns | Application-level distributed tracing patterns with OpenTelemetry SDK |
No traces appearing in Jaeger
kubectl logs -n jaeger <collector-pod> --tail=50 for ingestion errorsCollector high memory usage
jaeger_collector_queue_size metric — if consistently near max, increase batch sizeSlow trace queries
# Check Jaeger pod status
kubectl get pods -n jaeger
# View collector logs for ingestion errors
kubectl logs -n jaeger -l component=collector --tail=100 -f
# List all traced services
curl -s http://localhost:16686/api/services | jq .
# Query recent traces for a specific service and operation
curl -s "http://localhost:16686/api/traces?service=my-service&operation=getUser&limit=3&lookback=1h"
# Check Jaeger storage health (Elasticsearch)
kubectl exec -n jaeger deploy/jaeger-query -- curl -sf http://jaeger-collector:14269/healthz
Use this skill when:
Assess Requirements — Determine the number of services needing tracing, expected trace volume (traces/sec), and retention period. Checkpoint: Document trace ingestion rate targets and storage capacity needs.
Deploy Infrastructure — Install Jaeger components (agent/collector/query) in a dedicated namespace with proper resource limits and security contexts. Use Helm charts or the Jaeger Operator for automated deployment. Checkpoint: Verify all pods are Running, probes passing, and no CrashLoopBackOff errors.
Instrument Services — Configure applications to emit traces via OTLP/gRPC or HTTP endpoints. Set the correct collector endpoint in application config or via environment variables. Checkpoint: Verify traces appear in Jaeger UI within 60 seconds of deployment.
Monitor & Query — Use the Jaeger API (/api/traces, /api/services) for programmatic access, and expose the UI (port-forward or Ingress) for interactive debugging. Set up health checks for collector and query services. Checkpoint: Confirm trace ingestion rate matches expected volume, and queries return within acceptable latency.
Authoritative documentation links for this skill's domain. The model follows markdown links at load time to resolve external references and inline content.