SDK setup
The quickstart gets you to the first trace. This section goes one level deeper: edge routes, non-HTTP workers, sampling strategy, and the resource-attribute discipline that makes release attribution work across multiple services.
If you haven't done a quickstart yet, do that first.
Shared across every setup
Three things are identical regardless of language.
The endpoint
Every SDK exports OTLP over HTTP to:
https://ingest.greenslope.io/v1/otel/v1/tracesThe double /v1 is deliberate: the outer /v1/otel is our ingest
version; the inner /v1/traces is the OTLP schema version. Don't
collapse them.
gRPC OTLP is supported at the same host on port 443. Use HTTP unless
you have a specific reason — the difference in throughput isn't
meaningful at normal volumes, and HTTP is easier to debug.
The header
Authentication is a header, not a DSN:
x-greenslope-key: gs_ing_live_…Set it via your SDK's headers config. Do not put it in the URL — the
URL ends up in logs.
The three resource attributes
Required on every span:
| Attribute | Type | Example |
|---|---|---|
service.name | string | web, api, billing-worker |
service.version | string | 2026.4.21, v1.8.0 |
greenslope.release.id | string | A git SHA |
Set these once, on the resource, at SDK startup. Don't set them per-span.
If you have multiple services that deploy together, they share the same
greenslope.release.id — that's what lets the Doctor page ask "did this
release break anything across the whole system?".
See Release attribution.
Sampling defaults
- Under ~500 spans/sec per service — keep sampling at 1.0 (100%).
- Above that —
TraceIdRatioBasedSampler(0.1)(10%) is a reasonable default for HTTP workloads. Drop lower only after measurement. - Error and slow-trace retention — we retain 100% of traces with
status=erroror latency above your service's p99 baseline, regardless of sample rate. You don't lose the interesting ones.
See Spans and traces → Sampling.
Related