Skip to main content
Envía una traza de prueba, encuéntrala en Zelto y aplica la misma configuración a tu agente. Una traza representa una llamada o sesión; sus spans representan pasos con duración, como reconocimiento de voz, una petición al LLM, una invocación de herramienta o síntesis de voz. Exportar trazas no carga la transcripción ni la grabación: esos datos llegan mediante la integración de llamadas. Necesitas una organización de Zelto, un owner o admin que cree la clave y un servidor o worker con acceso HTTPS a ingest.zelto.ai. El primer ejemplo usa Python 3.10+ y datos sintéticos; no realiza una llamada.

1. Crea una clave de telemetría

En la organización de destino, abre Trazas → Conectar agente o Configuración → Integraciones → Observabilidad. Crea una clave de ingestión de observabilidad y cópiala cuando se muestre. Es una credencial de solo escritura para esa organización. Guárdala en los secretos o variables de entorno del worker como ZELTO_INGEST_KEY. Es independiente de la clave REST/MCP que utilizas para cargar conversaciones. La telemetría usa Authorization: Bearer <ingest-key> y no necesita el encabezado X-Zelto-Provider. Conserva la clave en el servidor.

2. Exporta una primera traza

Crea un entorno de Python aislado e instala el SDK y el exportador HTTP:
Guarda lo siguiente como send_trace.py y reemplaza el marcador de la clave en el entorno antes de ejecutarlo. El ejemplo representa un solo agente, así que su identidad estable está en el recurso: los atributos compartidos por todos los spans de este proveedor de trazas.
Verás un ID de traza y un ID de sesión único. El span hijo comparte el ID de traza del raíz porque se crea dentro de su contexto activo. Los atributos como session.id no se heredan automáticamente: agrégalos a cada span relevante o mediante el mecanismo de metadatos de tu framework. El script vacía el lote de spans terminados antes de salir. Revisa también los errores del exportador: imprimir un ID o terminar el vaciado no demuestra por sí solo que el servidor aceptó los datos.

3. Encuéntrala en Zelto

Abre Trazas en la misma organización, borra los filtros de agente y empresa y elige un periodo que incluya el momento actual. Busca demo.call y compara su ID con el que imprimió el script. Ábrela para ver demo.tool debajo del span raíz e inspeccionar sus atributos. Zelto reutiliza o crea el agente support-agent. Una respuesta HTTP correcta confirma la aceptación. En organizaciones con ingestión en cola, los datos se pueden consultar después del procesamiento asíncrono; el objetivo es 30 segundos desde la aceptación con carga normal, no un máximo garantizado. El exportador añade su propia espera para agrupar lotes antes de la aceptación, y una interrupción puede alargar el procesamiento. Actualiza la vista antes de diagnosticar una traza ausente. Los paneles de la llamada vinculada también requieren que haya llegado la conversación. Este ejemplo sintético aparece sin conversación vinculada hasta que cargues una llamada con el mismo ID externo. Eso no indica un fallo de exportación.

Identifica agentes y llamadas de forma coherente

Zelto busca los IDs externos dentro de tu organización. Los IDs nuevos crean agentes automáticamente, con el ID externo como nombre inicial. Si omites el proveedor, Zelto reutiliza una coincidencia única o crea el agente bajo zelto. Envía livekit cuando las llamadas usen X-Zelto-Provider: livekit para evitar identidades separadas si la telemetría llega primero. Si el ID coincide con varios agentes de distintos proveedores, queda sin asignar: especifica el proveedor para eliminar la ambigüedad. Los IDs externos distinguen mayúsculas y minúsculas y admiten hasta 255 caracteres; los nombres de proveedor, hasta 50. Las identidades fusionadas apuntan al agente que permanece. Si no puede resolver una identidad externa, Zelto no la sustituye por el agente de otra llamada que coincida con la sesión. Consulta las reglas de identidad. Si el proceso atiende a un solo agente, usa atributos del recurso. Si atiende a varios, pon la identidad en cada span y registro; estos atributos tienen prioridad sobre los del recurso. No uses un ID de sala ni una versión como ID del agente. zelto.agent_id y el campo nativo agentId significan un UUID de Zelto y tienen prioridad. Aunque tu ID tenga formato UUID, envíalo en zelto.agent_external_id. Envía los datos de la llamada mediante tu integración o la API de carga, con la misma organización, identidad del agente, proveedor e ID externo de llamada. La traza y la llamada pueden llegar en cualquier orden. El encabezado muestra Abrir conversación cuando encuentra una coincidencia única; así se habilitan la grabación, la transcripción y los resultados de monitores disponibles. Consulta cómo vincular conversaciones.

