LiveKit Observability & Monitoring with OpenTelemetry LiveKit has released a new integration with OpenTelemetry and SigNoz that enables developers to monitor and observe voice agent applications in real time. The setup allows teams to track latency, error rates, and usage trends across AI models by exporting logs, traces, and metrics to SigNoz dashboards. This observability framework helps developers debug issues, optimize performance, and analyze user interactions in LiveKit-powered voice workflows. Overview This guide walks you through setting up observability and monitoring for LiveKit using OpenTelemetry https://opentelemetry.io/ and exporting logs, traces, and metrics to SigNoz. With this integration, you can observe the performance of various models, capture request/response details, and track system-level metrics in SigNoz, giving you real-time visibility into latency, error rates, and usage trends for your LiveKit applications. Instrumenting LiveKit in your AI applications with telemetry ensures full observability across your voice agent workflows, making it easier to debug issues, optimize performance, and understand user interactions. By leveraging SigNoz, you can analyze correlated traces, logs, and metrics in unified dashboards, configure alerts, and gain actionable insights to continuously improve reliability, responsiveness, and user experience. Prerequisites - A SigNoz Cloud account https://signoz.io/teams/ with an active ingestion key or Self Hosted SigNoz instance https://signoz.io/docs/install/self-host/ - Internet access to send telemetry data to SigNoz Cloud - Python 3.10+ with LiveKit installed - For Python: uv installed for managing Python packages LiveKit Cloud Account https://cloud.livekit.io/ - Installed LiveKit CLI https://docs.livekit.io/home/cli/ Monitoring LiveKit For more detailed info on instrumenting your LiveKit applications with OpenTelemetry click here https://docs.livekit.io/agents/observability/data/ . Get started with a sample LiveKit starter project by following the LiveKit Getting Started Docs https://docs.livekit.io/agents/start/voice-ai/ No-code auto-instrumentation is recommended for quick setup with minimal code changes. It's ideal when you want to get observability up and running without modifying your application code and are leveraging standard instrumentor libraries. Step 1: Clone the sample voice agent project and setup dependencies git clone https://github.com/livekit-examples/agent-starter-python cd agent-starter-python uv sync Step 2: Setup Credentials Copy .env.example to .env.local and filling in the required keys: LIVEKIT URL LIVEKIT API KEY LIVEKIT API SECRET Load the LiveKit environment automatically using the LiveKit CLI: lk cloud auth lk app env -w -d .env.local Step 3: Add Automatic Instrumentation uv pip install opentelemetry-distro opentelemetry-exporter-otlp uv run opentelemetry-bootstrap -a requirements | uv pip install --requirement - Step 4: Instrument your LiveKit application Metrics: python from livekit.agents import metrics from livekit.agents.voice import MetricsCollectedEvent @session.on "metrics collected" def on metrics collected ev: MetricsCollectedEvent : metrics.log metrics ev.metrics Traces: python from livekit.agents.telemetry import set tracer provider from opentelemetry import trace set tracer provider trace.get tracer provider See this example repo https://github.com/livekit/agents/blob/main/examples/voice agents/langfuse trace.py for more details on how to configure instrumentation. Step 5: Your agent.py should look something like this: python import logging from dotenv import load dotenv from livekit import rtc from livekit.agents import Agent, AgentServer, AgentSession, JobContext, JobProcess, cli, inference, room io, metrics, from livekit.plugins import noise cancellation, silero from livekit.plugins.turn detector.multilingual import MultilingualModel from livekit.agents.telemetry import set tracer provider from opentelemetry import trace from livekit.agents.voice import MetricsCollectedEvent logger = logging.getLogger "agent" load dotenv ".env.local" class Assistant Agent : def init self - None: super . init instructions="""You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text. You eagerly assist users with their questions by providing information from your extensive knowledge. Your responses are concise, to the point, and without any complex formatting or punctuation including emojis, asterisks, or other symbols. You are curious, friendly, and have a sense of humor.""", server = AgentServer def prewarm proc: JobProcess : proc.userdata "vad" = silero.VAD.load server.setup fnc = prewarm @server.rtc session async def my agent ctx: JobContext : set tracer provider trace.get tracer provider Logging setup Add any other context you want in all log entries here ctx.log context fields = { "room": ctx.room.name, } Set up a voice AI pipeline using OpenAI, Cartesia, AssemblyAI, and the LiveKit turn detector session = AgentSession Speech-to-text STT is your agent's ears, turning the user's speech into text that the LLM can understand See all available models at https://docs.livekit.io/agents/models/stt/ stt=inference.STT model="assemblyai/universal-streaming", language="en" , A Large Language Model LLM is your agent's brain, processing user input and generating a response See all available models at https://docs.livekit.io/agents/models/llm/ llm=inference.LLM model="openai/gpt-4.1-mini" , Text-to-speech TTS is your agent's voice, turning the LLM's text into speech that the user can hear See all available models as well as voice selections at https://docs.livekit.io/agents/models/tts/ tts=inference.TTS model="cartesia/sonic-3", voice="9626c31c-bec5-4cca-baa8-f8ba9e84c8bc" , VAD and turn detection are used to determine when the user is speaking and when the agent should respond See more at https://docs.livekit.io/agents/build/turns turn detection=MultilingualModel , vad=ctx.proc.userdata "vad" , allow the LLM to generate a response while waiting for the end of turn See more at https://docs.livekit.io/agents/build/audio/ preemptive-generation preemptive generation=True, @session.on "metrics collected" def on metrics collected ev: MetricsCollectedEvent : metrics.log metrics ev.metrics Start the session, which initializes the voice pipeline and warms up the models await session.start agent=Assistant , room=ctx.room, room options=room io.RoomOptions audio input=room io.AudioInputOptions noise cancellation=lambda params: noise cancellation.BVCTelephony if params.participant.kind == rtc.ParticipantKind.PARTICIPANT KIND SIP else noise cancellation.BVC , , , Join the room and connect to the user await ctx.connect if name == " main ": cli.run app server Step 6: Run your application with auto-instrumentation Before your first run, you must download certain models such as Silero VAD and the LiveKit turn detector: uv run python src/agent.py download-files Next, run this command to speak to your agent directly in your terminal: OTEL RESOURCE ATTRIBUTES="service.name=