Kubernetes observability with OpenTelemetry

Kubernetes observability with OpenTelemetry works when Collector placement, Kubernetes metadata enrichment and exporter security are designed before rollout. This page covers the method, build sequence, mapping, security, testing and common failures.

On this page

Kubernetes observability with OpenTelemetry starts with Collector placement

The platform team needs traces, metrics and logs from the clusters it runs, and it needs them without tying application code to one vendor. The supported method is the OpenTelemetry Collector deployed inside Kubernetes, with the Collector Operator and auto-instrumentation as optional components you add when the design calls for them. OpenTelemetry generates, processes and exports telemetry, but it does not store or visualize it. A separate observability backend is therefore always part of the design, and the first decision is which backend receives each signal type. The Collector is licensed under Apache-2.0 and is vendor-agnostic, so changing a backend means editing exporter configuration in the pipeline and leaving application code alone. The Collector can run as an agent beside workloads or as a gateway that accepts data from many sources, and that choice shapes the rest of the design.

Placement comes first because it determines where data is collected, enriched and sent. In agent mode, the Collector usually runs on every node, typically as a DaemonSet, which lets it read node-local sources such as container log files and host metrics and attach Kubernetes metadata close to the source. In gateway mode, a smaller set of Collector replicas receives data over the network from agents or applications, and it becomes the place where sampling, batching, authentication and export to backends are centralized. Many teams use both: agents for node-level collection and a gateway for application traces and shared processing. Before writing configuration, record for each signal its source, the processing it needs, its destination backend and the team that owns that pipeline. That table is the input for the placement decision and for the scope of any quote.

Placement also creates the main operational risks. A gateway that is undersized or runs as a single replica becomes a bottleneck and a single point of failure for every application that sends to it, so confirm how it scales, how it handles memory limits and what happens to queued data when a backend is unavailable. Agents multiply across nodes, so their resource use grows with cluster size and should be tested on a representative node pool. Choose the Collector distribution deliberately: the Collector releases include the contrib distribution, and core components have mixed stability levels documented in each component's README, so check the stability of every receiver, processor and exporter you plan to use. Confirm the authenticator extensions for any receiver or exporter that needs OIDC or OAuth2 credentials before go-live.

What you need before installing the Collector in Kubernetes

Each item below decides whether the Collector installs cleanly and stays supported after go-live. Check the cluster version, the Collector build, the backend and your install rights first, then the registry path if the cluster cannot reach the internet.

Supported Kubernetes version

Confirm that your cluster runs a minor version the Kubernetes project still maintains. As of September 2026, the maintained minors were 1.37 (end of life October 28, 2027), 1.36 (June 28, 2027) and 1.35 (February 28, 2027). Patch support for 1.19 and newer runs about one year, so an older cluster may stop receiving fixes sooner than your Collector rollout expects. Plan any cluster upgrade before the Collector install, and confirm with your platform team which version the production clusters will run during the observability rollout.

Collector release and distribution

Choose a specific Collector release and distribution before writing manifests. Recent releases include v0.163.0 (released October 16, 2026), and the release page also ships the contrib distribution, the Collector builder and the OpAMP supervisor. Decide whether you need contrib components such as the Kubernetes attribute processor, then confirm each component's stability level in its README, since core components have mixed stability. Pin the version so upgrades are deliberate.

OTLP-capable telemetry backend

OpenTelemetry defines how telemetry is generated and exported, but it does not store or display traces, metrics and logs. Before installing, select a backend that accepts OTLP data, or confirm the endpoint, protocol and authentication your chosen tool expects. Confirm where each signal lands, how long it is retained and who can query it. The Collector exporter configuration depends on these answers, so settle them with the team that owns the backend.

Cluster or namespace install rights

Installing the Operator needs cluster-scoped rights to create custom resource definitions, cluster roles and bindings, and the admission webhook. A daemonset Collector that reads node and kubelet data also needs host-level access that Pod Security Standards may restrict. Confirm with your security team whether the install can run under namespace-scoped rights, which namespaces will enforce the Baseline or Restricted standards, and which exceptions require approval.

