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

# Jaeger traces

> Move or dual-ship Jaeger trace traffic to Squasher through your OpenTelemetry Collector.

Squasher accepts traces through OTLP/HTTP. Use an OpenTelemetry Collector that
you control to send current OTLP trace traffic or translate legacy Jaeger
protocols.

## OTLP applications

Modern Jaeger accepts OTLP on ports `4317` and `4318`. If your applications
already emit OTLP, keep the applications pointed at your Collector and add
Squasher as an exporter.

```yaml otel-collector-config.yaml theme={null}
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch: {}

exporters:
  otlphttp/squasher:
    endpoint: https://ingest.squasher.ai
    headers:
      x-squasher-key: "${env:SQUASHER_API_KEY}"

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp/squasher]
```

During a migration, keep your current Jaeger exporter in the same pipeline.
Compare trace counts, service names, error traces, and span attributes before
you remove it.

## Legacy Jaeger clients

Use the Collector Contrib Jaeger receiver when a client still sends Jaeger
gRPC or Thrift. Enable only the protocols that your clients use.

```yaml otel-collector-config.yaml theme={null}
receivers:
  jaeger:
    protocols:
      grpc:
        endpoint: 0.0.0.0:14250
      thrift_http:
        endpoint: 0.0.0.0:14268
      thrift_compact:
        endpoint: 0.0.0.0:6831

processors:
  batch: {}

exporters:
  otlphttp/squasher:
    endpoint: https://ingest.squasher.ai
    headers:
      x-squasher-key: "${env:SQUASHER_API_KEY}"

service:
  pipelines:
    traces:
      receivers: [jaeger]
      processors: [batch]
      exporters: [otlphttp/squasher]
```

Jaeger's legacy write protocols do not carry metrics or logs. Configure those
signals in separate Collector pipelines when you need them.

## Sampling

Jaeger remote-sampling configuration does not move with trace data. Keep your
current SDK sampling policy during the first dual-ship test. If you want to
retain all errors and slow traces while reducing routine traffic, add
[customer-side tail sampling](/integrations/tail-sampling) after you verify the
unsampled path.

## Verify

1. Validate the Collector configuration.
2. Send one trace from a known service.
3. Confirm that the root span, child spans, status, resource attributes, events, and links appear.
4. Send one error trace and confirm that it is visible in both Traces and related errors.
5. Compare counts during dual-ship before you change a shared endpoint or remove Jaeger storage.

## References

* [Jaeger write APIs](https://www.jaegertracing.io/docs/latest/architecture/apis/)
* [OpenTelemetry Jaeger receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/jaegerreceiver)

## Agent handoff

```text theme={null}
Connect Jaeger trace traffic to Squasher project <project_id> through a customer-run OpenTelemetry Collector. Use the OTLP receiver for modern clients and the Jaeger receiver only for legacy protocols. Keep the Squasher key in SQUASHER_API_KEY, dual-ship first, verify one error trace, and ask before removing the current Jaeger exporter or storage.
```
