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,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)