Registry path for restricted clusters

If your nodes cannot reach public registries, mirror the Collector and Operator images to an internal registry before installing. For clusters built with kubeadm, the kubeadm config images list and pull commands fetch control plane images, and the --image-repository option of kubeadm init points at a private registry. Confirm that the Collector images and any init or sidecar images are present in that registry and that your nodes can pull them.

Image source and signature checks

Confirm the Collector image source and signature verification process with your own change control before the first deployment. Collector release artifacts include signatures, SHA256 checksums and SBOM files, so verify these against the release you chose and record the digests your change record approves. Keep the same checks for mirrored images, because a copied image is only as trustworthy as the process that copied it.

Daemonset versus gateway Collectors and where each signal goes

The placement decision comes down to which signals need to be collected close to the node and which need to pass through a central point before they leave the cluster. A daemonset Collector runs one pod on every node, reads node-local data such as container log files and kubelet metrics, and adds Kubernetes metadata (namespace, pod, deployment and node names) while the telemetry is still tied to its source. A gateway Collector runs as a central Deployment behind a Kubernetes Service. It receives OTLP from applications, from daemonset agents and from other clusters, applies batching and sampling, and exports to the backends. The two roles are different, and most clusters need both.

The usual combined pattern sends node-local signals through the daemonset and application traces and metrics straight to a gateway. Daemonset pods read logs from the node and collect kubelet and host metrics, then forward them over OTLP to a gateway. Applications instrumented with OpenTelemetry SDKs export OTLP to the gateway, or to the daemonset on the same node if you want the node-local hop. Each daemonset pod needs CPU and memory on every node, including nodes running system or batch workloads, so its requests and limits should be set from measured usage on your busiest nodes, not from defaults. The gateway's resource use scales with total throughput, so it needs its own sizing, horizontal scaling and a memory limiter processor.

The trade-offs fall in three areas. Node resource use grows with node count for daemonsets and with telemetry volume for gateways. Failure blast radius is local for a daemonset, since a crashed agent affects one node's logs and metrics, while a gateway outage can stall telemetry from the whole cluster unless its senders have retry and queue settings in place. Scaling is also different: gateways scale horizontally behind a load balancer, but tail-based sampling needs all spans of a trace to reach the same gateway instance, which affects how you route traffic. Decide on the failure mode you can tolerate for each signal before you pick replica counts.

Use a few questions to decide where each signal goes. Does the data exist only on the node, as container logs and kubelet stats do? If so, it needs a daemonset. Does it need sampling, filtering across the whole cluster, or fan-out to several backends? Then it should pass through a gateway. Is the data already in OTLP from an instrumented application? It can go straight to the gateway. Before you choose any receiver or processor, confirm its current component list and stability level in the component README in the OpenTelemetry Collector repository, because stability differs across components and the Collector distribution you pin determines which ones are available.

How to set up OpenTelemetry on Kubernetes in order

