Rôles du collector
- Agent - Les instances d’agent collectent les données à la périphérie, par exemple sur des serveurs ou des nœuds Kubernetes, ou reçoivent directement des événements d’applications instrumentées avec un SDK OpenTelemetry. Dans ce dernier cas, l’instance d’agent s’exécute avec l’application ou sur le même hôte que celle-ci (par exemple en sidecar ou sous forme de DaemonSet). Les agents peuvent soit envoyer leurs données directement à ClickHouse, soit à une instance de gateway. Dans le premier cas, on parle du modèle de déploiement Agent.
- gateway - Les instances de gateway fournissent un service autonome (par exemple, un déploiement Kubernetes), généralement par cluster, par centre de données ou par région. Elles reçoivent des événements d’applications (ou d’autres collectors faisant office d’agents) via un point de terminaison OTLP unique. En général, plusieurs instances de gateway sont déployées, avec un équilibreur de charge prêt à l’emploi pour répartir la charge entre elles. Si tous les agents et toutes les applications envoient leurs signaux vers ce point de terminaison unique, on parle souvent du modèle de déploiement gateway.
Déployer le collector
- ClickStack managé
- ClickStack open source
Nous recommandons d’utiliser la distribution officielle ClickStack du collector pour le rôle de gateway lors de l’envoi vers Managed ClickStack, dans la mesure du possible. Si vous choisissez d’utiliser le vôtre, assurez-vous qu’il inclut le ClickHouse exporter.Le collecteur peut être déployé via Helm (recommandé pour Kubernetes) ou via Docker. Le chart Helm ClickStack officiel intègre le chart Helm du collecteur OpenTelemetry en tant que sous-chart, avec l’image de la distribution ClickStack préconfigurée — consultez le guide de déploiement Helm ClickStack si vous souhaitez installer la stack complète incluant HyperDX. Pour un déploiement autonome du collecteur, le chart upstream peut être utilisé directement avec l’image ClickStack, comme illustré ci-dessous.L’instance ClickHouse cible est configurée via les variables d’environnement La distribution ClickStack de l’OTel collector permet d’étendre la configuration de base en montant un fichier de configuration personnalisé et en définissant une variable d’environnement.Pour ajouter des receivers, des processors ou des pipelines personnalisés :Déploiement avec le collector autonome :Pour des configurations plus complexes, consultez la configuration par défaut du collector ClickStack et la documentation de l’exporter ClickHouse.Pour en savoir plus sur la configuration des collectors OTel, notamment les
- Helm
- Docker
Ajoutez le dépôt Helm OpenTelemetry officiel :Créez un fichier Installez le chart :Pour les déploiements de production, nous vous recommandons de stocker
values.yaml qui configure l’image ClickStack et les identifiants de Managed ClickStack :CLICKHOUSE_PASSWORD dans un secret Kubernetes et d’y faire référence via extraEnvsFrom plutôt que d’intégrer directement la valeur.CLICKHOUSE_ENDPOINT, CLICKHOUSE_USER et CLICKHOUSE_PASSWORD. La valeur de CLICKHOUSE_ENDPOINT doit correspondre à l’endpoint HTTP complet de ClickHouse Cloud, protocole et port inclus — par exemple, https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443.Pour plus d’informations sur la récupération de vos identifiants Managed ClickStack, consultez cette page.Utilisateur pour la productionEn production, vous devez utiliser un utilisateur disposant des identifiants appropriés.
Modification de la configuration
Configuration de l’instance Managed ClickStack
L’OpenTelemetry Collector peut être configuré pour utiliser une instance Managed ClickStack via les variables d’environnementCLICKHOUSE_ENDPOINT, CLICKHOUSE_USER et CLICKHOUSE_PASSWORD. La façon dont ces variables sont définies dépend de votre méthode de déploiement :- Helm
- Docker
Surchargez les entrées appropriées sous
extraEnvs dans votre values.yaml, puis mettez à jour la release :Étendre la configuration du collector
- Créez un fichier de configuration personnalisé contenant votre configuration supplémentaire
- Montez le fichier dans
/etc/otelcol-contrib/custom.config.yaml - Définissez la variable d’environnement
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml
Dans la configuration personnalisée, vous ne définissez que de nouveaux receivers, processors et pipelines. Les processors de base (
memory_limiter, batch) et les exporters (clickhouse) sont déjà définis — faites-y référence par leur nom. La configuration personnalisée est fusionnée avec la configuration de base et ne peut pas redéfinir des composants existants.Structure de configuration
receivers, les operators et les processors, nous vous recommandons de consulter la documentation officielle de l’OpenTelemetry Collector.Docker Compose
Avec Docker Compose, modifiez la configuration du collector en utilisant les mêmes variables d’environnement qu’indiqué ci-dessus :Sécurisation du collector
- Managed ClickStack
- ClickStack open source
Par défaut, le ClickStack OpenTelemetry collector n’est pas sécurisé lorsqu’il est déployé en dehors des distributions open source et ne nécessite aucune authentification sur ses ports OTLP.Pour sécuriser l’ingestion, spécifiez un jeton d’authentification lors du déploiement du collector à l’aide de la variable d’environnement Nous recommandons également :Cela suppose que le collector a été configuré pour utiliser la base de données
OTLP_AUTH_TOKEN. La manière de le définir dépend de votre méthode de déploiement :- Helm
- Docker
Ajoutez Pour les déploiements en production, nous recommandons de stocker
OTLP_AUTH_TOKEN à extraEnvs dans votre values.yaml, puis mettez à jour la release :OTLP_AUTH_TOKEN et CLICKHOUSE_PASSWORD dans un secret Kubernetes et de les référencer via extraEnvsFrom.- De configurer le collector pour communiquer avec ClickHouse en HTTPS.
- De créer un utilisateur dédié à l’ingestion avec des permissions limitées - voir ci-dessous.
- D’activer TLS pour l’endpoint OTLP, afin de garantir une communication chiffrée entre les SDK/agents et le collector. Cela peut être configuré via la configuration personnalisée du collector.
Création d’un utilisateur d’ingestion
Nous recommandons de créer une base de données et un utilisateur dédiés pour le OTel collector afin d’ingérer les données dans Managed ClickStack. Ils doivent pouvoir créer des tables et y insérer des données parmi les tables créées et utilisées par ClickStack.otel. Ce paramètre peut être défini via la variable d’environnement HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE. Transmettez-la au collector comme les autres variables d’environnement.Traitement - filtrage, transformation et enrichissement
- Déployer leur propre version de l’OTel collector pour assurer le filtrage et le traitement, puis envoyer les événements au ClickStack collector via OTLP pour ingestion dans ClickHouse.
- Déployer leur propre version de l’OTel collector et envoyer les événements directement à ClickHouse à l’aide du ClickHouse exporter.
-
Processors - Les processors prennent les données collectées par les receivers et les modifient ou les transforment avant de les envoyer aux exporters. Les processors sont appliqués dans l’ordre défini dans la section
processorsde la configuration du collector. Ils sont facultatifs, mais l’ensemble minimal est généralement recommandé. Lors de l’utilisation d’un OTel collector avec ClickHouse, nous recommandons de limiter les processors à : - Un memory_limiter est utilisé pour éviter les situations de manque de mémoire sur le collector. Consultez Estimating Resources pour obtenir des recommandations.
- Tout processor qui effectue un enrichissement basé sur le contexte. Par exemple, le Kubernetes Attributes Processor permet de définir automatiquement les attributs de ressource des spans, metrics et logs à partir des métadonnées k8s, par exemple en enrichissant les événements avec l’identifiant de leur pod source.
- Le sampling tail ou head si nécessaire pour les traces.
- Le filtrage de base - suppression des événements non requis si cela ne peut pas être fait via un operator (voir ci-dessous).
- Le batching - essentiel lorsque vous travaillez avec ClickHouse pour garantir que les données sont envoyées par lots. Voir « Optimizing inserts ».
- Operators - Les operators constituent l’unité de traitement la plus élémentaire disponible au niveau du receiver. Le parsing de base est pris en charge, ce qui permet de définir des champs tels que Severity et Timestamp. Le parsing JSON et regex est pris en charge ici, ainsi que le filtrage des événements et les transformations de base. Nous recommandons d’effectuer le filtrage des événements à ce niveau.
Exemple
regex_parser) et filtrer les événements, ainsi que d’un processeur pour traiter les événements par lots et limiter l’utilisation de la mémoire.
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
Optimisation des insertions
Traitement par lots
- (1) Si le nœud qui reçoit les données rencontre des problèmes, la requête d’insertion expirera (ou renverra une erreur plus spécifique) et ne recevra pas d’accusé de réception.
- (2) Si les données ont bien été écrites par le nœud, mais que l’accusé de réception ne peut pas être renvoyé à l’émetteur de la requête en raison d’interruptions réseau, l’émetteur recevra soit un timeout, soit une erreur réseau.
timeout du batch processor ne soit atteint, ce qui garantit une faible latence de bout en bout du pipeline et des lots de taille cohérente.
Utiliser les insertions asynchrones
timeout du batch processor expire. Cela peut entraîner des problèmes, et c’est là que les insertions asynchrones deviennent nécessaires. Ce problème est rare si vous envoyez des données au ClickStack collector agissant comme Gateway : en jouant le rôle d’agrégateur, il atténue ce problème. Voir Rôles du collector.
S’il n’est pas possible de garantir des lots volumineux, vous pouvez déléguer le traitement par lots à ClickHouse à l’aide des Asynchronous Inserts. Avec les insertions asynchrones, les données sont d’abord insérées dans un buffer, puis écrites plus tard dans le storage de la base de données, donc de manière asynchrone.
Lorsque les insertions asynchrones sont activées, quand ClickHouse ① reçoit une insert query, les données de la requête sont ② immédiatement écrites dans un buffer en mémoire. Lorsque ③ le buffer est ensuite vidé, ses données sont triées puis écrites sous forme de part dans le storage de la base de données. Notez que les données ne peuvent pas être interrogées par des queries avant d’avoir été écrites dans le storage de la base de données ; le flush du buffer est configurable.
Pour activer les insertions asynchrones pour le collector, ajoutez async_insert=1 à la connection string. Nous recommandons d’utiliser wait_for_async_insert=1 (valeur par défaut) afin d’obtenir des garanties de livraison ; voir ici pour plus de détails.
Les données d’une insertion asynchrone sont insérées une fois le buffer de ClickHouse vidé. Cela se produit soit après dépassement de async_insert_max_data_size, soit après async_insert_busy_timeout_ms millisecondes à compter de la première requête INSERT. Si async_insert_stale_timeout_ms est défini sur une valeur non nulle, les données sont insérées après async_insert_stale_timeout_ms milliseconds à compter de la dernière requête. Vous pouvez ajuster ces paramètres pour contrôler la latence de bout en bout de votre pipeline. D’autres paramètres permettant d’ajuster le flush du buffer sont documentés ici. En général, les valeurs par défaut conviennent.
Envisagez les insertions asynchrones adaptativesDans les cas où un petit nombre d’agent est utilisé, avec un faible débit mais des exigences strictes en matière de latence de bout en bout, les insertions asynchrones adaptatives peuvent être utiles. En général, elles ne s’appliquent pas aux cas d’usage d’Observability à haut débit, comme ceux observés avec ClickHouse.
async_insert_deduplicate.
Tous les détails sur la configuration de cette fonctionnalité sont disponibles sur cette page de documentation, ainsi que dans ce billet de blog plus approfondi.
Mise à l’échelle
Ajouter Kafka
Configuration de l’OTel collectorLa distribution ClickStack OpenTelemetry collector peut être configurée avec Kafka à l’aide de la configuration personnalisée du collector.
Estimation des ressources
| Taux de logging | Ressources pour l’agent collector |
|---|---|
| 1k/seconde | 0.2CPU, 0.2GiB |
| 5k/seconde | 0.5 CPU, 0.5GiB |
| 10k/seconde | 1 CPU, 1GiB |
Choix du schéma : Map vs JSON
Map(LowCardinality(String), String). Il s’agit du schéma recommandé pour les workloads d’observabilité. Un schéma de type JSON est disponible en bêta pour l’évaluation sur des workloads disposant d’un ensemble de clés d’attributs réduit et stable.
Pour une comparaison complète, savoir dans quels cas chacun convient, connaître les variables d’environnement requises pour activer le schéma de type JSON et suivre le guide de migration, consultez Map vs JSON type.