Roles del collector
- Agente - Las instancias de agente recopilan datos en el extremo, por ejemplo, en servidores o nodos de Kubernetes, o reciben eventos directamente de aplicaciones instrumentadas con un SDK de OpenTelemetry. En este último caso, la instancia de agente se ejecuta junto con la aplicación o en el mismo host que esta (como un sidecar o un conjunto de daemon). Los agentes pueden enviar sus datos directamente a ClickHouse o a una instancia de gateway. En el primer caso, esto se conoce como patrón de implementación de agente.
- Gateway - Las instancias de gateway proporcionan un servicio independiente (por ejemplo, una Implementación en Kubernetes), normalmente por clúster, centro de datos o región. Reciben eventos de aplicaciones (u otros collectors que actúan como agentes) a través de un único endpoint de OTLP. Normalmente, se implementa un conjunto de instancias de gateway, con un balanceador de carga listo para usar para distribuir la carga entre ellas. Si todos los agentes y las aplicaciones envían sus señales a este único endpoint, suele denominarse patrón de implementación de gateway.
Despliegue del collector
- Managed ClickStack
- ClickStack de código abierto
Cuando sea posible, recomendamos utilizar la distribución oficial de ClickStack del collector para el rol de gateway al enviar datos a Managed ClickStack. Si decide usar el suyo propio, asegúrese de que incluya el exporter de ClickHouse.El collector puede implementarse mediante Helm (recomendado para Kubernetes) o mediante Docker. El gráfico de Helm de ClickStack oficial incorpora el gráfico de Helm del OpenTelemetry Collector como un subchart con la imagen de distribución de ClickStack preconfigurada; consulte la guía de implementación de ClickStack con Helm si desea instalar el stack completo, incluido HyperDX. Para una implementación standalone del collector, el chart upstream puede utilizarse directamente con la imagen de ClickStack, tal como se muestra a continuación.La instancia de ClickHouse de destino se configura mediante las variables de entorno La distribución ClickStack del OTel collector permite ampliar la configuración base montando un archivo de configuración personalizado y estableciendo una variable de entorno.Para añadir receiver, processor o pipelines personalizados:Implemente con el collector independiente:Para configuraciones más complejas, consulta la configuración predeterminada del ClickStack collector y la documentación del exportador de ClickHouse.Para obtener más información sobre la configuración de los OTel collectors, incluidos
- Helm
- Docker
Añada el repositorio de Helm oficial de OpenTelemetry:Cree un Instale el chart:Para implementaciones de producción, recomendamos almacenar
values.yaml para configurar la imagen de ClickStack y las credenciales de Managed ClickStack:CLICKHOUSE_PASSWORD en un Secret de Kubernetes y hacer referencia a él mediante extraEnvsFrom en lugar de incluir el valor directamente.CLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME y CLICKHOUSE_PASSWORD. El valor de CLICKHOUSE_ENDPOINT debe ser el endpoint HTTP completo de ClickHouse Cloud, incluyendo el protocolo y el puerto; por ejemplo, https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443.Para obtener más información sobre cómo recuperar sus credenciales de Managed ClickStack, consulte aquí.Usuario para producciónEn producción, debe usar un usuario con las credenciales adecuadas.
Modificación de la configuración
Configuración de la instancia de Managed ClickStack
El OpenTelemetry collector puede configurarse para usar una instancia de Managed ClickStack mediante las variables de entornoCLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME y CLICKHOUSE_PASSWORD. La forma en que se configuran depende del método de implementación:- Helm
- Docker
Sobrescribe las entradas correspondientes en
extraEnvs de tu values.yaml y, a continuación, actualiza la release:Extensión de la configuración del collector
- Cree un archivo de configuración personalizado con la configuración adicional
- Monte el archivo en
/etc/otelcol-contrib/custom.config.yaml - Establezca la variable de entorno
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml
Solo debes definir nuevos receiver, processor y pipelines en la configuración personalizada. Los processor base (
memory_limiter, batch) y los exportadores (clickhouse) ya están definidos; haz referencia a ellos por su nombre. La configuración personalizada se fusiona con la configuración base y no puede sobrescribir componentes existentes.Estructura de la configuración
receivers, operators y processors, recomendamos consultar la documentación oficial de OpenTelemetry Collector.Docker Compose
Con Docker Compose, modifique la configuración del collector usando las mismas variables de entorno mencionadas anteriormente:Protección del collector
- ClickStack gestionado
- ClickStack Open Source
De forma predeterminada, el ClickStack OpenTelemetry collector no está protegido cuando se implementa fuera de las distribuciones open source y no requiere autenticación en sus puertos OTLP.Para proteger la ingestión, especifica un token de autenticación al implementar el collector mediante la variable de entorno Además, recomendamos:Esto supone que el collector se ha configurado para usar la base de datos
OTLP_AUTH_TOKEN. La forma de configurarlo depende del método de implementación:- Helm
- Docker
Agrega Para implementaciones en producción, recomendamos almacenar
OTLP_AUTH_TOKEN a extraEnvs en tu values.yaml y, a continuación, actualiza la release:OTLP_AUTH_TOKEN y CLICKHOUSE_PASSWORD en un secret de Kubernetes y hacer referencia a ellos mediante extraEnvsFrom.- Configurar el collector para que se comunique con ClickHouse a través de HTTPS.
- Crear un usuario dedicado para la ingestión con permisos limitados; consulta la sección siguiente.
- Habilitar TLS para el endpoint de OTLP, garantizando la comunicación cifrada entre los SDKs/agentes y el collector. Esto se puede configurar mediante la configuración personalizada del collector.
Crear un usuario de ingestión
Recomendamos crear una base de datos y un usuario dedicados para que el OTel collector realice la ingestión en Managed ClickStack. Este usuario debe poder crear e insertar datos en las tablas creadas y utilizadas por ClickStack.otel. Esto se puede controlar mediante la variable de entorno HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE. Pásala al collector de forma similar a otras variables de entorno.Procesamiento: filtrado, transformación y enriquecimiento
- Desplegar su propia versión del OTel collector para realizar el filtrado y el procesamiento, enviando los eventos al ClickStack collector mediante OTLP para su ingestión en ClickHouse.
- Desplegar su propia versión del OTel collector y enviar los eventos directamente a ClickHouse mediante el exporter de ClickHouse.
timestamp (mediante operators) y enriquecimiento, que requiere contexto en los agentes. Por ejemplo, si las instancias gateway residen en un cluster de Kubernetes distinto, el enriquecimiento de k8s tendrá que hacerse en el agente.
OpenTelemetry admite las siguientes funcionalidades de procesamiento y filtrado que puede aprovechar:
-
Processors - Los processors toman los datos recopilados por los receiver y los modifican o transforman antes de enviarlos a los exporters. Los processors se aplican en el orden en que están configurados en la sección
processorsde la configuración del collector. Son opcionales, pero normalmente se recomienda un conjunto mínimo. Al usar un OTel collector con ClickHouse, recomendamos limitar los processors a: - Un memory_limiter se usa para evitar situaciones de falta de memoria en el collector. Consulte Estimating Resources para ver recomendaciones.
- Cualquier processor que realice enriquecimiento en función del contexto. Por ejemplo, el Kubernetes Attributes Processor permite establecer automáticamente atributos de recursos de spans, métricas y logs con metadatos de k8s; por ejemplo, enriqueciendo eventos con el ID de su pod de Kubernetes de origen.
- Tail or head sampling si es necesario para traces.
- Basic filtering - descarte de eventos que no sean necesarios si esto no puede hacerse mediante operator (véase más abajo).
- Batching - esencial al trabajar con ClickHouse para garantizar que los datos se envíen en batches. Consulte “Optimizing inserts”.
- Operators - Los Operators proporcionan la unidad de procesamiento más básica disponible en el receiver. Se admite parsing básico, lo que permite establecer campos como Severity y Timestamp. Aquí se admiten el parsing de JSON y regex, junto con el filtrado de eventos y transformaciones básicas. Recomendamos realizar aquí el filtrado de eventos.
Ejemplo
regex_parser) y filtrar eventos, junto con un processor para agrupar eventos en lotes y limitar el uso de memoria.
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
Optimización de las inserciones
Agrupación por lotes
- (1) Si el nodo que recibe los datos tiene problemas, la consulta de inserción agotará el tiempo de espera (o devolverá un error más específico) y no se recibirá ninguna confirmación.
- (2) Si el nodo escribió los datos, pero la confirmación no puede devolverse al remitente de la consulta debido a interrupciones de red, el remitente recibirá un timeout o un error de red.
timeout del batch processor, lo que garantiza que la latencia de extremo a extremo de la canalización siga siendo baja y que los lotes tengan un tamaño uniforme.
Usa inserciones asíncronas
timeout del processor por lotes. Esto puede causar problemas, y es entonces cuando se requieren inserciones asíncronas. Este problema es poco frecuente si envías datos al ClickStack collector actuando como Gateway; al actuar como agregadores, mitigan este problema. Consulta Roles del collector.
Si no se pueden garantizar lotes grandes, puedes delegar la agrupación por lotes en ClickHouse mediante inserciones asíncronas. Con las inserciones asíncronas, los datos se insertan primero en un búfer y después se escriben en el almacenamiento de la base de datos más tarde, es decir, de forma asíncrona.
Con las inserciones asíncronas habilitadas, cuando ClickHouse ① recibe una consulta de inserción, los datos de la consulta ② se escriben inmediatamente en un búfer en memoria. Cuando ③ se produce el siguiente vaciado del búfer, los datos del búfer se ordenan y se escriben como una parte en el almacenamiento de la base de datos. Ten en cuenta que los datos no se pueden consultar antes de vaciarse en el almacenamiento de la base de datos; el vaciado del búfer es configurable.
Para habilitar las inserciones asíncronas para el collector, añade async_insert=1 a la cadena de conexión. Recomendamos usar wait_for_async_insert=1 (el valor predeterminado) para obtener garantías de entrega; consulta aquí para más detalles.
Los datos de una inserción asíncrona se insertan una vez que se vacía el búfer de ClickHouse. Esto ocurre cuando se supera async_insert_max_data_size o tras async_insert_busy_timeout_ms milisegundos desde la primera consulta INSERT. Si async_insert_stale_timeout_ms se establece en un valor distinto de cero, los datos se insertan después de async_insert_stale_timeout_ms milliseconds desde la última consulta. Puedes ajustar estas opciones para controlar la latencia de extremo a extremo de la canalización. Otras opciones que pueden usarse para ajustar el vaciado del búfer están documentadas aquí. En general, los valores predeterminados son adecuados.
Considera las inserciones asíncronas adaptativasEn los casos en que se utiliza un número reducido de agentes, con bajo throughput pero requisitos estrictos de latencia de extremo a extremo, las inserciones asíncronas adaptativas pueden ser útiles. En general, no suelen ser aplicables a casos de uso de observabilidad de alto throughput, como los habituales en ClickHouse.
async_insert_deduplicate.
Los detalles completos sobre cómo configurar esta funcionalidad se pueden encontrar en esta página de documentación o en esta entrada del blog con un análisis en profundidad.
Escalado
Añadir Kafka
Configuración del OTel collectorLa distribución ClickStack OpenTelemetry collector puede configurarse con Kafka mediante la configuración personalizada del collector.
Estimación de recursos
| Tasa de logging | Recursos para el collector agente |
|---|---|
| 1k/segundo | 0.2CPU, 0.2GiB |
| 5k/segundo | 0.5 CPU, 0.5GiB |
| 10k/segundo | 1 CPU, 1GiB |
Elección del esquema: Map vs JSON
Map(LowCardinality(String), String) de forma predeterminada. Este es el esquema recomendado para las cargas de trabajo de observabilidad. También está disponible, en beta, un esquema de tipo JSON para evaluarlo en cargas de trabajo con un conjunto pequeño y estable de claves de atributos.
Para ver la comparación completa, cuándo conviene usar cada uno, las variables de entorno necesarias para habilitar el esquema de tipo JSON y la guía de migración, consulta Map vs tipo JSON.