Guide
OpenTelemetry-native APM
jentry accepts OTLP/HTTP natively. Keep the instrumentation you already have — any OpenTelemetry SDK or Collector — change one endpoint, and your traces land in a full APM: span-tree waterfalls, automatic performance issues, and per-route percentiles. No vendor SDK, no agent, no lock-in.
Connect in two minutes
OpenTelemetry SDKs and Collectors are configured with environment variables. Point the traces endpoint at your jentry project and pass your project key as a header — that is the whole integration:
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://jentry.app/api/<projectId>/otlp/v1/traces"
export OTEL_EXPORTER_OTLP_HEADERS="x-jentry-key=<your project key>"
# protobuf (the SDK default) and http/json are both accepted — no protocol switch neededBoth OTLP/HTTP encodings are supported out of the box: http/protobuf (what SDKs send by default) and http/json. Gzip-compressed bodies are handled, responses follow the OTLP spec (including partialSuccess), and rate limiting uses standard 429 + Retry-After.
Node.js
// npm i @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto');
new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: 'https://jentry.app/api/<projectId>/otlp/v1/traces',
headers: { 'x-jentry-key': '<your project key>' },
}),
instrumentations: [getNodeAutoInstrumentations()],
}).start();Python
# pip install opentelemetry-distro opentelemetry-exporter-otlp-proto-http
# then run your app with auto-instrumentation:
OTEL_TRACES_EXPORTER=otlp \
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://jentry.app/api/<projectId>/otlp/v1/traces \
OTEL_EXPORTER_OTLP_HEADERS=x-jentry-key=<your project key> \
opentelemetry-instrument python app.pyOr through an OpenTelemetry Collector
exporters:
otlphttp/jentry:
traces_endpoint: https://jentry.app/api/<projectId>/otlp/v1/traces
headers:
x-jentry-key: <your project key>
service:
pipelines:
traces:
receivers: [otlp]
exporters: [otlphttp/jentry]What you get
- Trace waterfalls with the real span tree — children nested under parents via parent_span_id, errored spans flagged red.
- Automatic performance issues from your OTel spans: N+1 queries, N+1 API calls and slow DB queries, each with span evidence and estimated time saved.
- Per-route transaction stats: p50/p95/p99, throughput, failure rate and Apdex.
- Insights modules (DB, HTTP, cache, queues) grouped from OpenTelemetry semantic conventions.
- Cross-service traces stitched by trace id — instrument two services, see one waterfall.
- The same quota, rate-limiting and alerting pipeline as every other jentry event.
How the mapping works
Within each resource batch (one service), every local-root span — a span whose parent is not in the batch — becomes a transaction; its descendants become that transaction's span tree. Semantic-convention attributes drive everything else:
- db.system → db spans (redis/memcached become cache); db.statement is kept as the span description for grouping and N+1 evidence.
- http.request.method + url.full → http.client or http.server spans, with 4xx/5xx mapped onto span status even when OTel leaves it UNSET.
- messaging.system → queue.publish / queue.process; rpc.system → rpc spans.
- service.name → a service tag; service.version → the release; deployment.environment → the environment.
Frequently asked questions
Do OpenTelemetry SDKs work without changing the protocol?
Yes. SDKs default to http/protobuf, and jentry decodes it natively. http/json works too — no OTEL_EXPORTER_OTLP_TRACES_PROTOCOL switch is required either way.
Do I need a Sentry SDK for errors if I use OpenTelemetry for traces?
They compose. OTLP covers traces/APM today; error events flow through the Sentry-compatible SDKs (or your existing repointed Sentry DSN). Both hit the same projects, quotas and alerts.
Is sampling respected?
Yes — sampling is SDK/Collector-side with OpenTelemetry, and jentry stores what arrives. Use OTEL_TRACES_SAMPLER (e.g. parentbased_traceidratio) to control volume before it ships.
What about OTLP metrics and logs?
Traces are what jentry ingests over OTLP today. Custom metrics have their own ingest API, and OTLP metrics/logs are on the roadmap.
Does this work self-hosted?
Yes — the endpoint is part of jentry itself, so a self-hosted jentry accepts OTLP at the same path on your own domain.
Try jentry free
Hosted error tracking & performance monitoring. Works with your Sentry SDKs — send your first event in minutes.