specweave 0.3.13 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +17 -1
- package/README.md +1 -1
- package/bin/install-all.sh +9 -2
- package/bin/install-hooks.sh +57 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +55 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/agent-model-manager.d.ts +52 -0
- package/dist/core/agent-model-manager.d.ts.map +1 -0
- package/dist/core/agent-model-manager.js +120 -0
- package/dist/core/agent-model-manager.js.map +1 -0
- package/dist/core/cost-tracker.d.ts +108 -0
- package/dist/core/cost-tracker.d.ts.map +1 -0
- package/dist/core/cost-tracker.js +281 -0
- package/dist/core/cost-tracker.js.map +1 -0
- package/dist/core/model-selector.d.ts +57 -0
- package/dist/core/model-selector.d.ts.map +1 -0
- package/dist/core/model-selector.js +115 -0
- package/dist/core/model-selector.js.map +1 -0
- package/dist/core/phase-detector.d.ts +62 -0
- package/dist/core/phase-detector.d.ts.map +1 -0
- package/dist/core/phase-detector.js +229 -0
- package/dist/core/phase-detector.js.map +1 -0
- package/dist/types/cost-tracking.d.ts +43 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/cost-tracking.js +8 -0
- package/dist/types/cost-tracking.js.map +1 -0
- package/dist/types/model-selection.d.ts +53 -0
- package/dist/types/model-selection.d.ts.map +1 -0
- package/dist/types/model-selection.js +12 -0
- package/dist/types/model-selection.js.map +1 -0
- package/dist/utils/cost-reporter.d.ts +58 -0
- package/dist/utils/cost-reporter.d.ts.map +1 -0
- package/dist/utils/cost-reporter.js +224 -0
- package/dist/utils/cost-reporter.js.map +1 -0
- package/dist/utils/pricing-constants.d.ts +70 -0
- package/dist/utils/pricing-constants.d.ts.map +1 -0
- package/dist/utils/pricing-constants.js +71 -0
- package/dist/utils/pricing-constants.js.map +1 -0
- package/package.json +1 -1
- package/src/agents/architect/AGENT.md +3 -0
- package/src/agents/code-reviewer.md +156 -0
- package/src/agents/data-scientist/AGENT.md +181 -0
- package/src/agents/database-optimizer/AGENT.md +147 -0
- package/src/agents/devops/AGENT.md +3 -0
- package/src/agents/diagrams-architect/AGENT.md +3 -0
- package/src/agents/docs-writer/AGENT.md +3 -0
- package/src/agents/kubernetes-architect/AGENT.md +142 -0
- package/src/agents/ml-engineer/AGENT.md +150 -0
- package/src/agents/mlops-engineer/AGENT.md +201 -0
- package/src/agents/network-engineer/AGENT.md +149 -0
- package/src/agents/observability-engineer/AGENT.md +213 -0
- package/src/agents/payment-integration/AGENT.md +35 -0
- package/src/agents/performance/AGENT.md +3 -0
- package/src/agents/performance-engineer/AGENT.md +153 -0
- package/src/agents/pm/AGENT.md +3 -0
- package/src/agents/qa-lead/AGENT.md +3 -0
- package/src/agents/security/AGENT.md +3 -0
- package/src/agents/sre/AGENT.md +3 -0
- package/src/agents/tdd-orchestrator/AGENT.md +169 -0
- package/src/agents/tech-lead/AGENT.md +3 -0
- package/src/commands/specweave.costs.md +261 -0
- package/src/commands/specweave.ml-pipeline.md +292 -0
- package/src/commands/specweave.monitor-setup.md +501 -0
- package/src/commands/specweave.slo-implement.md +1055 -0
- package/src/commands/specweave.sync-github.md +1 -1
- package/src/commands/specweave.tdd-cycle.md +199 -0
- package/src/commands/specweave.tdd-green.md +842 -0
- package/src/commands/specweave.tdd-red.md +135 -0
- package/src/commands/specweave.tdd-refactor.md +165 -0
- package/src/skills/SKILLS-INDEX.md +18 -10
- package/src/skills/billing-automation/SKILL.md +559 -0
- package/src/skills/distributed-tracing/SKILL.md +438 -0
- package/src/skills/e2e-playwright/README.md +1 -1
- package/src/skills/e2e-playwright/package.json +1 -1
- package/src/skills/gitops-workflow/SKILL.md +285 -0
- package/src/skills/gitops-workflow/references/argocd-setup.md +134 -0
- package/src/skills/gitops-workflow/references/sync-policies.md +131 -0
- package/src/skills/grafana-dashboards/SKILL.md +369 -0
- package/src/skills/helm-chart-scaffolding/SKILL.md +544 -0
- package/src/skills/helm-chart-scaffolding/assets/Chart.yaml.template +42 -0
- package/src/skills/helm-chart-scaffolding/assets/values.yaml.template +185 -0
- package/src/skills/helm-chart-scaffolding/references/chart-structure.md +500 -0
- package/src/skills/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/src/skills/k8s-manifest-generator/SKILL.md +511 -0
- package/src/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/src/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/src/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/src/skills/k8s-manifest-generator/references/deployment-spec.md +753 -0
- package/src/skills/k8s-manifest-generator/references/service-spec.md +724 -0
- package/src/skills/k8s-security-policies/SKILL.md +334 -0
- package/src/skills/k8s-security-policies/assets/network-policy-template.yaml +177 -0
- package/src/skills/k8s-security-policies/references/rbac-patterns.md +187 -0
- package/src/skills/ml-pipeline-workflow/SKILL.md +245 -0
- package/src/skills/paypal-integration/SKILL.md +467 -0
- package/src/skills/pci-compliance/SKILL.md +466 -0
- package/src/skills/prometheus-configuration/SKILL.md +392 -0
- package/src/skills/slo-implementation/SKILL.md +329 -0
- package/src/skills/stripe-integration/SKILL.md +442 -0
- package/src/skills/tdd-workflow/SKILL.md +378 -0
- package/src/templates/README.md.template +1 -1
- package/src/skills/bmad-method-expert/SKILL.md +0 -626
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
- package/src/skills/bmad-method-expert/scripts/check-setup.js +0 -208
- package/src/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
- package/src/skills/context-optimizer/SKILL.md +0 -588
- package/src/skills/figma-designer/SKILL.md +0 -149
- package/src/skills/figma-implementer/SKILL.md +0 -148
- package/src/skills/figma-mcp-connector/SKILL.md +0 -136
- package/src/skills/figma-to-code/SKILL.md +0 -128
- package/src/skills/spec-kit-expert/SKILL.md +0 -1010
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: distributed-tracing
|
|
3
|
+
description: Implement distributed tracing with Jaeger and Tempo to track requests across microservices and identify performance bottlenecks. Use when debugging microservices, analyzing request flows, or implementing observability for distributed systems.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Distributed Tracing
|
|
7
|
+
|
|
8
|
+
Implement distributed tracing with Jaeger and Tempo for request flow visibility across microservices.
|
|
9
|
+
|
|
10
|
+
## Purpose
|
|
11
|
+
|
|
12
|
+
Track requests across distributed systems to understand latency, dependencies, and failure points.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- Debug latency issues
|
|
17
|
+
- Understand service dependencies
|
|
18
|
+
- Identify bottlenecks
|
|
19
|
+
- Trace error propagation
|
|
20
|
+
- Analyze request paths
|
|
21
|
+
|
|
22
|
+
## Distributed Tracing Concepts
|
|
23
|
+
|
|
24
|
+
### Trace Structure
|
|
25
|
+
```
|
|
26
|
+
Trace (Request ID: abc123)
|
|
27
|
+
↓
|
|
28
|
+
Span (frontend) [100ms]
|
|
29
|
+
↓
|
|
30
|
+
Span (api-gateway) [80ms]
|
|
31
|
+
├→ Span (auth-service) [10ms]
|
|
32
|
+
└→ Span (user-service) [60ms]
|
|
33
|
+
└→ Span (database) [40ms]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Key Components
|
|
37
|
+
- **Trace** - End-to-end request journey
|
|
38
|
+
- **Span** - Single operation within a trace
|
|
39
|
+
- **Context** - Metadata propagated between services
|
|
40
|
+
- **Tags** - Key-value pairs for filtering
|
|
41
|
+
- **Logs** - Timestamped events within a span
|
|
42
|
+
|
|
43
|
+
## Jaeger Setup
|
|
44
|
+
|
|
45
|
+
### Kubernetes Deployment
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Deploy Jaeger Operator
|
|
49
|
+
kubectl create namespace observability
|
|
50
|
+
kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.51.0/jaeger-operator.yaml -n observability
|
|
51
|
+
|
|
52
|
+
# Deploy Jaeger instance
|
|
53
|
+
kubectl apply -f - <<EOF
|
|
54
|
+
apiVersion: jaegertracing.io/v1
|
|
55
|
+
kind: Jaeger
|
|
56
|
+
metadata:
|
|
57
|
+
name: jaeger
|
|
58
|
+
namespace: observability
|
|
59
|
+
spec:
|
|
60
|
+
strategy: production
|
|
61
|
+
storage:
|
|
62
|
+
type: elasticsearch
|
|
63
|
+
options:
|
|
64
|
+
es:
|
|
65
|
+
server-urls: http://elasticsearch:9200
|
|
66
|
+
ingress:
|
|
67
|
+
enabled: true
|
|
68
|
+
EOF
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Docker Compose
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
version: '3.8'
|
|
75
|
+
services:
|
|
76
|
+
jaeger:
|
|
77
|
+
image: jaegertracing/all-in-one:latest
|
|
78
|
+
ports:
|
|
79
|
+
- "5775:5775/udp"
|
|
80
|
+
- "6831:6831/udp"
|
|
81
|
+
- "6832:6832/udp"
|
|
82
|
+
- "5778:5778"
|
|
83
|
+
- "16686:16686" # UI
|
|
84
|
+
- "14268:14268" # Collector
|
|
85
|
+
- "14250:14250" # gRPC
|
|
86
|
+
- "9411:9411" # Zipkin
|
|
87
|
+
environment:
|
|
88
|
+
- COLLECTOR_ZIPKIN_HOST_PORT=:9411
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Reference:** See `references/jaeger-setup.md`
|
|
92
|
+
|
|
93
|
+
## Application Instrumentation
|
|
94
|
+
|
|
95
|
+
### OpenTelemetry (Recommended)
|
|
96
|
+
|
|
97
|
+
#### Python (Flask)
|
|
98
|
+
```python
|
|
99
|
+
from opentelemetry import trace
|
|
100
|
+
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
|
|
101
|
+
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
|
|
102
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
103
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
104
|
+
from opentelemetry.instrumentation.flask import FlaskInstrumentor
|
|
105
|
+
from flask import Flask
|
|
106
|
+
|
|
107
|
+
# Initialize tracer
|
|
108
|
+
resource = Resource(attributes={SERVICE_NAME: "my-service"})
|
|
109
|
+
provider = TracerProvider(resource=resource)
|
|
110
|
+
processor = BatchSpanProcessor(JaegerExporter(
|
|
111
|
+
agent_host_name="jaeger",
|
|
112
|
+
agent_port=6831,
|
|
113
|
+
))
|
|
114
|
+
provider.add_span_processor(processor)
|
|
115
|
+
trace.set_tracer_provider(provider)
|
|
116
|
+
|
|
117
|
+
# Instrument Flask
|
|
118
|
+
app = Flask(__name__)
|
|
119
|
+
FlaskInstrumentor().instrument_app(app)
|
|
120
|
+
|
|
121
|
+
@app.route('/api/users')
|
|
122
|
+
def get_users():
|
|
123
|
+
tracer = trace.get_tracer(__name__)
|
|
124
|
+
|
|
125
|
+
with tracer.start_as_current_span("get_users") as span:
|
|
126
|
+
span.set_attribute("user.count", 100)
|
|
127
|
+
# Business logic
|
|
128
|
+
users = fetch_users_from_db()
|
|
129
|
+
return {"users": users}
|
|
130
|
+
|
|
131
|
+
def fetch_users_from_db():
|
|
132
|
+
tracer = trace.get_tracer(__name__)
|
|
133
|
+
|
|
134
|
+
with tracer.start_as_current_span("database_query") as span:
|
|
135
|
+
span.set_attribute("db.system", "postgresql")
|
|
136
|
+
span.set_attribute("db.statement", "SELECT * FROM users")
|
|
137
|
+
# Database query
|
|
138
|
+
return query_database()
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### Node.js (Express)
|
|
142
|
+
```javascript
|
|
143
|
+
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
|
|
144
|
+
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');
|
|
145
|
+
const { BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base');
|
|
146
|
+
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
|
|
147
|
+
const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');
|
|
148
|
+
const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');
|
|
149
|
+
|
|
150
|
+
// Initialize tracer
|
|
151
|
+
const provider = new NodeTracerProvider({
|
|
152
|
+
resource: { attributes: { 'service.name': 'my-service' } }
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const exporter = new JaegerExporter({
|
|
156
|
+
endpoint: 'http://jaeger:14268/api/traces'
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
provider.addSpanProcessor(new BatchSpanProcessor(exporter));
|
|
160
|
+
provider.register();
|
|
161
|
+
|
|
162
|
+
// Instrument libraries
|
|
163
|
+
registerInstrumentations({
|
|
164
|
+
instrumentations: [
|
|
165
|
+
new HttpInstrumentation(),
|
|
166
|
+
new ExpressInstrumentation(),
|
|
167
|
+
],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
const express = require('express');
|
|
171
|
+
const app = express();
|
|
172
|
+
|
|
173
|
+
app.get('/api/users', async (req, res) => {
|
|
174
|
+
const tracer = trace.getTracer('my-service');
|
|
175
|
+
const span = tracer.startSpan('get_users');
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
const users = await fetchUsers();
|
|
179
|
+
span.setAttributes({ 'user.count': users.length });
|
|
180
|
+
res.json({ users });
|
|
181
|
+
} finally {
|
|
182
|
+
span.end();
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
#### Go
|
|
188
|
+
```go
|
|
189
|
+
package main
|
|
190
|
+
|
|
191
|
+
import (
|
|
192
|
+
"context"
|
|
193
|
+
"go.opentelemetry.io/otel"
|
|
194
|
+
"go.opentelemetry.io/otel/exporters/jaeger"
|
|
195
|
+
"go.opentelemetry.io/otel/sdk/resource"
|
|
196
|
+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
197
|
+
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
func initTracer() (*sdktrace.TracerProvider, error) {
|
|
201
|
+
exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(
|
|
202
|
+
jaeger.WithEndpoint("http://jaeger:14268/api/traces"),
|
|
203
|
+
))
|
|
204
|
+
if err != nil {
|
|
205
|
+
return nil, err
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
tp := sdktrace.NewTracerProvider(
|
|
209
|
+
sdktrace.WithBatcher(exporter),
|
|
210
|
+
sdktrace.WithResource(resource.NewWithAttributes(
|
|
211
|
+
semconv.SchemaURL,
|
|
212
|
+
semconv.ServiceNameKey.String("my-service"),
|
|
213
|
+
)),
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
otel.SetTracerProvider(tp)
|
|
217
|
+
return tp, nil
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
func getUsers(ctx context.Context) ([]User, error) {
|
|
221
|
+
tracer := otel.Tracer("my-service")
|
|
222
|
+
ctx, span := tracer.Start(ctx, "get_users")
|
|
223
|
+
defer span.End()
|
|
224
|
+
|
|
225
|
+
span.SetAttributes(attribute.String("user.filter", "active"))
|
|
226
|
+
|
|
227
|
+
users, err := fetchUsersFromDB(ctx)
|
|
228
|
+
if err != nil {
|
|
229
|
+
span.RecordError(err)
|
|
230
|
+
return nil, err
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
span.SetAttributes(attribute.Int("user.count", len(users)))
|
|
234
|
+
return users, nil
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Reference:** See `references/instrumentation.md`
|
|
239
|
+
|
|
240
|
+
## Context Propagation
|
|
241
|
+
|
|
242
|
+
### HTTP Headers
|
|
243
|
+
```
|
|
244
|
+
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
|
|
245
|
+
tracestate: congo=t61rcWkgMzE
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Propagation in HTTP Requests
|
|
249
|
+
|
|
250
|
+
#### Python
|
|
251
|
+
```python
|
|
252
|
+
from opentelemetry.propagate import inject
|
|
253
|
+
|
|
254
|
+
headers = {}
|
|
255
|
+
inject(headers) # Injects trace context
|
|
256
|
+
|
|
257
|
+
response = requests.get('http://downstream-service/api', headers=headers)
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
#### Node.js
|
|
261
|
+
```javascript
|
|
262
|
+
const { propagation } = require('@opentelemetry/api');
|
|
263
|
+
|
|
264
|
+
const headers = {};
|
|
265
|
+
propagation.inject(context.active(), headers);
|
|
266
|
+
|
|
267
|
+
axios.get('http://downstream-service/api', { headers });
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Tempo Setup (Grafana)
|
|
271
|
+
|
|
272
|
+
### Kubernetes Deployment
|
|
273
|
+
|
|
274
|
+
```yaml
|
|
275
|
+
apiVersion: v1
|
|
276
|
+
kind: ConfigMap
|
|
277
|
+
metadata:
|
|
278
|
+
name: tempo-config
|
|
279
|
+
data:
|
|
280
|
+
tempo.yaml: |
|
|
281
|
+
server:
|
|
282
|
+
http_listen_port: 3200
|
|
283
|
+
|
|
284
|
+
distributor:
|
|
285
|
+
receivers:
|
|
286
|
+
jaeger:
|
|
287
|
+
protocols:
|
|
288
|
+
thrift_http:
|
|
289
|
+
grpc:
|
|
290
|
+
otlp:
|
|
291
|
+
protocols:
|
|
292
|
+
http:
|
|
293
|
+
grpc:
|
|
294
|
+
|
|
295
|
+
storage:
|
|
296
|
+
trace:
|
|
297
|
+
backend: s3
|
|
298
|
+
s3:
|
|
299
|
+
bucket: tempo-traces
|
|
300
|
+
endpoint: s3.amazonaws.com
|
|
301
|
+
|
|
302
|
+
querier:
|
|
303
|
+
frontend_worker:
|
|
304
|
+
frontend_address: tempo-query-frontend:9095
|
|
305
|
+
---
|
|
306
|
+
apiVersion: apps/v1
|
|
307
|
+
kind: Deployment
|
|
308
|
+
metadata:
|
|
309
|
+
name: tempo
|
|
310
|
+
spec:
|
|
311
|
+
replicas: 1
|
|
312
|
+
template:
|
|
313
|
+
spec:
|
|
314
|
+
containers:
|
|
315
|
+
- name: tempo
|
|
316
|
+
image: grafana/tempo:latest
|
|
317
|
+
args:
|
|
318
|
+
- -config.file=/etc/tempo/tempo.yaml
|
|
319
|
+
volumeMounts:
|
|
320
|
+
- name: config
|
|
321
|
+
mountPath: /etc/tempo
|
|
322
|
+
volumes:
|
|
323
|
+
- name: config
|
|
324
|
+
configMap:
|
|
325
|
+
name: tempo-config
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Reference:** See `assets/jaeger-config.yaml.template`
|
|
329
|
+
|
|
330
|
+
## Sampling Strategies
|
|
331
|
+
|
|
332
|
+
### Probabilistic Sampling
|
|
333
|
+
```yaml
|
|
334
|
+
# Sample 1% of traces
|
|
335
|
+
sampler:
|
|
336
|
+
type: probabilistic
|
|
337
|
+
param: 0.01
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Rate Limiting Sampling
|
|
341
|
+
```yaml
|
|
342
|
+
# Sample max 100 traces per second
|
|
343
|
+
sampler:
|
|
344
|
+
type: ratelimiting
|
|
345
|
+
param: 100
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Adaptive Sampling
|
|
349
|
+
```python
|
|
350
|
+
from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased
|
|
351
|
+
|
|
352
|
+
# Sample based on trace ID (deterministic)
|
|
353
|
+
sampler = ParentBased(root=TraceIdRatioBased(0.01))
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## Trace Analysis
|
|
357
|
+
|
|
358
|
+
### Finding Slow Requests
|
|
359
|
+
|
|
360
|
+
**Jaeger Query:**
|
|
361
|
+
```
|
|
362
|
+
service=my-service
|
|
363
|
+
duration > 1s
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Finding Errors
|
|
367
|
+
|
|
368
|
+
**Jaeger Query:**
|
|
369
|
+
```
|
|
370
|
+
service=my-service
|
|
371
|
+
error=true
|
|
372
|
+
tags.http.status_code >= 500
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Service Dependency Graph
|
|
376
|
+
|
|
377
|
+
Jaeger automatically generates service dependency graphs showing:
|
|
378
|
+
- Service relationships
|
|
379
|
+
- Request rates
|
|
380
|
+
- Error rates
|
|
381
|
+
- Average latencies
|
|
382
|
+
|
|
383
|
+
## Best Practices
|
|
384
|
+
|
|
385
|
+
1. **Sample appropriately** (1-10% in production)
|
|
386
|
+
2. **Add meaningful tags** (user_id, request_id)
|
|
387
|
+
3. **Propagate context** across all service boundaries
|
|
388
|
+
4. **Log exceptions** in spans
|
|
389
|
+
5. **Use consistent naming** for operations
|
|
390
|
+
6. **Monitor tracing overhead** (<1% CPU impact)
|
|
391
|
+
7. **Set up alerts** for trace errors
|
|
392
|
+
8. **Implement distributed context** (baggage)
|
|
393
|
+
9. **Use span events** for important milestones
|
|
394
|
+
10. **Document instrumentation** standards
|
|
395
|
+
|
|
396
|
+
## Integration with Logging
|
|
397
|
+
|
|
398
|
+
### Correlated Logs
|
|
399
|
+
```python
|
|
400
|
+
import logging
|
|
401
|
+
from opentelemetry import trace
|
|
402
|
+
|
|
403
|
+
logger = logging.getLogger(__name__)
|
|
404
|
+
|
|
405
|
+
def process_request():
|
|
406
|
+
span = trace.get_current_span()
|
|
407
|
+
trace_id = span.get_span_context().trace_id
|
|
408
|
+
|
|
409
|
+
logger.info(
|
|
410
|
+
"Processing request",
|
|
411
|
+
extra={"trace_id": format(trace_id, '032x')}
|
|
412
|
+
)
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## Troubleshooting
|
|
416
|
+
|
|
417
|
+
**No traces appearing:**
|
|
418
|
+
- Check collector endpoint
|
|
419
|
+
- Verify network connectivity
|
|
420
|
+
- Check sampling configuration
|
|
421
|
+
- Review application logs
|
|
422
|
+
|
|
423
|
+
**High latency overhead:**
|
|
424
|
+
- Reduce sampling rate
|
|
425
|
+
- Use batch span processor
|
|
426
|
+
- Check exporter configuration
|
|
427
|
+
|
|
428
|
+
## Reference Files
|
|
429
|
+
|
|
430
|
+
- `references/jaeger-setup.md` - Jaeger installation
|
|
431
|
+
- `references/instrumentation.md` - Instrumentation patterns
|
|
432
|
+
- `assets/jaeger-config.yaml.template` - Jaeger configuration
|
|
433
|
+
|
|
434
|
+
## Related Skills
|
|
435
|
+
|
|
436
|
+
- `prometheus-configuration` - For metrics
|
|
437
|
+
- `grafana-dashboards` - For visualization
|
|
438
|
+
- `slo-implementation` - For latency SLOs
|
|
@@ -490,7 +490,7 @@ MIT License - See LICENSE file for details
|
|
|
490
490
|
|
|
491
491
|
- **Documentation**: See SKILL.md for complete API reference
|
|
492
492
|
- **Issues**: Report bugs or request features via GitHub issues
|
|
493
|
-
- **SpecWeave**: See [SpecWeave documentation](https://github.com/
|
|
493
|
+
- **SpecWeave**: See [SpecWeave documentation](https://github.com/anton-abyzov/specweave) for framework details
|
|
494
494
|
|
|
495
495
|
## Version History
|
|
496
496
|
|