> ## Documentation Index
> Fetch the complete documentation index at: https://docs.controlplane.com/llms.txt
> Use this file to discover all available pages before exploring further.

# OpenTelemetry Collector

## Overview

OpenTelemetry Collector is an observability service that receives, processes, and exports metrics, logs, and traces to the Control Plane tracing backend. This template deploys an OTel Collector workload with pre-configured receiver and processor configuration.

### What Gets Created

* **Standard Workload** — An OTel Collector workload that supports both a simple and an advanced mode allowing you to run a minimal setup for quick deployment or a fully customized configuration.
* **Secret** — An opaque secret for configuring the collector.
* **Identity & Policy** — An identity and policy bound to the OTel Collector workload with `reveal` access to the secret.

<Note>
  This template does not create a GVC. You will need to deploy it to an existing GVC and enable tracing at the GVC level after installing, specifying the target workload and port. This will trigger a restart of all workloads in the GVC.
</Note>

## Installation

To install, follow the instructions for your preferred method:

<CardGroup cols={2}>
  <Card title="UI" href="/template-catalog/install-manage/ui" icon="laptop">
    Browse, install, and manage templates visually
  </Card>

  <Card title="CLI" href="/template-catalog/install-manage/cli" icon="terminal">
    Manage templates from your terminal
  </Card>

  <Card title="Terraform" href="/template-catalog/install-manage/terraform" icon={<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g fill-rule="evenodd"><path d="M77.941 44.5v36.836L46.324 62.918V26.082zm0 0" fill="#5c4ee5"/><path d="M81.41 81.336l31.633-18.418V26.082L81.41 44.5zm0 0" fill="#4040b2"/><path d="M11.242 42.36L42.86 60.776V23.941L11.242 5.523zm0 0M77.941 85.375L46.324 66.957v36.82l31.617 18.418zm0 0" fill="#5c4ee5"/></g></svg>}>
    Declare templates in your Terraform configurations
  </Card>

  <Card
    title="Pulumi"
    href="/template-catalog/install-manage/pulumi"
    icon={<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" id="Pulumi-Icon--Streamline-Svg-Logos" height="24" width="24">
    <desc>
        Pulumi Icon Streamline Icon: https://streamlinehq.com
    </desc>
    <path fill="#f26e7e" d="M4.683025 13.3318c0.869125 -0.5018 0.870575 -2.1264 0.003225 -3.62865s-2.27504 -2.313275 -3.1441725 -1.811475C0.672945 8.3935 0.6715 10.0181 1.53885 11.52035c0.86735 1.502275 2.27505 2.313275 3.144175 1.81145Zm0.0052 3.2167c0.86735 1.502275 0.865925 3.126875 -0.003225 3.628675 -0.86915 0.5018 -2.2768275 -0.309225 -3.144175 -1.81145 -0.8673525 -1.50225 -0.8659075 -3.126875 0.003225 -3.628675 0.8691325 -0.5018 2.276825 0.309225 3.144175 1.81145Zm5.922875 3.4243c0.86735 1.50225 0.8659 3.126775 -0.003225 3.62875 -0.869125 0.501775 -2.27685 -0.309325 -3.1442 -1.81155 -0.867325 -1.50225 -0.865875 -3.12685 0.00325 -3.628675 0.869125 -0.5018 2.276825 0.309225 3.144175 1.811475Zm-0.001925 -6.845275c0.86735 1.50225 0.8659 3.12685 -0.003225 3.628675 -0.869125 0.5018 -2.276825 -0.309225 -3.144175 -1.811475 -0.86735 -1.50225 -0.8659 -3.12685 0.003225 -3.62865 0.869125 -0.501825 2.276825 0.3092 3.144175 1.81145Z" stroke-width="0.25"></path>
    <path fill="#8a3391" d="M22.45775 11.524125c0.86725 -1.502225 0.865925 -3.12685 -0.003225 -3.62865 -0.869125 -0.501825 -2.276825 0.3092 -3.144175 1.811475 -0.86735 1.50225 -0.8659 3.126825 0.003225 3.62865 0.869125 0.501825 2.276825 -0.3092 3.144175 -1.811475Zm0.000175 3.2151c0.869075 0.5018 0.870625 2.1264 0.003225 3.62865 -0.86735 1.50225 -2.27505 2.313275 -3.144175 1.81145 -0.869125 -0.5018 -0.870575 -2.126425 -0.003225 -3.62865 0.86735 -1.50225 2.27505 -2.313275 3.144175 -1.81145ZM16.536225 18.157875c0.86915 0.501825 0.8706 2.126425 0.00325 3.628675 -0.86735 1.502125 -2.275075 2.313225 -3.1442 1.81145 -0.869125 -0.50175 -0.870575 -2.126425 -0.003225 -3.62865 0.867375 -1.502275 2.27505 -2.3133 3.144175 -1.811475Zm-0.003325 -6.843775c0.869125 0.5018 0.870575 2.126425 0.003225 3.628675s-2.27505 2.313275 -3.1442 1.811475c-0.869125 -0.501825 -0.870575 -2.126425 -0.003225 -3.628675 0.86735 -1.502275 2.27505 -2.313275 3.1442 -1.811475Z" stroke-width="0.25"></path>
    <path fill="#f7bf2a" d="M15.138225 2.06721c0 1.003615 -1.40625 1.817215 -3.14095 1.817215 -1.7347 0 -3.14095 -0.8136 -3.14095 -1.817215C8.856325 1.06359 10.262575 0.25 11.997275 0.25c1.7347 0 3.14095 0.81359 3.14095 1.81721ZM9.2166 5.482375c0 1.003625 -1.40625 1.8172 -3.14095 1.8172 -1.7347 0 -3.14095 -0.813575 -3.14095 -1.8172s1.40625 -1.817225 3.14095 -1.817225c1.7347 0 3.14095 0.8136 3.14095 1.817225Zm8.71005 1.8172c1.7347 0 3.14095 -0.813575 3.14095 -1.8172s-1.40625 -1.817225 -3.14095 -1.817225c-1.7347 0 -3.14095 0.8136 -3.14095 1.817225s1.40625 1.8172 3.14095 1.8172Zm-2.788425 1.605625c0 1.003625 -1.40625 1.8172 -3.14095 1.8172 -1.7347 0 -3.14095 -0.813575 -3.14095 -1.8172 0 -1.0036 1.40625 -1.8172 3.14095 -1.8172 1.7347 0 3.14095 0.8136 3.14095 1.8172Z" stroke-width="0.25"></path>
    </svg>}
  >
    Declare templates in your Pulumi programs
  </Card>
