RousselTMLEARNING

Observabilité

Thanos Query et Query Frontend : une vue globale et dédupliquée

Configurer Thanos Query : endpoints StoreAPI, déduplication par replica label, partial response, interface web, API Prometheus compatible, Query Frontend et cache.

1. Thanos Query #

Le point d'entrée PromQL.

Lancer Query #

Thanos Query expose l'API HTTP de Prometheus : Grafana s'y connecte comme à un Prometheus classique. À chaque requête, il interroge en parallèle tous ses endpoints StoreAPI (sidecars, Store Gateway, Receive, autres Query) et fusionne les résultats.

thanos query \
  --http-address=0.0.0.0:10902 \
  --grpc-address=0.0.0.0:10903 \
  --endpoint=sidecar-a:10901 \
  --endpoint=sidecar-b:10901 \
  --endpoint=store:10901 \
  --query.replica-label=replica \
  --query.auto-downsampling
# Docker Compose (extrait)
  query:
    image: quay.io/thanos/thanos:latest
    command:
      - query
      - --http-address=0.0.0.0:10902
      - --endpoint=sidecar:10901
      - --endpoint=store:10901
      - --query.replica-label=replica
    ports: ["10902:10902"]

2. La déduplication #

Haute disponibilité sans doublons.

Replica label #

Déduplication par replica label
Le label replica est retiré pour comparer les séries.

Thanos Query traite comme équivalentes les séries qui ne diffèrent que par le --query.replica-label. Si l'une des deux a un trou (redémarrage, panne), l'autre le comble : c'est ce qui donne la haute disponibilité des données.

# Dans l'interface Query : activer/désactiver "Use Deduplication" et comparer
count(up{job="node"})                  # avec dédup : 1 série par instance
# sans dédup : 2 séries (replica=A et replica=B)

# Plusieurs labels de réplicas (par ex. Prometheus + Operator)
thanos query --query.replica-label=replica --query.replica-label=prometheus_replica

3. Exploiter l'interface et l'API #

Stores, requêtes et diagnostic.

Interface web et API #

# http://localhost:10902  ->  Graph, Stores (état de chaque endpoint), Alerts, Config

# API compatible Prometheus
curl -s 'http://localhost:10902/api/v1/query?query=up' | jq '.data.result | length'
curl -s 'http://localhost:10902/api/v1/stores' | jq '.data | keys'

# Réponse partielle autorisée si un store est indisponible (par défaut) ou refusée
curl -s 'http://localhost:10902/api/v1/query?query=up&partial_response=false'

# Choisir la résolution (downsampling) : max_source_resolution en ms
curl -s 'http://localhost:10902/api/v1/query_range?query=up&start=...&end=...&step=3600&max_source_resolution=3600000'
Erreur Courante : Une partial response peut masquer l'absence d'un cluster entier : surveillez la page Stores et alertez sur thanos_store_nodes_grpc_connections.

4. Query Frontend #

Cache et parallélisation.

Configuration #

thanos query-frontend \
  --http-address=0.0.0.0:9090 \
  --query-frontend.downstream-url=http://query:10902 \
  --query-range.split-interval=24h \
  --query-range.max-retries-per-request=5 \
  --query-frontend.log-queries-longer-than=5s \
  --query-range.response-cache-config-file=/etc/thanos/cache.yml
# cache.yml
type: IN-MEMORY
config:
  max_size: 512MB
  max_size_items: 0
  validity: 10m
Bonne Pratique : Faites pointer Grafana vers le Query Frontend (et non directement vers Query) : les requêtes de plage sont découpées par jour, exécutées en parallèle et mises en cache.

Articles liés

Thanos : étendre Prometheus (haute disponibilité, vue globale et rétention longue)

Comprendre pourquoi et comment utiliser Thanos : limites de Prometheus, composants (Sidecar, Query, Store Gat…

Thanos Sidecar : accoler Thanos à Prometheus et téléverser vers le stockage objet

Mettre en place Thanos Sidecar : réglages Prometheus (external labels, blocs de 2 h), configuration objstore,…

Thanos Store Gateway et Compactor : historique, downsampling et rétention

Servir l'historique avec le Store Gateway et optimiser le stockage avec le Compactor : compaction, downsampli…

Pour aller plus loin