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.
Files changed (327) hide show
  1. package/README.md +843 -0
  2. package/dist/scripts/init.d.ts +3 -0
  3. package/dist/scripts/init.d.ts.map +1 -0
  4. package/dist/scripts/init.js +1190 -0
  5. package/dist/scripts/init.js.map +1 -0
  6. package/dist/scripts/migrate-to-manifests.d.ts +12 -0
  7. package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
  8. package/dist/scripts/migrate-to-manifests.js +230 -0
  9. package/dist/scripts/migrate-to-manifests.js.map +1 -0
  10. package/dist/tool/questionnaire/composer.d.ts +6 -0
  11. package/dist/tool/questionnaire/composer.d.ts.map +1 -0
  12. package/dist/tool/questionnaire/composer.js +1232 -0
  13. package/dist/tool/questionnaire/composer.js.map +1 -0
  14. package/dist/tool/readme/markdown-parser.d.ts +30 -0
  15. package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
  16. package/dist/tool/readme/markdown-parser.js +139 -0
  17. package/dist/tool/readme/markdown-parser.js.map +1 -0
  18. package/dist/tool/readme/readme-generator.d.ts +9 -0
  19. package/dist/tool/readme/readme-generator.d.ts.map +1 -0
  20. package/dist/tool/readme/readme-generator.js +422 -0
  21. package/dist/tool/readme/readme-generator.js.map +1 -0
  22. package/dist/tool/schema/custom-loader.d.ts +17 -0
  23. package/dist/tool/schema/custom-loader.d.ts.map +1 -0
  24. package/dist/tool/schema/custom-loader.js +149 -0
  25. package/dist/tool/schema/custom-loader.js.map +1 -0
  26. package/dist/tool/schema/overlay-loader.d.ts +47 -0
  27. package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
  28. package/dist/tool/schema/overlay-loader.js +252 -0
  29. package/dist/tool/schema/overlay-loader.js.map +1 -0
  30. package/dist/tool/schema/types.d.ts +212 -0
  31. package/dist/tool/schema/types.d.ts.map +1 -0
  32. package/dist/tool/schema/types.js +5 -0
  33. package/dist/tool/schema/types.js.map +1 -0
  34. package/docs/README.md +308 -0
  35. package/docs/architecture.md +233 -0
  36. package/docs/creating-overlays.md +549 -0
  37. package/docs/custom-patches.md +540 -0
  38. package/docs/dependencies.md +279 -0
  39. package/docs/examples/custom-patches-example.md +85 -0
  40. package/docs/examples.md +576 -0
  41. package/docs/messaging-comparison.md +265 -0
  42. package/docs/messaging-quick-start.md +385 -0
  43. package/docs/observability-workflow.md +537 -0
  44. package/docs/overlay-manifest-refactoring.md +214 -0
  45. package/docs/overlay-metadata-archive.md +54 -0
  46. package/docs/overlays.md +523 -0
  47. package/docs/presets-architecture.md +498 -0
  48. package/docs/presets.md +366 -0
  49. package/docs/publishing.md +476 -0
  50. package/docs/quick-reference.md +326 -0
  51. package/docs/ux.md +170 -0
  52. package/features/README.md +85 -0
  53. package/features/cross-distro-packages/README.md +146 -0
  54. package/features/cross-distro-packages/devcontainer-feature.json +20 -0
  55. package/features/cross-distro-packages/install.sh +58 -0
  56. package/features/local-secrets-manager/devcontainer-feature.json +18 -0
  57. package/features/local-secrets-manager/install.sh +127 -0
  58. package/features/project-scaffolder/devcontainer-feature.json +24 -0
  59. package/features/project-scaffolder/install.sh +100 -0
  60. package/features/team-conventions/devcontainer-feature.json +24 -0
  61. package/features/team-conventions/install.sh +93 -0
  62. package/overlays/.registry/README.md +14 -0
  63. package/overlays/.registry/base-images.yml +26 -0
  64. package/overlays/.registry/base-templates.yml +7 -0
  65. package/overlays/README.md +155 -0
  66. package/overlays/alertmanager/.env.example +5 -0
  67. package/overlays/alertmanager/README.md +465 -0
  68. package/overlays/alertmanager/alert-rules.yml +56 -0
  69. package/overlays/alertmanager/alertmanager.yml +42 -0
  70. package/overlays/alertmanager/devcontainer.patch.json +12 -0
  71. package/overlays/alertmanager/docker-compose.yml +20 -0
  72. package/overlays/alertmanager/overlay.yml +17 -0
  73. package/overlays/alertmanager/setup.sh +53 -0
  74. package/overlays/alertmanager/verify.sh +31 -0
  75. package/overlays/aws-cli/README.md +473 -0
  76. package/overlays/aws-cli/devcontainer.patch.json +13 -0
  77. package/overlays/aws-cli/overlay.yml +13 -0
  78. package/overlays/azure-cli/README.md +551 -0
  79. package/overlays/azure-cli/devcontainer.patch.json +8 -0
  80. package/overlays/azure-cli/overlay.yml +13 -0
  81. package/overlays/bun/README.md +312 -0
  82. package/overlays/bun/devcontainer.patch.json +41 -0
  83. package/overlays/bun/overlay.yml +16 -0
  84. package/overlays/bun/setup.sh +79 -0
  85. package/overlays/bun/verify.sh +30 -0
  86. package/overlays/codex/README.md +128 -0
  87. package/overlays/codex/devcontainer.patch.json +3 -0
  88. package/overlays/codex/overlay.yml +14 -0
  89. package/overlays/codex/setup.sh +24 -0
  90. package/overlays/codex/verify.sh +30 -0
  91. package/overlays/commitlint/README.md +333 -0
  92. package/overlays/commitlint/devcontainer.patch.json +8 -0
  93. package/overlays/commitlint/overlay.yml +16 -0
  94. package/overlays/commitlint/setup.sh +234 -0
  95. package/overlays/direnv/README.md +504 -0
  96. package/overlays/direnv/devcontainer.patch.json +6 -0
  97. package/overlays/direnv/overlay.yml +13 -0
  98. package/overlays/direnv/setup.sh +139 -0
  99. package/overlays/docker-in-docker/README.md +534 -0
  100. package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
  101. package/overlays/docker-in-docker/overlay.yml +13 -0
  102. package/overlays/docker-sock/README.md +256 -0
  103. package/overlays/docker-sock/devcontainer.patch.json +9 -0
  104. package/overlays/docker-sock/docker-compose.yml +8 -0
  105. package/overlays/docker-sock/overlay.yml +13 -0
  106. package/overlays/dotnet/README.md +147 -0
  107. package/overlays/dotnet/devcontainer.patch.json +51 -0
  108. package/overlays/dotnet/global-tools.txt +24 -0
  109. package/overlays/dotnet/overlay.yml +13 -0
  110. package/overlays/dotnet/setup.sh +51 -0
  111. package/overlays/dotnet/verify.sh +26 -0
  112. package/overlays/gcloud/README.md +269 -0
  113. package/overlays/gcloud/devcontainer.patch.json +14 -0
  114. package/overlays/gcloud/overlay.yml +14 -0
  115. package/overlays/gcloud/verify.sh +52 -0
  116. package/overlays/git-helpers/README.md +168 -0
  117. package/overlays/git-helpers/devcontainer.patch.json +33 -0
  118. package/overlays/git-helpers/overlay.yml +15 -0
  119. package/overlays/git-helpers/setup.sh +91 -0
  120. package/overlays/go/README.md +293 -0
  121. package/overlays/go/devcontainer.patch.json +43 -0
  122. package/overlays/go/overlay.yml +15 -0
  123. package/overlays/go/setup.sh +33 -0
  124. package/overlays/go/verify.sh +40 -0
  125. package/overlays/grafana/.env.example +9 -0
  126. package/overlays/grafana/README.md +462 -0
  127. package/overlays/grafana/dashboard-provider.yml +11 -0
  128. package/overlays/grafana/dashboards/observability-overview.json +263 -0
  129. package/overlays/grafana/devcontainer.patch.json +12 -0
  130. package/overlays/grafana/docker-compose.yml +27 -0
  131. package/overlays/grafana/grafana-datasources.yml +57 -0
  132. package/overlays/grafana/overlay.yml +21 -0
  133. package/overlays/grafana/verify.sh +34 -0
  134. package/overlays/jaeger/.env.example +7 -0
  135. package/overlays/jaeger/README.md +867 -0
  136. package/overlays/jaeger/devcontainer.patch.json +12 -0
  137. package/overlays/jaeger/docker-compose.yml +17 -0
  138. package/overlays/jaeger/overlay.yml +19 -0
  139. package/overlays/java/README.md +267 -0
  140. package/overlays/java/devcontainer.patch.json +44 -0
  141. package/overlays/java/overlay.yml +16 -0
  142. package/overlays/java/setup.sh +41 -0
  143. package/overlays/java/verify.sh +42 -0
  144. package/overlays/just/README.md +443 -0
  145. package/overlays/just/devcontainer.patch.json +3 -0
  146. package/overlays/just/overlay.yml +13 -0
  147. package/overlays/just/setup.sh +182 -0
  148. package/overlays/kubectl-helm/README.md +660 -0
  149. package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
  150. package/overlays/kubectl-helm/overlay.yml +13 -0
  151. package/overlays/loki/.env.example +5 -0
  152. package/overlays/loki/README.md +1156 -0
  153. package/overlays/loki/devcontainer.patch.json +12 -0
  154. package/overlays/loki/docker-compose.yml +18 -0
  155. package/overlays/loki/loki-config.yaml +45 -0
  156. package/overlays/loki/overlay.yml +17 -0
  157. package/overlays/minio/.env.example +9 -0
  158. package/overlays/minio/README.md +639 -0
  159. package/overlays/minio/devcontainer.patch.json +30 -0
  160. package/overlays/minio/docker-compose.yml +28 -0
  161. package/overlays/minio/overlay.yml +18 -0
  162. package/overlays/minio/setup.sh +61 -0
  163. package/overlays/minio/verify.sh +64 -0
  164. package/overlays/mkdocs/README.md +309 -0
  165. package/overlays/mkdocs/devcontainer.patch.json +24 -0
  166. package/overlays/mkdocs/overlay.yml +15 -0
  167. package/overlays/modern-cli-tools/README.md +556 -0
  168. package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
  169. package/overlays/modern-cli-tools/overlay.yml +13 -0
  170. package/overlays/modern-cli-tools/setup.sh +153 -0
  171. package/overlays/mongodb/.env.example +9 -0
  172. package/overlays/mongodb/README.md +481 -0
  173. package/overlays/mongodb/devcontainer.patch.json +32 -0
  174. package/overlays/mongodb/docker-compose.yml +44 -0
  175. package/overlays/mongodb/overlay.yml +17 -0
  176. package/overlays/mongodb/verify.sh +48 -0
  177. package/overlays/mysql/.env.example +11 -0
  178. package/overlays/mysql/README.md +542 -0
  179. package/overlays/mysql/devcontainer.patch.json +34 -0
  180. package/overlays/mysql/docker-compose.yml +55 -0
  181. package/overlays/mysql/overlay.yml +16 -0
  182. package/overlays/mysql/verify.sh +48 -0
  183. package/overlays/nats/.env.example +5 -0
  184. package/overlays/nats/README.md +762 -0
  185. package/overlays/nats/devcontainer.patch.json +24 -0
  186. package/overlays/nats/docker-compose.yml +31 -0
  187. package/overlays/nats/overlay.yml +18 -0
  188. package/overlays/nats/verify.sh +50 -0
  189. package/overlays/ngrok/README.md +503 -0
  190. package/overlays/ngrok/devcontainer.patch.json +3 -0
  191. package/overlays/ngrok/overlay.yml +14 -0
  192. package/overlays/ngrok/setup.sh +125 -0
  193. package/overlays/nodejs/README.md +192 -0
  194. package/overlays/nodejs/devcontainer.patch.json +49 -0
  195. package/overlays/nodejs/global-packages.txt +16 -0
  196. package/overlays/nodejs/overlay.yml +14 -0
  197. package/overlays/nodejs/setup.sh +46 -0
  198. package/overlays/nodejs/verify.sh +32 -0
  199. package/overlays/otel-collector/.env.example +9 -0
  200. package/overlays/otel-collector/README.md +1257 -0
  201. package/overlays/otel-collector/devcontainer.patch.json +28 -0
  202. package/overlays/otel-collector/docker-compose.yml +22 -0
  203. package/overlays/otel-collector/otel-collector-config.yaml +68 -0
  204. package/overlays/otel-collector/overlay.yml +21 -0
  205. package/overlays/otel-collector/setup.sh +49 -0
  206. package/overlays/otel-demo-nodejs/.env.example +2 -0
  207. package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
  208. package/overlays/otel-demo-nodejs/README.md +409 -0
  209. package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
  210. package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
  211. package/overlays/otel-demo-nodejs/overlay.yml +23 -0
  212. package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
  213. package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
  214. package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
  215. package/overlays/otel-demo-nodejs/verify.sh +31 -0
  216. package/overlays/otel-demo-python/.env.example +2 -0
  217. package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
  218. package/overlays/otel-demo-python/README.md +82 -0
  219. package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
  220. package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
  221. package/overlays/otel-demo-python/docker-compose.yml +19 -0
  222. package/overlays/otel-demo-python/overlay.yml +23 -0
  223. package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
  224. package/overlays/otel-demo-python/verify.sh +31 -0
  225. package/overlays/playwright/README.md +629 -0
  226. package/overlays/playwright/devcontainer.patch.json +9 -0
  227. package/overlays/playwright/overlay.yml +13 -0
  228. package/overlays/postgres/.env.example +6 -0
  229. package/overlays/postgres/README.md +602 -0
  230. package/overlays/postgres/devcontainer.patch.json +21 -0
  231. package/overlays/postgres/docker-compose.yml +22 -0
  232. package/overlays/postgres/overlay.yml +15 -0
  233. package/overlays/postgres/verify.sh +45 -0
  234. package/overlays/powershell/README.md +314 -0
  235. package/overlays/powershell/devcontainer.patch.json +22 -0
  236. package/overlays/powershell/overlay.yml +13 -0
  237. package/overlays/powershell/setup.sh +29 -0
  238. package/overlays/powershell/verify.sh +38 -0
  239. package/overlays/pre-commit/README.md +263 -0
  240. package/overlays/pre-commit/devcontainer.patch.json +9 -0
  241. package/overlays/pre-commit/overlay.yml +16 -0
  242. package/overlays/pre-commit/setup.sh +129 -0
  243. package/overlays/presets/docs-site.yml +118 -0
  244. package/overlays/presets/fullstack.yml +181 -0
  245. package/overlays/presets/microservice.yml +118 -0
  246. package/overlays/presets/web-api.yml +109 -0
  247. package/overlays/prometheus/.env.example +5 -0
  248. package/overlays/prometheus/README.md +1246 -0
  249. package/overlays/prometheus/devcontainer.patch.json +12 -0
  250. package/overlays/prometheus/docker-compose.yml +22 -0
  251. package/overlays/prometheus/overlay.yml +17 -0
  252. package/overlays/prometheus/prometheus.yml +12 -0
  253. package/overlays/prometheus/verify.sh +34 -0
  254. package/overlays/promtail/.env.example +2 -0
  255. package/overlays/promtail/README.md +357 -0
  256. package/overlays/promtail/devcontainer.patch.json +5 -0
  257. package/overlays/promtail/docker-compose.yml +16 -0
  258. package/overlays/promtail/overlay.yml +17 -0
  259. package/overlays/promtail/promtail-config.yaml +60 -0
  260. package/overlays/promtail/verify.sh +31 -0
  261. package/overlays/pulumi/README.md +472 -0
  262. package/overlays/pulumi/devcontainer.patch.json +13 -0
  263. package/overlays/pulumi/overlay.yml +14 -0
  264. package/overlays/pulumi/verify.sh +31 -0
  265. package/overlays/python/README.md +919 -0
  266. package/overlays/python/devcontainer.patch.json +41 -0
  267. package/overlays/python/overlay.yml +12 -0
  268. package/overlays/python/requirements-overlay.txt +13 -0
  269. package/overlays/python/setup.sh +47 -0
  270. package/overlays/python/verify.sh +32 -0
  271. package/overlays/rabbitmq/.env.example +7 -0
  272. package/overlays/rabbitmq/README.md +680 -0
  273. package/overlays/rabbitmq/devcontainer.patch.json +28 -0
  274. package/overlays/rabbitmq/docker-compose.yml +30 -0
  275. package/overlays/rabbitmq/overlay.yml +18 -0
  276. package/overlays/rabbitmq/verify.sh +41 -0
  277. package/overlays/redis/.env.example +4 -0
  278. package/overlays/redis/README.md +776 -0
  279. package/overlays/redis/devcontainer.patch.json +21 -0
  280. package/overlays/redis/docker-compose.yml +21 -0
  281. package/overlays/redis/overlay.yml +15 -0
  282. package/overlays/redis/verify.sh +41 -0
  283. package/overlays/redpanda/.env.example +10 -0
  284. package/overlays/redpanda/README.md +703 -0
  285. package/overlays/redpanda/devcontainer.patch.json +37 -0
  286. package/overlays/redpanda/docker-compose.yml +67 -0
  287. package/overlays/redpanda/overlay.yml +21 -0
  288. package/overlays/redpanda/verify.sh +48 -0
  289. package/overlays/rust/README.md +299 -0
  290. package/overlays/rust/devcontainer.patch.json +39 -0
  291. package/overlays/rust/overlay.yml +15 -0
  292. package/overlays/rust/setup.sh +36 -0
  293. package/overlays/rust/verify.sh +51 -0
  294. package/overlays/sqlite/README.md +584 -0
  295. package/overlays/sqlite/devcontainer.patch.json +14 -0
  296. package/overlays/sqlite/overlay.yml +15 -0
  297. package/overlays/sqlite/setup.sh +27 -0
  298. package/overlays/sqlite/verify.sh +43 -0
  299. package/overlays/sqlserver/.env.example +6 -0
  300. package/overlays/sqlserver/README.md +592 -0
  301. package/overlays/sqlserver/devcontainer.patch.json +22 -0
  302. package/overlays/sqlserver/docker-compose.yml +32 -0
  303. package/overlays/sqlserver/overlay.yml +17 -0
  304. package/overlays/sqlserver/verify.sh +30 -0
  305. package/overlays/tempo/.env.example +5 -0
  306. package/overlays/tempo/README.md +273 -0
  307. package/overlays/tempo/devcontainer.patch.json +12 -0
  308. package/overlays/tempo/docker-compose.yml +20 -0
  309. package/overlays/tempo/overlay.yml +20 -0
  310. package/overlays/tempo/tempo-config.yaml +32 -0
  311. package/overlays/tempo/verify.sh +31 -0
  312. package/overlays/terraform/README.md +389 -0
  313. package/overlays/terraform/devcontainer.patch.json +15 -0
  314. package/overlays/terraform/overlay.yml +14 -0
  315. package/overlays/terraform/verify.sh +63 -0
  316. package/package.json +74 -0
  317. package/templates/README.md +285 -0
  318. package/templates/compose/.devcontainer/devcontainer.json +46 -0
  319. package/templates/compose/.devcontainer/docker-compose.yml +12 -0
  320. package/templates/compose/README.md +20 -0
  321. package/templates/plain/.devcontainer/devcontainer.json +35 -0
  322. package/templates/plain/README.md +21 -0
  323. package/tool/README.md +281 -0
  324. package/tool/schema/base-images.schema.json +43 -0
  325. package/tool/schema/base-templates.schema.json +34 -0
  326. package/tool/schema/config.schema.json +71 -0
  327. 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,2 @@
1
+ # OTel Demo Node.js port
2
+ OTEL_DEMO_NODEJS_PORT=8080
@@ -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
+ }