</CardGroup>

## Configuration

Step 1 is completed while deploying the template. After deploying the template, complete the following steps to finish configuration:

**1. Normalize URL patterns (recommended)**

If your application has dynamic URL segments, use the `transform` processor to normalize them into fixed patterns. This keeps span cardinality manageable and makes your traces queryable. In either Simple or Advanced config, replace each occurrence of `PLACEHOLDER` with each path segment you want to collapse:

```yaml theme={null}
transform:
  trace_statements:
    - context: span
      statements:
        # Static path
        - replace_pattern(span.attributes["http.url"], "^.*(/user/profile).*$", "/user/profile")
        # Wildcard path
        - replace_pattern(span.attributes["http.url"], "^.*(/user/settings/.*).*$", "/user/settings/.*")
```

Add one statement per pattern you want to normalize.

**2. Install the OpenTelemetry SDK in your application**

Your application must emit traces using the OpenTelemetry SDK. Install the SDK and configure it to export via OTLP/gRPC to:

```
http://<otel-collector-workload-name>.<gvc-name>.cpln.local:4317
```

**3. Enable tracing at the GVC level**

Navigate to the GVC where the OpenTelemetry Collector is installed and enable tracing. Set the target workload on port `4317`. This triggers a restart of all workloads in the GVC so they begin emitting traces to the collector.

**4. Query span metrics in Grafana**

Span metrics are exposed via Prometheus on port `8889` of the collector workload which is configured and exposed by the workload.
Use the `spanmetrics` connector to build dashboards and alerts. The metric name suffix automatically changes based on the unit defined in your configuration to ensure data consistency.

```
traces_span_metrics_duration_milliseconds_bucket{http_url="/your-endpoint"}
```

If you changed the unit to `s` in the histogram, the metric name changes to:

```
traces_span_metrics_duration_seconds_bucket{http_url="/your-endpoint"}
```

The default `values.yaml` for this template:

