Skip to main content
A full setup example is available here!

Overview

The OpenHands SDK provides built-in OpenTelemetry (OTEL) tracing support, allowing you to monitor and debug your agent’s execution in real-time. You can send traces to any OTLP-compatible observability platform including:
  • Laminar - AI-focused observability with browser session replay support
  • MLflow - Open-source AI platform with tracing, evaluation, and LLM governance
  • Honeycomb - High-performance distributed tracing
  • Any OTLP-compatible backend - Including Jaeger, Datadog, New Relic, and more
The SDK automatically traces:
  • Agent execution steps
  • Tool calls and executions
  • LLM API calls (via LiteLLM integration)
  • Browser automation sessions (when using browser-use)
  • Conversation lifecycle events

Quick Start

Tracing is automatically enabled when you set the appropriate environment variables. The SDK detects the configuration on startup and initializes tracing without requiring code changes.

Using Laminar

Laminar provides specialized AI observability features including browser session replays when using browser-use tools:
That’s it! Run your agent code normally and traces will be sent to Laminar automatically. For self-hosted Laminar deployments, you can also configure custom ports:

Using OpenTelemetry (OTLP) Backends

For OpenTelemetry (OTLP) compatible backends, set the following environment variables:
View the platform-specific configuration sections below for which values to use.

Alternative Configuration Methods

You can also use these alternative environment variable formats:

How It Works

The OpenHands SDK uses the Laminar SDK as its OpenTelemetry instrumentation layer. When you set the environment variables, the SDK:
  1. Detects Configuration: Checks for OTEL environment variables on startup
  2. Initializes Tracing: Configures OpenTelemetry with the appropriate exporter
  3. Instruments Code: Automatically wraps key functions with tracing decorators
  4. Captures Context: Associates traces with conversation IDs for session grouping
  5. Exports Spans: Sends trace data to your configured backend

What Gets Traced

The SDK automatically instruments these components:
  • agent.step - Each iteration of the agent’s execution loop
  • Tool Executions - Individual tool calls with input/output capture
  • LLM Calls - API requests to language models via LiteLLM
  • Conversation Lifecycle - Message sending, conversation runs, and title generation
  • Browser Sessions - When using browser-use, captures session replays (Laminar only)

Trace Hierarchy

Traces are organized hierarchically:
conversation
conversation.run
agent.step
llm.completion
tool.execute
agent.step
llm.completion
Each conversation gets its own session ID (the conversation UUID), allowing you to group all traces from a single conversation together in your observability platform. Note that in tool.execute the tool calls are traced, e.g., bash, file_editor.

Configuration Reference

Environment Variables

The SDK checks for these environment variables (in order of precedence):

Header Format

Headers should be comma-separated key=value pairs with URL encoding for special characters:

Protocol Options

The SDK supports both HTTP and gRPC protocols:
  • http/protobuf or otlp_http - HTTP with protobuf encoding (recommended for most backends)
  • grpc or otlp_grpc - gRPC with protobuf encoding (use only if your backend supports gRPC)

Platform-Specific Configuration

Laminar Setup

  1. Sign up at laminar.sh
  2. Create a project and copy your API key
  3. Set the environment variable:
Self-Hosted Laminar: If you are running a self-hosted Laminar instance, you can configure the HTTP and gRPC ports via environment variables:
Browser Session Replay: When using Laminar with browser-use tools, session replays are automatically captured, allowing you to see exactly what the browser automation did.

MLflow Setup

MLflow is an open-source AI platform that accepts OpenTelemetry traces out of the box, alongside evaluation and LLM governance capabilities.
  1. Start your MLflow tracking server:
For other deployment options (pip, Docker Compose, etc.), see Set Up MLflow Server.
  1. Configure the environment variables:
Navigate to the MLflow UI (e.g., http://localhost:5000), select the experiment, and open the Traces tab to view the recorded traces.

Honeycomb Setup

  1. Sign up at honeycomb.io
  2. Get your API key from the account settings
  3. Configure the environment:

Jaeger Setup

For local development with Jaeger:
Access the Jaeger UI at http://localhost:16686

Generic OTLP Collector

For other backends, use their OTLP endpoint:

Advanced Usage

Disabling Observability

To disable tracing, simply unset all OTEL environment variables:
The SDK will automatically skip all tracing instrumentation with minimal overhead.

Custom Span Attributes

The SDK automatically adds these attributes to spans:
  • conversation_id - UUID of the conversation
  • tool_name - Name of the tool being executed
  • action.kind - Type of action being performed
  • session_id - Groups all traces from one conversation

Debugging Tracing Issues

If traces aren’t appearing in your observability platform:
  1. Verify Environment Variables:
  2. Check SDK Logs: The SDK logs observability initialization at debug level:
  3. Test Connectivity: Ensure your application can reach the OTLP endpoint:
  4. Validate Headers: Check that authentication headers are properly URL-encoded

Troubleshooting

Traces Not Appearing

Problem: No traces showing up in observability platform Solutions:
  • Verify environment variables are set correctly
  • Check network connectivity to OTLP endpoint
  • Ensure authentication headers are valid
  • Look for SDK initialization logs at debug level

High Trace Volume

Problem: Too many spans being generated Solutions:
  • Configure sampling at the collector level
  • For Laminar with non-browser tools, browser instrumentation is automatically disabled
  • Use backend-specific filtering rules

Performance Impact

Problem: Concerned about tracing overhead Solutions:
  • Tracing has minimal overhead when properly configured
  • Disable tracing in development by unsetting environment variables
  • Use asynchronous exporters (default in most OTLP configurations)

Example: Full Setup

This example is available on GitHub: examples/01_standalone_sdk/27_observability_laminar.py
examples/01_standalone_sdk/27_observability_laminar.py
Running the Example

Next Steps

  • Metrics Tracking - Monitor token usage and costs alongside traces
  • LLM Registry - Track multiple LLMs used in your application
  • Security - Add security validation to your traced agent executions