container-superposition 0.1.1
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/README.md +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
|
@@ -0,0 +1,867 @@
|
|
|
1
|
+
# Jaeger Overlay
|
|
2
|
+
|
|
3
|
+
Distributed tracing platform for monitoring and troubleshooting microservices-based applications.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Jaeger all-in-one** - Complete tracing solution (collector, query, agent, UI)
|
|
8
|
+
- **OpenTelemetry compatible** - OTLP receivers for modern instrumentation
|
|
9
|
+
- **In-memory storage** - Fast and simple for development environments
|
|
10
|
+
- **Service dependency graph** - Visualize microservice architecture
|
|
11
|
+
- **Root cause analysis** - Identify performance bottlenecks
|
|
12
|
+
- **W3C Trace Context** - Standard trace propagation across services
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
Jaeger is an open-source, end-to-end distributed tracing system that helps you monitor and troubleshoot complex distributed systems. It collects timing data (spans) from your services and visualizes how requests flow through your architecture.
|
|
17
|
+
|
|
18
|
+
**Architecture:**
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
graph TD
|
|
22
|
+
A[Your Application<br/>Instrumented with OTLP<br/>Sends spans to Jaeger] -->|OTLP gRPC/HTTP| B[Jaeger All-in-One<br/>Collector receives spans<br/>Storage in-memory<br/>Query serves UI<br/>UI http://localhost:16686]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**What is a Trace?**
|
|
26
|
+
|
|
27
|
+
- A trace represents a complete request journey through your system
|
|
28
|
+
- Each trace contains multiple spans (individual operations)
|
|
29
|
+
- Spans track timing, metadata, and parent-child relationships
|
|
30
|
+
|
|
31
|
+
## Configuration
|
|
32
|
+
|
|
33
|
+
### Ports
|
|
34
|
+
|
|
35
|
+
- `16686` - Jaeger UI (web interface)
|
|
36
|
+
- `4317` - OTLP gRPC receiver (when used without otel-collector)
|
|
37
|
+
- `4318` - OTLP HTTP receiver (when used without otel-collector)
|
|
38
|
+
|
|
39
|
+
⚠️ **Note:** When using with **otel-collector**, OTLP ports (4317/4318) are not exposed to avoid conflicts. Send telemetry to otel-collector, which forwards to Jaeger.
|
|
40
|
+
|
|
41
|
+
### Environment Variables
|
|
42
|
+
|
|
43
|
+
The overlay includes a `.env.example` file. Copy it to `.env` and customize:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
cd .devcontainer
|
|
47
|
+
cp .env.example .env
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Available variables:**
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Jaeger version
|
|
54
|
+
JAEGER_VERSION=latest
|
|
55
|
+
|
|
56
|
+
# UI port (default 16686)
|
|
57
|
+
JAEGER_UI_PORT=16686
|
|
58
|
+
|
|
59
|
+
# OTLP ports (only when used standalone)
|
|
60
|
+
JAEGER_OTLP_GRPC_PORT=4317
|
|
61
|
+
JAEGER_OTLP_HTTP_PORT=4318
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Port Configuration
|
|
65
|
+
|
|
66
|
+
Ports can be changed via `--port-offset`:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Offset all ports by 100
|
|
70
|
+
container-superposition --port-offset 100
|
|
71
|
+
|
|
72
|
+
# Jaeger UI will be on 16786 instead of 16686
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Accessing Jaeger UI
|
|
76
|
+
|
|
77
|
+
Once your devcontainer starts, open your browser to:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
http://localhost:16686
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### UI Features
|
|
84
|
+
|
|
85
|
+
**1. Search Traces**
|
|
86
|
+
|
|
87
|
+
- Filter by service, operation, tags
|
|
88
|
+
- Search by trace ID
|
|
89
|
+
- Find traces by duration (e.g., slower than 100ms)
|
|
90
|
+
- Filter by minimum span count
|
|
91
|
+
|
|
92
|
+
**2. Trace Details**
|
|
93
|
+
|
|
94
|
+
- Waterfall view of spans
|
|
95
|
+
- Timing breakdown
|
|
96
|
+
- Span tags and logs
|
|
97
|
+
- Error indicators
|
|
98
|
+
|
|
99
|
+
**3. System Architecture**
|
|
100
|
+
|
|
101
|
+
- Service dependency graph (DAG)
|
|
102
|
+
- Request flow visualization
|
|
103
|
+
- Service call frequency
|
|
104
|
+
|
|
105
|
+
**4. Compare Traces**
|
|
106
|
+
|
|
107
|
+
- Side-by-side comparison
|
|
108
|
+
- Identify performance differences
|
|
109
|
+
- Compare successful vs failed requests
|
|
110
|
+
|
|
111
|
+
## Application Integration
|
|
112
|
+
|
|
113
|
+
### Node.js (OpenTelemetry SDK)
|
|
114
|
+
|
|
115
|
+
Install dependencies:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npm install @opentelemetry/sdk-node \
|
|
119
|
+
@opentelemetry/auto-instrumentations-node \
|
|
120
|
+
@opentelemetry/exporter-trace-otlp-grpc
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Automatic instrumentation (recommended):**
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// tracing.js
|
|
127
|
+
const { NodeSDK } = require('@opentelemetry/sdk-node');
|
|
128
|
+
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
|
|
129
|
+
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
|
|
130
|
+
const { Resource } = require('@opentelemetry/resources');
|
|
131
|
+
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
|
|
132
|
+
|
|
133
|
+
const sdk = new NodeSDK({
|
|
134
|
+
resource: new Resource({
|
|
135
|
+
[SemanticResourceAttributes.SERVICE_NAME]: 'my-service',
|
|
136
|
+
[SemanticResourceAttributes.SERVICE_VERSION]: '1.0.0',
|
|
137
|
+
[SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT]: 'development',
|
|
138
|
+
}),
|
|
139
|
+
traceExporter: new OTLPTraceExporter({
|
|
140
|
+
url: 'http://jaeger:4317', // or http://otel-collector:4317
|
|
141
|
+
}),
|
|
142
|
+
instrumentations: [getNodeAutoInstrumentations()],
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
sdk.start();
|
|
146
|
+
|
|
147
|
+
process.on('SIGTERM', () => {
|
|
148
|
+
sdk.shutdown().finally(() => process.exit(0));
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Start your app with tracing:**
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
node --require ./tracing.js app.js
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Manual instrumentation:**
|
|
159
|
+
|
|
160
|
+
```javascript
|
|
161
|
+
const { trace } = require('@opentelemetry/api');
|
|
162
|
+
|
|
163
|
+
const tracer = trace.getTracer('my-service', '1.0.0');
|
|
164
|
+
|
|
165
|
+
async function processOrder(orderId) {
|
|
166
|
+
const span = tracer.startSpan('processOrder', {
|
|
167
|
+
attributes: {
|
|
168
|
+
'order.id': orderId,
|
|
169
|
+
'order.type': 'online',
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
// Your business logic
|
|
175
|
+
const result = await fetchOrder(orderId);
|
|
176
|
+
span.setAttributes({
|
|
177
|
+
'order.total': result.total,
|
|
178
|
+
'order.items': result.items.length,
|
|
179
|
+
});
|
|
180
|
+
return result;
|
|
181
|
+
} catch (error) {
|
|
182
|
+
span.recordException(error);
|
|
183
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
184
|
+
throw error;
|
|
185
|
+
} finally {
|
|
186
|
+
span.end();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Python (OpenTelemetry SDK)
|
|
192
|
+
|
|
193
|
+
Install dependencies:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
pip install opentelemetry-distro \
|
|
197
|
+
opentelemetry-exporter-otlp-proto-grpc \
|
|
198
|
+
opentelemetry-instrumentation
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Automatic instrumentation:**
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
# tracing.py
|
|
205
|
+
from opentelemetry import trace
|
|
206
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
207
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
208
|
+
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
|
|
209
|
+
from opentelemetry.sdk.resources import Resource, SERVICE_NAME, SERVICE_VERSION
|
|
210
|
+
|
|
211
|
+
# Configure resource
|
|
212
|
+
resource = Resource.create({
|
|
213
|
+
SERVICE_NAME: "my-service",
|
|
214
|
+
SERVICE_VERSION: "1.0.0",
|
|
215
|
+
"deployment.environment": "development",
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
# Set up tracer provider
|
|
219
|
+
trace.set_tracer_provider(TracerProvider(resource=resource))
|
|
220
|
+
|
|
221
|
+
# Configure OTLP exporter
|
|
222
|
+
otlp_exporter = OTLPSpanExporter(
|
|
223
|
+
endpoint="http://jaeger:4317", # or http://otel-collector:4317
|
|
224
|
+
insecure=True,
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
trace.get_tracer_provider().add_span_processor(
|
|
228
|
+
BatchSpanProcessor(otlp_exporter)
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Auto-instrument frameworks
|
|
232
|
+
from opentelemetry.instrumentation.flask import FlaskInstrumentor
|
|
233
|
+
from opentelemetry.instrumentation.requests import RequestsInstrumentor
|
|
234
|
+
|
|
235
|
+
FlaskInstrumentor().instrument()
|
|
236
|
+
RequestsInstrumentor().instrument()
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Manual instrumentation:**
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
from opentelemetry import trace
|
|
243
|
+
from opentelemetry.trace import Status, StatusCode
|
|
244
|
+
|
|
245
|
+
tracer = trace.get_tracer(__name__)
|
|
246
|
+
|
|
247
|
+
def process_payment(amount, currency):
|
|
248
|
+
with tracer.start_as_current_span("process_payment") as span:
|
|
249
|
+
span.set_attribute("payment.amount", amount)
|
|
250
|
+
span.set_attribute("payment.currency", currency)
|
|
251
|
+
|
|
252
|
+
try:
|
|
253
|
+
# Payment processing logic
|
|
254
|
+
result = charge_card(amount, currency)
|
|
255
|
+
span.set_attribute("payment.status", "success")
|
|
256
|
+
span.set_attribute("transaction.id", result.transaction_id)
|
|
257
|
+
return result
|
|
258
|
+
except PaymentError as e:
|
|
259
|
+
span.record_exception(e)
|
|
260
|
+
span.set_status(Status(StatusCode.ERROR, str(e)))
|
|
261
|
+
raise
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### .NET (OpenTelemetry SDK)
|
|
265
|
+
|
|
266
|
+
Install packages:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
|
|
270
|
+
dotnet add package OpenTelemetry.Extensions.Hosting
|
|
271
|
+
dotnet add package OpenTelemetry.Instrumentation.AspNetCore
|
|
272
|
+
dotnet add package OpenTelemetry.Instrumentation.Http
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**ASP.NET Core configuration:**
|
|
276
|
+
|
|
277
|
+
```csharp
|
|
278
|
+
using OpenTelemetry.Resources;
|
|
279
|
+
using OpenTelemetry.Trace;
|
|
280
|
+
|
|
281
|
+
var builder = WebApplication.CreateBuilder(args);
|
|
282
|
+
|
|
283
|
+
builder.Services.AddOpenTelemetry()
|
|
284
|
+
.ConfigureResource(resource => resource
|
|
285
|
+
.AddService("my-service", serviceVersion: "1.0.0")
|
|
286
|
+
.AddAttributes(new Dictionary<string, object>
|
|
287
|
+
{
|
|
288
|
+
["deployment.environment"] = "development"
|
|
289
|
+
}))
|
|
290
|
+
.WithTracing(tracing => tracing
|
|
291
|
+
.AddAspNetCoreInstrumentation(options =>
|
|
292
|
+
{
|
|
293
|
+
options.RecordException = true;
|
|
294
|
+
})
|
|
295
|
+
.AddHttpClientInstrumentation()
|
|
296
|
+
.AddOtlpExporter(options =>
|
|
297
|
+
{
|
|
298
|
+
options.Endpoint = new Uri("http://jaeger:4317"); // or http://otel-collector:4317
|
|
299
|
+
}));
|
|
300
|
+
|
|
301
|
+
var app = builder.Build();
|
|
302
|
+
app.Run();
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**Manual instrumentation:**
|
|
306
|
+
|
|
307
|
+
```csharp
|
|
308
|
+
using System.Diagnostics;
|
|
309
|
+
using OpenTelemetry;
|
|
310
|
+
|
|
311
|
+
var activitySource = new ActivitySource("MyService", "1.0.0");
|
|
312
|
+
|
|
313
|
+
public async Task<Order> ProcessOrder(string orderId)
|
|
314
|
+
{
|
|
315
|
+
using var activity = activitySource.StartActivity("ProcessOrder");
|
|
316
|
+
|
|
317
|
+
activity?.SetTag("order.id", orderId);
|
|
318
|
+
activity?.SetTag("order.type", "online");
|
|
319
|
+
|
|
320
|
+
try
|
|
321
|
+
{
|
|
322
|
+
var order = await _orderService.GetOrder(orderId);
|
|
323
|
+
activity?.SetTag("order.total", order.Total);
|
|
324
|
+
activity?.SetTag("order.items", order.Items.Count);
|
|
325
|
+
return order;
|
|
326
|
+
}
|
|
327
|
+
catch (Exception ex)
|
|
328
|
+
{
|
|
329
|
+
activity?.RecordException(ex);
|
|
330
|
+
activity?.SetStatus(ActivityStatusCode.Error, ex.Message);
|
|
331
|
+
throw;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Go (OpenTelemetry SDK)
|
|
337
|
+
|
|
338
|
+
Install dependencies:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
go get go.opentelemetry.io/otel
|
|
342
|
+
go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
|
343
|
+
go get go.opentelemetry.io/otel/sdk/trace
|
|
344
|
+
go get go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Setup tracing:**
|
|
348
|
+
|
|
349
|
+
```go
|
|
350
|
+
package main
|
|
351
|
+
|
|
352
|
+
import (
|
|
353
|
+
"context"
|
|
354
|
+
"log"
|
|
355
|
+
|
|
356
|
+
"go.opentelemetry.io/otel"
|
|
357
|
+
"go.opentelemetry.io/otel/attribute"
|
|
358
|
+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
|
359
|
+
"go.opentelemetry.io/otel/sdk/resource"
|
|
360
|
+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
361
|
+
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
func initTracer() func() {
|
|
365
|
+
ctx := context.Background()
|
|
366
|
+
|
|
367
|
+
exporter, err := otlptracegrpc.New(ctx,
|
|
368
|
+
otlptracegrpc.WithEndpoint("jaeger:4317"), // or otel-collector:4317
|
|
369
|
+
otlptracegrpc.WithInsecure(),
|
|
370
|
+
)
|
|
371
|
+
if err != nil {
|
|
372
|
+
log.Fatal(err)
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
res := resource.NewWithAttributes(
|
|
376
|
+
semconv.SchemaURL,
|
|
377
|
+
semconv.ServiceName("my-service"),
|
|
378
|
+
semconv.ServiceVersion("1.0.0"),
|
|
379
|
+
attribute.String("deployment.environment", "development"),
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
tp := sdktrace.NewTracerProvider(
|
|
383
|
+
sdktrace.WithBatcher(exporter),
|
|
384
|
+
sdktrace.WithResource(res),
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
otel.SetTracerProvider(tp)
|
|
388
|
+
|
|
389
|
+
return func() {
|
|
390
|
+
_ = tp.Shutdown(ctx)
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
func main() {
|
|
395
|
+
cleanup := initTracer()
|
|
396
|
+
defer cleanup()
|
|
397
|
+
|
|
398
|
+
// Your application code
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**Manual instrumentation:**
|
|
403
|
+
|
|
404
|
+
```go
|
|
405
|
+
import (
|
|
406
|
+
"go.opentelemetry.io/otel"
|
|
407
|
+
"go.opentelemetry.io/otel/attribute"
|
|
408
|
+
"go.opentelemetry.io/otel/codes"
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
var tracer = otel.Tracer("my-service")
|
|
412
|
+
|
|
413
|
+
func processPayment(ctx context.Context, amount float64) error {
|
|
414
|
+
ctx, span := tracer.Start(ctx, "processPayment")
|
|
415
|
+
defer span.End()
|
|
416
|
+
|
|
417
|
+
span.SetAttributes(
|
|
418
|
+
attribute.Float64("payment.amount", amount),
|
|
419
|
+
attribute.String("payment.currency", "USD"),
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
if err := chargeCard(ctx, amount); err != nil {
|
|
423
|
+
span.RecordError(err)
|
|
424
|
+
span.SetStatus(codes.Error, err.Error())
|
|
425
|
+
return err
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
span.SetAttributes(attribute.String("payment.status", "success"))
|
|
429
|
+
return nil
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Querying Traces in the UI
|
|
434
|
+
|
|
435
|
+
### Search Examples
|
|
436
|
+
|
|
437
|
+
**Find all traces for a service:**
|
|
438
|
+
|
|
439
|
+
1. Select service: `my-service`
|
|
440
|
+
2. Click "Find Traces"
|
|
441
|
+
|
|
442
|
+
**Find slow requests:**
|
|
443
|
+
|
|
444
|
+
1. Select service: `my-service`
|
|
445
|
+
2. Set "Min Duration": `500ms`
|
|
446
|
+
3. Click "Find Traces"
|
|
447
|
+
|
|
448
|
+
**Find errors:**
|
|
449
|
+
|
|
450
|
+
1. Select service: `my-service`
|
|
451
|
+
2. Add tag filter: `error=true` or `http.status_code=500`
|
|
452
|
+
3. Click "Find Traces"
|
|
453
|
+
|
|
454
|
+
**Find specific operation:**
|
|
455
|
+
|
|
456
|
+
1. Select service: `my-service`
|
|
457
|
+
2. Select operation: `GET /api/orders`
|
|
458
|
+
3. Set time range
|
|
459
|
+
4. Click "Find Traces"
|
|
460
|
+
|
|
461
|
+
**Search by trace ID:**
|
|
462
|
+
|
|
463
|
+
```
|
|
464
|
+
Enter trace ID in search box (hex format):
|
|
465
|
+
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Understanding Span Tags
|
|
469
|
+
|
|
470
|
+
**HTTP spans should include:**
|
|
471
|
+
|
|
472
|
+
```
|
|
473
|
+
http.method: GET
|
|
474
|
+
http.url: /api/orders/123
|
|
475
|
+
http.status_code: 200
|
|
476
|
+
http.route: /api/orders/:id
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
**Database spans should include:**
|
|
480
|
+
|
|
481
|
+
```
|
|
482
|
+
db.system: postgresql
|
|
483
|
+
db.name: myapp
|
|
484
|
+
db.statement: SELECT * FROM orders WHERE id = $1
|
|
485
|
+
db.operation: SELECT
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**RPC spans should include:**
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
rpc.system: grpc
|
|
492
|
+
rpc.service: OrderService
|
|
493
|
+
rpc.method: GetOrder
|
|
494
|
+
net.peer.name: order-service
|
|
495
|
+
net.peer.port: 50051
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
## Advanced Features
|
|
499
|
+
|
|
500
|
+
### Sampling Strategies
|
|
501
|
+
|
|
502
|
+
**Always sample (development):**
|
|
503
|
+
|
|
504
|
+
```javascript
|
|
505
|
+
// Node.js
|
|
506
|
+
const { AlwaysOnSampler } = require('@opentelemetry/sdk-trace-base');
|
|
507
|
+
|
|
508
|
+
const sdk = new NodeSDK({
|
|
509
|
+
sampler: new AlwaysOnSampler(),
|
|
510
|
+
// ... other config
|
|
511
|
+
});
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
**Probabilistic sampling (production):**
|
|
515
|
+
|
|
516
|
+
```javascript
|
|
517
|
+
// Sample 10% of traces
|
|
518
|
+
const { TraceIdRatioBasedSampler } = require('@opentelemetry/sdk-trace-base');
|
|
519
|
+
|
|
520
|
+
const sdk = new NodeSDK({
|
|
521
|
+
sampler: new TraceIdRatioBasedSampler(0.1),
|
|
522
|
+
// ... other config
|
|
523
|
+
});
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
**Parent-based sampling:**
|
|
527
|
+
|
|
528
|
+
```python
|
|
529
|
+
from opentelemetry.sdk.trace.sampling import ParentBasedTraceIdRatioBased
|
|
530
|
+
|
|
531
|
+
sampler = ParentBasedTraceIdRatioBased(0.1) # 10% sampling
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Baggage (Cross-cutting Concerns)
|
|
535
|
+
|
|
536
|
+
Baggage allows you to propagate key-value pairs across service boundaries:
|
|
537
|
+
|
|
538
|
+
```javascript
|
|
539
|
+
const { propagation, context } = require('@opentelemetry/api');
|
|
540
|
+
|
|
541
|
+
// Set baggage
|
|
542
|
+
const ctx = propagation.setBaggage(
|
|
543
|
+
context.active(),
|
|
544
|
+
propagation.createBaggage({
|
|
545
|
+
'user.id': { value: '12345' },
|
|
546
|
+
'tenant.id': { value: 'acme-corp' },
|
|
547
|
+
})
|
|
548
|
+
);
|
|
549
|
+
|
|
550
|
+
// Read baggage in another service
|
|
551
|
+
const baggage = propagation.getBaggage(context.active());
|
|
552
|
+
const userId = baggage?.getEntry('user.id')?.value;
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
⚠️ **Warning:** Baggage is propagated with every request. Keep it small!
|
|
556
|
+
|
|
557
|
+
### Span Events and Logs
|
|
558
|
+
|
|
559
|
+
Add timestamped events to spans:
|
|
560
|
+
|
|
561
|
+
```javascript
|
|
562
|
+
span.addEvent('cache.hit', {
|
|
563
|
+
'cache.key': 'user:12345',
|
|
564
|
+
'cache.ttl': 300,
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
span.addEvent('retry.attempt', {
|
|
568
|
+
'retry.count': 3,
|
|
569
|
+
'retry.delay': 1000,
|
|
570
|
+
});
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
```python
|
|
574
|
+
span.add_event("database.query.slow", {
|
|
575
|
+
"query.duration_ms": 2500,
|
|
576
|
+
"query.table": "orders",
|
|
577
|
+
})
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
### Span Links
|
|
581
|
+
|
|
582
|
+
Link related spans that aren't parent-child:
|
|
583
|
+
|
|
584
|
+
```javascript
|
|
585
|
+
const { trace, context } = require('@opentelemetry/api');
|
|
586
|
+
|
|
587
|
+
// Start a span with link to another trace
|
|
588
|
+
const linkedSpan = tracer.startSpan('batch-process', {
|
|
589
|
+
links: [{ context: parentSpanContext }],
|
|
590
|
+
});
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
## Best Practices
|
|
594
|
+
|
|
595
|
+
### Span Naming
|
|
596
|
+
|
|
597
|
+
**✅ Good:**
|
|
598
|
+
|
|
599
|
+
- `GET /api/orders` - HTTP endpoint
|
|
600
|
+
- `processPayment` - Business operation
|
|
601
|
+
- `SELECT orders` - Database operation
|
|
602
|
+
- `publishEvent` - Messaging operation
|
|
603
|
+
|
|
604
|
+
**❌ Bad:**
|
|
605
|
+
|
|
606
|
+
- `GET /api/orders/123` - Don't include IDs
|
|
607
|
+
- `handle_request` - Too generic
|
|
608
|
+
- `function_42` - Not descriptive
|
|
609
|
+
|
|
610
|
+
### Span Attributes
|
|
611
|
+
|
|
612
|
+
**✅ Do:**
|
|
613
|
+
|
|
614
|
+
- Use semantic conventions (see [OpenTelemetry docs](https://opentelemetry.io/docs/specs/semconv/))
|
|
615
|
+
- Keep cardinality low (no user IDs, timestamps)
|
|
616
|
+
- Add context-specific data
|
|
617
|
+
- Record error details
|
|
618
|
+
|
|
619
|
+
**❌ Don't:**
|
|
620
|
+
|
|
621
|
+
- Include sensitive data (passwords, tokens)
|
|
622
|
+
- Add high-cardinality values
|
|
623
|
+
- Log entire request/response bodies
|
|
624
|
+
- Duplicate data already in span name
|
|
625
|
+
|
|
626
|
+
### Error Handling
|
|
627
|
+
|
|
628
|
+
Always record exceptions:
|
|
629
|
+
|
|
630
|
+
```javascript
|
|
631
|
+
try {
|
|
632
|
+
await riskyOperation();
|
|
633
|
+
} catch (error) {
|
|
634
|
+
span.recordException(error);
|
|
635
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
636
|
+
throw error;
|
|
637
|
+
}
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
### Service Resource Attributes
|
|
641
|
+
|
|
642
|
+
Always set these resource attributes:
|
|
643
|
+
|
|
644
|
+
```javascript
|
|
645
|
+
{
|
|
646
|
+
'service.name': 'order-service',
|
|
647
|
+
'service.version': '2.1.0',
|
|
648
|
+
'service.namespace': 'production',
|
|
649
|
+
'deployment.environment': 'production',
|
|
650
|
+
'service.instance.id': process.env.HOSTNAME,
|
|
651
|
+
}
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
## Performance Tuning
|
|
655
|
+
|
|
656
|
+
### Batch Span Processor
|
|
657
|
+
|
|
658
|
+
Use batch processing for better performance:
|
|
659
|
+
|
|
660
|
+
```javascript
|
|
661
|
+
const { BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base');
|
|
662
|
+
|
|
663
|
+
const processor = new BatchSpanProcessor(exporter, {
|
|
664
|
+
maxQueueSize: 2048,
|
|
665
|
+
maxExportBatchSize: 512,
|
|
666
|
+
scheduledDelayMillis: 5000,
|
|
667
|
+
exportTimeoutMillis: 30000,
|
|
668
|
+
});
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
### Reduce Overhead
|
|
672
|
+
|
|
673
|
+
1. **Sample appropriately** - Don't trace everything in production
|
|
674
|
+
2. **Limit span attributes** - Only add valuable metadata
|
|
675
|
+
3. **Use async export** - Never block on span export
|
|
676
|
+
4. **Tune batch sizes** - Balance latency vs throughput
|
|
677
|
+
5. **Filter noisy spans** - Skip health checks, static assets
|
|
678
|
+
|
|
679
|
+
## Use Cases
|
|
680
|
+
|
|
681
|
+
### Microservices Debugging
|
|
682
|
+
|
|
683
|
+
- Trace requests across multiple services
|
|
684
|
+
- Identify slow service calls
|
|
685
|
+
- Find cascading failures
|
|
686
|
+
- Understand service dependencies
|
|
687
|
+
|
|
688
|
+
### Performance Optimization
|
|
689
|
+
|
|
690
|
+
- Find bottlenecks in request flow
|
|
691
|
+
- Identify slow database queries
|
|
692
|
+
- Compare fast vs slow requests
|
|
693
|
+
- Measure third-party API latency
|
|
694
|
+
|
|
695
|
+
### Error Investigation
|
|
696
|
+
|
|
697
|
+
- See full context of errors
|
|
698
|
+
- Identify error propagation
|
|
699
|
+
- Find intermittent failures
|
|
700
|
+
- Correlate errors with specific conditions
|
|
701
|
+
|
|
702
|
+
### Capacity Planning
|
|
703
|
+
|
|
704
|
+
- Understand traffic patterns
|
|
705
|
+
- Identify hot paths
|
|
706
|
+
- Measure resource usage
|
|
707
|
+
- Predict scaling needs
|
|
708
|
+
|
|
709
|
+
## Troubleshooting
|
|
710
|
+
|
|
711
|
+
### No traces appearing
|
|
712
|
+
|
|
713
|
+
**Check Jaeger is running:**
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
docker-compose ps jaeger
|
|
717
|
+
docker-compose logs jaeger
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
**Verify OTLP is enabled:**
|
|
721
|
+
|
|
722
|
+
```bash
|
|
723
|
+
docker-compose exec jaeger env | grep COLLECTOR_OTLP_ENABLED
|
|
724
|
+
# Should show: COLLECTOR_OTLP_ENABLED=true
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
**Test connectivity:**
|
|
728
|
+
|
|
729
|
+
```bash
|
|
730
|
+
# From dev container
|
|
731
|
+
curl -v http://jaeger:4317
|
|
732
|
+
# or
|
|
733
|
+
curl -v http://otel-collector:4317
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
**Check application configuration:**
|
|
737
|
+
|
|
738
|
+
```javascript
|
|
739
|
+
// Verify exporter endpoint
|
|
740
|
+
console.log('OTLP endpoint:', exporter.url);
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
### UI not loading
|
|
744
|
+
|
|
745
|
+
**Verify port forwarding:**
|
|
746
|
+
|
|
747
|
+
```bash
|
|
748
|
+
curl http://localhost:16686
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
**Check Jaeger health:**
|
|
752
|
+
|
|
753
|
+
```bash
|
|
754
|
+
docker-compose logs jaeger | grep -i error
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
**Access UI directly:**
|
|
758
|
+
|
|
759
|
+
- Ensure port 16686 is exposed
|
|
760
|
+
- Check firewall rules
|
|
761
|
+
- Try `http://127.0.0.1:16686`
|
|
762
|
+
|
|
763
|
+
### Spans missing or incomplete
|
|
764
|
+
|
|
765
|
+
**Check sampling:**
|
|
766
|
+
|
|
767
|
+
```javascript
|
|
768
|
+
// Ensure sampler is configured correctly
|
|
769
|
+
// AlwaysOnSampler for development
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
**Verify span export:**
|
|
773
|
+
|
|
774
|
+
```bash
|
|
775
|
+
# Enable debug logging
|
|
776
|
+
OTEL_LOG_LEVEL=debug node app.js
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
**Check batch processor:**
|
|
780
|
+
|
|
781
|
+
```javascript
|
|
782
|
+
// Force flush before shutdown
|
|
783
|
+
await sdk.shutdown();
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
### High memory usage
|
|
787
|
+
|
|
788
|
+
**Reduce sampling rate:**
|
|
789
|
+
|
|
790
|
+
```javascript
|
|
791
|
+
sampler: new TraceIdRatioBasedSampler(0.01), // 1%
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
**Limit span attributes:**
|
|
795
|
+
|
|
796
|
+
```javascript
|
|
797
|
+
// Don't add large payloads
|
|
798
|
+
span.setAttributes({
|
|
799
|
+
'http.request.body': requestBody, // ❌ Bad
|
|
800
|
+
'http.request.size': requestBody.length, // ✅ Good
|
|
801
|
+
});
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
**Tune batch processor:**
|
|
805
|
+
|
|
806
|
+
```javascript
|
|
807
|
+
maxQueueSize: 1024, // Reduce queue size
|
|
808
|
+
scheduledDelayMillis: 2000, // Export more frequently
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
### Performance overhead
|
|
812
|
+
|
|
813
|
+
**Use async exporters:**
|
|
814
|
+
|
|
815
|
+
```python
|
|
816
|
+
# Batch processor exports asynchronously
|
|
817
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
**Sample intelligently:**
|
|
821
|
+
|
|
822
|
+
```javascript
|
|
823
|
+
// Sample errors at 100%, success at 10%
|
|
824
|
+
class ErrorSampler {
|
|
825
|
+
shouldSample(context, traceId, spanName, spanKind, attributes) {
|
|
826
|
+
if (attributes['http.status_code'] >= 400) {
|
|
827
|
+
return { decision: SamplingDecision.RECORD_AND_SAMPLED };
|
|
828
|
+
}
|
|
829
|
+
return this.baseSampler.shouldSample(context, traceId, spanName, spanKind, attributes);
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
```
|
|
833
|
+
|
|
834
|
+
**Skip non-critical operations:**
|
|
835
|
+
|
|
836
|
+
```javascript
|
|
837
|
+
// Don't trace health checks
|
|
838
|
+
if (req.path === '/health') {
|
|
839
|
+
return next();
|
|
840
|
+
}
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
## Related Overlays
|
|
844
|
+
|
|
845
|
+
- **otel-collector** - Centralized telemetry collection and processing
|
|
846
|
+
- **prometheus** - Metrics collection for correlation with traces
|
|
847
|
+
- **grafana** - Unified observability dashboards (traces, metrics, logs)
|
|
848
|
+
- **loki** - Log aggregation for trace-log correlation
|
|
849
|
+
- **nodejs/python/dotnet** - Application frameworks with auto-instrumentation
|
|
850
|
+
|
|
851
|
+
## Additional Resources
|
|
852
|
+
|
|
853
|
+
- [Jaeger Documentation](https://www.jaegertracing.io/docs/)
|
|
854
|
+
- [OpenTelemetry Tracing Specification](https://opentelemetry.io/docs/specs/otel/trace/)
|
|
855
|
+
- [Jaeger Architecture](https://www.jaegertracing.io/docs/latest/architecture/)
|
|
856
|
+
- [W3C Trace Context](https://www.w3.org/TR/trace-context/)
|
|
857
|
+
- [OpenTelemetry Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/)
|
|
858
|
+
- [Distributed Tracing Best Practices](https://opentelemetry.io/docs/concepts/signals/traces/)
|
|
859
|
+
|
|
860
|
+
## Notes
|
|
861
|
+
|
|
862
|
+
- This overlay **requires compose stack** (uses docker-compose)
|
|
863
|
+
- Jaeger UI runs on port **16686** (configurable with port-offset)
|
|
864
|
+
- When used with **otel-collector**, send traces to collector on port 4317
|
|
865
|
+
- When used standalone, send directly to Jaeger on port 4317
|
|
866
|
+
- In-memory storage is **not persistent** - traces are lost on container restart
|
|
867
|
+
- For production, use persistent storage (Elasticsearch, Cassandra, Kafka)
|