For the complete documentation index, see llms.txt. Markdown versions are available by appending .md to documentation URLs.

Vercel Eve Observability & Monitoring with OpenTelemetry

SigNoz Cloud - This page applies to SigNoz Cloud editions.
Self-Host - This page applies to self-hosted SigNoz editions.

eve is Vercel's filesystem-first framework for building agents. It traces every turn with OpenTelemetry, so each model call, tool execution, and subagent dispatch becomes a span with no instrumentation package to add.

This guide sends those traces from the interactive eve dev terminal UI to SigNoz.

What is Eve Observability?

Eve observability is the practice of collecting traces from eve agents so you can see what each turn did: which model steps it took, how many tokens it consumed, which tools and subagents it called, and whether it completed, failed, or was cancelled.

With full eve observability in SigNoz, you can follow a conversation turn by turn, attribute token spend to an agent or a model, catch tools that fail while the agent quietly recovers, and alert on turns that fail after exhausting their model retries.

Prerequisites

  • A SigNoz Cloud account and an ingestion key
  • Node.js 24 or later
  • An eve project. Create one with npx eve@latest init my-agent
  • A model credential connected in the eve terminal UI, such as an OpenAI API key

Monitor Eve with OpenTelemetry

eve loads every file in agent/instrumentation/ at startup. A file that exports otelIntegration() adds an OpenTelemetry destination, so sending traces to SigNoz takes one file.

Step 1: Install the OTLP exporter from @vercel/otel.

npm install @vercel/otel

Step 2: Add the SigNoz settings to .env.local in the project root. eve dev loads this file automatically.

OTEL_SERVICE_NAME=<service_name>
SIGNOZ_OTLP_ENDPOINT=https://ingest.<region>.signoz.cloud:443
SIGNOZ_INGESTION_KEY=<your-ingestion-key>

Verify these values:

  • <service_name>: The name your agent appears under in SigNoz, for example support-agent.
  • <region>: Your SigNoz Cloud region.
  • <your-ingestion-key>: Your SigNoz ingestion key.

Step 3: Create agent/instrumentation/signoz.ts.

import { OTLPHttpProtoTraceExporter } from "@vercel/otel";
import { otelIntegration } from "eve/instrumentation/otel";
 
const AGENT_SPANS = /^(invoke_agent|agent\.step|agent\.action|chat|execute_tool)( |$)/;
 
export default otelIntegration({
  // Keep eve's agent spans and drop the durable-workflow runtime spans.
  exportPolicy: { span: ({ name }) => ({ emit: AGENT_SPANS.test(name) }) },
  traceExporter: new OTLPHttpProtoTraceExporter({
    url: `${process.env.SIGNOZ_OTLP_ENDPOINT}/v1/traces`,
    headers: { "signoz-ingestion-key": process.env.SIGNOZ_INGESTION_KEY! },
  }),
});

Step 4: Start the terminal UI and send a message.

npm run dev

Each turn is exported when it finishes. Allow up to 30 seconds for it to appear in SigNoz.

View Eve Traces in SigNoz

Open the Traces explorer and filter on your service.name. Each turn appears as an invoke_agent <agent> span with its agent.step, chat, agent.action, and execute_tool spans.

eve agent spans in the SigNoz Traces explorer
Turn, model step, model call, and tool spans from an eve agent

Click an invoke_agent span to open the turn. The waterfall shows the first model step requesting a tool, the tool running, and the second step writing the answer. Select a chat span to see the model, token counts, and conversation id on the right.

Detailed view of an eve turn in SigNoz
A single turn: two model steps and one tool call

The span tree a turn produces looks like this:

invoke_agent <agent>          one trace per turn, carries agent.turn.outcome
└─ agent.step                 one per model step
   ├─ chat <model>            carries gen_ai.request.model and gen_ai.usage.*
   └─ agent.action            one per tool or subagent call
      └─ execute_tool <tool>