Conecta tu exportador existente

Si tu aplicación ya inicializa OpenTelemetry, agrega el exportador de Zelto al proveedor existente en vez de registrar otro proveedor global. Configura OTLP/HTTP; no se admite gRPC en el puerto 4317. Si el exportador lee las variables estándar de OpenTelemetry:
El endpoint base compartido no lleva /v1/traces: el SDK añade la ruta de cada señal. Un endpoint específico por señal o una URL explícita del exportador es la URL completa, como en el ejemplo de Python: Usa Content-Type: application/x-protobuf para protobuf y application/json para JSON. Mantén el exportador HTTP de Python en http/protobuf. No hay un endpoint de métricas de telemetría. Consulta la documentación del exportador de OpenTelemetry para Python. Las variables de entorno por sí solas no instrumentan el código: inicializa el SDK y el exportador, crea spans o activa la instrumentación del framework, y termina los spans para poder exportarlos. Usa un procesador por lotes durante la vida del worker y vacíalo al apagarlo de forma controlada, no tras cada span. Propaga el contexto de la traza al pasar entre tareas asíncronas o servicios.

LiveKit

Aplica la configuración de LiveKit al principio del entrypoint, antes de session.start(). Registra el proveedor de LiveKit, añade el ID externo del agente y la referencia de sala y vacía los spans pendientes al apagar el worker. Usa el mismo ID estable de agente y nombre de sala que en la carga de la sesión terminada. LiveKit genera los spans de la sesión; enviar la transcripción sigue siendo un paso independiente.

Registros

Un exportador de trazas no envía automáticamente los registros de la aplicación. Configura un exportador de logs OTLP/HTTP y la integración de logging del SDK con https://ingest.zelto.ai/v1/logs y la misma clave Bearer. Emite los registros mientras esté activo el span correspondiente para incluir sus IDs de traza y span. Añade también la identidad del agente al registro o al recurso. Zelto muestra los registros correlacionados en Registros del span y los de toda la traza en Resumen de la traza → Registros. También puedes utilizar el ejemplo nativo siguiente.

JSON nativo sin SDK de OpenTelemetry

Usa /webhooks/otel cuando tu plataforma no pueda emitir OTLP. Su estructura JSON es distinta de JSON OTLP. Genera marcas de tiempo actuales e identidades nuevas para cada sesión; guarda el archivo sin cambios si necesitas reintentar:
Respuesta esperada: HTTP 200 con {"received":true}. Los endpoints OTLP devuelven HTTP 200 con {}. Las marcas de tiempo nativas usan milisegundos Unix; OTLP usa nanosegundos Unix. Usa parentSpanId para spans hijos nativos y el mismo traceId para agruparlos en un árbol. Los attributes nativos admiten valores de texto, número y booleano.

Límites, reintentos y solución de problemas

Cada solicitud admite 10 MB (10.000.000 bytes) después de descomprimir. Ajusta el lote según el tamaño de tus spans: un límite de filas no limita los bytes. Conserva los IDs, las marcas de tiempo y el cuerpo original al reintentar. Enviar la misma llamada con nuevos IDs de traza genera trazas separadas. Los reintentos y las colas en memoria del SDK tienen límites: un proceso que falla, una cola llena o una interrupción prolongada pueden perder datos antes de que Zelto los acepte. Vigila los errores y descartes del exportador; usa un Collector con almacenamiento persistente si necesitas entrega duradera desde tu infraestructura. La especificación de reintentos OTLP detalla los códigos que permiten reintentar. Ya tienes un exportador, una identidad estable y una forma de comprobar la entrega. Explora los datos en Trazas y conecta las llamadas terminadas con la integración de LiveKit.