```yaml theme={null}
# IMPORTANT:
# After installing the collector, you must enable tracing at the GVC level which will trigger a restart on all workloads.
otelCollector:
  image: otel/opentelemetry-collector-contrib:0.148.0
  mode: advanced # controls which config is used:
               # - simple: minimal setup for quick deployment.
               # - advanced: fully customizable configuration.
  resources:
    cpu: 200m
    memory: 256Mi

  # Simple Mode
  simple:
    processors:
      transform:
        traceStatements: # Simplifies spans by replacing dynamic data with a fixed value. Substitute PLACEHOLDER with the URL segment you want to normalize, e.g. 'user/profile'
          - replace_pattern(span.attributes["http.url"], "^.*(PLACEHOLDER).*$", "/PLACEHOLDER")

    spanmetrics:
      histogram: # Histogram bucket boundaries in ms for span duration distribution — tune to match your SLO thresholds
        buckets: [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000]
        unit: ms # Bucket values are interpreted in milliseconds (choose: ms or s)

  # Advanced Mode
  advanced:
    config: |
      extensions:
        health_check:
        pprof:
          endpoint: 0.0.0.0:8180

      receivers:
        otlp:
          protocols:
            grpc:
              endpoint: 0.0.0.0:4317

      processors:
        batch:
        resource:
          attributes:
            - key: workload
              from_attribute: service.name
              action: insert
        transform:
          trace_statements:
            - context: span
              statements:
                - replace_pattern(span.attributes["http.url"], "^.*(PLACEHOLDER).*$", "/PLACEHOLDER")

      connectors:
        spanmetrics:
          dimensions:
            - name: http.url
            - name: http.method
            - name: http.status_code
          histogram:
            explicit:
              buckets: [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000]
            unit: ms

      exporters:
        debug:
          verbosity: detailed
        otlp:
          endpoint: http://tracing.controlplane:80
          tls:
            insecure: true
        prometheus:
          endpoint: 0.0.0.0:8889

      service:
        pipelines:
          traces:
            receivers: [otlp]
            processors: [resource, transform, batch]
            exporters: [otlp, debug, spanmetrics]
          metrics:
            receivers: [spanmetrics]
            processors: [batch]
            exporters: [prometheus]

        extensions: [pprof, health_check]

        telemetry:
          logs:
            level: INFO
```

### Mode

* `otelCollector.mode` — Set to `simple` for a minimal setup for quick deployment, or `advanced` to provide a fully customized configuration. In `advanced` mode, the entire `otelCollector.advanced.config` is passed directly to the collector.

### Simple Mode

* `simple.processors.transform.traceStatements` — A list of `replace_pattern` statements that normalize dynamic URL segments in `http.url` span attributes. Replace `PLACEHOLDER` with the path segment you want to collapse, e.g. `user/profile`.
* `simple.spanmetrics.histogram.buckets` — Histogram bucket boundaries in milliseconds for span duration distribution. Tune these to align with your SLO thresholds.
* `simple.spanmetrics.histogram.unit` — Unit for histogram bucket values. Choose `ms` (milliseconds) or `s` (seconds).

### Advanced Mode

The `advanced.config` block accepts a full [OpenTelemetry Collector configuration](https://opentelemetry.io/docs/collector/configuration/).

| Component                | Description                                                            |
| ------------------------ | ---------------------------------------------------------------------- |
| `receivers.otlp`         | Accepts traces from your application over gRPC on port `4317`          |
| `processors.resource`    | Copies `service.name` into a `workload` attribute for easier filtering |
| `processors.transform`   | Normalizes dynamic URL segments in span attributes                     |
| `connectors.spanmetrics` | Derives duration histograms and request metrics from trace spans       |
| `exporters.otlp`         | Forwards traces to the Control Plane tracing backend                   |
| `exporters.prometheus`   | Exposes span-derived metrics for scraping on port `8889`               |
| `exporters.debug`        | Logs spans to the workload's stdout — useful during development        |

## External References

<CardGroup cols={2}>
  <Card title="OTel Collector Documentation" icon="book" href="https://opentelemetry.io/docs/collector/">
    Official OpenTelemetry Collector documentation
  </Card>

  <Card title="OTel SDK Setup" icon="book" href="https://opentelemetry.io/docs/languages/">
    Language-specific SDK guides for instrumenting your application
  </Card>

  <Card title="Spanmetrics Connector" icon="book" href="https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/connector/spanmetricsconnector">
    Reference for the spanmetrics connector configuration
  </Card>

  <Card title="OTel Collector Template" icon="github" href="https://github.com/controlplane-com/templates/tree/main/otel-collector">
    View the source files, default values, and chart definition
  </Card>
</CardGroup>
