---
title: "Sentry with OTel"
description: "Learn how to link Sentry SDK traces with OpenTelemetry instrumented services."
url: https://docs.sentry.io/concepts/otlp/sentry-with-otel/
---

# Sentry with OTel

If you're using both Sentry SDKs and OpenTelemetry instrumentation, you can link them together for end-to-end [distributed tracing](https://docs.sentry.io/concepts/key-terms/tracing/distributed-tracing.md).

## [Linking Sentry and OTLP Traces](https://docs.sentry.io/concepts/otlp/sentry-with-otel.md#linking-sentry-and-otlp-traces)

If you have a Sentry SDK on your frontend or mobile app making requests to an OTLP-instrumented backend, enable `propagateTraceparent` in your SDK initialization to link them into a single distributed trace. This sends the W3C `traceparent` header with outgoing requests, which your OTLP-instrumented backend will pick up and continue.

This gives you end-to-end visibility:

##### Tail-Based Sampling Interaction

When `propagateTraceparent` is enabled, the frontend SDK encodes its sampling decision in the `traceparent` header. If your OTel backend uses a `parentbased_*` sampler (the default is `parentbased_always_on`), it honors that decision and skips your collector's tail-based sampler entirely.

To preserve tail-based sampling, set your backend's sampler to `always_on` so all spans reach the collector for evaluation:

`OTEL_TRACES_SAMPLER=always_on`

The following SDKs support the `propagateTraceparent` option:

### [JavaScript](https://docs.sentry.io/concepts/otlp/sentry-with-otel.md#javascript)

