Skip to main content
LangChain chains, agents, and LangGraph graphs are instrumented by the OpenInference LangChain instrumentor. It captures model calls, tool calls, retrieval steps, and chain runs as OTLP spans. Point the exporter at AgentMark and the traces arrive normalized — LangGraph runs on top of LangChain, so the same instrumentor covers both.

Setup

1

Install the instrumentor and the OTLP exporter

npm install @arizeai/openinference-instrumentation-langchain \
  @opentelemetry/sdk-trace-node @opentelemetry/sdk-trace-base \
  @opentelemetry/exporter-trace-otlp-http
2

Point the exporter at AgentMark and instrument LangChain

Use your AgentMark API key and app id from project settings.
// instrumentation.ts
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { LangChainInstrumentation } from "@arizeai/openinference-instrumentation-langchain";
import * as CallbackManagerModule from "@langchain/core/callbacks/manager";

const provider = new NodeTracerProvider({
  spanProcessors: [
    new BatchSpanProcessor(
      new OTLPTraceExporter({
        url: "https://api.agentmark.co/v1/traces",
        headers: {
          Authorization: process.env.AGENTMARK_API_KEY!, // raw key, no "Bearer" prefix
          "X-Agentmark-App-Id": process.env.AGENTMARK_APP_ID!,
        },
      })
    ),
  ],
});
provider.register();

// LangChain.js exposes its callbacks manager as a non-standard module, so it
// must be instrumented manually rather than through registerInstrumentations.
const lcInstrumentation = new LangChainInstrumentation();
lcInstrumentation.manuallyInstrument(CallbackManagerModule);
In TypeScript, this setup must run before LangChain is imported, so the instrumentor can patch the callbacks manager. Put it in its own module and load it first, for example node -r ./instrumentation.js app.js.
3

Run your app

Run your LangChain or LangGraph application as usual. Each model call, tool call, and retrieval step arrives in AgentMark as a span, grouped into a trace. See Traces and logs.

What AgentMark captures

LangChain spans use the OpenInference attribute conventions — model, token usage, input and output messages, tool calls, settings, and span kind are all mapped onto AgentMark’s normalized trace fields, and token counts feed cost tracking. See OpenInference for the full attribute mapping.

Next steps

OpenInference

How AgentMark reads OpenInference attributes

Traces and logs

Explore traces once they arrive

Have questions?

Reach out any time: