Connect your app
atrim.ai is an OpenTelemetry backend. If your application already emits OTLP you do not need an SDK change, a vendor agent, or a code change — you need an endpoint and a header.
Endpoint and authentication
Section titled “Endpoint and authentication”| Endpoint | https://otlp.atrim.ai |
| Protocol | OTLP over HTTP (http/protobuf) |
| Signal paths | /v1/traces, /v1/metrics, /v1/logs |
| Auth header | x-api-key: atrim_key_… |
Your API key is shown in the app under Admin & Governance → Settings. Keys look like
atrim_key_ followed by 32 hex characters.
A request without a valid key is rejected with 401 Unauthorized, which is also the quickest way
to prove connectivity from the machine that will be sending data:
Quick path: environment variables
Section titled “Quick path: environment variables”Standard OpenTelemetry environment variables, understood by every language SDK and by the Collector. No SDK configuration, no code change:
Add deployment context while you are here — it is what makes the topology and the analysis readable later:
OTEL_SERVICE_NAME is the single most load-bearing value in that list: it is the node label in
Service Topology, the grouping key for critical paths, and the identity an incident is opened
against. payment-service is useful; app is not.
Per-language setup
Section titled “Per-language setup”Auto-instrumentation needs no code in your application at all:
HTTP servers and clients, the common database drivers, and the popular messaging libraries are
instrumented automatically. Add spans of your own with @opentelemetry/api where the interesting
business operations are.
opentelemetry-bootstrap -a install inspects your installed packages and pulls the matching
instrumentation libraries, so re-run it when your dependencies change.
Download the agent once, then attach it at startup:
Go has no drop-in agent, so the exporter is wired in code. The environment variables above are still read by the SDK — this is the explicit form:
Call tp.Shutdown(ctx) on the way out so the last batch is flushed. WithEndpoint takes a host,
not a URL, and defaults to TLS — use WithInsecure() only against a local collector.
OpenTelemetry Collector
Section titled “OpenTelemetry Collector”If you already run a Collector, add atrim.ai as an additional exporter. Your existing backends keep receiving everything they receive today:
Keep the key out of the file with the Collector’s environment-variable substitution:
On Kubernetes, add the k8sattributes processor
Section titled “On Kubernetes, add the k8sattributes processor”Running on Kubernetes? Add the
k8sattributesprocessor
to your Collector. It watches the Kubernetes API and stamps the namespace, workload, pod, and node
each signal came from onto every span, metric, and log — which is what lets your service map group
by namespace → workload → pod and pivot by node.
Without it your telemetry still arrives and every other view works — the Kubernetes hierarchy is the one thing that can’t be reconstructed after the fact, so it’s simply absent rather than guessed. I never infer a namespace or node I didn’t observe.
Use your coding agent
Section titled “Use your coding agent”If your application is not instrumented yet, hand the job to whatever coding agent you already use. The prompt is short on purpose — your agent knows how to wire OpenTelemetry, and the depth it might want is at a URL it can fetch:
The same prompt is offered in the product with your real credentials already filled in, and it is
editable there before you copy it. https://atrim.ai/llms.txt and
https://atrim.ai/llms-full.txt are these docs in a form an agent can read
directly.
Troubleshooting
Section titled “Troubleshooting”Nothing has arrived. Work down this list — it is ordered by how often each one is the answer.
-
Check the endpoint has no signal path on it.
OTEL_EXPORTER_OTLP_ENDPOINTis the base URL:https://otlp.atrim.ai. The SDK appends/v1/tracesitself. The per-signal variables (OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) are the ones that take the full path. Setting the base variable tohttps://otlp.atrim.ai/v1/tracesproduces requests to…/v1/traces/v1/traces, which fail silently in most SDKs. -
Check the header, exactly.
x-api-key=atrim_key_…inOTEL_EXPORTER_OTLP_HEADERS,=and not:, noBearerprefix, no quotes inside the value. Multiple headers are comma-separated. -
Prove reachability from the sending machine.
Run the
curlabove from inside the container or host that is exporting — not from your laptop. A401means the network path works. A timeout or DNS failure means egress rules, a proxy, or a service mesh is in the way. -
Check the protocol.
Set
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf. An SDK left on its gRPC default will not reach an HTTP endpoint, and the failure is usually logged once at startup and never again. -
Turn on the SDK’s own diagnostics.
Every SDK will tell you it failed to export if you ask it to:
An export error names the cause — TLS, DNS, 401, or a malformed endpoint — far faster than anything on this page.
-
Confirm the process is actually instrumented.
The agent or
--requireflag has to be on the command line of the process that serves traffic, not on a wrapper script or aDockerfileENTRYPOINTthat thenexecs something else. -
Generate traffic.
A batching exporter with no spans to send is indistinguishable from a broken one. Make a few requests against your service, then wait for the batch interval (5 seconds by default).
Still nothing? Send us the output of step 5 at hello@atrim.ai — the SDK’s own export error is almost always enough to resolve it in one round trip.
