npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

n8n-nodes-observability

v0.2.0

Published

Export OpenTelemetry traces from n8n AI Agent workflows to Opik, Langfuse, or any OTLP/HTTP JSON collector. Captures model calls, tool calls, tokens, latency, and optional content.

Readme

n8n-nodes-observability

OpenTelemetry tracing for n8n AI Agent workflows.

The AI Trace Exporter is a passthrough sub-node between a Chat Model and an AI Agent. It exports OTLP/HTTP JSON to Comet Opik, Langfuse, or a generic OpenTelemetry collector. Datadog is supported through an OpenTelemetry Collector. The package has no runtime dependencies and does not modify the model or agent nodes.

flowchart LR
    model["Chat Model"] -->|"Chat Model"| exporter["AI Trace Exporter"]
    exporter -->|"Traced Chat Model"| agent["AI Agent"]

AI Trace Exporter connected between an OpenAI Chat Model and an AI Agent in n8n

The exporter sits between the Chat Model and AI Agent and turns green when the model runs.

Trace structure

Each agent invocation gets a synthetic root span, one child span per model call, and reconstructed tool spans:

flowchart TD
    trace["support-agent-run<br/>execution totals"]
    first["chat claude-sonnet-4-6<br/>tokens, latency, TTFC"]
    tool["execute_tool calculator<br/>inferred timing"]
    final["chat claude-sonnet-4-6<br/>tokens, finish reason"]
    trace --> first
    trace --> tool
    trace --> final

An n8n AI Agent trace in Opik with two model calls and a Calculator tool call

One agent invocation in Opik: two model calls and the reconstructed Calculator call in one trace.

The root carries call, tool, and error counts plus input, output, cache-read, cache-creation, and reasoning-token totals when the provider reports them. Model spans include normalized provider/model names, request controls, response metadata, token details, latency, streaming state, and time to first chunk. Backends can derive per-call cost from the model and token attributes; the node does not maintain a pricing table.

Installation

On self-hosted n8n, open Settings → Community Nodes → Install and enter n8n-nodes-observability.

The node requires n8n's AI nodes and Node.js 22.22 or newer. It sends data only to the OTLP endpoint configured in its credential.

Setup

  1. Connect a Chat Model to the AI Trace Exporter, then connect the exporter's output to an AI Agent.
  2. Create an OTLP Trace Exporter API credential.

| Backend | Endpoint URL | Credential fields | Behavior | | -------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------- | | Langfuse Cloud | Your region's OTLP/HTTP base endpoint | Public key and secret key | Uses Basic Auth and sends x-langfuse-ingestion-version: 4 | | Opik Cloud | https://www.comet.com/opik/api/v1/private/otel | API key, workspace, optional project | Sends Authorization, Comet-Workspace, and optional projectName headers | | Datadog via OTLP Collector | Your collector's OTLP/HTTP JSON endpoint | Collector receiver auth, if required | Configure the Datadog exporter with your Datadog site and API key | | Generic OTLP | Any OTLP/HTTP JSON endpoint, including self-hosted Opik | Backend default (none), Basic Auth, API key header, or headers only | Adds only the authentication and headers you configure |

Additional Headers are applied after the preset and primary auth. This supports authenticated proxies and allows an explicit header to override a preset value.

The credential's Test button POSTs an empty OTLP payload ({"resourceSpans":[]}) to <endpoint>/v1/traces. The request checks the same URL and authentication used by the exporter without ingesting a span.

  1. Set Trace Name if needed. Session ID, User ID, and Metadata are expression-friendly.

Session ID is exported as gen_ai.conversation.id, thread_id, session.id, and langfuse.session.id. User ID is exported as user.id and langfuse.user.id. Use a stable chat session key such as {{ $json.sessionId }} to group related executions.

Options

| Option | Default | Notes | | ------------------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------- | | Include Prompts and Responses | off | Exports model prompts and responses. | | Include Tool Inputs and Outputs | off | Exports arguments and results on reconstructed tool spans. | | Privacy Options → Max Captured Content Size (KB) | 32 | Truncates each captured value before export. | | Privacy Options → Redaction Patterns | — | Safe JavaScript regexes; matches become [REDACTED]. | | Privacy Options → Structured Redaction Paths | — | Version 3. Redacts selected fields in captured JSON using the documented path subset below. | | Trace Attributes → Environment | — | Sets deployment.environment.name and the Langfuse environment mapping. | | Trace Attributes → Release | — | Searchable application or deployment version. | | Trace Attributes → Service Name | n8n | Sets the OTel service.name resource attribute. | | Trace Attributes → Tags | — | Searchable trace labels, including Langfuse-native trace tags. | | Trace Attributes → Agent Name / Version | — | Version 3. Sets the corresponding GenAI agent identity attributes. | | Trace Attributes → Prompt Name / Version | — | Version 3. Identifies the prompt revision used by the workflow. | | Export Options → Sampling Rate (%) | 100 | Deterministic ratio sampling based on the trace ID. The same trace ID always gets the same decision. |

