Pipecat Monitoring & Observability with OpenTelemetry Pipecat, an open-source framework for voice AI agents, now supports monitoring and observability through OpenTelemetry, enabling developers to export logs, traces, and metrics to SigNoz for real-time visibility into latency, error rates, and usage trends. The integration, detailed in a new guide, requires Python 3.10+, a SigNoz account, and credentials for Deepgram, Cartesia, and OpenAI, and can be set up with automatic instrumentation and minimal code changes. Overview This guide walks you through setting up monitoring and observability for Pipecat 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 Pipecat applications. Instrumenting Pipecat 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 Pipecat installed - For Python: uv installed for managing Python packages Deepgram Account https://console.deepgram.com/signup for STT Cartesia Account https://play.cartesia.ai/text-to-speech for TTS- OpenAI API Key Monitoring Pipecat For detailed information on instrumenting Pipecat applications with OpenTelemetry, see the Pipecat OpenTelemetry documentation https://docs.pipecat.ai/server/utilities/opentelemetry opentelemetry-tracing . Get started with a sample Pipecat starter project by following the Pipecat quickstart docs https://docs.pipecat.ai/getting-started/quickstart 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/pipecat-ai/pipecat-quickstart.git cd agent-starter-python uv sync Step 2: Setup Credentials Copy .env.example to .env and filling in the required keys: DEEPGRAM API KEY OPENAI API KEY CARTESIA API KEY 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 Pipecat application task = PipelineTask pipeline, params=PipelineParams enable metrics=True, Required for some service metrics , enable tracing=True, Enable tracing for this task enable turn tracking=True, Enable turn tracking for this task conversation id="customer-123", Optional - will auto-generate if not provided additional span attributes={"session.id": "abc-123"} Optional - additional attributes to attach to the otel span See this example repo https://github.com/pipecat-ai/pipecat-examples/blob/main/open-telemetry/langfuse/bot.py for more details on how to configure instrumentation. Step 5: Your bot.py should look something like this: Copyright c 2024–2025, Daily SPDX-License-Identifier: BSD 2-Clause License """Pipecat Quickstart Example. The example runs a simple voice AI bot that you can connect to using your browser and speak with it. You can also deploy this bot to Pipecat Cloud. Required AI services: - Deepgram Speech-to-Text - OpenAI LLM - Cartesia Text-to-Speech Run the bot using:: uv run bot.py """ import os from dotenv import load dotenv from loguru import logger print "πŸš€ Starting Pipecat bot..." print "⏳ Loading models and imports 20 seconds, first run only \n" logger.info "Loading Local Smart Turn Analyzer V3..." from pipecat.audio.turn.smart turn.local smart turn v3 import LocalSmartTurnAnalyzerV3 logger.info "βœ… Local Smart Turn Analyzer V3 loaded" logger.info "Loading Silero VAD model..." from pipecat.audio.vad.silero import SileroVADAnalyzer logger.info "βœ… Silero VAD model loaded" from pipecat.audio.vad.vad analyzer import VADParams from pipecat.frames.frames import LLMRunFrame logger.info "Loading pipeline components..." from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.processors.aggregators.llm context import LLMContext from pipecat.processors.aggregators.llm response universal import LLMContextAggregatorPair from pipecat.processors.frameworks.rtvi import RTVIConfig, RTVIObserver, RTVIProcessor from pipecat.runner.types import RunnerArguments from pipecat.runner.utils import create transport from pipecat.services.cartesia.tts import CartesiaTTSService from pipecat.services.deepgram.stt import DeepgramSTTService from pipecat.services.openai.llm import OpenAILLMService from pipecat.transports.base transport import BaseTransport, TransportParams from pipecat.transports.daily.transport import DailyParams logger.info "βœ… All components loaded successfully " load dotenv override=True async def run bot transport: BaseTransport, runner args: RunnerArguments : logger.info f"Starting bot" stt = DeepgramSTTService api key=os.getenv "DEEPGRAM API KEY" tts = CartesiaTTSService api key=os.getenv "CARTESIA API KEY" , voice id="71a7ad14-091c-4e8e-a314-022ece01c121", British Reading Lady llm = OpenAILLMService api key=os.getenv "OPENAI API KEY" messages = { "role": "system", "content": "You are a friendly AI assistant. Respond naturally and keep your answers conversational.", }, context = LLMContext messages context aggregator = LLMContextAggregatorPair context rtvi = RTVIProcessor config=RTVIConfig config= pipeline = Pipeline transport.input , Transport user input rtvi, RTVI processor stt, context aggregator.user , User responses llm, LLM tts, TTS transport.output , Transport bot output context aggregator.assistant , Assistant spoken responses Enable tracing in your PipelineTask task = PipelineTask pipeline, params=PipelineParams enable metrics=True, enable usage metrics=True, , enable tracing=True, Enable tracing for this task enable turn tracking=True, observers= RTVIObserver rtvi , @transport.event handler "on client connected" async def on client connected transport, client : logger.info f"Client connected" Kick off the conversation. messages.append {"role": "system", "content": "Say hello and briefly introduce yourself."} await task.queue frames LLMRunFrame @transport.event handler "on client disconnected" async def on client disconnected transport, client : logger.info f"Client disconnected" await task.cancel runner = PipelineRunner handle sigint=runner args.handle sigint await runner.run task async def bot runner args: RunnerArguments : """Main bot entry point for the bot starter.""" transport params = { "daily": lambda: DailyParams audio in enabled=True, audio out enabled=True, vad analyzer=SileroVADAnalyzer params=VADParams stop secs=0.2 , turn analyzer=LocalSmartTurnAnalyzerV3 , , "webrtc": lambda: TransportParams audio in enabled=True, audio out enabled=True, vad analyzer=SileroVADAnalyzer params=VADParams stop secs=0.2 , turn analyzer=LocalSmartTurnAnalyzerV3 , , } transport = await create transport runner args, transport params await run bot transport, runner args if name == " main ": from pipecat.runner.run import main main Step 6: Run your application with auto-instrumentation OTEL RESOURCE ATTRIBUTES="service.name=