{"id":78584,"date":"2026-09-14T16:17:34","date_gmt":"2026-09-14T16:17:34","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=78584"},"modified":"2026-09-14T16:17:42","modified_gmt":"2026-09-14T16:17:42","slug":"opentelemetry-complete-end-to-end-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/opentelemetry-complete-end-to-end-tutorial\/","title":{"rendered":"OpenTelemetry \u2014 Complete End-to-End Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">From Zero to Production: Architecture, Traces, Metrics, Logs, OTLP, Collector, Kubernetes, Sampling, Security, Scaling, Troubleshooting and Best Practices<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Technology:<\/strong> OpenTelemetry \/ OTel<br><strong>Level:<\/strong> Beginner \u2192 Intermediate \u2192 Advanced \u2192 Production<br><strong>Last verified:<\/strong> September 15, 2026<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What Is OpenTelemetry?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>OpenTelemetry<\/strong>, usually abbreviated <strong>OTel<\/strong>, is an open-source, vendor-neutral observability framework used to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>instrument applications<\/li>\n\n\n\n<li>generate telemetry<\/li>\n\n\n\n<li>collect telemetry<\/li>\n\n\n\n<li>process telemetry<\/li>\n\n\n\n<li>correlate telemetry<\/li>\n\n\n\n<li>export telemetry<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The principal telemetry signals are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Traces<\/strong><\/li>\n\n\n\n<li><strong>Metrics<\/strong><\/li>\n\n\n\n<li><strong>Logs<\/strong><\/li>\n\n\n\n<li><strong>Baggage<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Profiles are also being developed as an OpenTelemetry signal. In the current OTLP specification, traces, metrics, and logs are stable while profiles remain under development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry is a <strong>CNCF project<\/strong> created from the merger of OpenTracing and OpenCensus. It provides a common standard so applications do not need proprietary instrumentation for every monitoring vendor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A useful one-line definition is:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>OpenTelemetry is the standard instrumentation and telemetry pipeline layer between your applications\/infrastructure and your observability backends.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. What OpenTelemetry Is NOT<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most important things to understand is that OpenTelemetry is generally <strong>not your observability database or dashboard system<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry does not replace tools such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grafana<\/li>\n\n\n\n<li>Prometheus<\/li>\n\n\n\n<li>Jaeger<\/li>\n\n\n\n<li>Tempo<\/li>\n\n\n\n<li>Loki<\/li>\n\n\n\n<li>Datadog<\/li>\n\n\n\n<li>New Relic<\/li>\n\n\n\n<li>Dynatrace<\/li>\n\n\n\n<li>Elastic<\/li>\n\n\n\n<li>Splunk<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, OpenTelemetry sends telemetry <strong>to<\/strong> systems like these.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The OpenTelemetry project intentionally leaves backend storage and visualization to other systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n     |\n     | Telemetry\n     v\nOpenTelemetry\n     |\n     | OTLP\n     v\nObservability Backend\n     |\n     v\nStorage + Queries + Dashboards + Alerts\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Why OpenTelemetry Exists<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before OpenTelemetry, a typical organization might install:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Datadog Agent\n<span class=\"hljs-keyword\">New<\/span> Relic Agent\nJaeger Client\nPrometheus Client\nZipkin Client\nFluent Bit\nVendor A SDK\nVendor B SDK\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Application code became tightly coupled to monitoring products.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Changing observability vendors could require:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>replacing SDKs<\/li>\n\n\n\n<li>changing instrumentation<\/li>\n\n\n\n<li>modifying application code<\/li>\n\n\n\n<li>rebuilding services<\/li>\n\n\n\n<li>changing agents<\/li>\n\n\n\n<li>maintaining several telemetry formats<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry changes the model to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Applications\n      |\n      v\nOpenTelemetry SDK \/ Auto Instrumentation\n      |\n      v\nOpenTelemetry Collector\n      |\n      +--------&gt; Backend A\n      |\n      +--------&gt; Backend B\n      |\n      +--------&gt; Backend C\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The application speaks <strong>OpenTelemetry<\/strong> rather than a vendor-specific telemetry language.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry&#8217;s two major principles are that you retain ownership of your telemetry and can use a common set of APIs and conventions rather than learning a new instrumentation model for every backend.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. When Should You Use OpenTelemetry?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry is particularly valuable when running:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Microservices<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Browser\n   |\nFrontend\n   |\nAPI Gateway\n   |\nOrders Service\n   |\nPayment Service\n   |\nKafka\n   |\nNotification Service\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Distributed tracing lets you see one request across the entire system.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Kubernetes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OTel can observe:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Cluster\nNodes\nPods\nContainers\nApplications\nHTTP traffic\ngRPC traffic\nDatabases\nMessage queues\nKubernetes events\nInfrastructure metrics\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Multi-cloud environments<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">AWS\nGCP\nAzure\nOn-premises\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">All can emit a standardized telemetry format.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Vendor-neutral observability<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You might begin with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel \u2192 Jaeger\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">and later move to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel \u2192 Grafana Tempo\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel \u2192 Datadog\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">without redesigning your application instrumentation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Complex distributed systems<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">OTel is extremely useful when you need answers to questions such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Why is checkout slow?\n\nWhich service generated <span class=\"hljs-keyword\">this<\/span> error?\n\nWhich database call caused the latency?\n\nWhich Kafka consumer processed <span class=\"hljs-keyword\">this<\/span> request?\n\nWhich Kubernetes pod served the request?\n\nWhich version introduced the regression?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Where OpenTelemetry Fits<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A modern observability stack typically has four layers.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">+-----------------------------------------------------+\n|                 Applications                        |\n| Java | Go | Python | Node | .NET | Rust | etc.     |\n+----------------------------+------------------------+\n                             |\n                             v\n+-----------------------------------------------------+\n|             OpenTelemetry Instrumentation           |\n| APIs | SDKs | Auto Instrumentation | Libraries      |\n+----------------------------+------------------------+\n                             |\n                             | OTLP\n                             v\n+-----------------------------------------------------+\n|              OpenTelemetry Collector                |\n|                                                     |\n| Receivers \u2192 Processors \u2192 Exporters                  |\n+----------------------------+------------------------+\n                             |\n                             v\n+-----------------------------------------------------+\n|              Observability Backends                 |\n| Tempo | Prometheus | Datadog | Jaeger | Elastic     |\n+----------------------------+------------------------+\n                             |\n                             v\n+-----------------------------------------------------+\n|        Dashboards | Search | Alerts | SLOs          |\n+-----------------------------------------------------+\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. OpenTelemetry Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A more complete architecture looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>                        APPLICATIONS\n                              |\n          +-------------------+-------------------+\n          |                   |                   |\n          v                   v                   v\n       Service A           Service B           Service C\n       OTel SDK            OTel SDK            OTel SDK\n          |                   |                   |\n          +-------------------+-------------------+\n                              |\n                              | OTLP\n                              v\n                    +--------------------+\n                    | OTel Agent         |\n                    | Collector          |\n                    +--------------------+\n                              |\n                              v\n                    +--------------------+\n                    | OTel Gateway       |\n                    | Collector          |\n                    +--------------------+\n                              |\n            +-----------------+------------------+\n            |                 |                  |\n            v                 v                  v\n          Traces            Metrics            Logs\n            |                 |                  |\n            v                 v                  v\n          Tempo           Prometheus           Loki\n          Jaeger           Datadog             Elastic\n          Datadog          etc.                etc.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Collector itself follows a pipeline model:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Receiver\n   |\nProcessor\n   |\nProcessor\n   |\nExporter\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Collector can create separate pipelines for traces, metrics and logs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Core OpenTelemetry Components<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry consists of several major pieces.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Component<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Specification<\/td><td>Defines expected OpenTelemetry behavior<\/td><\/tr><tr><td>API<\/td><td>Application-facing instrumentation interfaces<\/td><\/tr><tr><td>SDK<\/td><td>Implements telemetry generation and processing<\/td><\/tr><tr><td>Instrumentation Libraries<\/td><td>Instrument common frameworks<\/td><\/tr><tr><td>Auto Instrumentation<\/td><td>Adds telemetry with minimal\/no code changes<\/td><\/tr><tr><td>Semantic Conventions<\/td><td>Standard attribute names<\/td><\/tr><tr><td>OTLP<\/td><td>OpenTelemetry wire protocol<\/td><\/tr><tr><td>Collector<\/td><td>Receives, processes and exports telemetry<\/td><\/tr><tr><td>Operator<\/td><td>Manages OTel on Kubernetes<\/td><\/tr><tr><td>Helm Charts<\/td><td>Deploy OTel components on Kubernetes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">These are the primary components described by the OpenTelemetry project.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. The Four Main Signals<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">8.1 Traces<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A trace represents the lifecycle of a request across a distributed system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trace ID: abc123\n\nFrontend\n\u2514\u2500\u2500 GET \/checkout                 320 ms\n    |\n    \u251c\u2500\u2500 Cart Service              40 ms\n    |\n    \u251c\u2500\u2500 Inventory Service         70 ms\n    |\n    \u2514\u2500\u2500 Payment Service          180 ms\n        |\n        \u2514\u2500\u2500 PostgreSQL query      90 ms\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can immediately see:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Payment Service = slow\nDatabase query = major contributor\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. What Is a Span?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>span<\/strong> represents a single operation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A span may contain:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Span Name\nTrace ID\nSpan ID\n<span class=\"hljs-keyword\">Parent<\/span> Span ID\nStart Time\nEnd Time\nDuration\nAttributes\nEvents\nLinks\nStatus\nSpan Kind\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A trace is composed of multiple related spans.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trace\n\u2502\n\u251c\u2500\u2500 Span: HTTP GET \/checkout\n\u2502\n\u251c\u2500\u2500 Span: cart.get\n\u2502\n\u251c\u2500\u2500 Span: inventory.check\n\u2502\n\u251c\u2500\u2500 Span: payment.authorize\n\u2502\n\u2514\u2500\u2500 Span: SQL SELECT\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Trace ID and Span ID<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Each trace has a unique:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">trace_id\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Each span has its own:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">span_id\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">trace_id = 4bf92f3577b34da6a3ce929d0e0e4736\n\nfrontend span:\nspan_id = 00f067aa0ba902b7\n\npayment span:\nspan_id = 12ab67aa0ba90019\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The common trace ID allows an observability backend to reconstruct the complete distributed request.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Context Propagation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Service A \u2192 Service B \u2192 Service C\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">How does Service C know it belongs to the same trace?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Through <strong>context propagation<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Service A sends tracing context to Service B.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Service B sends it to Service C.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry normally uses the W3C Trace Context format by default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For HTTP you may see a header such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">traceparent:\n00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That essentially identifies:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">trace\n<span class=\"hljs-keyword\">parent<\/span> span\ntrace flags\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Baggage<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Baggage allows contextual key\/value data to travel with requests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">customer.tier = gold\nregion = japan\ntenant.id = tenant-42\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Architecture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Frontend\n   |\n   | baggage\n   v\nOrders\n   |\n   | baggage\n   v\nPayments\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">All services can access that context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, baggage crosses process\/service boundaries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore <strong>never put credentials, secrets or sensitive PII into baggage<\/strong>. OpenTelemetry explicitly warns against this.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Metrics represent numerical measurements over time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">requests_total\nrequest_duration\ncpu_usage\nmemory_usage\nqueue_depth\nactive_sessions\norders_total\npayment_failures\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Major OpenTelemetry metric instrument types include:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Instrument<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td>Counter<\/td><td>Number of requests<\/td><\/tr><tr><td>UpDownCounter<\/td><td>Active requests<\/td><\/tr><tr><td>Gauge<\/td><td>Current temperature\/value<\/td><\/tr><tr><td>Histogram<\/td><td>Request latency distribution<\/td><\/tr><tr><td>Async Counter<\/td><td>Externally observed cumulative value<\/td><\/tr><tr><td>Async UpDownCounter<\/td><td>Externally observed variable total<\/td><\/tr><tr><td>Async Gauge<\/td><td>Externally observed current value<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry metrics also support aggregation and delta\/cumulative temporality.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Counter Example<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">orders<\/span><span class=\"hljs-selector-class\">.created<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Values:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1\n2\n3\n4\n5\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A counter should only increase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical uses:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">HTTP requests\nOrders\nErrors\nRetries\nJobs completed\nMessages processed\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. UpDownCounter<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Unlike a Counter, an UpDownCounter can increase or decrease.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">active_requests\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Request starts:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">+1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Request finishes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">-1\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful for:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">queue depth\nactive connections\nactive sessions\nworkers\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Gauge<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A Gauge records a current value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CPU temperature\nmemory usage\nqueue size\nbattery percentage\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">10\n18\n14\n22\n16\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The measurement does not need to be monotonic.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Histogram<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Histograms are particularly important for latency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example observations:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">10 ms\n20 ms\n30 ms\n70 ms\n400 ms\n800 ms\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Instead of storing every measurement independently, the SDK\/backend can aggregate them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can then derive information such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">P50\nP90\nP95\nP99\nrequest count\nsum\ndistribution\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Logs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Logs are timestamped event records.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">2026-09-15T00:11:18Z ERROR Payment failed order_id=123\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry supports both structured and unstructured logs, although structured logs are preferable. OTel can also correlate logs with active traces by attaching trace and span identifiers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"timestamp\"<\/span>: <span class=\"hljs-string\">\"2026-09-15T00:11:18Z\"<\/span>,\n  <span class=\"hljs-attr\">\"severity\"<\/span>: <span class=\"hljs-string\">\"ERROR\"<\/span>,\n  <span class=\"hljs-attr\">\"message\"<\/span>: <span class=\"hljs-string\">\"Payment failed\"<\/span>,\n  <span class=\"hljs-attr\">\"order.id\"<\/span>: <span class=\"hljs-string\">\"123\"<\/span>,\n  <span class=\"hljs-attr\">\"trace_id\"<\/span>: <span class=\"hljs-string\">\"abc123\"<\/span>,\n  <span class=\"hljs-attr\">\"span_id\"<\/span>: <span class=\"hljs-string\">\"def456\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can go from:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Error<\/span> log\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">directly to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Distributed trace\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">which is enormously useful for troubleshooting.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Profiles<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Profiles show code-level resource consumption.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Which <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">consumes<\/span> <span class=\"hljs-title\">CPU<\/span>?\n\n<span class=\"hljs-title\">Where<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">memory<\/span> <span class=\"hljs-title\">being<\/span> <span class=\"hljs-title\">allocated<\/span>?\n\n<span class=\"hljs-title\">Which<\/span> <span class=\"hljs-title\">code<\/span> <span class=\"hljs-title\">path<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">expensive<\/span>?\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n    |\n    +--- traces\n    +--- metrics\n    +--- logs\n    +--- profiles\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Profiles are a newer part of the OpenTelemetry ecosystem and remain under development in OTLP rather than being as mature as traces, metrics and logs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. The OpenTelemetry API<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The API is what instrumentation code interacts with.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For tracing:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Tracer\nSpan\nContext\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For metrics:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Meter\nCounter\nHistogram\nGauge\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For application libraries, the usual recommendation is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Library\n   |\n   v\nOTel API\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">rather than forcing an SDK configuration onto applications consuming that library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Standalone applications typically use both:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel API\n+\nOTel SDK\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This distinction is explicitly part of OpenTelemetry&#8217;s recommended instrumentation model.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. The OpenTelemetry SDK<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The SDK implements the API and provides functionality such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Sampling\nSpan processing\nMetric aggregation\nExporting\nResources\nConfiguration\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Architecture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application code\n      |\n      v\nOTel API\n      |\n      v\nOTel SDK\n      |\n      v\nOTLP Exporter\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Automatic vs Manual Instrumentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">There are two main instrumentation approaches.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Automatic instrumentation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Automatically instruments frameworks such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">HTTP servers\nHTTP clients\ngRPC\nDatabase clients\nMessaging libraries\nPopular frameworks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Very little application code needs modification.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Manual instrumentation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Developers explicitly create spans, metrics and attributes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">checkout<\/span><span class=\"hljs-selector-class\">.validate_cart<\/span>\n<span class=\"hljs-selector-tag\">payment<\/span><span class=\"hljs-selector-class\">.authorize<\/span>\n<span class=\"hljs-selector-tag\">order<\/span><span class=\"hljs-selector-class\">.persist<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Manual instrumentation provides business-level visibility that automatic instrumentation cannot infer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Best Instrumentation Strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Usually the best strategy is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Automatic instrumentation\n        +\nManual business instrumentation\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Automatic instrumentation gives you:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">HTTP\ndatabase\ngRPC\nframework\nnetwork\nmessaging\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Manual instrumentation adds:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">business operations\nimportant workflows\ndomain attributes\ncustom metrics\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry explicitly supports using both approaches together.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Zero-Code Instrumentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry currently provides zero-code approaches for major languages including:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Java\n.NET\nPython\nJavaScript \/ Node.js\nGo\nPHP\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Mechanisms vary by language and can include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Java agents\nbytecode instrumentation\nmonkey patching\nruntime hooks\neBPF\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Zero-code instrumentation usually observes libraries around the edges of an application; important application-specific business operations may still benefit from manual instrumentation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Semantic Conventions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine one service reports:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">http<\/span><span class=\"hljs-selector-class\">.method<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">another:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">HTTPMethod\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">another:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">request_method\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Querying the data becomes painful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry solves this with <strong>Semantic Conventions<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They standardize naming for telemetry across:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">HTTP\nRPC\ndatabases\nmessaging\ncloud\ncontainers\nKubernetes\nservices\nhosts\nnetworks\netc.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry semantic conventions apply across traces, metrics, logs, profiles and resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.version<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.namespace<\/span>\n\n<span class=\"hljs-selector-tag\">http<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.method<\/span>\n\n<span class=\"hljs-selector-tag\">server<\/span><span class=\"hljs-selector-class\">.address<\/span>\n<span class=\"hljs-selector-tag\">server<\/span><span class=\"hljs-selector-class\">.port<\/span>\n\n<span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.environment<\/span><span class=\"hljs-selector-class\">.name<\/span>\n\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.cluster<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.namespace<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.pod<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.container<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Resources<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>Resource<\/strong> describes the entity producing telemetry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">service.name = checkout\nservice.version = <span class=\"hljs-number\">2.7<\/span><span class=\"hljs-number\">.1<\/span>\n\ndeployment.environment.name = production\n\ncloud.provider = aws\ncloud.region = ap-northeast<span class=\"hljs-number\">-1<\/span>\n\nk8s.cluster.name = production\nk8s.<span class=\"hljs-keyword\">namespace<\/span>.<span class=\"hljs-title\">name<\/span> = <span class=\"hljs-title\">commerce<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Resources answer:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;Where did this telemetry originate?&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry recommends setting <code>service.name<\/code> explicitly; otherwise SDKs can fall back to an <code>unknown_service<\/code> value. <code>OTEL_SERVICE_NAME<\/code> is the standard environment variable for configuring it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Recommended Resource Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A good baseline is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.namespace<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.version<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.instance<\/span><span class=\"hljs-selector-class\">.id<\/span>\n\n<span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.environment<\/span><span class=\"hljs-selector-class\">.name<\/span>\n\n<span class=\"hljs-selector-tag\">cloud<\/span><span class=\"hljs-selector-class\">.provider<\/span>\n<span class=\"hljs-selector-tag\">cloud<\/span><span class=\"hljs-selector-class\">.region<\/span>\n\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.cluster<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.namespace<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.deployment<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.pod<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service.namespace = ecommerce\nservice.name = checkout\nservice.version = 4.3.2\n\ndeployment.environment.name = production\n\ncloud.provider = aws\ncloud.region = ap-northeast-1\n\nk8s.cluster.name = prod-eks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>deployment.environment.name<\/code> is the current semantic convention; the older <code>deployment.environment<\/code> attribute is deprecated.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. OTLP \u2014 OpenTelemetry Protocol<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OTLP is the native OpenTelemetry telemetry transport protocol.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It supports:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Traces\nMetrics\nLogs\nProfiles\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Two important transports are:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTLP\/gRPC\nOTLP\/HTTP\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The default ports are:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Protocol<\/th><th>Port<\/th><\/tr><\/thead><tbody><tr><td>OTLP\/gRPC<\/td><td>4317<\/td><\/tr><tr><td>OTLP\/HTTP<\/td><td>4318<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For OTLP\/HTTP the conventional endpoints include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/v1\/traces\n\/v1\/metrics\n\/v1\/logs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The current OTLP specification defines Protocol Buffers for the data and supports gRPC and HTTP transports.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. OTLP\/gRPC vs OTLP\/HTTP<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">OTLP\/gRPC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Common endpoint:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">otel-collector<\/span><span class=\"hljs-selector-pseudo\">:4317<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Advantages:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Efficient protobuf transport\nHTTP\/2\nwidely used service-to-collector protocol\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">OTLP\/HTTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Common endpoint:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/otel-collector:4318<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Signal URLs generally become:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/v1\/traces\n\/v1\/metrics\n\/v1\/logs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Advantages include simpler compatibility with environments where HTTP infrastructure is easier to operate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The current generic exporter specification prefers <code>http\/protobuf<\/code> as the default where backward-compatibility constraints do not require something else, although individual SDK defaults can vary.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Important OpenTelemetry Environment Variables<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">These are worth memorizing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Service name<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTEL_SERVICE_NAME=checkout-service\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Resource attributes<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OTEL_RESOURCE_ATTRIBUTES=<span class=\"hljs-string\">\"deployment.environment.name=production,service.version=1.4.3\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">OTLP endpoint<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OTEL_EXPORTER_OTLP_ENDPOINT=http:<span class=\"hljs-comment\">\/\/otel-collector:4318<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Protocol<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTEL_EXPORTER_OTLP_PROTOCOL=http\/protobuf\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTEL_EXPORTER_OTLP_PROTOCOL=grpc\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Trace-specific endpoint<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http:<span class=\"hljs-comment\">\/\/otel-collector:4318\/v1\/traces<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Metrics endpoint<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http:<span class=\"hljs-comment\">\/\/otel-collector:4318\/v1\/metrics<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Logs endpoint<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http:<span class=\"hljs-comment\">\/\/otel-collector:4318\/v1\/logs<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Authentication headers<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">OTEL_EXPORTER_OTLP_HEADERS=<span class=\"hljs-string\">\"authorization=Bearer TOKEN\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Exporter endpoint, protocol, certificate and header variables are standardized in the OpenTelemetry exporter specification.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. OpenTelemetry Collector<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Collector<\/strong> is one of the most important OTel components.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Its job is to:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Receive telemetry\nProcess telemetry\nTransform telemetry\nFilter telemetry\nSample telemetry\nBatch telemetry\nRoute telemetry\nExport telemetry\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It is vendor-neutral and can receive and emit multiple telemetry formats.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Collector Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The fundamental Collector model is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">RECEIVER\n   |\n   v\nPROCESSOR\n   |\n   v\nEXPORTER\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">More realistically:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>            +----------+\nApplication -&gt; Receiver |\n             +----+-----+\n                  |\n                  v\n            +-----------+\n            | Processor |\n            +-----+-----+\n                  |\n                  v\n            +-----------+\n            | Processor |\n            +-----+-----+\n                  |\n                  v\n            +-----------+\n            | Exporter  |\n            +-----+-----+\n                  |\n                  v\n              Backend\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Receivers<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Receivers ingest telemetry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples can include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTLP\nPrometheus\nJaeger\nZipkin\nKafka\nFile logs\nHost metrics\nKubernetes metrics\nCloud provider sources\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">receivers<\/span>:\n  <span class=\"hljs-selector-tag\">otlp<\/span>:\n    <span class=\"hljs-selector-tag\">protocols<\/span>:\n      <span class=\"hljs-selector-tag\">grpc<\/span>:\n        <span class=\"hljs-selector-tag\">endpoint<\/span>: 0<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-pseudo\">:4317<\/span>\n      <span class=\"hljs-selector-tag\">http<\/span>:\n        <span class=\"hljs-selector-tag\">endpoint<\/span>: 0<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-pseudo\">:4318<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Processors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Processors modify or manage telemetry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common functions include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Batching\nFiltering\nSampling\nResource detection\nAttribute manipulation\nKubernetes metadata enrichment\nMemory protection\nTransformation\nRedaction\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A particularly important ordering pattern is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">memory_limiter\n      |\ndrop \/ sampling processors\n      |\ncontext-dependent processors\n      |\nenrichment \/ transformation\n      |\nbatch\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Processor ordering matters because processing occurs sequentially. OpenTelemetry recommends the memory limiter early, dropping unnecessary telemetry before expensive processing, and batching after filtering\/enrichment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Exporters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Exporters send telemetry onward.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTLP backend\nPrometheus-compatible backend\nJaeger-compatible backend\nKafka\nVendor backend\nDebug output\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A single Collector can also fan out telemetry to several destinations.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>            +--&gt; Backend A\nCollector ---+\n             +--&gt; Backend B\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each exporter receives a copy of the relevant data from the pipeline.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Extensions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Extensions provide additional Collector capabilities outside normal telemetry pipelines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Authentication\nHealth checks\nService discovery\nStorage\nDebugging\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The available extensions depend on the Collector distribution being used.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Connectors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Connectors connect one Collector pipeline to another and act as both an exporter and a receiver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trace pipeline\n      |\n      v\nSpan Metrics Connector\n      |\n      v\nMetrics pipeline\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This can generate metrics derived from spans.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Current Collector distributions include connectors for use cases such as service graphs, span metrics, routing and signal-to-metrics conversion.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Basic Collector Configuration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">otel-config<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">receivers<\/span>:\n  <span class=\"hljs-selector-tag\">otlp<\/span>:\n    <span class=\"hljs-selector-tag\">protocols<\/span>:\n      <span class=\"hljs-selector-tag\">grpc<\/span>:\n        <span class=\"hljs-selector-tag\">endpoint<\/span>: 0<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-pseudo\">:4317<\/span>\n      <span class=\"hljs-selector-tag\">http<\/span>:\n        <span class=\"hljs-selector-tag\">endpoint<\/span>: 0<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-pseudo\">:4318<\/span>\n\n<span class=\"hljs-selector-tag\">processors<\/span>:\n  <span class=\"hljs-selector-tag\">memory_limiter<\/span>:\n    <span class=\"hljs-selector-tag\">check_interval<\/span>: 1<span class=\"hljs-selector-tag\">s<\/span>\n    <span class=\"hljs-selector-tag\">limit_percentage<\/span>: 75\n    <span class=\"hljs-selector-tag\">spike_limit_percentage<\/span>: 15\n\n  <span class=\"hljs-selector-tag\">batch<\/span>:\n    <span class=\"hljs-selector-tag\">timeout<\/span>: 5<span class=\"hljs-selector-tag\">s<\/span>\n\n<span class=\"hljs-selector-tag\">exporters<\/span>:\n  <span class=\"hljs-selector-tag\">debug<\/span>:\n    <span class=\"hljs-selector-tag\">verbosity<\/span>: <span class=\"hljs-selector-tag\">detailed<\/span>\n\n<span class=\"hljs-selector-tag\">service<\/span>:\n  <span class=\"hljs-selector-tag\">pipelines<\/span>:\n\n    <span class=\"hljs-selector-tag\">traces<\/span>:\n      <span class=\"hljs-selector-tag\">receivers<\/span>: <span class=\"hljs-selector-attr\">&#91;otlp]<\/span>\n      <span class=\"hljs-selector-tag\">processors<\/span>: <span class=\"hljs-selector-attr\">&#91;memory_limiter, batch]<\/span>\n      <span class=\"hljs-selector-tag\">exporters<\/span>: <span class=\"hljs-selector-attr\">&#91;debug]<\/span>\n\n    <span class=\"hljs-selector-tag\">metrics<\/span>:\n      <span class=\"hljs-selector-tag\">receivers<\/span>: <span class=\"hljs-selector-attr\">&#91;otlp]<\/span>\n      <span class=\"hljs-selector-tag\">processors<\/span>: <span class=\"hljs-selector-attr\">&#91;memory_limiter, batch]<\/span>\n      <span class=\"hljs-selector-tag\">exporters<\/span>: <span class=\"hljs-selector-attr\">&#91;debug]<\/span>\n\n    <span class=\"hljs-selector-tag\">logs<\/span>:\n      <span class=\"hljs-selector-tag\">receivers<\/span>: <span class=\"hljs-selector-attr\">&#91;otlp]<\/span>\n      <span class=\"hljs-selector-tag\">processors<\/span>: <span class=\"hljs-selector-attr\">&#91;memory_limiter, batch]<\/span>\n      <span class=\"hljs-selector-tag\">exporters<\/span>: <span class=\"hljs-selector-attr\">&#91;debug]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This creates:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTLP\n |\n +--&gt; traces  -&gt; memory_limiter -&gt; batch -&gt; debug\n |\n +--&gt; metrics -&gt; memory_limiter -&gt; batch -&gt; debug\n |\n +--&gt; logs    -&gt; memory_limiter -&gt; batch -&gt; debug\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The official Python exporter documentation uses essentially this OTLP receiver + debug exporter arrangement to validate an exporter locally.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Install OpenTelemetry Collector with Docker<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The current official documentation examples use Collector <code>0.160.0<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker pull otel\/opentelemetry-collector:0.160.0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">docker run \\\n  --rm \\\n  -p <span class=\"hljs-number\">4317<\/span>:<span class=\"hljs-number\">4317<\/span> \\\n  -p <span class=\"hljs-number\">4318<\/span>:<span class=\"hljs-number\">4318<\/span> \\\n  -v <span class=\"hljs-string\">\"$(pwd)\/otel-config.yaml:\/etc\/otelcol\/config.yaml\"<\/span> \\\n  otel\/opentelemetry-collector:<span class=\"hljs-number\">0.160<\/span><span class=\"hljs-number\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Collector now accepts:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTLP\/gRPC -&gt; localhost:4317\nOTLP\/HTTP -&gt; localhost:4318\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Official Docker installation documentation supports mounting <code>\/etc\/otelcol\/config.yaml<\/code> in this manner.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Linux Installation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry publishes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DEB\nRPM\nLinux binaries\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">for multiple architectures.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, the current documented DEB workflow uses:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">wget https:<span class=\"hljs-comment\">\/\/github.com\/open-telemetry\/opentelemetry-collector-releases\/releases\/download\/v0.160.0\/otelcol_0.160.0_linux_amd64.deb<\/span>\n\nsudo dpkg -i otelcol_0<span class=\"hljs-number\">.160<\/span><span class=\"hljs-number\">.0<\/span>_linux_amd64.deb\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The default Linux package configuration is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/etc\/otelcol\/config.yaml\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">and packaged installations can run via <code>systemd<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Your First Instrumented Python Application<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Install:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">python -m venv .venv\n\nsource .venv\/bin\/activate\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install flask requests\npip install opentelemetry-distro\npip install opentelemetry-exporter-otlp\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Install compatible instrumentation:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">opentelemetry-bootstrap -a install\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry&#8217;s Python zero-code flow uses <code>opentelemetry-distro<\/code>, the OTLP exporter and <code>opentelemetry-bootstrap<\/code> to detect installed libraries and install matching instrumentation packages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">app<\/span><span class=\"hljs-selector-class\">.py<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> flask <span class=\"hljs-keyword\">import<\/span> Flask\n<span class=\"hljs-keyword\">import<\/span> requests\n\napp = Flask(__name__)\n\n@app.route(<span class=\"hljs-string\">\"\/\"<\/span>)\ndef home():\n    requests.get(<span class=\"hljs-string\">\"https:\/\/example.com\"<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Hello OpenTelemetry!\"<\/span>\n\n<span class=\"hljs-keyword\">if<\/span> __name__ == <span class=\"hljs-string\">\"__main__\"<\/span>:\n    app.run(port=<span class=\"hljs-number\">5000<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Configure OpenTelemetry:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> OTEL_SERVICE_NAME=demo-python-service\n\n<span class=\"hljs-keyword\">export<\/span> OTEL_RESOURCE_ATTRIBUTES=<span class=\"hljs-string\">\"deployment.environment.name=development\"<\/span>\n\n<span class=\"hljs-keyword\">export<\/span> OTEL_EXPORTER_OTLP_ENDPOINT=http:<span class=\"hljs-comment\">\/\/localhost:4318<\/span>\n\n<span class=\"hljs-keyword\">export<\/span> OTEL_EXPORTER_OTLP_PROTOCOL=http\/protobuf\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Run with auto instrumentation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">opentelemetry-instrument<\/span> <span class=\"hljs-selector-tag\">python<\/span> <span class=\"hljs-selector-tag\">app<\/span><span class=\"hljs-selector-class\">.py<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Request:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl http:<span class=\"hljs-comment\">\/\/localhost:5000<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The flow becomes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">curl\n |\n v\nFlask\n |\n | auto-generated spans\n v\nOpenTelemetry Python\n |\n | OTLP\/HTTP\n v\nCollector\n |\n v\ndebug exporter\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Manual Instrumentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Automatic instrumentation is only the beginning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose checkout processing contains:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Validate Cart\nReserve Inventory\nAuthorize Payment\nCreate Order\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Those operations are business concepts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can create spans manually.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example Python:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> opentelemetry <span class=\"hljs-keyword\">import<\/span> trace\n\ntracer = trace.get_tracer(<span class=\"hljs-string\">\"checkout-service\"<\/span>)\n\ndef checkout(order):\n    <span class=\"hljs-keyword\">with<\/span> tracer.start_as_current_span(<span class=\"hljs-string\">\"checkout.process\"<\/span>) <span class=\"hljs-keyword\">as<\/span> span:\n\n        span.set_attribute(<span class=\"hljs-string\">\"order.type\"<\/span>, order&#91;<span class=\"hljs-string\">\"type\"<\/span>])\n\n        validate_cart(order)\n\n        <span class=\"hljs-keyword\">with<\/span> tracer.start_as_current_span(<span class=\"hljs-string\">\"inventory.reserve\"<\/span>):\n            reserve_inventory(order)\n\n        <span class=\"hljs-keyword\">with<\/span> tracer.start_as_current_span(<span class=\"hljs-string\">\"payment.authorize\"<\/span>):\n            authorize_payment(order)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The resulting trace becomes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">HTTP POST \/checkout\n\u2502\n\u2514\u2500\u2500 checkout.process\n    \u2502\n    \u251c\u2500\u2500 inventory.reserve\n    \u2502\n    \u2514\u2500\u2500 payment.authorize\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is considerably more useful than seeing only generic HTTP calls.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Custom Metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> opentelemetry <span class=\"hljs-keyword\">import<\/span> metrics\n\nmeter = metrics.get_meter(<span class=\"hljs-string\">\"checkout-service\"<\/span>)\n\norders = meter.create_counter(\n    <span class=\"hljs-string\">\"orders.created\"<\/span>,\n    description=<span class=\"hljs-string\">\"Number of successfully created orders\"<\/span>\n)\n\norders.add(\n    <span class=\"hljs-number\">1<\/span>,\n    {\n        <span class=\"hljs-string\">\"payment.method\"<\/span>: <span class=\"hljs-string\">\"credit_card\"<\/span>\n    }\n)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You could then analyze:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">orders<\/span><span class=\"hljs-selector-class\">.created<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">by safe, bounded dimensions such as payment method.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Metric Cardinality \u2014 Critical Production Topic<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A metric such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">http<\/span><span class=\"hljs-selector-class\">.requests<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">http.method = GET\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">has low cardinality.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But adding:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">user.id = 183729101\nsession.id = abc987123\nrequest.id = randomUUID\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">can create millions of unique time series.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This causes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Huge memory consumption\nHuge observability bills\nSlow queries\nBackend pressure\nCollector pressure\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Therefore avoid unbounded dimensions in metrics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">order<\/span><span class=\"hljs-selector-class\">.id<\/span>\n<span class=\"hljs-selector-tag\">user<\/span><span class=\"hljs-selector-class\">.id<\/span>\n<span class=\"hljs-selector-tag\">session<\/span><span class=\"hljs-selector-class\">.id<\/span>\n<span class=\"hljs-selector-tag\">request<\/span><span class=\"hljs-selector-class\">.id<\/span>\n<span class=\"hljs-selector-tag\">full<\/span> <span class=\"hljs-selector-tag\">URL<\/span>\n<span class=\"hljs-selector-tag\">random<\/span> <span class=\"hljs-selector-tag\">UUID<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">http<\/span><span class=\"hljs-selector-class\">.request<\/span><span class=\"hljs-selector-class\">.method<\/span>\n<span class=\"hljs-selector-tag\">http<\/span><span class=\"hljs-selector-class\">.response<\/span><span class=\"hljs-selector-class\">.status_code<\/span>\n<span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.environment<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">region<\/span>\n<span class=\"hljs-selector-tag\">operation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. Span Cardinality<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Span attributes tolerate more cardinality than metrics, but you still should not create dynamically unique <strong>span names<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GET \/users\/12345\nGET \/users\/89431\nGET \/users\/82173\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">GET \/users\/{id}\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then store the relevant normalized information as appropriate attributes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stable span naming dramatically improves grouping and analysis.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Logs + Traces Correlation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose your application logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Payment failed\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Without correlation, you search manually.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With OTel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"message\"<\/span>: <span class=\"hljs-string\">\"Payment failed\"<\/span>,\n  <span class=\"hljs-attr\">\"trace_id\"<\/span>: <span class=\"hljs-string\">\"8fabc...\"<\/span>,\n  <span class=\"hljs-attr\">\"span_id\"<\/span>: <span class=\"hljs-string\">\"2b73...\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can navigate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Log\n |\n v\nTrace\n |\n v\nPayment Span\n |\n v\nDatabase Span\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This correlation is one of the strongest arguments for unifying telemetry through OpenTelemetry.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. Collector Deployment Patterns<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">There are three especially important patterns.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pattern 1 \u2014 Agent<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">App\n |\n v\nLocal Collector\n |\n v\nBackend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Collector runs close to the application, for example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">VM process\nKubernetes DaemonSet\nSidecar\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The official documentation calls this the <strong>agent deployment pattern<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">48. Pattern 2 \u2014 Gateway<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">App A --+\n        |\nApp B --+--&gt; Gateway Collector --&gt; Backend\n        |\nApp C --+\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Advantages:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">central configuration\ncentral credentials\ncentral routing\ncentral filtering\ncentral sampling\ncentral policy\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A gateway generally exposes a shared OTLP endpoint per cluster, data center or region.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">49. Pattern 3 \u2014 Agent + Gateway<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For medium and large environments, this is usually the strongest architecture:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>                Node 1\nApp A ---&gt; Agent Collector\n                    |\n                 Node 2\nApp B ---&gt; Agent Collector\n                    |\n                 Node 3\nApp C ---&gt; Agent Collector\n                    |\n                    v\n             Gateway Collectors\n                    |\n                    v\n             Observability Backend\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Agents perform lightweight\/local operations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gateways perform:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sampling\nfiltering\nbatching\nrouting\nauthentication\ncredential management\nbackend fan-out\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry&#8217;s current deployment guidance highlights separation of concerns, scalable processing and stable egress\/security as major advantages of the combined architecture.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. Production Kubernetes Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A mature Kubernetes deployment can look like this:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">+---------------------------------------------------------+\n| Kubernetes Cluster                                      |\n|                                                         |\n| Node A                       Node B                      |\n| ----------------           ----------------             |\n| Application Pods            Application Pods            |\n|      |                           |                      |\n|      v                           v                      |\n| OTel Agent DS              OTel Agent DS                |\n|      |                           |                      |\n|      +------------+--------------+                      |\n|                   |                                     |\n|                   v                                     |\n|          OTel Gateway Service                           |\n|                   |                                     |\n|          +--------+--------+                            |\n|          |        |        |                            |\n|          v        v        v                            |\n|      Gateway  Gateway  Gateway                          |\n+----------+--------+--------+----------------------------+\n           |\n           | TLS + OTLP\n           v\n+---------------------------------------------------------+\n| Observability Platform                                  |\n| Traces | Metrics | Logs                                 |\n+---------------------------------------------------------+\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">51. Install Collector on Kubernetes with Helm<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Add the official repository:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">helm repo add open-telemetry \\\n  <span class=\"hljs-attr\">https<\/span>:<span class=\"hljs-comment\">\/\/open-telemetry.github.io\/opentelemetry-helm-charts<\/span>\n\nhelm repo update\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Install as DaemonSet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">helm install otel-agent \\\n  open-telemetry\/opentelemetry-collector \\\n  --<span class=\"hljs-keyword\">set<\/span> image.repository=otel\/opentelemetry-collector-k8s \\\n  --<span class=\"hljs-keyword\">set<\/span> mode=daemonset\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or gateway:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">helm install otel-gateway \\\n  open-telemetry\/opentelemetry-collector \\\n  --<span class=\"hljs-keyword\">set<\/span> image.repository=otel\/opentelemetry-collector-k8s \\\n  --<span class=\"hljs-keyword\">set<\/span> mode=deployment\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The official chart supports:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">daemonset\ndeployment\nstatefulset\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">modes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">52. Kubernetes Data Collection<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Useful Collector components include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">k8sattributes\nkubeletstats\nhostmetrics\nk8scluster\nk8sobjects\nfilelog\nprometheus\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>                Kubernetes\n                     |\n       +-------------+-------------+\n       |             |             |\n    Pod logs      Kubelet       API Server\n       |             |             |\n       v             v             v\n    filelog     kubeletstats   k8scluster\n       |             |             |\n       +-------------+-------------+\n                     |\n                     v\n                  Collector\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">53. Kubernetes Attributes Processor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most valuable processors is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">k8sattributes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It can enrich telemetry with metadata such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.cluster<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.namespace<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.pod<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.node<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The official Helm chart strongly recommends enabling the Kubernetes attributes preset or manually configuring this processor where appropriate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example Helm values:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">mode<\/span>: daemonset\n\npresets:\n  kubernetesAttributes:\n    enabled: true\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">54. Kubernetes Node Metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For node\/pod\/container metrics:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">presets:\n  kubeletMetrics:\n    enabled: <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">DaemonSet mode is generally preferred because the Kubelet Stats receiver observes the node where that Collector instance is running.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">55. Host Metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">presets:\n  hostMetrics:\n    enabled: <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This can provide:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CPU\nload\nmemory\ndisk\nfilesystem\nnetwork\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Helm chart documents this as another DaemonSet-oriented use case.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">56. Cluster Metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Cluster-wide metrics are different.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">mode<\/span>: deployment\n\nreplicaCount: 1\n\npresets:\n  clusterMetrics:\n    enabled: true\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Why one replica?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because several identical collectors gathering the same cluster-wide metrics can generate duplicate telemetry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The official Helm documentation specifically warns about duplicate data for cluster-level receivers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">57. Kubernetes Events<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can also collect Kubernetes events:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">presets:\n  kubernetesEvents:\n    enabled: <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This allows operational events to join the rest of your telemetry pipeline.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">58. OpenTelemetry Operator<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The OpenTelemetry Operator manages:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OpenTelemetry Collectors\nAutomatic instrumentation\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It can inject instrumentation into workloads rather than requiring every team to configure it independently.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Install the Operator, for example, using the official release manifest after satisfying its prerequisites:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl apply -f \\\n<span class=\"hljs-attr\">https<\/span>:<span class=\"hljs-comment\">\/\/github.com\/open-telemetry\/opentelemetry-operator\/releases\/latest\/download\/opentelemetry-operator.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For production, pin an explicitly tested Operator version rather than relying permanently on <code>latest<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">59. OpenTelemetryCollector Resource<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">apiVersion<\/span>: opentelemetry.io\/v1beta1\n<span class=\"hljs-attribute\">kind<\/span>: OpenTelemetryCollector\n\nmetadata:\n  name: otel\n\nspec:\n  config:\n\n    receivers:\n      otlp:\n        protocols:\n          grpc:\n            endpoint: 0.0.0.0:4317\n          http:\n            endpoint: 0.0.0.0:4318\n\n    processors:\n      memory_limiter:\n        check_interval: 1s\n        limit_percentage: 75\n        spike_limit_percentage: 15\n\n      batch: {}\n\n    exporters:\n      debug: {}\n\n    service:\n      pipelines:\n\n        traces:\n          receivers: &#91;otlp]\n          processors: &#91;memory_limiter, batch]\n          exporters: &#91;debug]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The current Operator documentation uses the <code>opentelemetry.io\/v1beta1<\/code> Collector CRD in its getting-started example.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">60. Kubernetes Automatic Instrumentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An Instrumentation resource can define how applications export telemetry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example Python-oriented configuration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: opentelemetry.io\/v1alpha1\n<span class=\"hljs-attr\">kind<\/span>: Instrumentation\n\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: <span class=\"hljs-keyword\">default<\/span>-instrumentation\n\n<span class=\"hljs-attr\">spec<\/span>:\n\n  exporter:\n    endpoint: http:<span class=\"hljs-comment\">\/\/otel-collector:4318<\/span>\n\n  propagators:\n    - tracecontext\n    - baggage\n\n  <span class=\"hljs-attr\">sampler<\/span>:\n    type: parentbased_traceidratio\n    <span class=\"hljs-attr\">argument<\/span>: <span class=\"hljs-string\">\"1\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then annotate a Deployment:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">metadata:\n  annotations:\n    instrumentation.opentelemetry.io\/inject-python: <span class=\"hljs-string\">\"true\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Supported injection annotations include language-specific options for Java, Node.js, Python, .NET and Go.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">61. Sampling<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Tracing every request can become expensive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">50,000 requests \/ second\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If every request creates:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">20 spans\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">1,000,000 spans \/ second\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">may be produced.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sampling controls telemetry volume.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are two important approaches:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Head Sampling\nTail Sampling\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">62. Head Sampling<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The decision is made early.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Keep 10%\nDrop 90%\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Request\n   |\nSampling decision\n   |\n   +-- Keep \u2192 create\/<span class=\"hljs-keyword\">export<\/span> trace\n   |\n   +-- Drop\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Advantages:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">simple\nfast\ncheap\nscalable\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Disadvantage:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The system doesn&#8217;t yet know whether the request will eventually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">fail\nbecome slow\ncontain an interesting anomaly\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry describes consistent probability sampling as a common head-sampling strategy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">63. Tail Sampling<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Tail sampling decides <strong>after observing much or all of the trace<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">IF<\/span> error\n    keep <span class=\"hljs-number\">100<\/span>%\n\n<span class=\"hljs-keyword\">IF<\/span> latency &gt; <span class=\"hljs-number\">2<\/span> seconds\n    keep <span class=\"hljs-number\">100<\/span>%\n\n<span class=\"hljs-keyword\">IF<\/span> VIP workflow\n    keep <span class=\"hljs-number\">100<\/span>%\n\n<span class=\"hljs-keyword\">ELSE<\/span>\n    keep <span class=\"hljs-number\">5<\/span>%\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Advantages:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">keep failures\nkeep slow requests\nkeep unusual transactions\nreduce normal trace volume\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is considerably smarter than purely random sampling.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">64. Tail Sampling Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Tail sampling requires all spans belonging to a given trace to reach the same sampling Collector.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trace abc\n\nSpan 1 -&gt; Gateway A\nSpan 2 -&gt; Gateway B\nSpan 3 -&gt; Gateway C\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">No gateway sees the whole trace.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Correct architecture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trace abc\n   |\nTrace-ID aware routing\n   |\n   v\nGateway B\n\nSpan 1 -&gt; B\nSpan 2 -&gt; B\nSpan 3 -&gt; B\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry recommends trace-ID-aware load balancing for multi-gateway tail sampling and warns that this is an advanced architecture requiring careful testing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">65. Recommended Sampling Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A mature system frequently uses:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Application\n    |\n    | <span class=\"hljs-keyword\">Parent<\/span>-based head sampling\n    v\nAgent\n    |\n    v\nTrace-ID router\n    |\n    v\nTail Sampling Gateway\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example policies:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">100% errors\n100% very slow requests\n100% critical transactions\n100% selected release\/canary traffic\nsmall percentage of healthy traffic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Avoid sampling so aggressively that normal baseline behavior becomes impossible to understand.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">66. Filtering<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Not all telemetry deserves to reach storage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Possible noise:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/health\n\/readiness\n\/liveness\ninternal probes\nlow-value debug logs\nknown crawler traffic\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Filtering these centrally can significantly reduce cost.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptual pipeline:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Receiver\n   |\nMemory limiter\n   |\nFilter\n   |\nTransform\n   |\nBatch\n   |\nExporter\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">67. Attribute Redaction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Telemetry can accidentally contain:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Authorization headers\nAPI keys\ntokens\npasswords\nemail addresses\nuser IDs\ncredit-card information\ndatabase query parameters\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Therefore implement controls such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Allow-<span class=\"hljs-keyword\">list<\/span> attributes\nDelete sensitive attributes\nHash selected identifiers\nMask values\nDrop sensitive records\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A good rule:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Treat observability pipelines as production data systems, not harmless debugging utilities.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">68. Production Collector Configuration Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A typical architecture looks more like:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">receivers:\n  otlp:\n    protocols:\n      grpc:\n        endpoint: 0.0.0.0:4317\n      http:\n        endpoint: 0.0.0.0:4318\n\nprocessors:\n\n  memory_limiter:\n    check_interval: 1s\n    limit_percentage: 75\n    spike_limit_percentage: 15\n\n  batch:\n    timeout: 5s\n\nexporters:\n\n  otlp\/backend:\n    endpoint: ${env:OTEL_BACKEND_ENDPOINT}\n\nservice:\n\n  pipelines:\n\n    traces:\n      receivers: &#91;otlp]\n      processors:\n        - memory_limiter\n        - batch\n      exporters:\n        - otlp\/backend\n\n    metrics:\n      receivers: &#91;otlp]\n      processors:\n        - memory_limiter\n        - batch\n      exporters:\n        - otlp\/backend\n\n    logs:\n      receivers: &#91;otlp]\n      processors:\n        - memory_limiter\n        - batch\n      exporters:\n        - otlp\/backend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Credentials should come from your secrets mechanism rather than being hard-coded into Git.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">69. Collector Resilience<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Collector \u2192 Backend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">and the backend becomes unavailable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without resilience:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">telemetry \u2192 DROP\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">With a queue:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">telemetry \u2192 queue \u2192 retry \u2192 backend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry Collector exporters support retry and sending-queue mechanisms. Current Collector documentation describes exponential backoff and queue-based protection from temporary backend failures.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">70. Persistent Queue \/ WAL<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An in-memory queue disappears if the Collector crashes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A more resilient design uses persistent storage:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Collector\n   |\n   v\nDisk-backed queue \/ WAL\n   |\n   v\nBackend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The <code>file_storage<\/code> extension can provide persistent queue storage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptual configuration:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">extensions:\n  file_storage:\n    directory: <span class=\"hljs-regexp\">\/var\/<\/span>lib\/otelcol\/storage\n\n<span class=\"hljs-attr\">exporters<\/span>:\n  otlp\/backend:\n    endpoint: backend:<span class=\"hljs-number\">4317<\/span>\n\n    <span class=\"hljs-attr\">sending_queue<\/span>:\n      storage: file_storage\n\n<span class=\"hljs-attr\">service<\/span>:\n  extensions:\n    - file_storage\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This lets queued telemetry survive Collector restarts, subject to disk capacity and other failure modes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">71. Extreme Resilience \u2014 Kafka<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For extremely critical telemetry:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Apps\n |\nCollectors\n |\nKafka\n |\nGateway Collectors\n |\nObservability Backend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kafka introduces:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">durability\ndecoupling\nbackpressure isolation\nreplay possibilities\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But it also adds significant operational complexity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not automatically add Kafka merely because it sounds more enterprise-grade.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use it when telemetry durability requirements justify another distributed system.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">72. Memory Limiter<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The Collector must protect itself during spikes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without protection:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Traffic spike\n   |\nHuge telemetry volume\n   |\nCollector memory growth\n   |\nOOMKilled\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">With <code>memory_limiter<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Traffic spike\n   |\nMemory threshold\n   |\nBackpressure \/ refused telemetry\n   |\nCollector remains alive\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Monitor refusal metrics, because frequent refusal means capacity or downstream throughput is inadequate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">73. Batch Processor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Span -&gt; network\nSpan -&gt; network\nSpan -&gt; network\nSpan -&gt; network\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">batching creates:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Span\nSpan\nSpan\nSpan\n  |\nBatch\n  |\nNetwork\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Benefits include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">fewer requests\nbetter compression\nlower networking overhead\nbetter <span class=\"hljs-keyword\">export<\/span> efficiency\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry recommends batching after processors that may drop telemetry.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">74. Collector Scaling<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Important Collector metrics include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">otelcol_exporter_queue_size\notelcol_exporter_queue_capacity\n\notelcol_exporter_send_failed_spans\n\notelcol_processor_refused_spans\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">and equivalent signal-specific metrics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry&#8217;s scaling guidance suggests paying close attention as exporter queues approach roughly <strong>60\u201370% of capacity<\/strong>, while also determining whether the actual bottleneck is the Collector, network or backend.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">75. Don&#8217;t Blindly Scale Collectors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Collector queue = full\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It is tempting to add more Collectors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But perhaps:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Backend is overloaded\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">More Collectors\n    |\n    v\nMore pressure\n    |\n    v\nBackend gets worse\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Always determine:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Collector bottleneck?\nNetwork bottleneck?\nBackend bottleneck?\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">before scaling.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This exact distinction is emphasized in OpenTelemetry&#8217;s Collector scaling guidance.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">76. Collector Self-Observability<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Your observability pipeline itself needs observability.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Monitor:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Collector CPU\nCollector memory\nreceived telemetry\naccepted telemetry\ndropped telemetry\n<span class=\"hljs-keyword\">export<\/span> failures\nqueue utilization\n<span class=\"hljs-keyword\">export<\/span> latency\nprocessor refusals\nrestarts\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Alert on conditions such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">export<\/span> failures &gt; threshold\n\nqueue utilization &gt; threshold\n\nmemory near limit\n\nCollector unavailable\n\ntelemetry refusal &gt; <span class=\"hljs-number\">0<\/span> <span class=\"hljs-keyword\">for<\/span> sustained period\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Otherwise your monitoring system can silently fail while telling you everything is healthy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">77. Security Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Production communication should ideally look like:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n   |\nmTLS \/ trusted cluster network\n   |\nAgent\n   |\nTLS\n   |\nGateway\n   |\nTLS + Authentication\n   |\nBackend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry&#8217;s security guidance recommends encryption and authentication for Collector communications and TLS or mTLS in production as appropriate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">78. Collector Security Best Practices<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Follow these principles:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do not hard-code secrets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">headers:\n  api-key: <span class=\"hljs-keyword\">super<\/span>-secret-value\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Secret Manager\nKubernetes Secret\nVault\nEnvironment variable\nworkload identity where supported\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Use TLS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid exposing unencrypted OTLP across untrusted networks.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Consider mTLS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Useful where client authentication at the transport layer is required.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Run least privilege<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Collector should normally not run as root.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Only grant privileged mounts or capabilities when a receiver genuinely requires them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Restrict receivers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Do not accidentally expose:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">0<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-pseudo\">:4317<\/span>\n0<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-pseudo\">:4318<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">to the public internet without intentional authentication and network controls.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Minimize components<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Only enable the Collector components you actually need.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry specifically recommends reducing the component set to minimize attack surface and mentions the OpenTelemetry Collector Builder as an option for producing a constrained distribution.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">79. Sensitive Data Governance<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a telemetry data classification policy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Category<\/th><th>Allowed?<\/th><\/tr><\/thead><tbody><tr><td>Service name<\/td><td>Yes<\/td><\/tr><tr><td>Environment<\/td><td>Yes<\/td><\/tr><tr><td>Region<\/td><td>Yes<\/td><\/tr><tr><td>HTTP method<\/td><td>Yes<\/td><\/tr><tr><td>Status code<\/td><td>Yes<\/td><\/tr><tr><td>Order category<\/td><td>Yes<\/td><\/tr><tr><td>Password<\/td><td>Never<\/td><\/tr><tr><td>Authorization token<\/td><td>Never<\/td><\/tr><tr><td>API key<\/td><td>Never<\/td><\/tr><tr><td>Credit card number<\/td><td>Never<\/td><\/tr><tr><td>Sensitive PII<\/td><td>Usually no<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Filtering should occur as close to ingestion as practical.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">80. OpenTelemetry vs Prometheus<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">They are complementary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prometheus is primarily:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">metrics collection\/storage\/querying\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry provides:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">instrumentation\ntraces\nmetrics\nlogs\ncontext propagation\ntelemetry processing\n<span class=\"hljs-keyword\">export<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example architecture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">App\n |\nOTel\n |\nCollector\n |\nPrometheus\n |\nGrafana\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not think:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel OR Prometheus\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel + Prometheus\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">where appropriate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">81. OpenTelemetry vs Jaeger<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Jaeger primarily focuses on distributed tracing storage\/query\/visualization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OTel provides instrumentation and transport.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Architecture:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Applications\n |\nOTel\n |\nCollector\n |\nJaeger\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">82. OpenTelemetry vs Datadog\/New Relic\/Dynatrace<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Commercial platforms provide:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">backend storage\nanalytics\ndashboards\nalerts\nAPM UI\nSLOs\nincident tooling\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry can provide a vendor-neutral telemetry ingestion layer.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Apps\n |\nOTel\n |\nCollector\n |\nDatadog \/ <span class=\"hljs-keyword\">New<\/span> Relic \/ Dynatrace\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This can reduce instrumentation coupling even when the observability backend remains commercial.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">83. OpenTelemetry vs Fluent Bit \/ Fluentd<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Fluent Bit and Fluentd historically focus heavily on:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">logs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry supports:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">traces\nmetrics\nlogs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">and increasingly unified signal processing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some organizations retain Fluent Bit for specialized log pipelines while adopting OpenTelemetry for traces\/metrics; others consolidate parts of the stack into OTel Collector.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The right answer depends on required receivers, performance characteristics and operational maturity.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">84. Typical End-to-End Request<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Mobile Client\n   |\nAPI Gateway\n   |\nOrder Service\n   |\nKafka\n   |\nPayment Service\n   |\nPostgreSQL\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A trace might look like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">TRACE<\/span>: checkout\n\nMobile API request                 920 ms\n\u2502\n\u251c\u2500 API Gateway                     20 ms\n\u2502\n\u251c\u2500 Order Service                  120 ms\n\u2502  \u251c\u2500 validate_cart               15 ms\n\u2502  \u2514\u2500 publish Kafka event         25 ms\n\u2502\n\u251c\u2500 Kafka                           40 ms\n\u2502\n\u2514\u2500 Payment Service               700 ms\n   \u2502\n   \u251c\u2500 payment.authorize          500 ms\n   \u2502\n   \u2514\u2500 PostgreSQL                  80 ms\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You instantly discover:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">payment<\/span><span class=\"hljs-selector-class\">.authorize<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">is consuming most latency.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">85. RED Method with OpenTelemetry<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For services, track:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rate<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">requests \/ second\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Errors<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">failed requests \/ second\nerror percentage\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Duration<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">P50\nP95\nP99\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry traces + metrics make RED dashboards straightforward.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">86. USE Method for Infrastructure<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For infrastructure resources:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Utilization<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CPU utilization\nmemory utilization\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Saturation<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">queue depth\nthrottling\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Errors<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">disk errors\nnetwork errors\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Host and Kubernetes metrics can provide much of this information.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">87. Golden Signals<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A classic set of service signals is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Latency\nTraffic\nErrors\nSaturation\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A mature observability implementation should expose all four.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">88. Service Level Indicators<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OTel metrics can feed SLIs such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Availability\n\nsuccessful_requests\n-------------------\ntotal_requests\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Latency:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">requests &lt; 500ms\n----------------\ntotal_requests\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then build:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SLO\n<span class=\"hljs-built_in\">Error<\/span> Budget\nAlert\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">in the monitoring backend.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">89. Production Naming Strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Define conventions centrally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service.namespace = ecommerce\nservice.name = checkout\nservice.version = 2.5.0\ndeployment.environment.name = production\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Avoid teams inventing:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">checkout\nCheckout\ncheckout-service\ncheckout_prod\nprod-checkout\ncheckout-v2\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">for the same logical service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stable identity is fundamental to useful observability.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">90. Recommended Service Naming<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">checkout\npayment\ninventory\nvehicle-api\ntelemetry-consumer\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Poor:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">checkout-prod-pod<span class=\"hljs-number\">-6745678<\/span>\ncheckout-v4-<span class=\"hljs-keyword\">new<\/span>\nmy-service\nbackend1\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dynamic instance information belongs in:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.instance<\/span><span class=\"hljs-selector-class\">.id<\/span>\n<span class=\"hljs-selector-tag\">k8s<\/span><span class=\"hljs-selector-class\">.pod<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">not the logical <code>service.name<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The service semantic conventions explicitly define <code>service.name<\/code> as a logical service identity shared across horizontally scaled instances.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">91. Recommended Environment Naming<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use the semantic convention:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.environment<\/span><span class=\"hljs-selector-class\">.name<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-69\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">development\ntest\nstaging\nproduction\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry defines those as well-known values.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">92. Cost Optimization<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Observability cost is strongly influenced by:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">telemetry volume\ncardinality\nretention\nsampling\nlog verbosity\nattribute size\nnumber of services\nnumber of environments\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Control cost at multiple layers:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n  \u2193\nHead Sampling\n  \u2193\nAgent Filtering\n  \u2193\nGateway Filtering\n  \u2193\nTail Sampling\n  \u2193\nBackend Retention\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not depend entirely on backend billing controls.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">93. What Should Be Sampled?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Good candidates for reduction:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">high-volume successful requests\nhealth probes\nrepetitive background traffic\nknown internal noise\nverbose debugging\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good candidates to preserve:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">errors\ntimeouts\nslow requests\ncritical business transactions\n<span class=\"hljs-keyword\">new<\/span> release traffic\nsecurity-related events\nrare operations\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">94. What Not to Instrument Excessively<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Do not create spans for every tiny function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">parseInteger()\nincrementCounter()\nformatString()\ngetCurrentTime()\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A trace containing thousands of trivial spans can become harder to understand than no trace at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create spans around meaningful operations such as:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">network requests\ndatabase calls\nqueue operations\nbusiness operations\nexpensive computation\ncritical workflow steps\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">95. Database Instrumentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Capture useful information such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">database system\noperation\nduration\nserver\nquery <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span>\n<span class=\"hljs-title\">error<\/span> <span class=\"hljs-title\">status<\/span>\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But be extremely careful with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">raw SQL\nbind parameters\ncustomer data\ncredentials\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Database observability should not become a data-leak mechanism.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">96. Messaging \/ Kafka Instrumentation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For messaging systems, useful telemetry can include:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">publish\nconsume\nqueue\/topic\nlatency\nconsumer processing duration\nerrors\nretry count\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Distributed tracing across asynchronous systems requires careful propagation of trace context through message metadata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A typical flow is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Producer\n  |\ntrace context in message headers\n  |\nKafka\n  |\nConsumer\n  |\ncontinued trace\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">97. Trace Links<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Not every asynchronous relationship is naturally parent \u2192 child.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For batch processing or fan-in\/fan-out systems, span <strong>Links<\/strong> can express relationships to other span contexts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Message A \u2500\u2510\nMessage B \u2500\u253c\u2500&gt; Batch processor span\nMessage C \u2500\u2518\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The batch processing span may link to the originating spans rather than pretending there is one simple parent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Links are part of the OpenTelemetry Span model.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">98. CI\/CD Observability<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Add deployment metadata such as:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.version<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">commit<\/span>\n<span class=\"hljs-selector-tag\">release<\/span> <span class=\"hljs-selector-tag\">version<\/span>\n<span class=\"hljs-selector-tag\">environment<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then correlate:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Deployment v2<span class=\"hljs-number\">.4<\/span><span class=\"hljs-number\">.0<\/span>\n       |\n       v\n<span class=\"hljs-built_in\">Error<\/span> rate increases\n       |\n       v\nLatency regression\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This makes release regression detection dramatically easier.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">99. Recommended Adoption Strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Do not attempt to instrument the entire organization on day one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A better journey is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Phase 1\nCollector + one service\n\nPhase 2\nAutomatic traces\n\nPhase 3\nResource conventions\n\nPhase 4\nCustom business spans\n\nPhase 5\nApplication metrics\n\nPhase 6\nLog correlation\n\nPhase 7\nKubernetes\/infrastructure telemetry\n\nPhase 8\nSampling + filtering\n\nPhase 9\nSLOs + alerts\n\nPhase 10\nGovernance + scale\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">100. Phase 1 \u2014 Proof of Concept<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Choose one representative service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deploy:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">App\n |\nOTel SDK\n |\nCollector\n |\nBackend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Validate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">trace received\nservice name correct\nattributes correct\ncontext propagation correct\nlatency correct\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">101. Phase 2 \u2014 Standardize<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Define organization-wide conventions:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service naming\nenvironment naming\nresource attributes\nsampling\nPII policies\nOTLP endpoints\nbackend routing\nversion metadata\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is where an OTel platform becomes maintainable rather than a collection of unrelated experiments.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">102. Phase 3 \u2014 Centralize Collection<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Move toward:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Applications\n   |\nAgent Collectors\n   |\nGateway Collectors\n   |\nBackend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Centralize:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">authentication\nsecurity\nsampling\nrouting\nfiltering\nredaction\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">103. Phase 4 \u2014 Add Metrics and Logs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Once tracing is stable:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Traces\n+\nMetrics\n+\nLogs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then correlate them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Alert:\nP99 checkout latency high\n\n        \u2193\n\nMetric identifies checkout service\n\n        \u2193\n\nTrace identifies payment span\n\n        \u2193\n\nLogs show payment timeout\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That is practical observability.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">104. Phase 5 \u2014 SLO-Based Observability<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Build:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">SLI\n |\nv\nSLO\n |\nv\n<span class=\"hljs-built_in\">Error<\/span> Budget\n |\nv\nBurn Rate Alert\n |\nv\nTrace investigation\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This moves observability from:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"lots of dashboards\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"actionable reliability engineering\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">105. Troubleshooting \u2014 No Telemetry Arriving<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use a layered approach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2014 Application<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTel instrumentation loaded?\nCorrect service name?\nExporter enabled?\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2014 Endpoint<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OTEL_EXPORTER_OTLP_ENDPOINT\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check whether you meant:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">4317\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">4318\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3 \u2014 Protocol<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">grpc\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">versus:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">http\/protobuf\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A protocol mismatch is a very common failure.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4 \u2014 Collector receiver<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">receivers:\n  otlp:\n    protocols:\n      grpc:\n      http:\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5 \u2014 Collector pipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Defining a component is not enough.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It must be referenced in:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service:\n  pipelines:\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">106. Use Debug Exporter<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Temporarily:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">exporters:\n  debug:\n    verbosity: detailed\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service:\n  pipelines:\n    traces:\n      exporters:\n        - debug\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If telemetry appears there:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application \u2192 Collector = GOOD\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Now investigate:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Collector \u2192 Backend\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">107. Collector Troubleshooting Flow<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application generating telemetry?\n        |\n       Yes\n        |\nCollector receiving telemetry?\n        |\n       Yes\n        |\nProcessor dropping telemetry?\n        |\n       No\n        |\nExporter succeeding?\n        |\n       Yes\n        |\nBackend ingesting telemetry?\n        |\n       Yes\n        |\nBackend query \/ dashboard correct?\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Troubleshoot one boundary at a time.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">108. Broken Distributed Trace<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Symptoms:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Service A trace\nService B separate trace\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Investigate:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">W3C traceparent propagation\nproxy\/header stripping\nHTTP instrumentation\ngRPC instrumentation\nmessage header propagation\ncustom middleware\n<span class=\"hljs-keyword\">async<\/span> context handling\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry context propagation is what allows downstream spans to join the same distributed trace.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">109. Missing Kubernetes Metadata<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">k8sattributes processor enabled?\nRBAC correct?\nProcessor actually in pipeline?\nPod association working?\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Remember:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Declaring processor\n!=\nUsing processor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It needs to appear in the pipeline.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">110. Duplicate Metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Common Kubernetes cause:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Multiple gateway replicas\n   |\n   v\nSame target scraped repeatedly\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The OpenTelemetry Kubernetes documentation specifically warns that identical Collector replicas scraping the same targets can generate duplicate metrics.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Target Allocator\nsharding\nsingle-replica cluster receivers\nappropriate DaemonSets\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">depending on the receiver.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">111. OpenTelemetry Demo<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The OpenTelemetry project maintains a complete demo application.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git <span class=\"hljs-keyword\">clone<\/span> https:<span class=\"hljs-comment\">\/\/github.com\/open-telemetry\/opentelemetry-demo.git<\/span>\n\ncd opentelemetry-demo\n\nmake start\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The full demo includes multiple services and observability backends and is one of the best practical environments for learning how OTel works end-to-end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A very useful learning exercise is to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Run the demo.\n<span class=\"hljs-number\">2.<\/span> Generate traffic.\n<span class=\"hljs-number\">3.<\/span> View traces.\n<span class=\"hljs-number\">4.<\/span> Find a slow span.\n<span class=\"hljs-number\">5.<\/span> Inspect related metrics.\n<span class=\"hljs-number\">6.<\/span> Inspect related logs.\n<span class=\"hljs-number\">7.<\/span> Modify Collector configuration.\n<span class=\"hljs-number\">8.<\/span> Add filtering.\n<span class=\"hljs-number\">9.<\/span> Experiment <span class=\"hljs-keyword\">with<\/span> sampling.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">112. Development vs Production Configuration<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Development:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">100% traces\ndebug exporter\nsimple Collector\nno HA\nminimal filtering\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Production:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-80\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">sampling\nHA Collectors\nTLS\nauthentication\nqueues\nretries\nresource limits\nmemory limiter\nbatching\nredaction\nPII controls\n<span class=\"hljs-keyword\">self<\/span>-monitoring\nautoscaling\nversion pinning\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-80\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Never promote a tutorial Collector configuration directly into production without applying those controls.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">113. Recommended Production Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For most sizeable cloud\/Kubernetes environments:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>                        APPLICATIONS\n                              |\n            Auto + Manual OTel Instrumentation\n                              |\n                              v\n                    OTLP 4317 \/ 4318\n                              |\n                              v\n             +--------------------------------+\n             | Node-level OTel Agent          |\n             | Collector DaemonSet            |\n             |                                |\n             | - logs                         |\n             | - kubelet metrics              |\n             | - host metrics                 |\n             | - lightweight enrichment       |\n             +---------------+----------------+\n                             |\n                             v\n             +--------------------------------+\n             | OTel Gateway Tier              |\n             |                                |\n             | memory protection              |\n             | filtering                      |\n             | redaction                      |\n             | transformation                 |\n             | tail sampling                  |\n             | batching                       |\n             | queue \/ retry                  |\n             | backend credentials            |\n             +---------------+----------------+\n                             |\n                             | TLS\n                             v\n             +--------------------------------+\n             | Observability Backend          |\n             |                                |\n             | Traces                         |\n             | Metrics                        |\n             | Logs                           |\n             +--------------------------------+\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For tail sampling across horizontally scaled gateways:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Agents\n  |\ntrace-ID aware load balancing\n  |\nTail Sampling Gateways\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">not arbitrary round-robin routing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">114. Production HA<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For gateways:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">minimum multiple replicas where architecture permits\nPodDisruptionBudget\nanti-affinity \/ topology spread\nresource requests\nresource limits\nhealth probes\nHPA\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">But stateful processing such as tail sampling requires more careful routing than ordinary stateless gateway scaling.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">115. Kubernetes Resource Management<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Always define Collector resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example conceptually:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-81\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">resources:\n\n  requests:\n    cpu: <span class=\"hljs-number\">250<\/span>m\n    <span class=\"hljs-attr\">memory<\/span>: <span class=\"hljs-number\">512<\/span>Mi\n\n  <span class=\"hljs-attr\">limits<\/span>:\n    cpu: <span class=\"hljs-string\">\"1\"<\/span>\n    <span class=\"hljs-attr\">memory<\/span>: <span class=\"hljs-number\">1<\/span>Gi\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-81\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then configure memory limiting appropriately below the container&#8217;s actual hard memory limit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Leave headroom.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not configure:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">memory_limiter threshold == container limit\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">because the process may be OOM-killed before protection becomes effective.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">116. Network Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-82\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Applications\n   |\nCluster-<span class=\"hljs-keyword\">private<\/span> OTLP endpoint\n   |\nGateway\n   |\nControlled egress\n   |\nBackend\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-82\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">over:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Every application\n   |\nInternet\n   |\nObservability vendor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Centralized egress provides:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">simpler firewalling\ncredential isolation\nnetwork control\nconsistent telemetry policy\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">117. Credential Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n   |\nno vendor credential\n   |\nCollector\n   |\nbackend credential\n   |\nVendor\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This keeps backend API keys out of hundreds of application workloads.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">118. Vendor Migration Architecture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Because applications emit OTLP:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Apps\n |\nOTel\n |\nCollector\n |\nCurrent Backend\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Migration can become:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-83\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Apps\n |\nOTel\n |\nCollector\n |        |\n v        v\nOld      <span class=\"hljs-keyword\">New<\/span>\nBackend  Backend\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-83\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After validation:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-84\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Apps\n |\nOTel\n |\nCollector\n |\n<span class=\"hljs-keyword\">New<\/span> Backend\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-84\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">No major application instrumentation rewrite should be necessary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is one of OpenTelemetry&#8217;s most important strategic advantages.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">119. Multi-Backend Export<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">During migration or for specialized purposes:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>          +----&gt; Backend A\n           |\nCollector--+\n           |\n           +----&gt; Backend B\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Be cautious, however.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Duplicating telemetry doubles downstream:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">network volume\ningestion volume\nstorage cost\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">so use fan-out intentionally.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">120. Common Anti-Patterns<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid these.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every application exports directly to a vendor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">credentials everywhere\nvendor coupling\ndifficult migrations\ninconsistent policy\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 2<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">100% tracing forever.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">massive telemetry volume\nmassive cost\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">High-cardinality metric labels.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">time-series explosion\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Different service naming by every team.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">chaotic queries\nbroken dashboards\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sensitive customer data in spans\/logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">security\nprivacy\ncompliance\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 6<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No Collector self-monitoring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">observability pipeline fails silently\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 7<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tail sampling behind random load balancing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">fragmented traces\nincorrect sampling decisions\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anti-pattern 8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Using <code>latest<\/code> everywhere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">unexpected upgrades\nconfiguration compatibility changes\nhard-to-reproduce incidents\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">121. OpenTelemetry Production Best Practices<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A strong production standard is:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use OpenTelemetry as the application instrumentation standard.<\/li>\n\n\n\n<li>Prefer OTLP between applications and Collectors.<\/li>\n\n\n\n<li>Use automatic instrumentation for quick baseline coverage.<\/li>\n\n\n\n<li>Add manual spans for important business operations.<\/li>\n\n\n\n<li>Standardize <code>service.name<\/code>.<\/li>\n\n\n\n<li>Standardize <code>service.namespace<\/code>.<\/li>\n\n\n\n<li>Standardize <code>service.version<\/code>.<\/li>\n\n\n\n<li>Use <code>deployment.environment.name<\/code>.<\/li>\n\n\n\n<li>Follow semantic conventions.<\/li>\n\n\n\n<li>Keep metric cardinality bounded.<\/li>\n\n\n\n<li>Keep span names stable.<\/li>\n\n\n\n<li>Propagate W3C Trace Context consistently.<\/li>\n\n\n\n<li>Never put sensitive information into baggage.<\/li>\n\n\n\n<li>Use Agent + Gateway architecture for substantial Kubernetes environments.<\/li>\n\n\n\n<li>Keep agent processing lightweight.<\/li>\n\n\n\n<li>Centralize expensive processing in gateways.<\/li>\n\n\n\n<li>Use <code>memory_limiter<\/code>.<\/li>\n\n\n\n<li>Filter\/drop useless telemetry early.<\/li>\n\n\n\n<li>Batch after filtering and enrichment.<\/li>\n\n\n\n<li>Use queues and retries for remote exports.<\/li>\n\n\n\n<li>Consider persistent queues for important telemetry.<\/li>\n\n\n\n<li>Use tail sampling strategically.<\/li>\n\n\n\n<li>Ensure trace-ID-aware routing when horizontally scaling tail-sampling gateways.<\/li>\n\n\n\n<li>Enrich Kubernetes telemetry using <code>k8sattributes<\/code>.<\/li>\n\n\n\n<li>Avoid duplicate Kubernetes scraping.<\/li>\n\n\n\n<li>Protect OTLP endpoints.<\/li>\n\n\n\n<li>Use TLS\/mTLS where appropriate.<\/li>\n\n\n\n<li>Keep vendor credentials in gateways rather than applications.<\/li>\n\n\n\n<li>Apply least privilege.<\/li>\n\n\n\n<li>Redact secrets and PII.<\/li>\n\n\n\n<li>Monitor the Collector itself.<\/li>\n\n\n\n<li>Alert on queue saturation and dropped telemetry.<\/li>\n\n\n\n<li>Pin Collector\/SDK\/Operator versions.<\/li>\n\n\n\n<li>Test upgrades in non-production first.<\/li>\n\n\n\n<li>Treat the telemetry pipeline as production infrastructure.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">122. Recommended Repository Structure<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For an organization managing OTel through Infrastructure as Code:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">observability\/\n\u2502\n\u251c\u2500\u2500 collector\/\n\u2502   \u2502\n\u2502   \u251c\u2500\u2500 agent\/\n\u2502   \u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u2502   \u2514\u2500\u2500 config.yaml\n\u2502   \u2502\n\u2502   \u2514\u2500\u2500 gateway\/\n\u2502       \u251c\u2500\u2500 values.yaml\n\u2502       \u2514\u2500\u2500 config.yaml\n\u2502\n\u251c\u2500\u2500 operator\/\n\u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u2514\u2500\u2500 instrumentation.yaml\n\u2502\n\u251c\u2500\u2500 policies\/\n\u2502   \u251c\u2500\u2500 attributes.md\n\u2502   \u251c\u2500\u2500 sampling.md\n\u2502   \u251c\u2500\u2500 pii.md\n\u2502   \u2514\u2500\u2500 service-naming.md\n\u2502\n\u251c\u2500\u2500 dashboards\/\n\u2502\n\u251c\u2500\u2500 alerts\/\n\u2502\n\u251c\u2500\u2500 slo\/\n\u2502\n\u2514\u2500\u2500 README.md\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This separates:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">collection\ninstrumentation\npolicy\nvisualization\nalerting\nSLOs\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">123. OpenTelemetry Governance<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Large organizations should maintain an internal OTel specification.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OpenTelemetry Standard\n\n1. Service Naming\n2. Resource Attributes\n3. Semantic Conventions\n4. Instrumentation Rules\n5. Metric Naming\n6. Metric Cardinality\n7. Span Naming\n8. Sampling\n9. PII Handling\n10. Logging\n11. Collector Architecture\n12. Security\n13. Backend Routing\n14. Version Management\n15. SLO Integration\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Without governance, telemetry often turns into an expensive data lake nobody trusts.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">124. Recommended Learning Path<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Learn OpenTelemetry in this order:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Observability\n   \u2193\nTraces \/ Spans\n   \u2193\nContext Propagation\n   \u2193\nMetrics\n   \u2193\nLogs\n   \u2193\nResources\n   \u2193\nSemantic Conventions\n   \u2193\nOTLP\n   \u2193\nSDK\n   \u2193\nAuto Instrumentation\n   \u2193\nManual Instrumentation\n   \u2193\nCollector\n   \u2193\nReceivers \/ Processors \/ Exporters\n   \u2193\nKubernetes\n   \u2193\nAgent + Gateway\n   \u2193\nSampling\n   \u2193\nSecurity\n   \u2193\nScaling\n   \u2193\nSLOs\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not begin by memorizing hundreds of Collector configuration options.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Understand the telemetry model first.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">125. OpenTelemetry Mental Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you remember only one architecture, remember:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>                 SOURCE\n                    |\n                    v\n            INSTRUMENTATION\n                    |\n                    v\n                  OTLP\n                    |\n                    v\n               COLLECTOR\n                    |\n            +-------+-------+\n            |       |       |\n         Receive  Process  Export\n            |       |       |\n            +-------+-------+\n                    |\n                    v\n                  OTLP\n                    |\n                    v\n                 BACKEND\n                    |\n                    v\n       Dashboards \/ Alerts \/ SLOs\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And for production Kubernetes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n    |\nOTel SDK \/ Auto Instrumentation\n    |\n    v\nAgent Collector\n    |\n    v\nGateway Collector\n    |\n    v\nObservability Backend\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">126. End-to-End Workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The complete telemetry lifecycle is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-85\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span> Application receives request\n\n<span class=\"hljs-number\">2.<\/span> Instrumentation creates root span\n\n<span class=\"hljs-number\">3.<\/span> Trace context is propagated downstream\n\n<span class=\"hljs-number\">4.<\/span> Child services create child spans\n\n<span class=\"hljs-number\">5.<\/span> SDK records spans and measurements\n\n<span class=\"hljs-number\">6.<\/span> Logs are correlated <span class=\"hljs-keyword\">with<\/span> trace\/span context\n\n<span class=\"hljs-number\">7.<\/span> SDK exports telemetry using OTLP\n\n<span class=\"hljs-number\">8.<\/span> Agent Collector receives telemetry\n\n<span class=\"hljs-number\">9.<\/span> Agent enriches telemetry\n\n<span class=\"hljs-number\">10.<\/span> Gateway receives telemetry\n\n<span class=\"hljs-number\">11.<\/span> Gateway applies:\n       memory protection\n       filtering\n       redaction\n       transformations\n       sampling\n       batching\n\n<span class=\"hljs-number\">12.<\/span> Gateway exports using OTLP\n\n<span class=\"hljs-number\">13.<\/span> Backend stores telemetry\n\n<span class=\"hljs-number\">14.<\/span> Dashboard visualizes metrics\n\n<span class=\"hljs-number\">15.<\/span> Alert detects SLO degradation\n\n<span class=\"hljs-number\">16.<\/span> Engineer opens trace\n\n<span class=\"hljs-number\">17.<\/span> Trace identifies slow component\n\n<span class=\"hljs-number\">18.<\/span> Correlated logs expose error\n\n<span class=\"hljs-number\">19.<\/span> Root cause is identified\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-85\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That is OpenTelemetry end to end.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">127. Reference Architecture Summary<\/h1>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>                               USERS\n                                  |\n                                  v\n                        +-------------------+\n                        | Load Balancer     |\n                        +---------+---------+\n                                  |\n                                  v\n+-------------------------------------------------------------+\n|                     KUBERNETES                              |\n|                                                             |\n| +-------------+   +-------------+   +-------------+         |\n| | Service A   |--&gt;| Service B   |--&gt;| Service C   |         |\n| | OTel SDK    |   | OTel SDK    |   | OTel SDK    |         |\n| +------+------+   +------+------+   +------+------+         |\n|        |                 |                  |                |\n|        +-----------------+------------------+                |\n|                          |                                   |\n|                          v                                   |\n|                 +------------------+                         |\n|                 | Agent Collector  |                         |\n|                 | DaemonSet        |                         |\n|                 +--------+---------+                         |\n|                          |                                   |\n|                          v                                   |\n|               +----------------------+                       |\n|               | Gateway Collectors   |                       |\n|               |                      |                       |\n|               | memory limiter       |                       |\n|               | filtering            |                       |\n|               | redaction            |                       |\n|               | tail sampling        |                       |\n|               | batching             |                       |\n|               | queue\/retry          |                       |\n|               +----------+-----------+                       |\n+--------------------------|-----------------------------------+\n                           |\n                           | OTLP + TLS\n                           v\n          +----------------+----------------+\n          |                                 |\n          v                                 v\n +----------------+                +----------------+\n | Trace Backend  |                | Metrics\/Logs   |\n | Tempo\/Jaeger   |                | Backend        |\n +-------+--------+                +-------+--------+\n         |                                 |\n         +----------------+----------------+\n                          |\n                          v\n                +--------------------+\n                | Grafana \/ Vendor UI|\n                +---------+----------+\n                          |\n               +----------+-----------+\n               |                      |\n               v                      v\n          Dashboards                Alerts\n                                      |\n                                      v\n                                     SLO\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">128. Final Architecture Principles<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenTelemetry works best when you think of it not as another monitoring agent but as an <strong>observability abstraction layer<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your application should know:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-86\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"I generate telemetry.\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-86\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">not:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-87\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"I generate Datadog telemetry.\"<\/span>\n\n<span class=\"hljs-string\">\"I generate New Relic telemetry.\"<\/span>\n\n<span class=\"hljs-string\">\"I generate Jaeger telemetry.\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-87\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The ideal architecture becomes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Application\n      |\n      v\nOpenTelemetry\n      |\n      v\nObservability Platform\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This separation provides:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Portability\nStandardization\nConsistent instrumentation\nVendor flexibility\nCentralized governance\nSecurity control\nCost control\nCross-signal correlation\nBetter troubleshooting\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">129. Final Production Checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before calling an OpenTelemetry deployment production-ready, verify:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Instrumentation<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 All critical services have instrumentation\n\u2610 Automatic instrumentation validated\n\u2610 Important business flows manually instrumented\n\u2610 Distributed context propagation works\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Resources<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-88\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\">\u2610 <span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.name<\/span>\n\u2610 <span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.namespace<\/span>\n\u2610 <span class=\"hljs-selector-tag\">service<\/span><span class=\"hljs-selector-class\">.version<\/span>\n\u2610 <span class=\"hljs-selector-tag\">deployment<\/span><span class=\"hljs-selector-class\">.environment<\/span><span class=\"hljs-selector-class\">.name<\/span>\n\u2610 <span class=\"hljs-selector-tag\">cloud<\/span> <span class=\"hljs-selector-tag\">metadata<\/span>\n\u2610 <span class=\"hljs-selector-tag\">Kubernetes<\/span> <span class=\"hljs-selector-tag\">metadata<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-88\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Tracing<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 Stable span names\n\u2610 Appropriate attributes\n\u2610 Errors represented correctly\n\u2610 Sampling strategy documented\n\u2610 Trace continuity tested\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Metrics<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 RED metrics available\n\u2610 Infrastructure metrics available\n\u2610 Cardinality reviewed\n\u2610 Units defined\n\u2610 Histograms used appropriately\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Logs<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 Structured logging\n\u2610 Trace IDs correlated\n\u2610 Sensitive fields removed\n\u2610 Log volume controlled\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Collector<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 memory_limiter\n\u2610 filtering\n\u2610 enrichment\n\u2610 batch\n\u2610 queues\n\u2610 retries\n\u2610 persistent buffering where required\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Kubernetes<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 Agent Collector\n\u2610 Gateway Collector\n\u2610 Kubernetes attributes\n\u2610 Kubelet metrics\n\u2610 Host metrics\n\u2610 Cluster receivers appropriately singleton\/sharded\n\u2610 No duplicate scraping\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Security<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 TLS\n\u2610 authentication\n\u2610 least privilege\n\u2610 secret management\n\u2610 OTLP endpoints not publicly exposed accidentally\n\u2610 PII redaction\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Reliability<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-89\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\u2610 Multiple gateway replicas where appropriate\n\u2610 resource requests\/limits\n\u2610 disruption protection\n\u2610 queue monitoring\n\u2610 exporter-failure monitoring\n\u2610 Collector <span class=\"hljs-keyword\">self<\/span>-observability\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-89\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Operations<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\u2610 Version pinning\n\u2610 Upgrade procedure\n\u2610 Rollback procedure\n\u2610 Load testing\n\u2610 Failure testing\n\u2610 Capacity planning\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Observability Outcomes<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-90\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">\u2610 Dashboards\n\u2610 Alerts\n\u2610 SLOs\n\u2610 <span class=\"hljs-built_in\">Error<\/span> budgets\n\u2610 Trace investigation workflow\n\u2610 Log correlation\n\u2610 Release\/version correlation\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-90\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When those pieces are in place, OpenTelemetry stops being merely a tracing SDK and becomes the <strong>telemetry foundation of the platform<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">130. One-Sentence Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>OpenTelemetry standardizes how applications and infrastructure generate, correlate, collect, process and transport traces, metrics and logs, while the OpenTelemetry Collector provides the vendor-neutral control plane that routes this telemetry securely and reliably to the observability backend of your choice.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>From Zero to Production: Architecture, Traces, Metrics, Logs, OTLP, Collector, Kubernetes, Sampling, Security, Scaling, Troubleshooting and Best Practices Technology: OpenTelemetry \/ OTelLevel: Beginner \u2192 Intermediate \u2192 Advanced&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-78584","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=78584"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78584\/revisions"}],"predecessor-version":[{"id":78585,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/78584\/revisions\/78585"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=78584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=78584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=78584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}