agent reasoning observability · SigNoz Trace Funnels

Does your AI agent
actually finish thinking?

An agent follows a reasoning contractplan → tool → validate → respond. Your dashboard counts spans and reports the validate step ran 100% of the time. But it only checks the span exists, not that it happened in order. Ask the same traces as an ordered funnel and the real number is 64% — validate is firing before the tool it's supposed to check. That 36-point gap is agents shipping unchecked answers, invisible to a counter.

contract plan tool validate respond

The money moment

Same 125 traces, two measurements

One number keeps you asleep. The other is what actually happened.

what your dashboard shows
Naive counter
“did the agent.validate span exist?”
0.0%
present in 125/125 traces
what really happened
Ordered funnel
“did it happen after the previous step?”
0.0%
completed in order 80/125
The gap
45 traces the counter called healthy — that never validated in order
0.0pp

The funnel

Where the reasoning drops off

Each bar is the share of traces that reached that step in the contract's order. The break is exactly where a counter goes blind.

cognition · fot-agent 125 traces entered
1agent.plan n=125  ·  100.0%
2agent.tool n=125  ·  100.0%
3agent.validate n=80  ·  64.0%
−45 traces the validate span existed, but not after the tool result
4agent.respond n=80  ·  64.0%

Why a counter can't see it

Presence is not sequence

A span can be present and still be wrong. Here's one of the 45 traces the counter waved through.

A counter asks a yes/no question: did the agent.validate span exist? If yes, it scores the trace healthy — 100%. It has no notion of time, so it can't tell a validation that checked the tool result from one that ran before the tool even started.

A funnel asks a stricter question: did each step happen after the one before it? It's the same trace data, read as an ordered sequence. When agent.validate starts before agent.tool ends, the funnel counts a drop-off — because the contract was broken, even though every span is technically present.

That's the whole idea: A counter measures presence; a funnel measures sequence.

trace 7f3c1a9e4b2d8065 · 2530ms
agent.plan
420ms
agent.validate
260ms
agent.tool
1180ms
agent.respond
640ms

validate finished before the tool it was checking even started.

The span is present, so the counter scores it 100%. The funnel requires agent.validate to start after agent.tool ends — so it scores it a drop-off.

Run metrics

From the same window

Avg duration
2.59s
p99 latency
3.34s
Errors
45

Yes — the error count is also 45, so here you could find these traces by counting errors instead. That only works because this agent labels its own premature validation: it knows the ground truth because I injected it. A real agent that validates before its evidence arrives gets a confident SUPPORTED back and records a success — there is no error to count. The funnel finds those runs without the agent having to know it went wrong.

Closing the loop

The agent can now read this funnel itself

Everything above is a human looking at a chart. The point of measuring a reasoning contract is that the agent can check its own — and it couldn't.

41tools in SigNoz's own MCP server 0of them reach trace funnels

An agent could already reach traces, metrics, logs, dashboards and alerts through MCP — everything except the one primitive that measures whether it finished thinking. That count is measured, not claimed: the judge script completes an MCP handshake against the live server and enumerates tools/list. Run python scripts/mcp_gap.py --list to see all 41 yourself, and it fails loudly if SigNoz ever ships funnel tools.

create_funnel
define a contract, in one call
get_funnel_analytics
per-step conversion, with n
get_funnel_slow_traces
the slowest step transitions
list_funnels
what already exists
delete_funnel
clean up after yourself

signoz-funnel-mcp ships those five. Point an MCP client at it and ask "build a funnel over my agent's reasoning steps and tell me which step is losing traces." The read path makes zero LLM calls, so an agent can measure itself between turns.