Structured redaction paths

Version 3 accepts a small field-path language, not full JSONPath. A rule is applied only when the captured value is valid JSON.

| Form | Example | Matches | | ---------------- | ------------------ | ------------------------------------ | | Object member | $.user.email | email below the root user object | | Quoted member | $['api.key'] | A key containing punctuation | | Array wildcard | $.items[*].token | token on every item | | Recursive member | $..password | Every password member at any depth |

Invalid or unsafe regexes and invalid field paths are ignored and reported by count; their contents are not logged. Serialization is bounded by depth, item count, string size, and the configured captured-content limit. Circular or hostile objects cannot block the workflow.

If n8n's execution redaction policy blocks content, that policy is a hard ceiling: prompt/response and tool I/O capture stay disabled even when enabled on the node. Capture also stays disabled if the runtime cannot expose its redaction policy. The execution receives a warning explaining why.

Delivery behavior

Export is best-effort and never fails the workflow. Spans are coalesced and bounded by both count and serialized size:

  • Each exporter retains at most 200 spans or 2 MiB and sends at most 64 spans or 512 KiB per request. Oldest queued spans are dropped when a bound is reached.
  • The synthetic agent root is sent in its own request. A duplicate-root conflict cannot reject newly queued child spans in the same batch.
  • Across one n8n worker process, at most four OTLP requests run concurrently; the shared pending-request queue is also bounded.
  • Recognized transient network failures and HTTP 429, 502, 503, and 504 are retried up to three total attempts with capped exponential backoff and jitter. Retry-After is honored, capped at 30 seconds. Other HTTP failures are not retried.
  • OTLP partial-success responses are recorded as partial acceptance, including rejected-span counts. Collector and proxy error text is not retained or logged because it can echo captured payload content.
  • When the tracing pipeline finalizes, the node performs a 250 ms best-effort flush. A timeout, rejection, partial acceptance, or queue overflow is surfaced as an n8n execution warning; it is not thrown into the workflow.

The execution-state output reports exportStatus: queued, not delivered, because delivery remains asynchronous. A sampled run includes traceId and rootSpanId; an unsampled run reports exportStatus: notSampled and exposes no correlation IDs. Captured prompt, response, and tool content is never copied into the n8n execution-state output.

Invocation boundaries and native correlation

The tracing registry isolates executions by n8n execution ID, Trace Exporter node ID, parent run index, and item index. Steppable AI Agent calls reuse the same trace across model/tool steps, while parallel fan-out on the same boundary gets separate pipeline slots. Terminal answers, errors, and cancellation close the trace; an abandoned tool tail is finalized after a bounded quiet period.

When the active n8n runtime exposes native tracing metadata, the node adds ai_observability_trace_id and ai_observability_root_span_id without overwriting existing string, number, or boolean metadata. This provides queryable correlation, not OpenTelemetry parentage. n8n's public community-node API does not expose the active native span context, so the exported synthetic root cannot currently be made a child of n8n's own execution span.

Tool span limitation

Actual Calculator, HTTP, and other tool executions occur outside a model-attached callback. The node reconstructs execute_tool <name> spans from the model's requested calls and the results returned in the next model input, including n8n V3's Calling <tool> with input: <JSON> fallback. Reconstructed spans carry:

  • n8n.span.synthesized: true
  • n8n.span.timing_source: inferred
  • n8n.tool.result_observed: false when no later model call contains a result

Their duration spans the surrounding model-call boundaries and may include n8n framework overhead. Exact tool runtime, failures before a result reaches the model, and exact tool cancellation state require an n8n-core lifecycle hook. Tool arguments and results are exported only when Include Tool Inputs and Outputs is enabled.

Compatibility

CI builds and runs contract tests against n8n-workflow 2.27, 2.28, and 2.29 on the minimum supported Node.js version, 22.22. The tracer attaches through LangChain callbacks and normalizes provider payload differences rather than depending on one model vendor.

Roadmap

  • Engine-level tool lifecycle spans with exact timing
  • A stable evaluation-score/feedback and dataset-item write contract
  • Gzip compression and raw-byte OTLP transport
  • Multiple export destinations from one trace

License

MIT