New Relic's Infinite Tracing Processor is an implementation of the OpenTelemetry Collector tailsamplingprocessor. In addition to upstream features, it supports scalable and durabl distributed processing by using a distributed cache for shared state storage. This documentation how to configure it
Caches pris en charge
The processor supports any Redis-compatible cache implementation. It has been tested and validated with Redis and Valkey in both single-instance and cluster configurations. For production deployments, we recommend using cluster mode (sharded) to ensure high availability and scalability. To enable distributed caching, add the distributed_cache configuration to your tail_sampling processor section:
tail_sampling: distributed_cache: connection: address: redis://localhost:6379/0 password: 'local' trace_window_expiration: 30s # Default: how long to wait after last span before evaluating processor_name: "itc" # Nane of the processor data_compression: format: lz4 # Optional: compression format (none, snappy, zstd, lz4); lz4 recommendedImportant
Configuration behavior: When distributed_cache is configured, the processor automatically uses the distributed cache for state management. If distributed_cache is omitted entirely, the collector will use in-memory processing instead.
Le paramètre address doit spécifier une adresse de serveur compatible Redis valide au format standard :
redis[s]://[[username][:password]@][host][:port][/db-number]Vous pouvez également intégrer directement les informations d'identification dans le paramètre address :
tail_sampling: distributed_cache: connection: address: redis://:yourpassword@localhost:6379/0Le processeur est implémenté en Go et utilise la bibliothèque cliente go-redis.
Paramètres de configuration
La section distributed_cache prend en charge les paramètres suivants :
Paramètres de connexion
| paramètres | Type | Défaut | Description |
|---|---|---|---|
connection.address | chaîne | requis | Chaîne de connexion Redis (format : redis://host:port/db). Pour le mode cluster, utilisez des adresses séparées par des virgules (par exemple, redis://node1:6379,redis://node2:6379) |
connection.password | chaîne | "" | Mot de passe Redis pour l'authentification |
Compression des données
| paramètres | Type | Défaut | Description |
|---|---|---|---|
data_compression | chaîne | none | Algorithme de compression pour les données de trace. Options : none, snappy, zstd, lz4 |
Conseil
Compromis de compression:
none: No CPU overhead, highest Network and Redis memory usagesnappy: Compression/décompression rapide, bon taux de compressionzstd: Meilleur taux de compression, plus d'utilisation du CPUlz4: Très rapide, taux de compression modéréCompression is mainly aimed at reducing network traffic which is the main bottleneck of the processors when connecting to redis
Gestion des traces
| paramètres | Type | Défaut | Description |
|---|---|---|---|
trace_window_expiration | durée | 30s | Combien de temps faut-il attendre les spans avant d'évaluer une trace |
traces_ttl | durée | 5m | Durée de vie des données de trace dans Redis |
cache_ttl | durée | 30m | Durée de vie des décisions d'échantillonnage |
processor_name | chaîne | "" | processor name for Redis keys and metrics (useful for multi-tenant deployments) |
Consignes TTL :
traces_ttldoit être suffisamment long pour gérer les nouvelles tentatives et les spans tardifscache_ttldevrait être beaucoup plus long quetraces_ttlpour gérer les spans arrivant tardivement- Une
cache_ttlplus longue réduit les évaluations en double, mais augmente l'utilisation de la mémoire Redis
Partitionnement
| paramètres | Type | Défaut | Description |
|---|---|---|---|
partitions | int | 6 | Nombre de partitions pour la répartition de la charge sur Redis |
partition_workers | int | 6 | Nombre d'évaluateurs de travail simultanés |
Avantages du partitionnement:
- Répartit la charge sur plusieurs plages de clés Redis
- Permet une évaluation parallèle sur plusieurs workers
- Améliore le débit dans les déploiements multi-collecteurs
Conseil
Partition scaling: A partition is a logical shard of trace data in Redis that enables horizontal scaling. Traces are assigned to partitions using a hashing algorithm on the trace ID.
Important: partitions should be ideally 3x times the number of Redis nodes needed for your workload with avgerage load. partition_workers should typically be less than or equal to the number of partitions.
Paramètres d'ingestion
| paramètres | Type | Défaut | Description |
|---|---|---|---|
ingestion_workers | int | 6 | Nombre de goroutines traitant les traces à partir du canal d'ingestion partagé |
ingestion_buffer_size | int | 10000 | Capacité du canal d'ingestion partagé pour la mise en mémoire tampon des traces entrantes |
ingestion_channel_timeout | durée | 500ms | Temps maximal d'attente lors de l'envoi des traces au canal d'ingestion. Si dépassé, les traces sont supprimées |
ingestion_response_timeout | durée | 10s | Délai d'attente maximal pour que le worker traite et réponde. Empêche le blocage indéfini si les workers sont bloqués |
hashing_strategy | chaîne | rendezvous | Algorithme de hachage pour la sélection de partition. Options : rendezvous (recommandé, 3x plus rapide) ou consistent |
Architecture d'ingestion :
Le processeur utilise un canal partagé avec des workers configurables pour l'ingestion des traces :
- Les traces entrantes sont envoyées à un canal tampon partagé
- Plusieurs workers tirent du canal et routent les traces vers les partitions appropriées
- Les workers hachent les ID de trace en utilisant la stratégie de hachage configurée pour déterminer l'affectation des partitions.
Consignes de configuration :
- Buffer Size: Should absorb traffic bursts.
- Workers: Number of concurrent goroutines processing traces.
- Délai d'attente du canal: Durée d'attente si la mémoire tampon est pleine. Un court délai d'attente (500 ms) échoue rapidement en cas de saturation
- Délai d'attente de la réponse: Protège contre les workers bloqués. Par défaut : 10 s est approprié pour les opérations Redis normales
- Stratégie de hachage: Algorithme pour déterminer l'affectation des partitions de trace
rendezvous(par défaut) : Fournit une répartition de charge supérieure pour 2 à 99 partitions. Meilleur choix pour les déploiements typiques.consistent: Maintient les performances lors de l'utilisation de plus de 100 partitions où le rendez-vous devient lent. Compense une répartition de la charge légèrement moins optimale pour de meilleures performances à grande échelle.- Les deux stratégies garantissent que la même trace est toujours mappée à la même partition (déterministe)
- Choisissez le rendez-vous pour une meilleure répartition de la charge (jusqu'à 99 partitions), cohérent pour les performances à l'échelle (100+)
Paramètres d'évaluation
| paramètres | Type | Défaut | Description |
|---|---|---|---|
evaluation_interval | durée | 1s | Fréquence de vérification des traces prêtes pour l'évaluation |
max_traces_per_batch | int | 1000 | Nombre maximal de traces à évaluer par lot |
rate_limiter | booléen | false | Activer le limiteur de débit bloquant pour le traitement simultané des traces |
num_traces | int | 50000 | if rate_limiter is enabled, it uses the num_traces as max number of concurrent processing traces |
Limiteur de débit :
L'option rate_limiter contrôle le comportement de la contre-pression lorsque la limite de traces simultanées (num_traces) est atteinte :
false(par défaut): Pas de limitation de débit. Le processeur accepte les traces sans blocage, en s'appuyant sur Redis pour le stockage. C'est le paramètre recommandé pour la plupart des déploiements Redis.true: Active un limiteur de débit bloquant qui applique une contre-pression lorsquenum_tracestraces simultanées sont traitées. Les nouvelles traces seront bloquées jusqu'à ce qu'un emplacement devienne disponible.
Quand activer :
- To prevent overwhelming Redis network, cpu and/or memory
- Pour éviter de submerger les consommateurs en aval avec des pics de trafic soudains
Nouvelle tentative et récupération
| paramètres | Type | Défaut | Description |
|---|---|---|---|
max_retries | int | 2 | Nombre maximal de tentatives de relance pour les évaluations de trace ayant échoué |
in_flight_timeout | durée | Identique à trace_window_expiration | Délai d'attente pour le traitement par lots en cours avant d'être considéré comme orphelin |
recover_interval | durée | 5s | Fréquence de vérification des lots orphelins |
Important
Récupération des orphelins: Les lots orphelins se produisent lorsqu'un collecteur se bloque en cours d'évaluation. Le processus de récupération des orphelins remet ces traces en file d'attente pour l'évaluation par une autre instance de collecteur.
Policy configuration
| paramètres | Type | Défaut | Description |
|---|---|---|---|
policies | éventail | requis | Définitions des règles d'échantillonnage |
They follow the same rules as in the open source tail sampling.
Délais d'attente du client Redis et pool de connexions
Tous les paramètres sont facultatifs et ont des valeurs par défaut alignées sur les 10s ingestion_response_timeout.
| paramètres | Type | Défaut | Description |
|---|---|---|---|
connection.dial_timeout | durée | 5s | Délai d'établissement de nouvelles connexions à Redis |
connection.read_timeout | durée | 3s | Délai d'attente pour les lectures de socket. Les commandes échouent avec une erreur de délai d'attente si dépassé |
connection.write_timeout | durée | 3s | Délai d'écriture des sockets. Les commandes échouent avec une erreur de délai d'attente si dépassé |
connection.pool_timeout | durée | 4s | Temps d'attente pour la connexion depuis le pool si toutes les connexions sont occupées |
connection.pool_size | int | 10 * cores | Base number of socket connections |
connection.min_idle_conns | int | 0 | Minimum number of idle connections which is useful when establishing new connection is slow. The idle connections are not closed by default. |
connection.max_idle_conns | int | 0 | Maximum number of connections allocated by the pool at a given time. 0 no limit |
connection.conn_max_idle_time | durée | 30m | Maximum amount of time a connection may be idle. Should be less than server's timeout. |
connection.conn_max_lifetime | durée | 0m | Maximum amount of time a connection may be reused. |
connection.max_retries | int | 3 | Nombre maximal de tentatives de commande avant d'abandonner |
connection.min_retry_backoff | durée | 8ms | Délai d'attente minimal entre les tentatives |
connection.max_retry_backoff | durée | 512ms | Délai d'attente maximal entre les tentatives (repli exponentiel plafonné à cette valeur) |
Conseils de réglage :
- High-latency Redis (cross-region, VPN): Increase timeouts to 2-3x defaultsand reduce
max_retriesto 2 - Redis très rapide (même hôte/rack) : Peut réduire davantage les délais d'attente (par exemple, 250 ms) pour une détection plus rapide des défaillances
- Haut débit: Augmentez
pool_sizeà 30-50 pour éviter l'épuisement du pool de connexions - Réseau non fiable: Augmentez
max_retriesà 5-7 et ajustez les paramètres de backoff
Options de réplica de cluster
The connection.replica section controls cluster replica routing.
| paramètres | Type | Défaut | Description |
|---|---|---|---|
connection.replica.read_only_replicas | booléen | true | Enable routing read commands to replica nodes. Default is true for improved scalability. |
connection.replica.route_by_latency | booléen | false | Acheminer les commandes vers le nœud le plus proche en fonction de la latence (active automatiquement read_only_replicas) |
connection.replica.route_randomly | booléen | false | Acheminer les commandes vers un nœud aléatoire (active automatiquement read_only_replicas) |
Conseil
Replica read benefits: When running with a Redis cluster that has replica nodes, enabling replica reads distributes read load across both primary and replica nodes, significantly improving read throughput and reducing load on primary nodes.
Considérations importantes:
- Cluster-only: These options only work with Redis cluster deployments with replicas per shard
Exemple de configuration complet
processors: tail_sampling: num_traces: 5_000_000 distributed_cache: # Connection connection: address: "redis://redis-cluster:6379/0" password: "your-redis-password"
# Connection pool settings (optional - tune for your environment) pool_size: 30 read_timeout: 2s write_timeout: 2s pool_timeout: 5s max_retries: 5
# Replica read options (cluster mode only) replica: read_only_replicas: true # Default: enabled for improved scalability route_by_latency: true # Route to closest node (recommended)
# Compression data_compression: snappy
# Trace Management trace_window_expiration: 30s traces_ttl: 2m # 120s (allow extra time for retries) cache_ttl: 1h # 3600s (keep decisions longer) processor_name: "prod-cluster-1"
# Retry and Recovery max_retries: 3 in_flight_timeout: 45s recover_interval: 10s
# Evaluation evaluation_interval: 1s max_traces_per_batch: 10000 rate_limiter: false # Recommended for Redis mode
# Partitioning partitions: 8 partition_workers: 8 partition_buffer_max_traces: 1000
# Ingestion ingestion_workers: 12 # 1.5 workers per partition ingestion_buffer_size: 40000 # 40k trace buffer ingestion_channel_timeout: 500ms ingestion_response_timeout: 10s hashing_strategy: rendezvous # default, best for less than 100 partitions
# Sampling policies policies: - name: errors type: status_code status_code: {status_codes: [ERROR]} - name: slow-traces type: latency latency: {threshold_ms: 1000} - name: sample-10-percent type: probabilistic probabilistic: {sampling_percentage: 10}Évaluation des traces
Cette section couvre les paramètres qui contrôlent quand les traces sont évaluées et combien de temps les données persistent dans Redis.
Timing et fréquence d'évaluation
Fonctionnement de l'évaluation :
- Tous les
evaluation_interval, les workers vérifient les traces qui sont restées inactives pendant au moinstrace_window_expiration - Jusqu'à
max_traces_per_batchtraces sont extraites de Redis par cycle d'évaluation partition_workersévaluer les lots simultanément sur les partitions
Conseils de réglage :
- Décisions plus rapides: diminuez
evaluation_interval(par exemple, 500 ms) pour une latence plus faible, mais augmente la charge Redis - Débit plus élevé: Augmentez
max_traces_per_batch(par exemple, 5000-10000) pour traiter plus de traces par cycle - Plus de parallélisme: Augmentez
partition_workerspour correspondre aux cœurs de processeur disponibles
Durée de vie (TTL) et expiration
Fonctionnement du TTL en mode distribué
Lors de l'utilisation de distributed_cache, le processeur met en œuvre un système TTL à plusieurs niveaux qui diffère du processeur en mémoire :
Étapes du cycle de vie de la trace :
- Phase de collecte: Les spans arrivent et sont stockés dans Redis
- Phase d'évaluation: Après
trace_window_expiration, la trace est prête pour la décision d'échantillonnage - Phase de rétention: Les données de trace persistent pendant
traces_ttlpour gérer les nouvelles tentatives et les spans tardifs - Phase de cache: Les décisions d'échantillonnage persistent pendant
cache_ttlpour éviter les évaluations en double
Important
Différence essentielle par rapport au mode en mémoire: Le paramètre trace_window_expiration remplace decision_wait et met en œuvre une approche de fenêtre glissante :
- Chaque fois que de nouveaux spans arrivent pour une trace, le chronomètre d'évaluation est réinitialisé
- Les traces avec une activité en cours restent actives plus longtemps que les traces qui ont cessé de recevoir des spans
- Ce comportement dynamique gère mieux les schémas d'arrivée des spans dans le monde réel
Pourquoi les TTL en cascade sont importants :
La hiérarchie TTL garantit la disponibilité des données tout au long du cycle de vie de la trace:
trace_window_expiration (30s) ↓ [trace ready for evaluation]in_flight_timeout (30s default) ↓ [evaluation completes or times out]traces_ttl (5m) ↓ [trace data deleted from Redis]cache_ttl (30m) ↓ [decision expires, late spans re-evaluated]trace_window_expiration(le plus court) contrôle le début de l'évaluation.in_flight_timeout(shortest) controls when evaluation is taking too long and it must be retriedcache_ttl(le plus long) gère les spans arrivant tardivement, des heures après l'évaluationtraces_ttl(moyen) fournit une mémoire tampon pour les nouvelles tentatives et la récupération des orphelins
Des TTL correctement configurés évitent la perte de données, les évaluations en double et les traces incomplètes tout en optimisant l'utilisation de la mémoire Redis.
Conseil
Principe de configuration: Chaque TTL doit être significativement plus long que le précédent (généralement 5 à 10 fois). Cela crée des tampons de sécurité qui tiennent compte des retards de traitement, des nouvelles tentatives et des données arrivant tardivement.
1. Fenêtre de collecte des traces : trace_window_expiration
Par défaut : 30s | Config : distributed_cache.trace_window_expiration
- Objectif: Contrôle le moment où une trace est prête pour l’évaluation de l’échantillonnage
- Comportement: Fenêtre glissante qui se réinitialise chaque fois que de nouveaux spans arrivent pour une trace
- Exemple: Si une trace reçoit des spans à t=0s, t=15s et t=28s, l'évaluation commence à t=58s (fenêtre de 28s + 30s)
Conseils de réglage :
- Valeurs plus courtes (15-20s): Décisions d'échantillonnage plus rapides, mais risque de traces incomplètes si les spans arrivent lentement
- Valeurs plus longues (45-60s): Traces plus complètes, mais latence et utilisation de la mémoire plus élevées
- Plage typique: 20 à 45 secondes selon vos schémas d'arrivée des spans
2. Délai d'expiration du traitement par lots : in_flight_timeout
Par défaut : Identique à trace_window_expiration | Config : distributed_cache.in_flight_timeout
- Objectif: Temps maximal pendant lequel un lot peut être en cours de traitement avant d'être considéré comme orphelin
- Comportement: Empêche la perte de données si un collecteur se bloque pendant l'évaluation
- Récupération des orphelins: Les lots dépassant ce délai d'attente sont automatiquement remis en file d'attente pour être évalués par un autre collecteur
Conseils de réglage :
Doit être ≥
trace_window_expiration: Assure suffisamment de temps pour une évaluation normaleAugmenter si: Vos politiques d'évaluation sont coûteuses en calcul (OTTL complexe, regex)
Monitorer:
otelcol_processor_tail_sampling_sampling_decision_timer_latencypour s'assurer que les évaluations se terminent dans cette fenêtreConseil
Relation avec trace_window_expiration: Définir
in_flight_timeoutégal àtrace_window_expirationfonctionne bien pour la plupart des déploiements. Augmentez uniquement si vous observez des récupérations de lots orphelins fréquentes en raison d'une évaluation de stratégie lente.
3. Rétention des données de trace : traces_ttl
Par défaut : 5m | Config : distributed_cache.traces_ttl
- Objectif: Durée de conservation des données de span de trace dans Redis après le stockage initial
- Comportement: fournit un temps tampon pour les nouvelles tentatives, les spans tardifs et la récupération des orphelins
- Contrainte critique: doit être significativement plus long que
trace_window_expiration+in_flight_timeout
Formule recommandée :
traces_ttl ≥ (trace_window_expiration + in_flight_timeout + max_retries × evaluation_interval) × 2Exemple avec les valeurs par défaut :
traces_ttl ≥ (30s + 30s + 2 retries × 1s) × 2 = 124s ≈ 5m ✅Conseils de réglage :
Contrainte de mémoire: Utilisez un TTL plus court (2-3 m) mais risquez de perdre des données pour les spans très tardifs
Tolérance des spans tardifs: Utilisez un TTL plus long (10-15m) pour gérer les arrivées de spans retardées
Production standard: 5 à 10 minutes offrent un bon équilibre
Important
Trop court = perte de données: Si
traces_ttlest trop court, les traces peuvent être supprimées avant la fin de l'évaluation, en particulier lors des nouvelles tentatives ou de la récupération des orphelins. Cela entraîne des traces partielles ou manquantes.
4. Rétention du cache de décision : cache_ttl
Par défaut : 30m | Config : distributed_cache.cache_ttl
- Objectif: Durée de mise en cache des décisions d'échantillonnage (échantillonné/non échantillonné)
- Comportement: Empêche l'évaluation en double lorsque des spans tardifs arrivent après l'évaluation de la trace
- Contrainte critique: Doit être beaucoup plus long que
traces_ttl
Formule recommandée :
cache_ttl ≥ traces_ttl × 6Pourquoi beaucoup plus long ?
- Les spans arrivant tardivement peuvent arriver minutes ou heures après la fin de la trace
- Le cache de décision empêche la réévaluation des traces lorsque des spans très tardifs arrivent
- Sans décision mise en cache, les spans tardifs seraient évalués comme des traces incomplètes (décision d'échantillonnage incorrecte)
Conseils de réglage :
- Production standard: 30m-2h équilibre l'utilisation de la mémoire et la gestion des spans tardifs
- Taux de spans tardifs élevé: 2-4h garantit que les décisions persistent pour les données très retardées
- Contrainte de mémoire: 15-30 minutes minimum, mais attendez-vous à plus d'évaluations en double
Impact sur la mémoire:
Chaque décision: ~50 octets par ID de trace
À 10 000 spans/s avec 20 spans/trace → 500 traces/s
Cache de 30 minutes : ~900 000 décisions × 50 octets = ~45 Mo
Cache de 2 heures : ~3,6 millions de décisions × 50 octets = ~180 Mo
Conseil
Monitorer l'efficacité du cache: suivre la métrique
otelcol_processor_tail_sampling_early_releases_from_cache_decision. Des valeurs élevées indiquent que le cache empêche efficacement les évaluations en double.
Exemples de configuration TTL
Faible latence, mémoire limitée :
distributed_cache: trace_window_expiration: 20s in_flight_timeout: 20s traces_ttl: 2m cache_ttl: 15m evaluation_interval: 500ms max_traces_per_batch: 2000Tolérant aux spans tardifs et à haut débit :
distributed_cache: trace_window_expiration: 45s in_flight_timeout: 60s traces_ttl: 10m cache_ttl: 2h evaluation_interval: 1s max_traces_per_batch: 10000Production équilibrée (recommandé) :
distributed_cache: trace_window_expiration: 30s in_flight_timeout: 45s # Extra buffer for complex policies traces_ttl: 5m cache_ttl: 30m evaluation_interval: 1s max_traces_per_batch: 5000Nouvelle tentative et récupération
Récupération des orphelins :
Les lots orphelins se produisent lorsqu'un collecteur se bloque en cours d'évaluation. Le processus de récupération des orphelins s'exécute toutes les recover_interval et:
- Identifie les lots qui ont dépassé
in_flight_timeout - Remet ces traces en file d'attente pour évaluation par une autre instance de collecteur
- Garantit qu'aucune trace n'est perdue en raison de défaillances du collecteur
Conseils de réglage :
- Augmenter
max_retries(3-5) en cas d'erreurs Redis transitoires - Diminuer
recover_interval(2-3s) pour une récupération plus rapide dans les environnements à haute disponibilité - Monitorer les métriques de récupération pour identifier si les collecteurs se bloquent fréquemment
Partitionnement et mise à l'échelle
Qu'est-ce qu'une partition ?
Une partition est une partition logique des données de trace dans Redis qui permet le traitement parallèle et la mise à l'échelle horizontale. Considérez les partitions comme des files d'attente distinctes où les traces sont distribuées en fonction de leur ID de trace.
Concepts clés :
Chaque partition maintient sa propre file d'attente de traces en attente dans Redis
Les traces sont affectées aux partitions à l'aide d'une stratégie de hachage configurable (rendez-vous ou cohérent) sur l'ID de trace
Chaque partition peut être traitée indépendamment et simultanément
Les partitions permettent à la fois une mise à l'échelle verticale (plus de cœurs de processeur) et une mise à l'échelle horizontale (plus d'instances de collecteur)
Prudence
Important: Changing the number of partitions when there's a cluster already running will cause fragmented traces, since traces might be routed to another partition after the change.
Fonctionnement du partitionnement
Incoming Traces | v┌─────────────────────────────┐│ Hashing Strategy │ trace_id → rendezvous or consistent hash│ (rendezvous by default) │└─────────────────────────────┘ | ├──────────┬──────────┬──────────┐ v v v v┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐│Partition│ │Partition│ │Partition│ │Partition││ 0 │ │ 1 │ │ 2 │ │ 3 ││ (Redis) │ │ (Redis) │ │ (Redis) │ │ (Redis) │└─────────┘ └─────────┘ └─────────┘ └─────────┘ | | | | v v v v┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐│ Worker │ │ Worker │ │ Worker │ │ Worker ││ 0 │ │ 1 │ │ 2 │ │ 3 ││(Goroutine)│(Goroutine)│(Goroutine)│(Goroutine)│└─────────┘ └─────────┘ └─────────┘ └─────────┘ | | | | └──────────┴──────────┴──────────┘ | v Sampled TracesFlux :
- Ingestion: l'ID de trace est haché à l'aide de la stratégie de hachage configurée pour déterminer l'affectation de la partition
- Stockage: données de trace stockées dans Redis sous des clés spécifiques à la partition
- Évaluation: Le worker affecté à cette partition extrait et évalue les traces
- Concurrence: Tous les workers de partition s'exécutent en parallèle, traitant différentes traces simultanément
Stratégie de hachage
Le processeur prend en charge deux algorithmes de hachage pour la sélection des partitions. Le choix dépend du nombre de partitions :
| Stratégie | Répartition de la charge | Performance | Idéal pour |
|---|---|---|---|
rendezvous (par défaut) | Équilibrage de charge supérieur | Rapide pour un maximum de 99 partitions | Déploiements standard (2-99 partitions) - meilleure répartition de la charge de travail pour les charges de travail de production typiques |
consistent | Bonne distribution | Maintient les performances avec plus de 100 partitions | Très grande échelle (plus de 100 partitions) - préserve les performances lorsque le rendez-vous devient lent |
Important
Key characteristics: Both strategies are deterministic - the same trace always maps to the same partition Rendezvous provides better load distribution but requeries more cpu with high number of partitions
Choisir la bonne stratégie:
- Rendezvous (default): Use for deployments with up to 100 partitions. Provides superior load distribution for the vast majority of production workloads.
- Consistent: Use when scaling to 100+ partitions where rendezvous becomes cpu intenside.
Prudence
Important: Changing the hashing algorithm when there's a cluster already running will cause fragmented traces, since traces might be routed to another partition after the change.
Paramètres de configuration des partitions
Utilisez partitions pour contrôler le nombre de shards logiques dont vous disposez et partition_workers pour définir le nombre de workers qui les traitent :
distributed_cache: partitions: 8 # Number of logical shards in Redis partition_workers: 8 # Number of workers processing partitionsComportement du worker :
- 8 partitions + 8 workers: Chaque worker traite une partition toutes les
evaluation_interval✅ Équilibré - 8 partitions + 16 workers: Chaque partition est évaluée deux fois par intervalle (redondant, gaspille des ressources)
- 8 partitions + 4 workers: Only half the partitions evaluated per interval (slower, but less Redis load)
Conseil
Conseil de réglage: Définir moins de workers par instance (partition_workers < partitions) réduit la pression sur Redis et le collecteur, ce qui est utile lors de l'exécution de nombreuses instances de collecteur.
Consignes de dimensionnement des partitions
| Scénario | Partitions | Workers de partition | Raisonnement |
|---|---|---|---|
| Développement | 2-4 | 2-4 | Faible surcharge, débogage facile |
| Production standard (15 000 spans/sec) | 4-12 | 4-12 | Balanced |
| Volume élevé (plus de 100 000 spans/sec) | 12-48 | 12-48 | Maximiser le débit |
Important
Règles de dimensionnement importantes :
partitionsshould be at least 2x 3x the number of Redis nodes needed for your average workloadpartition_workersdoit généralement être ≤partitions- La modification du nombre de partitions entraîne la perte des données existantes : les traces ne peuvent pas être localisées après la modification du nombre de partitions
Exemples de configuration de partition
Collecteur unique (machine à 4 cœurs) :
distributed_cache: partitions: 4 partition_workers: 4 partition_buffer_max_traces: 5000Multi-collecteur (3 instances, 8 cœurs chacune) :
distributed_cache: partitions: 12 # 3x more than single collector partition_workers: 6 # Each collector processes 6 partitions partition_buffer_max_traces: 10000Volume élevé (plus de 10 collecteurs) :
distributed_cache: partitions: 24 partition_workers: 4 # Fewer per collector to share load partition_buffer_max_traces: 20000Dimensionnement et performance
Prudence
Critical bottlenecks: Redis performance for tail sampling is primarily constrained by Network and CPU, not memory. Focus your sizing and optimization efforts on:
- Débit et latence du réseau entre les collecteurs et Redis
- CPU capacity: Redis CPU consumption
- Memory capacity: Typically sufficient if CPU and network are properly sized
Example: assume the following parameters
- Spans per second: assumes 10,000 spans/sec throughput
- Taille moyenne d'une portée: 900 octets
1. Network requirements
Calculs de la bande passante :
Pour 10 000 spans/sec à 900 octets par span :
- Trafic d'ingestion (collecteurs → Redis) :
10,000 × 900 bytes = 9 MB/sec = ~72 Mbps - Trafic d'évaluation (Redis → collecteurs):
~9 MB/sec = ~72 Mbps(lecture des traces pour l'évaluation) - Total bidirectionnel:
~18 MB/sec = ~144 Mbps
Avec une compression de 25 % (snappy/lz4) :
- Trafic compressé:
~108 Mbpsbidirectionnel
Network guidelines:
- Monitor Redis Network Usage: A typical redis instance can handle up to 1GBs, make sure to monitor the network usage
- Use compressiong: It reduces the number of network traffic in exchange for cpu usage in the collectors
- Co-localisé (même centre de données/VPC) : Les interfaces réseau de 1 Gbit/s suffisent pour la plupart des charges de travail
- Inter-région: Attendez-vous à une latence de 10 à 50 ms - augmentez les délais d'attente et utilisez la compression pour réduire la bande passante
- Connection pooling: Increase for higher throughput
- Use replicas: If the cluster has read replicas, they will we used by default. Reducing network and cpu usage on master nodes
2. CPU requirements
CPU guidelines:
Single Redis instance: Minimum 4 vCPUs
Redis cluster: 3+ nodes with read replicas with 4 vCPUs each for high troughtput.
Use replicas: If the cluster has read replicas, they will we used by default. Reducing network and cpu usage on master nodes
Conseil
Monitoring CPU: Watch for CPU saturation (more than 80% utilization) as the first indicator of scaling needs. If CPU-bound, either add cluster nodes
3. Exigences de mémoire
Bien que la mémoire soit moins contrainte que le processeur et le réseau, un dimensionnement approprié empêche les évictions et garantit la disponibilité des données.
formule d'estimation de la mémoire
Total Memory = (Trace Data) + (Decision Caches) + (Overhead)Stockage des données de trace
Les données de trace sont stockées dans Redis pour toute la période traces_ttl afin de prendre en charge les intervalles arrivant en retard et la récupération trace :
Stockage par étendue:
~900 bytes(protobuf sérialisé)Durée de stockage: Contrôlée par
traces_ttl(par défaut : 1 heure)Fenêtre de collecte active: Contrôlée par
trace_window_expiration(par défaut : 30 s)Formule:
Memory ≈ spans_per_second × traces_ttl × 900 bytesImportant
Fenêtre active vs. rétention complète: les traces sont collectées pendant une fenêtre active
~30-second(trace_window_expiration), mais persistent dans Redis pendant toute la période d'une heuretraces_ttl. Cela permet au processeur de gérer les segments arrivant en retard et de récupérer les traces orphelines. Le dimensionnement de votre instance Redis doit prendre en compte la période de rétention complète, et non seulement la fenêtre active.
Exemple de calcul: À 10 000 portées/seconde avec 1 heure traces_ttl:
10,000 spans/sec × 3600 sec × 900 bytes = 32.4 GBAvec la compression lz4 (nous avons observé une réduction de 25 %) :
32.4 GB × 0.75 = 24.3 GBRemarque : ce calcul représente le principal consommateur de mémoire. La mémoire Redis réellement utilisée peut être légèrement supérieure en raison des caches de décision et des structures de données internes.
Stockage du cache de décision
Lors de l'utilisation distributed_cache, les caches de décision sont stockés dans Redis sans limites de taille explicites. Au lieu de cela, Redis utilise sa politique d'éviction LRU native (configurée via maxmemory-policy) pour gérer la mémoire. Chaque identifiant de trace nécessite environ 50 octets de stockage :
Cache échantillonné: géré par l'éviction LRU de Redis
Cache non échantillonné: géré par l’éviction LRU de Redis
Surcharge typique par ID de trace:
~50 bytesConseil
Gestion de la mémoire: Configurez Redis avec
maxmemory-policy allkeys-lrupour permettre l'éviction automatique des anciennes entrées du cache de décision lorsque les limites de mémoire sont atteintes. Les clés du cache de décision utilisent une expiration basée sur TTL (contrôlée parcache_ttl) plutôt que des limites de taille fixes.
Frais généraux du traitement par lots
- File d'attente actuelle: Minimale (identifiants de trace + scores dans l'ensemble trié)
- Lots en vol:
max_traces_per_batch × average_spans_per_trace × 900 bytes
Exemple de calcul: 500 traces par lot (par défaut) avec 20 segments par trace en moyenne :
500 × 20 × 900 bytes = 9 MB per batchLa taille du lot influe sur l'utilisation de la mémoire pendant l'évaluation. La mémoire de traitement par lots en vol est temporaire et est supprimée une fois le traitement terminé.
Architecture de configuration par défaut
Les valeurs de configuration par défaut sont conçues pour un déploiement de référence prenant en charge 1 million de spans par minute (~16 000 spans/sec) :
Déploiement du collecteur :
- 3 instances de collecteur
- 4 vCPU par instance
- 8 Go de RAM par instance
Cluster Redis :
- 3 instances Redis (AWS cache.r6g.xlarge : 4 vCPU, 25,01 Gio de mémoire chacune)
- Configuré en tant que cluster pour une haute disponibilité et une répartition de la charge
- Co-localisé avec les collecteurs pour un accès à faible latence
Cette architecture de référence fournit un point de départ pour les déploiements en production. Ajustez-vous en fonction de vos exigences réelles en matière de débit et de latence.
Référence des métriques
Le processeur d'échantillonnage de queue émet les métriques suivantes en mode distribué Redis pour vous aider à monitorer les performances et à diagnostiquer les problèmes.
Métriques disponibles
| Nom métrique | Dimensions | Description | Cas d'utilisation |
|---|---|---|---|
otelcol_processor_tail_sampling_batches | partition, processor | Nombre d'opérations par lot | Monitorer le taux de traitement par lots entre les partitions |
otelcol_processor_tail_sampling_sampling_decision_timer_latency | partition, processor | Latence du minuteur de décision d'échantillonnage (ms) | Suivez les performances globales de l'évaluation par partition |
otelcol_processor_tail_sampling_sampling_policy_evaluation_error | partition, processor | Nombre d'erreurs d'évaluation de la politique | Détecter les problèmes de configuration des stratégies |
otelcol_processor_tail_sampling_count_traces_sampled | policy, decision, partition, processor | Nombre de traces échantillonnées/non échantillonnées par politique | Suivre les décisions d'échantillonnage par politique |
otelcol_processor_tail_sampling_count_spans_sampled | policy, decision, partition, processor | Nombre de spans échantillonnés/non échantillonnés par politique | Statistiques d'échantillonnage au niveau des spans |
otelcol_processor_tail_sampling_global_count_traces_sampled | decision, partition, processor | Nombre global de traces échantillonnées par au moins une politique | Monitoring global du taux d'échantillonnage |
otelcol_processor_tail_sampling_early_releases_from_cache_decision | sampled | Spans immédiatement libérés en raison d’un accès au cache | Efficacité du cache de décision |
otelcol_processor_tail_sampling_new_trace_id_received | partition, processor | Nombre de nouvelles traces reçues | Taux d'ingestion des traces par partition |
otelcol_processor_tail_sampling_new_span_received | partition, processor | Nombre de nouvelles spans reçues | Taux d'ingestion des spans par partition |
otelcol_processor_tail_sampling_traces_dropped | partition, processor | Traces supprimées en raison d’erreurs d’enregistrement | Détection et dépannage des erreurs |
otelcol_processor_tail_sampling_spans_dropped | partition, processor | Spans supprimés en raison d'erreurs d'enregistrement | Détection et dépannage des erreurs |
otelcol_processor_tail_sampling_count_traces_deleted | deleted, partition, processor | Nombre de traces supprimées du stockage | Monitoring du nettoyage |
Détails des dimensions
policy: Nom de la politique d'échantillonnage qui a pris la décisionsampled: Si la décision était d'échantillonner (true/false)decision: Le type de décision d'échantillonnage (sampled,not_sampled,dropped)deleted: Si la suppression a réussi (true/false)partition: Identifiant de partition (hachage encodé en hexadécimal, par exemple,{a1b2c3d4...}) - assure la compatibilité des balises de hachage du cluster Redisprocessor: identifiant d'instance de processeur (à partir de la configurationdistributed_cache.processor_name)
Conseil
Identificateurs de partition: Les valeurs de partition sont des hachages SHA256 déterministes de l'index de partition combinés au nom du processeur. Vérifiez les logs du collecteur au démarrage pour voir le mappage des indices de partition aux valeurs de hachage.
Exigences de cache compatibles avec Redis
Exigences de cache compatibles avec Redis
Le processeur utilise le cache comme stockage distribué pour les données trace suivantes :
- attribut trace et étendue
- Données trace actif
- Cache de décision d'échantillonnage
Le processeur exécute un script Lua pour interagir de manière atomique avec le cache Redis. La prise en charge script Lua est généralement activée par défaut dans les caches compatibles avec Redis. Aucune configuration supplémentaire n'est requise, sauf si vous avez explicitement désactivé cette fonctionnalité. Le processeur utilise le cache comme stockage distribué pour les données trace suivantes :
- attribut trace et étendue
- Données trace actif
- Cache de décision d'échantillonnage
Le processeur exécute un script Lua pour interagir de manière atomique avec le cache Redis. La prise en charge script Lua est généralement activée par défaut dans les caches compatibles avec Redis. Aucune configuration supplémentaire n'est requise, sauf si vous avez explicitement désactivé cette fonctionnalité.