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,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"runServices": ["otel-collector"],
|
|
4
|
+
"_serviceOrder": 2,
|
|
5
|
+
"forwardPorts": [4317, 4318, 8888, 8889, 13133],
|
|
6
|
+
"portsAttributes": {
|
|
7
|
+
"4317": {
|
|
8
|
+
"label": "OTLP gRPC",
|
|
9
|
+
"onAutoForward": "silent"
|
|
10
|
+
},
|
|
11
|
+
"4318": {
|
|
12
|
+
"label": "OTLP HTTP",
|
|
13
|
+
"onAutoForward": "silent"
|
|
14
|
+
},
|
|
15
|
+
"8888": {
|
|
16
|
+
"label": "Collector Metrics",
|
|
17
|
+
"onAutoForward": "silent"
|
|
18
|
+
},
|
|
19
|
+
"8889": {
|
|
20
|
+
"label": "Prometheus Exporter",
|
|
21
|
+
"onAutoForward": "silent"
|
|
22
|
+
},
|
|
23
|
+
"13133": {
|
|
24
|
+
"label": "Health Check",
|
|
25
|
+
"onAutoForward": "silent"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
otel-collector:
|
|
4
|
+
image: otel/opentelemetry-collector-contrib:${OTEL_COLLECTOR_VERSION:-latest}
|
|
5
|
+
command: ['--config=/etc/otel-collector-config.yaml']
|
|
6
|
+
volumes:
|
|
7
|
+
- ./otel-collector-config-otel-collector.yaml:/etc/otel-collector-config.yaml
|
|
8
|
+
ports:
|
|
9
|
+
- '${OTEL_GRPC_PORT:-4317}:4317' # OTLP gRPC receiver
|
|
10
|
+
- '${OTEL_HTTP_PORT:-4318}:4318' # OTLP HTTP receiver
|
|
11
|
+
- '${OTEL_METRICS_PORT:-8888}:8888' # Prometheus metrics exposed by collector
|
|
12
|
+
- '${OTEL_EXPORTER_PORT:-8889}:8889' # Prometheus exporter
|
|
13
|
+
- '${OTEL_HEALTH_PORT:-13133}:13133' # health_check extension
|
|
14
|
+
depends_on:
|
|
15
|
+
- jaeger
|
|
16
|
+
- prometheus
|
|
17
|
+
- loki
|
|
18
|
+
networks:
|
|
19
|
+
- devnet
|
|
20
|
+
|
|
21
|
+
networks:
|
|
22
|
+
devnet:
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
receivers:
|
|
2
|
+
otlp:
|
|
3
|
+
protocols:
|
|
4
|
+
grpc:
|
|
5
|
+
endpoint: 0.0.0.0:4317
|
|
6
|
+
http:
|
|
7
|
+
endpoint: 0.0.0.0:4318
|
|
8
|
+
|
|
9
|
+
processors:
|
|
10
|
+
batch:
|
|
11
|
+
timeout: 10s
|
|
12
|
+
send_batch_size: 1024
|
|
13
|
+
memory_limiter:
|
|
14
|
+
check_interval: 1s
|
|
15
|
+
limit_mib: 512
|
|
16
|
+
|
|
17
|
+
exporters:
|
|
18
|
+
# Export traces to Jaeger
|
|
19
|
+
otlp/jaeger:
|
|
20
|
+
endpoint: jaeger:4317
|
|
21
|
+
tls:
|
|
22
|
+
insecure: true
|
|
23
|
+
|
|
24
|
+
# Export traces to Tempo
|
|
25
|
+
otlp/tempo:
|
|
26
|
+
endpoint: tempo:4317
|
|
27
|
+
tls:
|
|
28
|
+
insecure: true
|
|
29
|
+
|
|
30
|
+
# Export metrics to Prometheus
|
|
31
|
+
prometheus:
|
|
32
|
+
endpoint: '0.0.0.0:8889'
|
|
33
|
+
|
|
34
|
+
# Export logs to Loki
|
|
35
|
+
loki:
|
|
36
|
+
endpoint: http://loki:3100/loki/api/v1/push
|
|
37
|
+
labels:
|
|
38
|
+
attributes:
|
|
39
|
+
service.name: 'service_name'
|
|
40
|
+
severity: 'severity'
|
|
41
|
+
|
|
42
|
+
# Debug exporter for development
|
|
43
|
+
debug:
|
|
44
|
+
verbosity: detailed
|
|
45
|
+
|
|
46
|
+
service:
|
|
47
|
+
extensions: [health_check]
|
|
48
|
+
pipelines:
|
|
49
|
+
traces:
|
|
50
|
+
receivers: [otlp]
|
|
51
|
+
processors: [memory_limiter, batch]
|
|
52
|
+
# Note: Configure exporters based on selected tracing backend
|
|
53
|
+
# - For Jaeger: [otlp/jaeger, debug]
|
|
54
|
+
# - For Tempo: [otlp/tempo, debug]
|
|
55
|
+
# - For both: [otlp/jaeger, otlp/tempo, debug] (not recommended)
|
|
56
|
+
exporters: [otlp/jaeger, debug]
|
|
57
|
+
metrics:
|
|
58
|
+
receivers: [otlp]
|
|
59
|
+
processors: [memory_limiter, batch]
|
|
60
|
+
exporters: [prometheus, debug]
|
|
61
|
+
logs:
|
|
62
|
+
receivers: [otlp]
|
|
63
|
+
processors: [memory_limiter, batch]
|
|
64
|
+
exporters: [loki, debug]
|
|
65
|
+
|
|
66
|
+
extensions:
|
|
67
|
+
health_check:
|
|
68
|
+
endpoint: 0.0.0.0:13133
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
id: otel-collector
|
|
2
|
+
name: OpenTelemetry Collector
|
|
3
|
+
description: Telemetry collection pipeline
|
|
4
|
+
category: observability
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires: []
|
|
8
|
+
suggests:
|
|
9
|
+
- jaeger
|
|
10
|
+
- prometheus
|
|
11
|
+
conflicts: []
|
|
12
|
+
tags:
|
|
13
|
+
- observability
|
|
14
|
+
- telemetry
|
|
15
|
+
- opentelemetry
|
|
16
|
+
ports:
|
|
17
|
+
- 4317
|
|
18
|
+
- 4318
|
|
19
|
+
- 8888
|
|
20
|
+
- 8889
|
|
21
|
+
order: 2
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# OpenTelemetry Collector setup script - Configure trace backend
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
echo "🔧 Configuring OpenTelemetry Collector trace backend..."
|
|
7
|
+
|
|
8
|
+
# Determine workspace root dynamically
|
|
9
|
+
WORKSPACE_ROOT="${LOCAL_WORKSPACE_FOLDER:-$PWD}"
|
|
10
|
+
|
|
11
|
+
if [ ! -d "$WORKSPACE_ROOT/.devcontainer" ]; then
|
|
12
|
+
if [ -d "/workspaces" ]; then
|
|
13
|
+
FIRST_WORKSPACE_DIR="$(find /workspaces -maxdepth 1 -mindepth 1 -type d 2>/dev/null | head -n 1)"
|
|
14
|
+
if [ -n "$FIRST_WORKSPACE_DIR" ] && [ -d "$FIRST_WORKSPACE_DIR/.devcontainer" ]; then
|
|
15
|
+
WORKSPACE_ROOT="$FIRST_WORKSPACE_DIR"
|
|
16
|
+
fi
|
|
17
|
+
fi
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
if [ ! -d "$WORKSPACE_ROOT/.devcontainer" ] && [ -d "/workspace/.devcontainer" ]; then
|
|
21
|
+
WORKSPACE_ROOT="/workspace"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
OTEL_CONFIG="$WORKSPACE_ROOT/.devcontainer/otel-collector-config-otel-collector.yaml"
|
|
25
|
+
|
|
26
|
+
if [ ! -f "$OTEL_CONFIG" ]; then
|
|
27
|
+
echo "⚠️ OTel Collector config not found"
|
|
28
|
+
exit 0
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Check which tracing backend is configured
|
|
32
|
+
JAEGER_RUNNING=$(docker ps --filter "name=jaeger" --format "{{.Names}}" 2>/dev/null || echo "")
|
|
33
|
+
TEMPO_RUNNING=$(docker ps --filter "name=tempo" --format "{{.Names}}" 2>/dev/null || echo "")
|
|
34
|
+
|
|
35
|
+
if [ -n "$TEMPO_RUNNING" ] && [ -z "$JAEGER_RUNNING" ]; then
|
|
36
|
+
echo "📝 Configuring for Tempo backend..."
|
|
37
|
+
# Update config to use Tempo
|
|
38
|
+
sed -i 's/exporters: \[otlp\/jaeger, debug\]/exporters: [otlp\/tempo, debug]/' "$OTEL_CONFIG"
|
|
39
|
+
echo "✓ Configured to export traces to Tempo"
|
|
40
|
+
elif [ -n "$JAEGER_RUNNING" ] && [ -z "$TEMPO_RUNNING" ]; then
|
|
41
|
+
echo "📝 Configuring for Jaeger backend..."
|
|
42
|
+
# Update config to use Jaeger (default)
|
|
43
|
+
sed -i 's/exporters: \[otlp\/tempo, debug\]/exporters: [otlp\/jaeger, debug]/' "$OTEL_CONFIG"
|
|
44
|
+
echo "✓ Configured to export traces to Jaeger"
|
|
45
|
+
else
|
|
46
|
+
echo "ℹ️ Using default configuration (Jaeger)"
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
echo "✓ OpenTelemetry Collector setup complete"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
FROM node:18-alpine
|
|
2
|
+
|
|
3
|
+
WORKDIR /app
|
|
4
|
+
|
|
5
|
+
# Copy package files
|
|
6
|
+
COPY ./package-otel-demo-nodejs.json package.json
|
|
7
|
+
COPY ./server-otel-demo-nodejs.js server.js
|
|
8
|
+
COPY ./tracing-otel-demo-nodejs.js tracing.js
|
|
9
|
+
|
|
10
|
+
# Install dependencies
|
|
11
|
+
RUN npm install --production
|
|
12
|
+
|
|
13
|
+
# Expose port
|
|
14
|
+
EXPOSE 8080
|
|
15
|
+
|
|
16
|
+
# Start with OpenTelemetry instrumentation
|
|
17
|
+
CMD ["node", "--require", "./tracing.js", "server.js"]
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# OpenTelemetry Demo - Node.js
|
|
2
|
+
|
|
3
|
+
Sample Node.js application fully instrumented with OpenTelemetry to demonstrate distributed tracing, metrics, and logging in the observability stack.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Auto-instrumentation** - Automatic HTTP request tracing
|
|
8
|
+
- **Custom metrics** - Request counters, duration histograms, active requests
|
|
9
|
+
- **Structured logs** - JSON formatted logs with trace context
|
|
10
|
+
- **Multiple endpoints** - Various scenarios (normal, slow, error)
|
|
11
|
+
- **OTLP export** - Sends traces and metrics to OpenTelemetry Collector
|
|
12
|
+
- **Zero-config** - Works out-of-box with the observability stack
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
This demo application showcases the three pillars of observability:
|
|
17
|
+
|
|
18
|
+
**1. Traces (Distributed Tracing):**
|
|
19
|
+
|
|
20
|
+
- Auto-instrumented HTTP server
|
|
21
|
+
- Custom spans for business logic
|
|
22
|
+
- Trace context propagation
|
|
23
|
+
- Parent-child span relationships
|
|
24
|
+
|
|
25
|
+
**2. Metrics (Time-Series Data):**
|
|
26
|
+
|
|
27
|
+
- `http_requests_total` - Counter of all HTTP requests
|
|
28
|
+
- `http_request_duration_seconds` - Histogram of request latencies
|
|
29
|
+
- `http_requests_active` - Gauge of concurrent requests
|
|
30
|
+
|
|
31
|
+
**3. Logs (Structured Logging):**
|
|
32
|
+
|
|
33
|
+
- JSON formatted logs
|
|
34
|
+
- Trace ID and span ID correlation
|
|
35
|
+
- Log levels (info, warn, error)
|
|
36
|
+
- Searchable in Loki
|
|
37
|
+
|
|
38
|
+
**Architecture:**
|
|
39
|
+
|
|
40
|
+
```mermaid
|
|
41
|
+
graph TD
|
|
42
|
+
A[OTel Demo App Node.js<br/>HTTP server on port 8080<br/>OpenTelemetry SDK<br/>Auto-instrumentation] -->|OTLP gRPC| B[OpenTelemetry Collector<br/>Receives OTLP data<br/>Routes to backends]
|
|
43
|
+
B --> C[Jaeger/Tempo]
|
|
44
|
+
B --> D[Prometheus]
|
|
45
|
+
B --> E[Loki]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Configuration
|
|
49
|
+
|
|
50
|
+
### Ports
|
|
51
|
+
|
|
52
|
+
- `8080` - HTTP API (web interface and endpoints)
|
|
53
|
+
|
|
54
|
+
### Environment Variables
|
|
55
|
+
|
|
56
|
+
The service is configured via environment variables in docker-compose:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# OTLP endpoint (OpenTelemetry Collector)
|
|
60
|
+
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
|
|
61
|
+
|
|
62
|
+
# Service identification
|
|
63
|
+
OTEL_SERVICE_NAME=otel-demo-nodejs
|
|
64
|
+
OTEL_RESOURCE_ATTRIBUTES=service.version=1.0.0,deployment.environment=dev
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Dependencies
|
|
68
|
+
|
|
69
|
+
Requires:
|
|
70
|
+
|
|
71
|
+
- **otel-collector** - Required to receive and route telemetry
|
|
72
|
+
- **jaeger** or **tempo** - Recommended for trace visualization
|
|
73
|
+
- **prometheus** - Recommended for metrics visualization
|
|
74
|
+
- **loki** - Recommended for log aggregation
|
|
75
|
+
- **grafana** - Recommended for unified visualization
|
|
76
|
+
|
|
77
|
+
## Available Endpoints
|
|
78
|
+
|
|
79
|
+
### GET /
|
|
80
|
+
|
|
81
|
+
**Home page** with documentation and links to test endpoints.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
curl http://localhost:8080/
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### GET /api/data
|
|
88
|
+
|
|
89
|
+
**Returns JSON data** with trace context. Creates child spans for data processing.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
curl http://localhost:8080/api/data
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Example response:**
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"timestamp": "2024-01-15T10:30:00.000Z",
|
|
100
|
+
"items": [
|
|
101
|
+
{ "id": 1, "name": "Item 1", "value": 42.5 },
|
|
102
|
+
{ "id": 2, "name": "Item 2", "value": 78.3 },
|
|
103
|
+
{ "id": 3, "name": "Item 3", "value": 15.9 }
|
|
104
|
+
],
|
|
105
|
+
"trace": {
|
|
106
|
+
"traceId": "a1b2c3d4e5f6...",
|
|
107
|
+
"spanId": "123abc..."
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### GET /api/slow
|
|
113
|
+
|
|
114
|
+
**Simulates slow request** with 2-second delay. Useful for testing latency alerts and p99 metrics.
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
curl http://localhost:8080/api/slow
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### GET /api/error
|
|
121
|
+
|
|
122
|
+
**Simulates error** returning 500 status. Useful for testing error alerts and exception tracking.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
curl http://localhost:8080/api/error
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### GET /health
|
|
129
|
+
|
|
130
|
+
**Health check endpoint** for monitoring.
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
curl http://localhost:8080/health
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Viewing Observability Data
|
|
137
|
+
|
|
138
|
+
### Traces in Grafana
|
|
139
|
+
|
|
140
|
+
1. Open Grafana: http://localhost:3000
|
|
141
|
+
2. Go to **Explore**
|
|
142
|
+
3. Select **Jaeger** or **Tempo** datasource
|
|
143
|
+
4. Search for traces:
|
|
144
|
+
- Service: `otel-demo-nodejs`
|
|
145
|
+
- Operation: `GET /api/data`
|
|
146
|
+
|
|
147
|
+
**TraceQL query (for Tempo):**
|
|
148
|
+
|
|
149
|
+
```traceql
|
|
150
|
+
{ service.name = "otel-demo-nodejs" }
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**What you'll see:**
|
|
154
|
+
|
|
155
|
+
- Request spans with timing
|
|
156
|
+
- Parent-child relationships
|
|
157
|
+
- HTTP metadata (method, status, URL)
|
|
158
|
+
- Custom events and attributes
|
|
159
|
+
|
|
160
|
+
### Metrics in Grafana
|
|
161
|
+
|
|
162
|
+
1. Open Grafana: http://localhost:3000
|
|
163
|
+
2. Go to **Explore**
|
|
164
|
+
3. Select **Prometheus** datasource
|
|
165
|
+
4. Query metrics:
|
|
166
|
+
|
|
167
|
+
**Request rate:**
|
|
168
|
+
|
|
169
|
+
```promql
|
|
170
|
+
rate(http_requests_total{service="otel-demo-nodejs"}[5m])
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Request duration (p99):**
|
|
174
|
+
|
|
175
|
+
```promql
|
|
176
|
+
histogram_quantile(0.99,
|
|
177
|
+
rate(http_request_duration_seconds_bucket{service="otel-demo-nodejs"}[5m])
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Active requests:**
|
|
182
|
+
|
|
183
|
+
```promql
|
|
184
|
+
http_requests_active{service="otel-demo-nodejs"}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Error rate:**
|
|
188
|
+
|
|
189
|
+
```promql
|
|
190
|
+
rate(http_requests_total{service="otel-demo-nodejs", status="500"}[5m])
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Logs in Grafana
|
|
194
|
+
|
|
195
|
+
1. Open Grafana: http://localhost:3000
|
|
196
|
+
2. Go to **Explore**
|
|
197
|
+
3. Select **Loki** datasource
|
|
198
|
+
4. Query logs:
|
|
199
|
+
|
|
200
|
+
**All logs from service:**
|
|
201
|
+
|
|
202
|
+
```logql
|
|
203
|
+
{service="otel-demo-nodejs"}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Error logs only:**
|
|
207
|
+
|
|
208
|
+
```logql
|
|
209
|
+
{service="otel-demo-nodejs"} | json | level="error"
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Logs for specific trace:**
|
|
213
|
+
|
|
214
|
+
```logql
|
|
215
|
+
{service="otel-demo-nodejs"} | json | `trace.id`="a1b2c3d4..."
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Logs with rate:**
|
|
219
|
+
|
|
220
|
+
```logql
|
|
221
|
+
rate({service="otel-demo-nodejs"} | json | level="error" [5m])
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Use Cases
|
|
225
|
+
|
|
226
|
+
- **Learning OpenTelemetry** - See instrumentation in action
|
|
227
|
+
- **Testing observability stack** - Verify traces, metrics, and logs work
|
|
228
|
+
- **Dashboard development** - Real data for creating Grafana dashboards
|
|
229
|
+
- **Alert testing** - Generate test data for alert rules
|
|
230
|
+
- **Demo purposes** - Show complete observability workflow
|
|
231
|
+
|
|
232
|
+
## Testing the Complete Stack
|
|
233
|
+
|
|
234
|
+
**1. Generate traffic:**
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
# Normal requests
|
|
238
|
+
for i in {1..10}; do curl http://localhost:8080/api/data; done
|
|
239
|
+
|
|
240
|
+
# Slow requests
|
|
241
|
+
for i in {1..5}; do curl http://localhost:8080/api/slow; done
|
|
242
|
+
|
|
243
|
+
# Error requests
|
|
244
|
+
for i in {1..3}; do curl http://localhost:8080/api/error; done
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**2. View traces:**
|
|
248
|
+
|
|
249
|
+
- Open Grafana → Explore → Jaeger/Tempo
|
|
250
|
+
- Search for `otel-demo-nodejs`
|
|
251
|
+
- Click on traces to see spans
|
|
252
|
+
|
|
253
|
+
**3. View metrics:**
|
|
254
|
+
|
|
255
|
+
- Open Grafana → Explore → Prometheus
|
|
256
|
+
- Query: `rate(http_requests_total[5m])`
|
|
257
|
+
- Create dashboard with panels
|
|
258
|
+
|
|
259
|
+
**4. View logs:**
|
|
260
|
+
|
|
261
|
+
- Open Grafana → Explore → Loki
|
|
262
|
+
- Query: `{service="otel-demo-nodejs"}`
|
|
263
|
+
- Filter by trace ID from spans
|
|
264
|
+
|
|
265
|
+
**5. Correlate data:**
|
|
266
|
+
|
|
267
|
+
- Click trace ID in logs → jumps to trace
|
|
268
|
+
- Click "Logs for this span" in trace → jumps to logs
|
|
269
|
+
- View metrics dashboard with trace exemplars
|
|
270
|
+
|
|
271
|
+
## Customization
|
|
272
|
+
|
|
273
|
+
### Adding Custom Spans
|
|
274
|
+
|
|
275
|
+
```javascript
|
|
276
|
+
const { trace } = require('@opentelemetry/api');
|
|
277
|
+
const tracer = trace.getTracer('my-app');
|
|
278
|
+
|
|
279
|
+
function myFunction() {
|
|
280
|
+
const span = tracer.startSpan('my_operation');
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
// Your code here
|
|
284
|
+
span.setAttribute('key', 'value');
|
|
285
|
+
span.addEvent('Something happened');
|
|
286
|
+
} finally {
|
|
287
|
+
span.end();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Adding Custom Metrics
|
|
293
|
+
|
|
294
|
+
```javascript
|
|
295
|
+
const { metrics } = require('@opentelemetry/api');
|
|
296
|
+
const meter = metrics.getMeter('my-app');
|
|
297
|
+
|
|
298
|
+
const myCounter = meter.createCounter('my_counter', {
|
|
299
|
+
description: 'Counts something',
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
myCounter.add(1, { label: 'value' });
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Adding Structured Logs
|
|
306
|
+
|
|
307
|
+
```javascript
|
|
308
|
+
logger.info({
|
|
309
|
+
msg: 'User action',
|
|
310
|
+
userId: '123',
|
|
311
|
+
action: 'login',
|
|
312
|
+
'trace.id': span.spanContext().traceId,
|
|
313
|
+
});
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Troubleshooting
|
|
317
|
+
|
|
318
|
+
### Issue: No Traces Appearing
|
|
319
|
+
|
|
320
|
+
**Symptoms:**
|
|
321
|
+
|
|
322
|
+
- App running but no traces in Jaeger/Tempo
|
|
323
|
+
|
|
324
|
+
**Solutions:**
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
# Check OTLP endpoint is reachable
|
|
328
|
+
docker exec otel-demo-nodejs wget -O- http://otel-collector:4317
|
|
329
|
+
|
|
330
|
+
# Check otel-collector is running
|
|
331
|
+
docker ps | grep otel-collector
|
|
332
|
+
|
|
333
|
+
# Check app logs for errors
|
|
334
|
+
docker logs otel-demo-nodejs
|
|
335
|
+
|
|
336
|
+
# Verify otel-collector config includes OTLP receiver
|
|
337
|
+
docker exec otel-collector cat /etc/otel-collector-config.yaml
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Issue: No Metrics Appearing
|
|
341
|
+
|
|
342
|
+
**Symptoms:**
|
|
343
|
+
|
|
344
|
+
- Traces work but metrics don't show in Prometheus
|
|
345
|
+
|
|
346
|
+
**Solutions:**
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
# Check otel-collector exports to Prometheus
|
|
350
|
+
# Look for prometheusexporter in otel-collector config
|
|
351
|
+
|
|
352
|
+
# Check Prometheus scrapes otel-collector
|
|
353
|
+
curl http://prometheus:9090/api/v1/targets
|
|
354
|
+
|
|
355
|
+
# Check app exports metrics
|
|
356
|
+
docker logs otel-demo-nodejs | grep "metric"
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Issue: No Logs in Loki
|
|
360
|
+
|
|
361
|
+
**Symptoms:**
|
|
362
|
+
|
|
363
|
+
- App logs to stdout but not in Loki
|
|
364
|
+
|
|
365
|
+
**Solutions:**
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
# Check promtail is running (if using promtail)
|
|
369
|
+
docker ps | grep promtail
|
|
370
|
+
|
|
371
|
+
# Check container logs are available
|
|
372
|
+
docker logs otel-demo-nodejs
|
|
373
|
+
|
|
374
|
+
# Verify log format is JSON
|
|
375
|
+
docker logs otel-demo-nodejs | head -1 | jq .
|
|
376
|
+
|
|
377
|
+
# Check promtail discovers the container
|
|
378
|
+
docker logs promtail | grep otel-demo-nodejs
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Performance Considerations
|
|
382
|
+
|
|
383
|
+
**Resource Usage:**
|
|
384
|
+
|
|
385
|
+
- **CPU:** ~10-20% during load (single-core)
|
|
386
|
+
- **Memory:** ~150MB (Node.js + OpenTelemetry SDK)
|
|
387
|
+
- **Network:** Minimal (batched OTLP exports)
|
|
388
|
+
|
|
389
|
+
**For production-like testing:**
|
|
390
|
+
|
|
391
|
+
- Increase traffic volume with load testing tools
|
|
392
|
+
- Adjust export intervals in `tracing.js`
|
|
393
|
+
- Configure sampling for high-traffic scenarios
|
|
394
|
+
|
|
395
|
+
## References
|
|
396
|
+
|
|
397
|
+
- [OpenTelemetry JavaScript](https://opentelemetry.io/docs/instrumentation/js/)
|
|
398
|
+
- [OpenTelemetry SDK for Node.js](https://github.com/open-telemetry/opentelemetry-js)
|
|
399
|
+
- [OTLP Exporters](https://opentelemetry.io/docs/reference/specification/protocol/otlp/)
|
|
400
|
+
- [Auto-instrumentation](https://opentelemetry.io/docs/instrumentation/js/automatic/)
|
|
401
|
+
|
|
402
|
+
**Related Overlays:**
|
|
403
|
+
|
|
404
|
+
- `otel-collector` - Required for receiving telemetry
|
|
405
|
+
- `jaeger` or `tempo` - Trace visualization
|
|
406
|
+
- `prometheus` - Metrics storage
|
|
407
|
+
- `loki` - Log aggregation
|
|
408
|
+
- `grafana` - Unified observability UI
|
|
409
|
+
- `promtail` - Optional log shipping (auto-discovers containers)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"runServices": ["otel-demo-nodejs"],
|
|
4
|
+
"_serviceOrder": 3,
|
|
5
|
+
"forwardPorts": [8080],
|
|
6
|
+
"portsAttributes": {
|
|
7
|
+
"8080": {
|
|
8
|
+
"label": "OTel Demo (Node.js)",
|
|
9
|
+
"onAutoForward": "openBrowser"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
otel-demo-nodejs:
|
|
4
|
+
build:
|
|
5
|
+
context: .
|
|
6
|
+
dockerfile: ./Dockerfile-otel-demo-nodejs
|
|
7
|
+
environment:
|
|
8
|
+
- OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
|
|
9
|
+
- OTEL_SERVICE_NAME=otel-demo-nodejs
|
|
10
|
+
- OTEL_RESOURCE_ATTRIBUTES=service.version=1.0.0,deployment.environment=dev
|
|
11
|
+
ports:
|
|
12
|
+
- '${OTEL_DEMO_NODEJS_PORT:-8080}:8080'
|
|
13
|
+
depends_on:
|
|
14
|
+
- otel-collector
|
|
15
|
+
networks:
|
|
16
|
+
- devnet
|
|
17
|
+
|
|
18
|
+
networks:
|
|
19
|
+
devnet:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
id: otel-demo-nodejs
|
|
2
|
+
name: OTel Demo (Node.js)
|
|
3
|
+
description: Sample Node.js app with OpenTelemetry instrumentation
|
|
4
|
+
category: observability
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires:
|
|
8
|
+
- otel-collector
|
|
9
|
+
suggests:
|
|
10
|
+
- jaeger
|
|
11
|
+
- tempo
|
|
12
|
+
- prometheus
|
|
13
|
+
- loki
|
|
14
|
+
- grafana
|
|
15
|
+
conflicts: []
|
|
16
|
+
tags:
|
|
17
|
+
- observability
|
|
18
|
+
- demo
|
|
19
|
+
- nodejs
|
|
20
|
+
- opentelemetry
|
|
21
|
+
ports:
|
|
22
|
+
- 8080
|
|
23
|
+
order: 4
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "otel-demo-nodejs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "OpenTelemetry demo application in Node.js",
|
|
5
|
+
"main": "server.js",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@opentelemetry/api": "^1.7.0",
|
|
8
|
+
"@opentelemetry/auto-instrumentations-node": "^0.40.0",
|
|
9
|
+
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.45.1",
|
|
10
|
+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.45.1",
|
|
11
|
+
"@opentelemetry/instrumentation": "^0.45.1",
|
|
12
|
+
"@opentelemetry/resources": "^1.19.0",
|
|
13
|
+
"@opentelemetry/sdk-metrics": "^1.19.0",
|
|
14
|
+
"@opentelemetry/sdk-node": "^0.45.1",
|
|
15
|
+
"@opentelemetry/sdk-trace-base": "^1.19.0",
|
|
16
|
+
"@opentelemetry/sdk-trace-node": "^1.19.0",
|
|
17
|
+
"@opentelemetry/semantic-conventions": "^1.19.0",
|
|
18
|
+
"pino": "^8.16.2"
|
|
19
|
+
}
|
|
20
|
+
}
|