Overview
The OpenTelemetry Collector receives, processes and exports telemetry over OTLP. This template runs a stateless collector that normalizes span URLs, derives span metrics, and forwards traces to Control Plane tracing. It can also ingest OTLP metrics and push them to any Prometheus-remote-write store, such as the catalog Prometheus or Mimir templates, and accept authenticated OTLP from senders outside Control Plane (bearer token or mTLS). Control Plane already collects metrics, logs and traces for every workload on its own. Install this collector when you want something the built-in telemetry does not give you: span-derived metrics you query yourself, OTLP metrics landing in a store you own, or an ingestion endpoint for systems that run elsewhere.--gvc at install. It never creates or manages a GVC. Traces only reach the collector after you point the GVC tracing provider at it, which restarts every workload in that GVC (see Connecting).What Gets Created
Prerequisites
None for a default install. The collector accepts OTLP from inside the GVC without authentication. Public ingestion requires one of two optional auth modes, and each needs a secret that you create before installing:Bearer auth - create the token secret
Authorization: Bearer <token>:auth.method: bearer and auth.bearer.secretName to this name.mTLS auth - create the certificate secret
cert (server certificate), key (server private key) and ca (the CA that signed your client certificates). Paste your PEM files into a file and apply it:auth.method: mtls and auth.mtls.secretName to this name.Installation
A default install needs no--set values:
UI
CLI
Terraform
Pulumi
Configuration
Collector
resources sets the container limit only. replicas is a fixed count: the collector does not autoscale.
Simple Mode
replace_pattern statement per URL shape you want to collapse, so span cardinality stays manageable:
http.url, http.method and http.status_code. With unit: ms the histogram is named traces_span_metrics_duration_milliseconds_bucket, and with unit: s it is traces_span_metrics_duration_seconds_bucket.
Advanced Mode
Withmode: advanced, the collector runs advanced.config exactly as written and ignores the simple-mode knobs. The shipped config is a working starting point equivalent to simple mode:
- Keep
health_checkon0.0.0.0:13133. The chart only adds readiness and liveness probes when the health check listens on0.0.0.0. - Container ports come from
receivers.otlp. The chart reads the gRPC and HTTP endpoints of theotlpreceiver and declares those ports. - For public ingestion, bind your authenticated receiver to
0.0.0.0:4318(HTTP) and0.0.0.0:4319(gRPC). Theauth.*andpublicAccess.*knobs still mount the secret, grantreveal, and set the firewall and load balancer. Token and certificate files are mounted at/etc/otel-collector/auth/tokenand/etc/otel-collector/tls/server.crt,server.keyandca.crt. metrics.enabled: trueis refused in advanced mode. Add the remote-write exporter and pipeline to your config instead:
Metrics Ingestion
metrics.enabled: true, OTLP metrics sent to the collector are pushed to metrics.remoteWrite.endpoint. One collector pushes to one store, so install the template again for each additional target. Remote-write endpoints of the sibling templates in the same GVC:
RELEASE_NAME is the release name of the Prometheus or Mimir install, not of this collector. A Thanos query tier reads from Prometheus, so point the collector at Prometheus and query through Thanos.
Changing metrics.enabled or metrics.remoteWrite updates only the collector’s configuration secret, which a running replica does not re-read. After the cpln helm upgrade, run cpln workload force-redeployment RELEASE_NAME --gvc GVC_NAME.
Ingestion Auth
method is bearer or mtls, a separate authenticated receiver listens on 4318 (HTTP) and 4319 (gRPC). The plain gRPC receiver on 4317 stays unauthenticated for the GVC tracing provider and is never exposed publicly.
bearer— senders sendAuthorization: Bearer <token>. Public bearer ingestion uses the canonical HTTPS endpoint and is OTLP/HTTP only; use mTLS for public gRPC.mtls— the collector presents your server certificate and requires a client certificate signed by your CA. Public mTLS ingestion uses the direct load balancer, and the canonical HTTPS endpoint stops accepting traffic in this mode.
Access
publicAccess.enabled is true with auth.method: none, or with an empty allowedCidrs. Opening to every address takes an explicit ["0.0.0.0/0"]. A public bearer install looks like this:
Connecting
status.canonicalEndpoint:
cpln secret reveal TOKEN_SECRET_NAME -o yaml).
Send Traces From the GVC
Point the GVC OpenTelemetry tracing provider at the collector gRPC port. In the console, open the GVC, enable tracing with the OpenTelemetry provider, and set the endpoint. The resulting GVC spec is:cpln apply a GVC file that holds only this block: an apply replaces the whole GVC spec, including its locations. See OpenTelemetry Tracing Provider for the field reference. Applications instrumented with an OpenTelemetry SDK can also export OTLP straight to the in-GVC addresses above.
Verify the Receiver
Forward the OTLP HTTP port and post an empty trace batch. An HTTP200 means the receiver accepts OTLP. This check applies to a default install (auth.method: none) and was not exercised against a live install for this page:
Operations
Upgrading from 1.0.x
- The default
otelCollector.modeissimplesince 1.1.0 (it wasadvanced). If you customizedadvanced.configand relied on the old default, setotelCollector.mode: advancedexplicitly. - Histogram buckets must be duration strings. Convert numeric buckets carried over from 1.0.x, for example
250to"250ms".
--set values or values file you installed with, so the upgrade does not reset other settings to their defaults.
Scaling and Availability
The collector keeps no state, so replicas need no coordination. SetotelCollector.replicas to 2 or more to keep ingestion running through rolling restarts and the loss of a replica:
Rotating the Bearer Token
Apply the secret with a new value, then force a redeployment. A running replica keeps the old token until it restarts:Troubleshooting
Metrics never arrive in Prometheus or Mimir
Metrics never arrive in Prometheus or Mimir
metrics.remoteWrite.endpoint to the fully qualified address of the store:A metric name is missing but the endpoint is correct
A metric name is missing but the endpoint is correct
my_metric is stored as my_metric_seconds or my_metric_ratio depending on its OTLP unit, and a counter sent as demo_counter arrives as demo_counter_total.Fix: query the suffixed name in Prometheus or Grafana.Traces stop after enabling auth
Traces stop after enabling auth
4318, which belongs to the authenticated receiver once auth is on.Fix: set the GVC tracing endpoint to RELEASE_NAME.GVC_NAME.cpln.local:4317, the plain gRPC receiver.Install fails with publicAccess.enabled true with auth.method none
Install fails with publicAccess.enabled true with auth.method none
otel-collector: you set publicAccess.enabled: true with auth.method: none.Fix: set auth.method to bearer or mtls with the matching secretName, or keep publicAccess.enabled: false and send from inside the GVC.Install fails because allowedCidrs is empty
Install fails because allowedCidrs is empty
otel-collector: publicAccess.allowedCidrs must be non-empty when publicAccess.enabledFix: list your sender CIDRs in publicAccess.allowedCidrs, or ["0.0.0.0/0"] to allow every address.Install fails because the endpoint still contains a placeholder
Install fails because the endpoint still contains a placeholder
otel-collector: metrics.remoteWrite.endpoint still contains the placeholder (simple mode) or otel-collector: otelCollector.advanced.config still contains the placeholder (advanced mode).Fix: replace both the workload name and the GVC in the exporter endpoint.In-GVC senders fail the TLS handshake in mTLS mode
In-GVC senders fail the TLS handshake in mTLS mode
4318 and 4319 serve mTLS for external clients through the direct load balancer.Fix: send from inside the GVC to the plain gRPC receiver on RELEASE_NAME.GVC_NAME.cpln.local:4317.Important Notes
- Point the GVC tracing provider at
RELEASE_NAME.GVC_NAME.cpln.local:4317after install; saving it restarts every workload in the GVC. - Histogram buckets must be duration strings (
"250ms","1s"); bare numbers are read as nanoseconds and break the histogram. - Create the auth secret before installing; a missing secret wedges the deployment with no logs.
- Public ingestion always needs
auth.methodset and a non-emptyallowedCidrs. - In mTLS mode the canonical HTTPS endpoint stops accepting traffic; public clients use the direct load balancer.
- One collector pushes to one remote-write store; install again for each extra target.
- Rotating a token or certificate secret takes effect only after
cpln workload force-redeployment.