Best API Observability Tools for Agent Traffic
API observability shows the HTTP call. Agent traffic also has a tool choice and a set of calls that were refused before any request was sent. Most tools show one of those, not both.
Key takeaways
- -In this article we explore the best API observability tools for agent traffic, and which part of an agent call each tool can actually see.
- -To understand how API observability works for agents: an HTTP span shows a request that left. It does not show a call a policy blocked before the request existed.
- -Model-trace tools show the tool the model picked, if your app recorded it. They do not show the provider status unless you attached it.
- -One agent action needs three records: the tool choice, the policy decision, and the provider result. Most API observability tools give you one of those.
- -Swytchcode's audit log is the policy decision and the call, stored locally. It is not an APM product. Send the normalized result to the tracing tool you already use.
Agent traffic breaks the usual API dashboard in a specific way. The dashboard was built for requests that were sent. An agent also chooses a tool, gets refused, retries, and sometimes reports success when the provider returned an error inside a 200. If your observability only has HTTP spans, the refused calls are invisible, and the successful-looking spans may be the wrong tool.
The question for each product below is the same. Can it show the tool the agent chose and the calls that were refused, or only the HTTP spans? Descriptions match how these products are generally used as of October 2026. None of them becomes an execution layer because you add a span.
Three records, not one
A useful trace of an agent call has three parts.
The tool choice. Which method the model asked for, and with what arguments, secrets removed.
The decision. Allowed, blocked, or held for a person, and which rule. This happens before the request. There is no HTTP span to attach it to, unless something emits one on purpose.
The provider result. Status, a normalized error, and whether a retry was safe. A 200 with an error in the body belongs here, marked as a failure.
HTTP tools are built for the third record. LLM trace tools are built for the first, and only for the calls your application remembered to log. The second record is the one teams find out they lack during an incident: "the agent tried to do it" is not in the APM, because the runtime stopped it.
Tools that see the HTTP span
Datadog. The default APM for a lot of companies. Service maps, latency, status codes, and traces, as long as the request was made by a service Datadog is instrumented on. An agent that calls an API through your backend shows up like any other client. An agent whose tool call was rejected locally does not. Datadog will not infer the tool name or the policy rule unless you send them as span attributes. It is the right place for provider latency and error rate. It is the wrong place to look, alone, for "what did the agent try?"
Honeycomb and Grafana Tempo. Same class of tool, different bias. Honeycomb is for high-cardinality events: you can ask which customer, which tool name, which status, if you put those fields on the event. Tempo and the Grafana stack store traces, usually from OpenTelemetry. Both show what you emit. If the refused call is not an emitted span, it is not in the query. They are excellent once the execution layer, or your code, sends the decision as an event. They do not create that event.
New Relic. APM plus a path for AI monitoring that ingests application traces. Provider calls made through an instrumented process appear. Policy refusals appear only if the process records them. Treat the AI views as a lens on traces you already have, not as a record of calls that never left the machine.
Tools that see the model trace
LangSmith. Built for LangChain and LangGraph runs. You see the prompt, the tool call the framework recorded, and the tool result the framework recorded. That is the tool choice, which HTTP APM lacks. It is not the refused call, unless the framework invoked the tool and the tool returned a refusal. A runtime that blocks the method before the framework's HTTP client runs will be absent unless you log that block into the trace yourself. LangSmith is the right system of record for "what the chain did." Pair it with something that knows which API methods were even allowed.
Langfuse. Open-source tracing for LLM applications. Traces, generations, and scores. Same boundary: it stores what the application sends. A tool span you create can carry the provider status. A call you never made will not appear by magic. Self-hosting matters when the prompt itself is sensitive. The trace still does not replace an allow list.
Arize Phoenix. Open-source tracing and evaluation, OpenTelemetry-friendly. Strong when you want to score whether the tool choice was the right one after the fact. Evaluation is not the same as a block. Phoenix can tell you the model picked a bad tool on Tuesday. It does not stop the tool on Tuesday. Stopping it is a policy in the execution path. Scoring it is observability.
Helicone. A proxy in front of model APIs, with logs of those requests. You see the model call, including tool-call JSON the provider returned, if the traffic went through Helicone. You do not see the downstream Stripe or Salesforce request unless that request also went through a logger. And you have put the model traffic through another service. Fine for model cost and latency. Incomplete for "did the provider write happen, and was a different write refused?"
What to send, and what not to expect
OpenTelemetry is the glue, not a product on this list. If the execution path emits a span or a log with the method name, the decision, and the provider status, Datadog, Honeycomb, Grafana, and New Relic can all show it. The work is the emission. Buying another dashboard does not create the refused-call row.
Do not log the credential, the full payment body, or the prompt if the prompt contains a secret. The point of these tools is that many people can query them. Redact first.
Do not treat a model trace that says the tool returned success as the provider result. Frameworks record what the tool function returned. If that function treated HTTP 200 as success, the trace agrees, and the provider error is hidden. Normalize the result before you record it.
Where Swytchcode's log fits
Swytchcode is not an observability suite. It will not replace Datadog, and it should not be bought as one. It is an execution kernel. The audit records the calls that were sent and the calls that were refused.
swy audit network is the calls that were sent, with status and timing. swy audit policy is the calls that were blocked or held, and which rule did it. There is no HTTP span for those, because they stopped before the request. Secrets in the recorded call are redacted. The log is local. Retention follows the plan: 7 days on Free, 30 on Pro, 90 on Business. It is not a multi-team trace backend. Export what your APM needs. Do not point an incident responder at a chat transcript and call it observability. The transcript drops the refusals.
The kernel's other properties are the ones in AI agent execution layer architecture: allow list, schema check, policy before the credential is injected, sandbox or production as a mode in tooling.json, retries that back off on rate limits, and writes retried only with an idempotency key. The response is validated, including a 200 whose body says the action failed. The audit is the record of those decisions. How a gateway's log differs, because it never saw the provider hop, is in MCP gateway vs execution layer.
A practical split: Swytchcode for the decision and the normalized call, your existing APM for latency and paging across services, LangSmith or Langfuse or Phoenix for whether the model's choice of tool was any good. Three systems, three questions. One system that claims all three is usually showing you the HTTP spans with a new label.
FAQ
Can Datadog show calls an agent was not allowed to make?
Only if something records them. A request that was never sent has no span. Emit the policy decision, or read it from the runtime that made the decision.
What is the difference between an LLM trace and an API trace?
The LLM trace is the model's steps: prompt, tool choice, tool result as the application saw it. The API trace is the HTTP request. Agent incidents usually need both, plus the refusals that produced neither a model "success" nor an HTTP call.
Why is a 200 not enough?
Providers put errors in the body and still return 200. A dashboard grouped by status code counts that as success. Normalize the body into an error category before you alert.
Does Swytchcode replace an APM?
No. It records the calls it executed and the calls it refused, locally. Use it for that. Keep Datadog, Honeycomb, or Grafana for service-wide latency, and a model-trace tool for the prompt and the tool choice.
What should I alert on?
Provider failures after normalization, retry storms on writes, and a rise in policy blocks for a method that used to be rare. Latency of successful HTTP calls, alone, will not page you for a duplicate write or for an agent that was correctly stopped.
More content
How to Log Every API Call an AI Agent Makes
Log the call where it is sent, not where it is described. Record the operation, the actor, the idempotency key, the policy decision and the outcome. Never record the credential. If the agent writes its own log, the calls that were blocked quietly disappear.
How to Connect GitHub to an AI Agent (2026)
Most of what you want an agent to do on GitHub needs no push access at all. Working that out first is the difference between a useful teammate and a token that can rewrite your main branch.
Composio Pricing Compared with Nango, Arcade, Pipedream, and Swytchcode
Composio is free for 100,000 tool calls a month, then $29. Nango is $50 pay-as-you-go. Arcade Team is $25 plus a cent a call. Pipedream Startup is $99 billed annually. Swytchcode is $149 for a million. The headline prices are the least useful part, so here is the arithmetic.
