Before you start, you need two values.
- Your base endpoint — shown on Get Started in the dashboard. These
pages write it as
$OIQ_ENDPOINT. - A license key — created in Settings → API keys, starting
oiq_. Requires the Admin role. See Create a license key. These pages write it as$OIQ_LICENSE_KEY.
What each page needs
A page with no data is not an error state — it is a page whose signal has not
arrived. If Services is empty, no traces carrying
service.name have been
received inside the current time range.
Traces
1
Point the SDK at your endpoint
Every OpenTelemetry SDK reads the same two variables. Set them wherever your
process gets its environment — the container spec, the systemd unit, the
platform’s config UI.
2
Instrument the application
Auto-instrumentation covers the common frameworks without code changes — see
Zero-code instrumentation. For anything it does
not reach, manual instrumentation
adds spans by hand.
3
Confirm the spans landed
Open APM → Services. A service appears the first time a span carrying its
service.name is written, and stays listed while data remains inside
retention. If it is missing, see
Verify your data.Set service.version from the start
service.version is what turns the Versions and Deployments pages from
empty into useful, and it is far easier to set now than to backfill later — spans
already written keep whatever they were written with. Use whatever your build
already knows: a git SHA, a semver tag, an image digest.
Metrics
Two sources, both supported, and they can run side by side.- OpenTelemetry
- Prometheus remote-write
Metrics travel over the same endpoint and headers as traces. If you set the
variables above, an SDK or Collector exporting metrics needs nothing further.OpenTelemetry metric names arrive dotted —
http.server.request.duration.Remote-write can be refused by plan. If your plan does not include metrics,
the receiver rejects the write rather than accepting and discarding it. The
rejection is visible in your Prometheus logs as a non-2xx from the remote-write
URL.
Projects and APM
APM is the one product where projects narrow what you see. A project maps to a set of services, and the APM pages filter to that set.- Pass
projectIdto look at one project - Pass
scope=accountto read across the whole account - Sending neither is refused, deliberately — a request that states no scope is a bug in the caller, and answering account-wide data under one project’s heading is the failure that refusal prevents
projectId.
Cost control before you scale up
Traces are the expensive signal. Decide sampling before you roll instrumentation out widely, not after the first bill:- Head sampling in the SDK drops spans at the source and costs nothing to run
- Tail sampling in the Collector keeps every error and slow trace while dropping the uninteresting majority — more useful, more moving parts
Troubleshooting
Services page is empty but the app is running
Services page is empty but the app is running
The spans are not arriving, or they carry no
service.name. Check the SDK’s
own diagnostic log for exporter errors, then confirm the endpoint and key with
Verify your data.401 or 403 from the exporter
401 or 403 from the exporter
Nearly always one of three things: an
oiq_ key sent over gRPC instead of
HTTP, the header spelled something other than x-license-key, or a key that
was revoked. Header names in gRPC metadata must be lower-case.Metrics arrive but charts look coarse over long ranges
Metrics arrive but charts look coarse over long ranges
Expected. A wide time range is answered from pre-aggregated rollups rather
than raw samples, so resolution drops as the window grows. See
Exploring metrics.
Next
Set up Logs
Correlate logs with the traces you just enabled.
Set up Infrastructure
Hosts, containers and Kubernetes.