This sequence takes a cluster from no telemetry to traces, metrics and logs flowing through node and gateway Collectors with pod-level context. Auto-instrumentation comes last, so each layer is proven before the next one is added.

  1. Confirm cluster version and platform support

    The platform team checks the Kubernetes minor version the cluster runs against the Collector and Operator documentation and confirms the version is still supported by the Kubernetes project. Upgrade the cluster first if it is near end of support, because later steps depend on the API versions it provides. For clusters without internet access, confirm that the Collector and Operator images can be mirrored to a private registry and pulled by the nodes. Done when the team has recorded the cluster version, the planned component versions and the registry location in the change record.

  2. Choose Collector distributions and install method

    The architecture lead selects a Collector distribution and decides between the OpenTelemetry Operator and the Helm chart as the install method. Confirm the current recommended option in the Collector documentation, since packaging guidance changes between releases. The contrib distribution includes the community receivers and processors this sequence uses, so start there unless a smaller build is justified. Pin one release, verify the signed artifacts, checksums and SBOM published with it, and record the choice. Done when a test install in a non-production namespace starts the Collector pod and its logs show no configuration errors.

  3. Deploy the node-level daemonset Collector

    The platform engineer deploys the Collector as a DaemonSet so that one agent runs on every node. Enable host-level receivers such as hostmetrics and kubelet stats, and add a filelog receiver only if container logs are in scope. These receivers need host paths or kubelet access, so review them against the Pod Security Standards level set for the namespace and document any exception. Done when the Collector pod on each node is running, its internal telemetry shows the receivers accepting data, and the backend displays node-level metric series from every node.

  4. Deploy the gateway Collector

    The platform engineer deploys a second Collector as a Deployment behind a Service to receive OTLP over gRPC and HTTP and forward data to the backend. Add memory limiter and batch processors, configure exporters with the endpoint and credentials the backend requires, and place authenticator extensions on the receivers if callers must authenticate. Follow the Collector configuration best practices for secrets and TLS. Done when a test span sent to the gateway service shows an increase in the receiver's accepted counters, appears in the backend, and the exporter logs show no failed sends.

  5. Add the Kubernetes attribute processor

    The platform engineer adds the k8sattributes processor to the node-level Collector, since it sees traffic with pod IP addresses that must be mapped to workload metadata. Create a dedicated ServiceAccount and a ClusterRole that grants only the read verbs the processor needs on pods, namespaces, nodes and the owning workload resources. Confirm the exact resource list in the processor's documentation and review the grant with the security team, because cluster-wide read access is a sensitive permission. Done when kubectl auth can-i confirms the permissions for the ServiceAccount, and spans from a test pod in the backend carry k8s.pod.name, k8s.namespace.name and k8s.node.name.

  6. Wire application OTLP endpoints

    The application team points each workload at a Collector endpoint by setting the standard OTLP exporter environment variables, using the node-local agent or the gateway service according to the architecture chosen earlier. Change one test deployment first, then restart its pods so the new configuration loads. Confirm the protocol and port match the receiver configuration. Done when a restarted test pod produces spans, metrics or logs that reach the backend with the pod-level resource attributes added in the previous step, and the same workload no longer exports to any older endpoint.

  7. Enable auto-instrumentation after manual validation

    The platform engineer enables Operator-managed auto-instrumentation only for namespaces and languages where the manual path has been verified. Confirm which languages the Operator supports and their maturity in the OpenTelemetry status documentation, because support differs by language and signal. Annotate a single test workload, restart it, and compare its telemetry with the manually instrumented baseline. Done when the restarted workload shows the injected instrumentation, produces spans with the same service names and attributes as the baseline, and the team has recorded the rollout scope for each namespace.

How Kubernetes metadata maps to telemetry attributes

This table maps each Kubernetes object the Collector should record to its OpenTelemetry resource attribute, the source of the value, the component that adds it and the access it needs. Use it as a checklist for Collector RBAC, host mounts and the backend schema. Confirm attribute names against the OpenTelemetry semantic conventions version your backend supports, and decide early which high-cardinality values, such as pod UID and free-form annotations, you will keep.

AttributeSource of the valueProcessor or receiver and accessBackend field
k8s.namespace.namePod namespace from the Kubernetes API or the downward APIk8sattributes processor; get, list and watch on pods and namespacesResource attribute mapped to the namespace field
k8s.pod.namePod metadata from the Kubernetes API or the pod log file pathk8sattributes processor or filelog receiver; read access to podsResource attribute mapped to the pod field
k8s.pod.uidPod object UID from the Kubernetes APIk8sattributes processor; read access to podsResource attribute; high cardinality, so confirm whether to keep it
k8s.node.nameNode name from the downward API (spec.nodeName) or the APIPod environment variable or k8sattributes; no host access needed for the valueResource attribute mapped to the node field
k8s.deployment.name or k8s.statefulset.nameOwner references: ReplicaSet to Deployment, or the StatefulSet namek8sattributes processor with owner extraction; read access to ReplicaSets and StatefulSetsResource attribute mapped to the workload field
k8s.container.nameContainer name from the pod spec, matched through the log file path or pod statusfilelog receiver or k8sattributes; read-only hostPath to /var/log/pods for logsResource attribute mapped to the container field
k8s.pod.label.<key> and k8s.pod.annotation.<key>Pod labels and annotations selected in processor configurationk8sattributes processor label and annotation extraction; read access to podsOnly the selected keys; each new value adds index entries and series
container.idContainer ID from pod status or the container log pathk8sattributes processor; confirm whether your setup needs runtime socket accessResource attribute; confirm the semantic convention name for your backend

