Endpoint and headers
OTLP requests do not need a project ID. Squasher finds the project from the ingest key. To get a
key, see Create an ingest key.
The Setup page also shows a Collector URL. Send OTLP/HTTP to
https://ingest.squasher.ai
instead: the project rate limit and region routing apply to that endpoint. Use the Collector URL
only for OTLP/gRPC.
Send over gRPC
Squasher also accepts OTLP/gRPC for traces, logs, and metrics. Send gRPC to the Collector URL on the Setup page on port 443 with TLS. For a US project, that ishttps://collector-us.squasher.ai.
Do not use port 4317.
gzip compression. The exporter gets these gRPC status codes:
Set the exporter variables
Most OpenTelemetry SDKs read these variables. With the base URL, the SDK adds/v1/traces,
/v1/logs, and /v1/metrics itself.
deployment.environment.name. Squasher reads the environment from that attribute, and from
the older deployment.environment when an SDK still sends it. Automatic AI triage runs only on
issues in the production environment by default.
Connect your service
- Node.js
- Other languages
- OpenTelemetry Collector
1
Install the packages
2
Start your app with the register hook
Set the variables above, then start Node.js with the hook. It reads the variables and turns
on automatic instrumentation.
What Squasher does with each signal
- A span with the status
ERRORmakes one issue occurrence. The title is the status message, or the span name when the message is empty. When the span hasexceptionevents, the last one adds its attributes and stack trace to the occurrence. - An HTTP client span for a
HEADrequest that got a404response does not make an issue, also when its status isERROR. AHEADrequest asks if a resource exists, so404is the answer and not a failure. Squasher keeps the span with its status. Other methods and status codes make an issue as usual. - On a span without the
ERRORstatus, each span event namedexception, or with a name that ends in.exception, makes one issue occurrence, titled withexception.message, thenexception.type. The event needs one of them. Squasher reads up to 32 such events from one span and 1,000 from one request. - A log record holds an exception when it has
exception.typeorexception.message, or when its event name isexceptionor ends in.exception. At severity 1 to 12 (TRACEtoINFO) it stays a log record and does not make an issue. - The issue page shows the stack trace from
exception.stacktrace. - Squasher groups issues by
service.name, theerror.typeorexception.typeattribute, and the first line of the message. An exception sent as a span event and again as a log record makes two occurrences. - Squasher drops summary metrics.
gen_ai.* attributes, Vercel AI SDK ai.* attributes, Langfuse
langfuse.* attributes, OpenLLMetry llm.*, traceloop.*, and indexed gen_ai.prompt.<n>.*
attributes, OpenInference attributes (with indexed llm.input_messages.<n>.* messages), lmnr.*
and mlflow.* span attributes, and the anthropic.* spans of the
Claude API and SDK.
These log events also go to AI observability, one model call or tool call each:
A model call counts once. When a span that reports usage holds another span or log event that
reports usage, Squasher counts the inner one. Claude Code logs its events in the interaction span,
not in the request span, so Squasher joins its
claude_code.llm_request span and its
claude_code.api_request event by the API request ID, and its tool spans and tool_result events by
the tool use ID. So an agent that sends both traces and log events, or an SDK span around a provider
span, does not count the same tokens twice. AI metrics, such as
gen_ai.client.token.usage, stay metrics: they are totals without a call, so Squasher does not add
them to AI observability.
Use current attribute names
Squasher follows the OpenTelemetry semantic conventions, version 1.44.0, and the GenAI conventions. Send the current attribute names. Squasher also accepts older names, because many SDKs still send them.- When a resource, span, span event, log record, or metric point has an older name and not the current name, Squasher adds the current name with the same value. The older attribute stays.
- When both names are present with different values, Squasher uses the current name.
- AI attributes from the Vercel AI SDK, OpenInference, OpenLLMetry, and Langfuse also get the
matching
gen_ai.*name, for exampleai.usage.promptTokenstogen_ai.usage.input_tokens. - Some values change with the name, as the conventions say. For example,
db.system=mssqlbecomesdb.system.name=microsoft.sql_server, and anhttp.methodoutside the standard list becomes_OTHER. Search and dashboard filters convert an older value too, sodb.system:mssqlfinds both forms. In SQL, compare with the current value. - Squasher does not rename metrics. Some metric renames also changed the unit, for example
http.server.durationin milliseconds tohttp.server.request.durationin seconds.
Search, dashboards, monitors, and SQL queries can use either name. Squasher reads the current name
first, then the older one, so data from before and after an SDK upgrade appears together.
Verify
- Send one span with status
ERROR, or one log record atERRORseverity. - Select Issues in the sidebar. The error is at the top of the list.
- Select Logs in the sidebar, then choose Traces, Logs, or Metrics in the source menu to see the raw data.
401 (wrong key), 415 (wrong content type),
or 404 (a wrong path). A gRPC exporter that sends to ingest.squasher.ai or to port 4317 also
fails; send gRPC to the Collector URL on port 443.
Limits
- A
200response means that Squasher stored the batch or saved it for replay. Delivery is at least once, so a retry can store a duplicate. Keep stable trace and span IDs. - Retry
429and5xxresponses with backoff. Do not retry other4xxresponses before you fix the request. - Each project can send 10,000 records per minute by default. Squasher counts each span, log record, and metric point.
- A gzip body can expand to at most 16 MiB.
Next steps
OTLP contract
Paths, media types, responses, limits, and non-goals.
Tail sampling
Keep error and slow traces and drop routine ones.
Prometheus metrics
Send Prometheus metrics through a Collector.
Kubernetes
Collect pod logs and workload metrics with Helm.
Read AI triage
Learn what the triage summary tells you.