Sentry Exporter
Route OpenTelemetry traces and logs from multiple services to different Sentry projects through a single collector instance.
The Sentry Exporter has alpha stability for traces and logs. Configuration options and behavior may change.
The Sentry Exporter routes telemetry from multiple services to different Sentry projects through a single collector instance. Without it, you'd need to configure separate DSNs for each project or set up additional routing connectors.
| Scenario | Recommended Exporter |
|---|---|
| Single project, all services share one DSN | otlphttp |
| Multiple projects, need per-service routing | sentry |
| Dynamic environments with auto-provisioning | sentry with auto_create_projects |
The Sentry Exporter is included in otelcol-contrib, the pre-built OpenTelemetry Collector distribution. There is no build step required, just download and run otelcol-contrib with your configuration. For the full specification, see the source code.
In your Sentry account, create an Internal Integration with the required permissions:
- Navigate to Custom Integrations
- Click Create New Integration
- Choose Internal Integration (not Public)
- Give it a name (e.g., "OTEL Collector")
- Set permissions:
- Organization: Read — required
- Project: Read — required
- Project: Write — required for
auto_create_projects
- Click Save Changes
- After saving, click Create New Token
- Copy the token and store it securely, you won't be able to see it again
export SENTRY_AUTH_TOKEN="abc123..."
In your Sentry account, go to General Settings to find your organization slug. Alternatively, you can find it in your Sentry URL: https://sentry.io/organizations/{org-slug}/
| Parameter | Type | Description |
|---|---|---|
url | string | Base URL of your Sentry instance |
org_slug | string | Your Sentry organization slug |
auth_token | string | Internal Integration token |
| Parameter | Type | Default | Description |
|---|---|---|---|
auto_create_projects | bool | false | Create missing projects automatically - requires one existing team |
routing.project_from_attribute | string | service.name | Resource attribute for routing |
routing.attribute_to_project_mapping | map | - | Map attribute values to project slugs |
timeout | duration | 30s | Exporter timeout |
http | object | collector defaults | Standard confighttp client settings (timeout, TLS, headers) |
sending_queue | object | enabled | Queue settings from exporterhelper |
By default, the exporter routes telemetry based on service.name. A service with service.name: payments-api sends to a Sentry project with slug payments-api.
otel-collector-config.yamlreceivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
sentry:
url: https://sentry.io
org_slug: ${env:SENTRY_ORG_SLUG}
auth_token: ${env:SENTRY_AUTH_TOKEN}
processors:
batch:
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [sentry]
logs:
receivers: [otlp]
processors: [batch]
exporters: [sentry]
When services spin up dynamically (Kubernetes deployments, serverless functions), you may not have pre-created Sentry projects. Enable auto_create_projects to provision them on-demand.
Project creation is asynchronous. The first batch of data for a new project may be dropped while provisioning completes.
exporters:
sentry:
# ... required fields
auto_create_projects: true
When your service names don't match your Sentry project slugs (legacy naming, organizational conventions), map them explicitly.
Services not in the mapping fall back to using service.name as the project slug.
exporters:
sentry:
# ... required fields
routing:
attribute_to_project_mapping:
orders-service: ecommerce-orders
products-service: ecommerce-products
api-gateway: ecommerce-gateway
Route by environment, team, or any other resource attribute instead of service name.
exporters:
sentry:
# ... required fields
routing:
project_from_attribute: deployment.environment
attribute_to_project_mapping:
production: prod-monitoring
staging: staging-monitoring
The exporter respects Sentry's rate limits automatically:
- Parses
X-Sentry-Rate-Limitsheaders - Tracks per-project, per-category (traces/logs) rate limit deadlines
- Returns throttle errors to the collector queue for retry
- Falls back to 60-second backoff on HTTP 429 without headers
| Limitation | Mitigation |
|---|---|
| Missing routing attribute drops data | Ensure service.name is set on all resources |
| First batch for auto-created projects may drop | Subsequent data flows normally after provisioning |
| Deleted projects cause 403 until cache evicts | Avoid deleting projects while collector is running |
| Single organization per exporter | Deploy multiple exporters for multi-org setups |
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").