How auto-instrumentation changes the application side

Auto-instrumentation moves much of the telemetry work from application code into the cluster. The OpenTelemetry Operator can inject language agents into pods when a workload carries the right annotation, so the Operator's admission webhook adds the agent when the pod is created. The agent depends on the application's language and runtime, so a Java service, a Node.js service and a Python worker each need their own agent. One shared configuration cannot serve all of them without a clear mapping from namespace or workload to language. Before enabling injection, inventory the languages and runtime versions in each namespace, then confirm in the Operator documentation which languages it supports and which runtime versions each agent covers.

Compared with manual SDK instrumentation, auto-instrumentation trades developer effort for operational dependencies. Injection happens at pod creation, so enabling, changing or removing an agent takes effect only when workloads roll out, and a configuration change can restart many pods at once. The agent also loads before the application starts, which adds work to each pod's startup and can slow readiness during scaling or failover. Measure startup times in staging with and without injection. Injected components usually add an init container or a mounted volume, which changes the pod spec but not the application image. Check that these additions comply with the Pod Security Admission level set on each namespace, because a restricted namespace may reject them. Manual SDKs give finer control over span names and attributes, but developers must change and release code to get it.

Agents must be versioned together with the application runtime. An agent built for one runtime line may behave differently on another, and an agent upgrade can change span names, attributes or default behavior that dashboards and alerts depend on. Decide who owns each version. In most setups the platform team pins the agent version in the Instrumentation resource, while application teams own runtime upgrades. Ask the Operator project which agent versions it bundles, and test a runtime upgrade in a non-production namespace before the platform default changes. Record the agent version each workload runs, ideally in the same deployment inventory that tracks runtime versions, so an incident can be traced to a specific agent change.

Maturity differs by signal and by language. Trace APIs and SDKs are stable in most languages, including C++, .NET, Go, Java, JavaScript, PHP, Python, Ruby and Swift, which makes traces the lowest-risk starting point for application telemetry. Log SDK maturity varies more, and several languages are still in development. Before relying on logs from applications through OpenTelemetry, check the status of each runtime in use on the OpenTelemetry status page, and confirm the support level for the specific signal. Where a language's log support is not mature enough for your standards, keep the existing logging path for that workload and forward those logs through the Collector while the gap closes.

Security settings for Collector pipelines in your clusters

A Collector pipeline touches application traffic, cluster credentials and the node filesystem, so each setting below needs a deliberate choice. The cards cover how receivers and exporters authenticate, where credentials live, which RBAC and pod privileges the Collector needs, and how to verify release artifacts before they reach your clusters. Review them together with the Collector configuration best practices.

Authenticate and isolate OTLP receivers

OTLP receivers accept telemetry on network ports, so an unauthenticated gateway can be fed data by any pod that can reach it. Configure authenticator extensions on the receiver, such as OIDC where the sending application or agent supports it, and confirm the chosen mechanism with each source before rollout. Pair this with network policies that allow only the namespaces and workloads that send telemetry to reach the gateway ports. Test that a request without valid credentials is rejected.

Exporter credentials through oauth2client

Exporters that send data to a backend or gateway outside the Collector's own trust boundary need credentials on outgoing requests. The oauth2client extension can fetch tokens from an identity provider and attach them to exporter calls, which keeps client secrets out of pipeline definitions. Confirm the token endpoint, scopes and rotation behavior with your identity team, and check that the receiving backend validates the token audience it gets.