A few placement details matter when you write your own queries:

  • Tokens appear three times. invoke_agent, agent.step, and chat spans all carry the same usage totals. Sum gen_ai.usage.* on chat spans for totals, and use invoke_agent only for per-agent breakdowns.
  • Read turn outcomes from agent.turn.outcome. When a user presses Escape, the invoke_agent span stays unset with agent.turn.outcome = cancelled, while its child spans are marked as errors with TurnCancelledError. A has_error filter therefore counts cancellations as failures.
  • Tool errors stay on the tool. A tool that throws marks its execute_tool and agent.action spans as errors, but the model recovers and the turn completes. A model call that fails after its retries does fail the turn.
  • Subagents are separate traces. A subagent turn is its own invoke_agent trace, linked to its caller and sharing the caller's gen_ai.conversation.id. Its tokens are not rolled into the caller's turn.
  • Provider-executed tools have no tool span. Tools the model provider runs itself, such as OpenAI web search, appear as agent.action spans without an execute_tool child.

Capturing prompts and completions

eve records prompts, completions, and tool arguments on spans by default in eve dev, and in production only when the channel's audience is public. Content lands on gen_ai.input.messages and gen_ai.output.messages, and each chat span repeats the full conversation history.

To stop recording content, set a tracePolicy in agent/instrumentation/otel.ts. Spans, timings, and token counts are still exported.

import { otel } from "eve/instrumentation/otel";
 
export default otel({
  tracePolicy: () => ({ emit: true, recordInputs: false, recordOutputs: false }),
});

The policy applies to every OpenTelemetry destination, not only SigNoz. If you also set deployment.environment, put resource and tracePolicy in the same otel() call, since eve allows only one.

Eve Observability Dashboard

SigNoz ships a prebuilt dashboard for eve covering turns, conversations, token usage by model and agent, latency, tools, subagents, turn outcomes, and errors. See the Eve dashboard for the panel reference and the import link.

Eve dashboard in SigNoz
The Eve dashboard template

Troubleshooting Eve Observability

No spans reach SigNoz

Check that the file lives in agent/instrumentation/ and that @vercel/otel is installed. Unlike the standard OTEL_EXPORTER_OTLP_ENDPOINT variable, the @vercel/otel exporter takes the full signal URL, so the url must end in /v1/traces. If you start the agent with something other than eve dev, load .env.local yourself.

Every turn fails with "fetch failed" or "Lost the connection to the running turn"

An earlier eve dev process is still running, usually after a terminal was closed without quitting the UI. Stop every eve dev process and start it again. A message sent while the status line still reads "Starting agent…" can fail the same way, so wait for it to clear.

Hundreds of spans per turn

The exportPolicy from Step 3 is missing, so the workflow runtime spans are exported too. Add it back to keep only the agent spans.

A bundler warning about eval in @vercel/otel

The terminal UI's stderr panel shows a warning about direct eval use inside @vercel/otel when the agent builds. It does not affect exporting.

Token totals look three times higher than the provider bill

The query sums usage across invoke_agent, agent.step, and chat spans. Filter on gen_ai.operation.name = 'chat' for totals.

Turns fail after switching models with /model

/model rewrites agent/agent.ts to an AI Gateway model string, which routes calls through Vercel AI Gateway. Without Gateway credentials, every model call fails after three retries. Connect a Vercel account or AI Gateway key in the UI, or restore the provider helper, such as openai("gpt-5.6-sol"), in agent/agent.ts.

No cost attribute on spans

eve reports cost only for calls served through Vercel AI Gateway. Calls made through a provider helper such as openai() carry token counts but no cost, so compute cost from tokens and your model rates.

Setup OpenTelemetry Collector (Optional)

The OpenTelemetry Collector is a vendor-neutral proxy that receives, processes, and exports telemetry. Sending through a Collector lets you batch and retry centrally, strip or enrich attributes before they leave your network, and fan out to more than one backend without changing application code.

To use one, point SIGNOZ_OTLP_ENDPOINT at your Collector's OTLP/HTTP receiver instead of at SigNoz, and configure the Collector's OTLP exporter to forward to SigNoz. See Install OpenTelemetry Collector for setup.

If you build agents with other parts of the Vercel stack, or on another TypeScript framework, instrument them with the same OpenTelemetry pipeline:

Browse all LLM observability integrations to instrument the rest of your stack.

Is this page helpful

Last updated—September 23, 2026

Edit on GitHub