Comment fonctionne l'histogramme Prometheus?

Une traduction de l'article a été préparée avant le début du cours «Monitoring and Logging: Zabbix, Prometheus, ELK» .




Plus tôt, nous avons examiné un compteur , une jauge et un résumé . Parlons maintenant du fonctionnement de l'histogramme dans Prométhée.
L'histogramme présente quelques similitudes avec le résumé. Un histogramme est une combinaison de différents compteurs. Comme les métriques récapitulatives, les métriques d'histogramme sont utilisées pour suivre les indicateurs dimensionnels des événements, souvent leur durée, à l'aide de la méthode observe. Les outils de chronométrage sont généralement les mêmes que les bulletins. Ce qui les différencie, c'est le traitement des quantiles.

Voici un exemple de format d' étiquette Prometheus pour l'expositionhandler :

# HELP prometheus_http_request_duration_seconds Histogram of latencies for HTTP requests.
# TYPE prometheus_http_request_duration_seconds histogram
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.1"} 25547
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.2"} 26688
prometheus_http_request_duration_seconds_bucket{handler="/",le="0.4"} 27760
prometheus_http_request_duration_seconds_bucket{handler="/",le="1"} 28641
prometheus_http_request_duration_seconds_bucket{handler="/",le="3"} 28782
prometheus_http_request_duration_seconds_bucket{handler="/",le="8"} 28844
prometheus_http_request_duration_seconds_bucket{handler="/",le="20"} 28855
prometheus_http_request_duration_seconds_bucket{handler="/",le="60"} 28860
prometheus_http_request_duration_seconds_bucket{handler="/",le="120"} 28860
prometheus_http_request_duration_seconds_bucket{handler="/",le="+Inf"} 28860
prometheus_http_request_duration_seconds_sum{handler="/"} 1863.80491025699
prometheus_http_request_duration_seconds_count{handler="/"} 28860

_sumet ils _countfonctionnent exactement de la même manière que pour le résumé, et peuvent être utilisés pour obtenir le temps d'exécution moyen au cours des cinq dernières minutes:

 rate(prometheus_http_request_duration_seconds_sum[5m]
/
  rate(prometheus_http_request_duration_seconds_count[5m])

Cependant, il existe de très rares cas où il est _sumabsent, par exemple, dans certaines mesures de l'exportateur MySQLd.

Une partie notable de l'histogramme est la série chronologique _bucket, qui est en fait la partie histogramme de la métrique. Plus précisément, ce sont des compteurs qui forment un histogramme cumulatif. ledénoter inférieur ou égal à. Ainsi, 26688 demandes ont pris moins ou égal à 200 ms, 27 760 demandes ont pris moins ou égal à 400 ms, et il y avait 28860 demandes au total. Les valeurs dans le compartiment seront monotones non décroissantes et le +Infcompartiment aura la plus grande valeur. +Infle compartiment doit toujours être présent et correspondre à la valeur _count.

Pour calculer, disons, un quantile de 0,9 (le 90e centile), vous devez utiliser:

histogram_quantile(0.9, 
  rate(prometheus_http_request_duration_seconds_bucket[5m])
)

Un gros avantage des histogrammes sur les résumés est que vous pouvez agréger des seaux avant de calculer le quantile - en prenant soin de ne pas perdre l'étiquette le:

histogram_quantile(0.9, 
  sum without (handler)(
    rate(prometheus_http_request_duration_seconds_bucket[5m])
  )
)

En plus de l'agrégation, les histogrammes sont moins chers pour le client, car les compteurs sont rapidement incrémentés. Alors pourquoi ne pas toujours utiliser des histogrammes? Il y a une longue réponse, mais la version courte est qu'avec les histogrammes, vous devez d'abord sélectionner votre compartiment, et les coûts sont transférés du client à Prometheus lui-même en raison du nombre d'éléments du compartiment. Par défaut, dix compartiments couvrent un service Web typique avec un délai allant de quelques millisecondes à une seconde, et dans certains cas, vous devrez peut-être changer cela. Ici, par exemple, ils ont été redéfinis pour mieux suivre les requêtes PromQL, qui par défaut ont un délai de deux minutes. Avoir plus d'une douzaine de seaux donnera des résultats plus précis, mais peut également produire de nombreuses séries chronologiques. Surtout en combinaison avec d'autres balises.

Lorsque vous utilisez un système de surveillance en temps réel tel que Prometheus, l'objectif doit être de fournir une valeur analytique suffisante pour prendre des décisions d'ingénierie basées sur celui-ci. Par exemple, savoir que le retard du 90e centile a augmenté de 50 ms est plus important que de savoir s'il est maintenant de 562 ms ou 563 ms, et généralement dix tranches suffisent pour cela. Si vous avez besoin d'une réponse exacte, vous pouvez toujours la calculer ultérieurement à partir de vos journaux. S'il y a trop de compartiments, ils peuvent être supprimés pendant le traitement des données, comme indiqué précédemment . Dans les cas les plus extrêmes, vous pouvez ignorer complètement la série de _buckets et vous fier à la moyenne de _sumet _count.

En conclusion, les histogrammes permettent de calculer des quantiles agrégés, bien que le nombre d'éléments doive être pris en compte. N'oubliez pas qu'un résumé sans quantiles est une option moins chère si vous n'avez pas besoin d'histogramme.



En savoir plus sur le cours



All Articles