Secrets at rest and namespace RBAC

Kubernetes Secrets are stored unencrypted in etcd by default, so receiver and exporter credentials are readable by anyone who can reach etcd or its backups. Enable encryption at rest for Secrets in the API server configuration, then verify it on a test Secret before relying on it. Limit get, list and watch on the Collector namespace to the platform team and the service accounts that need them.

Least-privilege RBAC for k8sattributes

The Kubernetes attributes processor enriches telemetry with pod, namespace and workload metadata by querying the API server. Grant its service account read access only to the resources and namespaces it watches, and bind that role to a dedicated service account that no other workload uses. After applying the role, run kubectl auth can-i checks as that service account to confirm it cannot read Secrets or write anything.

Daemonset privileges and Pod Security Standards

Node-level Collectors deployed as daemonsets often need host paths for container logs, host networking for node metrics, or elevated privileges, and these settings conflict with the Restricted Pod Security Standard. Kubernetes defines Privileged, Baseline and Restricted levels, enforced per namespace by Pod Security Admission. Document each privilege the daemonset needs, isolate it in a dedicated namespace, and keep the gateway Deployment on a stricter level.

Verify release artifacts before deployment

Collector releases ship signed artifacts, SHA256 checksums and SBOM files alongside the builder and OpAMP supervisor. Before you deploy a version, verify the signature using the method the project publishes, compare each binary and image digest against its checksum, and review the SBOM against your vulnerability and license policy. Record the verified version in your change record so every cluster runs an artifact you checked.

How to test OpenTelemetry pipelines before going live

Every OpenTelemetry pipeline should pass a written test plan in a non-production cluster before any application sends it production data. Run the plan separately for each pipeline: the node-level agent Collectors deployed as a daemonset, the gateway Collectors, and each path that carries traces, metrics and logs. Use synthetic telemetry with known identifiers so every test has an expected result. For each signal, record the number of items sent, the number received at the backend, and the attributes present on arrival. Agree the pass criteria with the platform and application owners before testing starts, so the results cannot be reinterpreted after the fact.

Kubernetes attribute enrichment is the check most likely to fail silently. Send synthetic spans and logs from a test workload, then confirm the k8sattributes processor adds the pod, namespace, workload and node fields your design specifies. Repeat the check after deleting the test pod so its replacement starts with a new name, and again after a rolling update of its Deployment. The Collector's service account needs read access to the pod and namespace metadata it looks up, so confirm the RBAC role is bound as designed and that the association rules match the labels your teams use in dashboards. Missing attributes often surface weeks later as blank panels, so treat any gap as a blocking defect.

Test the exporter path separately from the receivers. Confirm the exporter authenticates to the backend with the method in the design, whether that is an authenticator extension such as oauth2client or another mechanism your backend requires. Then rotate or expire the test credential and check that the Collector reports the failure in its logs and metrics instead of losing data quietly. Next, restart a gateway Collector while synthetic load is running and measure how much data is lost. If the design relies on persistent queues through a storage extension, verify that the storage volume is mounted and that queued data replays after the restart. Write down the loss figure the team accepts, because the result only means something against an agreed number.

Backpressure testing shows what the pipeline does when a backend slows down or stops. Point an exporter at a deliberately slow or unreachable endpoint, then watch queue occupancy, retry behavior and the exporter failure counters in the Collector's own metrics. Confirm that the memory_limiter processor refuses data before the pod reaches its memory limit, and that every dropped item is counted. Then run the expected volume for a sustained period and record CPU and memory for each Collector pod. Use those peaks, with headroom agreed with the platform team, to set requests and limits. Check the exact metric names against the Collector version you deploy, since they can change between releases.

