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 comoZELTO_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: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.
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. Buscademo.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 puerto4317.
Si el exportador lee las variables estándar de OpenTelemetry:
/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 desession.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 conhttps://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:
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.

