Ir al contenido
mcpd
sin daemon
Código

Reenvío

mcpd habla OTLP en los dos sentidos. Nada de lo que llega se queda atascado aquí.

Un protocolo de salida, no once exportadores

mcpd recibe OTLP, y puede emitir OTLP. Esa sola propiedad sustituye casi todo lo que hace un juego de exportadores por proveedor: Langfuse, Datadog, Honeycomb, Grafana y cualquier otro destino que valga la pena nombrar aceptan OTLP sobre HTTP. El reenvío es por tanto una implementación en lugar de once, y no puede quedarse atrás respecto a la versión del SDK de un proveedor.

También significa que adoptar mcpd es reversible. Apúntalo a lo que estabas usando antes, ejecuta los dos durante quince días y decide con los datos delante en lugar de con una migración que no puedes deshacer.

Cómo activarlo

almacena en local y copia hacia adelante

mcpd serve --forward-endpoint https://otlp.example.com

La ruta se añade al final, así que da la URL base y no /v1/traces. Para un destino que necesita credenciales, añade cabeceras:

con una cabecera de autorización

mcpd serve \ --forward-endpoint https://otlp.example.com \ --forward-header 'Authorization: Bearer $TOKEN'

Los mismos ajustes viven bajo forward en el archivo de configuración, donde también están disponibles batch_size y enabled. Un flag gana al archivo, así que se puede apuntar una instancia a otro sitio sin editar un ConfigMap compartido.

{
  "forward": {
    "endpoint": "https://otlp.example.com",
    "headers": [["Authorization", "Bearer sk-..."]],
    "batch_size": 256,
    "enabled": true
  }
}
Ingest pipeline
  1. Decode

    OTLP or native, gzip or plain

  2. Sample

    Decided once, at the root

  3. Redact

    Before anything is written

  4. Price

    From the configured price book

  5. Store

    One transaction per batch

Redaction is stage three, not a cleanup job. A value that a rule matches never reaches storage at all.

El almacenamiento local va primero

Un span se escribe en el almacén propio de mcpd antes de reenviar nada, y el reenvío corre después en su propia tarea. Dos consecuencias, ambas deliberadas.

Un destino lento nunca suma su latencia a la solicitud que produjo el span. Tu agente no espera al colector de otra persona.

Un destino caído nunca se convierte en una ingesta rechazada. mcpd sigue funcionando y reintenta el reenvío en su propia tarea. La alternativa, en la que la caída de otra empresa significa que tu telemetría no se guarda en absoluto, es exactamente el fallo que este diseño existe para evitar.

Cada lote tiene tres intentos. Un 429, un 5xx o una conexión fallida se reintenta tras 250 ms, y la espera se duplica después de cada intento. Un Retry-After en segundos sustituye a la espera, hasta 30 segundos. Cualquier otro 4xx es definitivo a la primera respuesta, porque el lote seguirá siendo inválido para ese destino. Cuando el daemon se está deteniendo, hace los intentos restantes de inmediato. Un lote rechazado de forma definitiva, o aún sin entregar tras su último intento, se anota en el log, y sus spans se suman a mcpd_forward_dropped_spans_total, para que veas cuánto falta de la copia.

Un destino que acepta la conexión y nunca responde tampoco puede quedarse con la memoria del daemon. Como mucho, las copias de 64 solicitudes de ingesta esperan al destino a la vez. Mientras haya tantas esperando, una copia nueva se descarta en el acto y se cuenta en mcpd_forward_dropped_spans_total, y la escritura local no se ve afectada.

No hay una cola de salida duradera. Un lote espera en memoria mientras se reintenta, y cuando la cola de reenvío está llena, un lote nuevo se descarta y sus spans se cuentan en la misma métrica. Una cola duradera es otro producto, y una silenciosa que se retrasa horas es peor que un hueco visible. Si necesitas entrega garantizada, pon un colector de verdad entre mcpd y el destino y déjalo hacer el trabajo para el que fue construido.

La ocultación se aplica a lo que sale

El reenvío ocurre después del pipeline de entrada, que oculta en el sitio antes de escribir nada. Lo que se le dijo a mcpd que escondiera tampoco llega al siguiente salto. Una regla que protegiera tu almacenamiento pero no tu salida no sería un control de privacidad.

Qué se reenvía

Spans. Los logs, las métricas, las puntuaciones, el feedback y las notas de aspecto se quedan en mcpd, porque los destinos a los que la gente reenvía son backends de trazas y descartarían el resto o lo retorcerían para meterlo en atributos.

Los spans se agrupan por servicio dentro de resourceSpans, que es la forma que espera un receptor, en lugar de un recurso por span, que es válido y obliga a todo lo que hay aguas abajo a reagruparlo.

mcpd reenviando a mcpd

Como los dos extremos hablan el mismo protocolo, un mcpd local puede reenviar a uno compartido. Cada persona mantiene un almacén rápido en su propia máquina con los payloads completos, y la instancia del equipo recibe las mismas ejecuciones con su propia retención y sus propias reglas de ocultación aplicadas al llegar.

A continuación