Compare the sampling and filtering rules in the running configuration with the design document, line by line. This covers tail sampling decisions, filters that drop health checks or noisy logs, and any attribute redaction. Send traces that should be kept and traces that should be dropped, and confirm the outcome for each. Confirm also that the Collector's own telemetry settings are enabled and exported, so the pipeline reports its health to your monitoring. Finish with a sign-off record that lists the Collector and contrib versions, the configuration revision, test results, accepted loss figures and open defects. The security team should review this record, including exposed receiver ports and how credentials are handled, before production approval.

Common OpenTelemetry on Kubernetes failures and fixes

This table lists common failures when running OpenTelemetry Collectors on Kubernetes, with the likely cause, the first diagnostic to run and the fix for each. Start with the Collector logs and self-telemetry metrics, since most of these failures appear there first. Confirm every diagnostic, metric name and configuration key against the Collector version you run, because component names and metrics can change between releases.

FailureLikely causeFirst diagnosticFix
Missing pod attributesThe k8sattributes processor lacks RBAC to read pods, namespaces or ReplicaSets, or pod association rules do not match the emitted resource attributes.Search Collector logs for forbidden or list errors from the processor, then check the ClusterRole binding for the Collector service account.Grant get, list and watch on the required resources to the Collector service account, then align association rules with the attributes your workloads send.
Collector pods rejected by Pod Security admissionThe target namespace enforces Baseline or Restricted, while the Collector needs host paths, host ports or elevated capabilities.Read the admission events and warnings for the daemonset in its namespace, and check the namespace Pod Security labels.Place the Collector in a dedicated namespace at the least privileged level it needs, and remove host mounts that a receiver does not require.
Exporter authentication errorsCredentials are missing, expired or mounted incorrectly, or the exporter points at the wrong endpoint.Search Collector logs for 401 or 403 responses, then review exporter send-failure metrics on the self-telemetry endpoint.Load credentials from a Kubernetes Secret, use an authenticator extension such as oauth2client where supported, and confirm the endpoint URL.
Daemonset pods not scheduled on tainted nodesThe daemonset has no tolerations for the taints on control plane or dedicated nodes, or node selectors exclude them.Run kubectl describe on a Collector pod that is pending or missing, and compare its events with the node taints.Add tolerations for the taints you intend to cover, and remove node selectors that exclude nodes you want collected.
Gateway overloadMany agents send to too few gateway replicas, or the gateway lacks a memory limiter and sized batch and queue settings.Watch queue fill, refused data and memory use in the gateway self-telemetry and Kubernetes resource metrics.Scale gateway replicas, tune the memory limiter, batch and queue settings, and confirm how agents are load balanced across gateway pods.
High-cardinality attribute growthRequest IDs, pod UIDs or unbounded labels are kept as metric dimensions or span attributes.Count distinct series per metric in the backend, and list the attribute keys that reach the pipeline.Remove or hash high-cardinality keys with attributes or transform processors before export, and keep only the resource attributes the team has agreed to store.
Mismatched component stability assumptionsA beta or alpha component is placed in a pipeline the team treats as production stable.Read the stability level in each component's README for the Collector build you run.Pin the Collector version, record the stability level of each component in use, and replace or gate components before production rollout.

Questions buyers ask before hiring help with OpenTelemetry on Kubernetes

What makes an OpenTelemetry on Kubernetes project cost more or less?

The main drivers are scope size and complexity. Cluster count, application languages, which signals you collect (traces, metrics, logs), your backend choice, the depth of the security review and how much existing logging must be migrated or kept running all change the work. Costs fall into two groups. Design, build, testing and documentation are one-time effort, usually carried by a partner or internal staff. Collector upgrades, backend capacity and ongoing support recur. Ask any provider for a quote that itemizes these groups, names who performs each task, and states which backend licenses or cloud charges are excluded.

How long does an OpenTelemetry Kubernetes implementation usually take?

Duration follows the written scope. A single cluster with one backend and a small set of services is a very different job from many clusters, several languages and a required security review. Change windows, application owner availability and backend readiness often set the pace more than the technical build does. Ask for a timeline tied to named phases: design, a pilot cluster, rollout by environment, and handover. Confirm which dependencies sit on your side, since delays there usually move the end date.