* [![javascript.browser icon](https://docs.sentry.io/_next/static/media/javascript.d53aab1f.svg)Browser JavaScript](https://docs.sentry.io/platforms/javascript/configuration/options.md#propagateTraceparent)
* [![javascript.angular icon](https://docs.sentry.io/_next/static/media/angularjs.8e98e235.svg)Angular](https://docs.sentry.io/platforms/javascript/guides/angular/configuration/options.md#propagateTraceparent)
* [![javascript.astro icon](https://docs.sentry.io/_next/static/media/astro.3cb960c2.svg)Astro](https://docs.sentry.io/platforms/javascript/guides/astro/configuration/options.md#propagateTraceparent)
* [![javascript.ember icon](https://docs.sentry.io/_next/static/media/ember.9862ba42.svg)Ember](https://docs.sentry.io/platforms/javascript/guides/ember/configuration/options.md#propagateTraceparent)
* [![javascript.gatsby icon](https://docs.sentry.io/_next/static/media/gatsby.d1e74154.svg)Gatsby](https://docs.sentry.io/platforms/javascript/guides/gatsby/configuration/options.md#propagateTraceparent)
* [![javascript.nextjs icon](https://docs.sentry.io/_next/static/media/nextjs.27669790.svg)Next.js](https://docs.sentry.io/platforms/javascript/guides/nextjs/configuration/options.md#propagateTraceparent)
* [![javascript.nuxt icon](https://docs.sentry.io/_next/static/media/nuxt.90663273.svg)Nuxt](https://docs.sentry.io/platforms/javascript/guides/nuxt/configuration/options.md#propagateTraceparent)
* [![javascript.react icon](https://docs.sentry.io/_next/static/media/react.e3c301d5.svg)React](https://docs.sentry.io/platforms/javascript/guides/react/configuration/options.md#propagateTraceparent)

###  

* [![javascript.react-router icon](https://docs.sentry.io/_next/static/media/react-router.e30ce352.svg)React Router](https://docs.sentry.io/platforms/javascript/guides/react-router/configuration/options.md#propagateTraceparent)
* [![javascript.remix icon](https://docs.sentry.io/_next/static/media/remix.27fc09d0.svg)Remix](https://docs.sentry.io/platforms/javascript/guides/remix/configuration/options.md#propagateTraceparent)
* [![javascript.solid icon](https://docs.sentry.io/_next/static/media/solid.398fcbf4.svg)Solid](https://docs.sentry.io/platforms/javascript/guides/solid/configuration/options.md#propagateTraceparent)
* [![javascript.solidstart icon](https://docs.sentry.io/_next/static/media/solidstart.a4c37fbe.svg)SolidStart](https://docs.sentry.io/platforms/javascript/guides/solidstart/configuration/options.md#propagateTraceparent)
* [![javascript.svelte icon](https://docs.sentry.io/_next/static/media/svelte.d8e9a29b.svg)Svelte](https://docs.sentry.io/platforms/javascript/guides/svelte/configuration/options.md#propagateTraceparent)
* [![javascript.sveltekit icon](https://docs.sentry.io/_next/static/media/svelte.d8e9a29b.svg)SvelteKit](https://docs.sentry.io/platforms/javascript/guides/sveltekit/configuration/options.md#propagateTraceparent)
* [![javascript.vue icon](https://docs.sentry.io/_next/static/media/vue.2bb828dc.svg)Vue](https://docs.sentry.io/platforms/javascript/guides/vue/configuration/options.md#propagateTraceparent)
* [![javascript.wasm icon](https://docs.sentry.io/_next/static/media/wasm.1533893e.svg)Wasm](https://docs.sentry.io/platforms/javascript/guides/wasm/configuration/options.md#propagateTraceparent)

### [Mobile](https://docs.sentry.io/concepts/otlp/sentry-with-otel.md#mobile)

* [![android icon](https://docs.sentry.io/_next/static/media/android.b3576036.svg)Android](https://docs.sentry.io/platforms/android/configuration/options.md#propagateTraceparent)
* [![apple icon](https://docs.sentry.io/_next/static/media/apple.007b3938.svg)Apple](https://docs.sentry.io/platforms/apple/configuration/options.md#enablePropagateTraceparent)
* [![dart.flutter icon](https://docs.sentry.io/_next/static/media/flutter.b7cd4dd4.svg)Flutter](https://docs.sentry.io/platforms/dart/guides/flutter/configuration/options.md#propagateTraceparent)
* [![native icon](https://docs.sentry.io/_next/static/media/nativec.2ce68873.svg)Native](https://docs.sentry.io/platforms/native/configuration/options.md#propagate_traceparent)
* [![react-native icon](https://docs.sentry.io/_next/static/media/react-native.a5e5ad76.svg)React Native](https://docs.sentry.io/platforms/react-native/configuration/options.md#propagateTraceparent)

### [.NET](https://docs.sentry.io/concepts/otlp/sentry-with-otel.md#net)

* [![dotnet icon](https://docs.sentry.io/_next/static/media/dotnet.aa679e25.svg).NET](https://docs.sentry.io/platforms/dotnet/configuration/options.md#PropagateTraceparent)

## [OTLP Integration](https://docs.sentry.io/concepts/otlp/sentry-with-otel.md#otlp-integration)

If you're running both a Sentry SDK and OTel instrumentation in the same backend service, use the OTLP Integration. It sends your OTel spans to Sentry and ensures errors and logs are linked to the right traces.

* [![python icon](https://docs.sentry.io/_next/static/media/python.94740f0e.svg)Python](https://docs.sentry.io/platforms/python/integrations/otlp.md)
* [![javascript.node icon](https://docs.sentry.io/_next/static/media/nodejs.79546009.svg)Node.js](https://docs.sentry.io/platforms/javascript/guides/node/install/lightweight.md#using-with-opentelemetry-otlp)
* [![java icon](https://docs.sentry.io/_next/static/media/java.7b67f718.svg)Java](https://docs.sentry.io/platforms/java/opentelemetry/setup/otlp.md)
* [![dotnet icon](https://docs.sentry.io/_next/static/media/dotnet.aa679e25.svg).NET](https://docs.sentry.io/platforms/dotnet/tracing/instrumentation/opentelemetry-otlp.md)
* [![go icon](https://docs.sentry.io/_next/static/media/go.ac6569f8.svg)Go](https://docs.sentry.io/platforms/go/tracing/instrumentation/opentelemetry.md)
* [![ruby icon](https://docs.sentry.io/_next/static/media/ruby.07144e67.svg)Ruby](https://docs.sentry.io/platforms/ruby/integrations/otlp.md)
* [![php icon](https://docs.sentry.io/_next/static/media/php.2bb9a6cf.svg)PHP](https://docs.sentry.io/platforms/php/integrations/otlp.md)
* [![php.laravel icon](https://docs.sentry.io/_next/static/media/laravel.978ff0fa.svg)Laravel](https://docs.sentry.io/platforms/php/guides/laravel/integrations/otlp.md)
* [![php.symfony icon](https://docs.sentry.io/_next/static/media/symfony.61e42312.svg)Symfony](https://docs.sentry.io/platforms/php/guides/symfony/integrations/otlp.md)

## [Exporters, Event Linking, and Propagation](https://docs.sentry.io/concepts/otlp/sentry-with-otel.md#exporters-event-linking-and-propagation)

The OTLP Integration configures two things: an **exporter** that sends your OTel spans to Sentry, and **event linking** that attaches Sentry errors and logs to the active OTel trace. This is what makes an error show up on the right span in the trace waterfall.

**Cross-service trace propagation** — making Service A and Service B appear in the same distributed trace — is a separate concern handled by OTel's default W3C `traceparent` propagator. This is already active in any standard OTel SDK setup, so traces connect across services without additional Sentry configuration.