Can our internal platform team set up OpenTelemetry on Kubernetes alone?

Often yes, if the team already operates Kubernetes well and has the skills in four areas: Collector configuration, Kubernetes RBAC and deployment, language instrumentation for each application, and backend administration. Teams usually struggle with the application side, because each owner must review instrumentation and agree on attribute naming. A practical test is whether one engineer can build a pilot pipeline, explain its failure modes and hand it to operations. If not, a scoped partner engagement can cover the build while your team takes over operations.

Should OpenTelemetry Collectors run as a DaemonSet or a gateway?

In many designs you run both. An agent Collector on each node receives telemetry from local workloads and adds Kubernetes attributes such as pod, namespace and node names. A gateway Collector receives data from agents and other sources, then applies central processing, sampling and export. The Collector documentation describes these roles. The right split depends on your cluster count, the sampling you need, how many backends you export to and your failure tolerance, so validate the topology on a pilot cluster before standardizing it.

What must our organization provide before an OpenTelemetry project starts?

Before work starts, you should provide cluster access with an agreed deployment method, the chosen backend and credentials for it, and the identity provider if Collector endpoints will require authentication. Also provide change windows for each environment, a named owner for every application that will be instrumented, and a non-production cluster for testing. Authenticator extensions can check OIDC tokens on receivers and add OAuth2 credentials on exporters, so confirm early which of these your security team requires. Missing items usually show up as idle time in the schedule.

How does DeployOpen price and scope an OpenTelemetry engagement?

DeployOpen works from a written scope. Most engagements are fixed-scope, so the scope, deliverables and timeline are agreed in writing before work starts, and a quote follows from that scope. DeployOpen does not publish a price list. For a quote, describe your clusters, languages, signals, backend, identity setup, compliance requirements and change process. Ongoing support, upgrades and continuous testing are available as retainers, which keeps recurring work separate from the one-time build. Ask for the deliverables and the exclusions in writing with any quote.

What usually goes wrong in OpenTelemetry Kubernetes rollouts?

Common problems include metric cardinality growth from attributes added without review, Collectors without memory limits or queue sizing, missing Kubernetes resource attributes that make telemetry hard to filter, and auto-instrumentation that conflicts with an application's own setup. Stability also varies. Trace SDKs are stable in most languages, log SDK maturity differs by language, and core Collector components have mixed stability levels documented in each component's README. Check each component and language against those stability notes, and test exporter credentials and failover before go-live.

How DeployOpen scopes and delivers Kubernetes observability

DeployOpen plans and builds OpenTelemetry collection for Kubernetes inside your own clusters and cloud accounts, with the Collector layout, enrichment and instrumentation choices agreed before work starts. Each engagement is fixed-scope, so the telemetry sources, backends and deliverables are written down first.

How we scope

  • Inventory the clusters, namespaces, languages and telemetry backends that the written scope will cover.
  • Decide where the Operator, daemonset Collectors and gateway Collectors sit, and document the reasons.
  • Agree which signals (traces, metrics, logs) and which Kubernetes attributes are in scope for each workload.

How we build

  • Install the OpenTelemetry Operator and Collectors from versions you approve, with image sources set for your registry.
  • Configure Kubernetes attribute enrichment and auto-instrumentation only for the languages and workloads named in the scope.
  • Test each pipeline with sample telemetry, checking that data reaches the agreed backend with the expected labels.

How we hand over

  • Provide Collector configuration, Operator manifests and instrumentation settings stored in your version control system.
  • Document each pipeline, its owners, its component stability notes and the known limits of the chosen setup.
  • Walk your platform and application teams through runbooks for adding a workload, changing a pipeline and rolling back.

How we support

  • Offer ongoing support, Collector upgrades and continuous checks as a retainer, separate from the fixed-scope build.
  • Plan Collector upgrades with your team, reviewing component release notes before changing a running pipeline.
  • Ask for a written quote that lists which upgrades, reviews and backend changes the retainer includes.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.