python promethues_Clientモジュールの詳細


1.紹介
promethues_Clientモジュールはオープンprometheusクライアントであり、監視指標をカスタマイズします.
2.インストール
pip install prometheus_client

3.prometheus clientを起動する方法
3.1 start_http_サーバメソッド
#---coding:utf-8

from prometheus_client import Gauge,start_http_server  
import random  
  
from prometheus_client import Gauge  
a = Gauge('a', 'Description of gauge')  
a.set(345)   #value    ,                
  
g = Gauge('g', 'Description of gauge',['mylabelname'])  
  
#       ,  Gague          ,       lablename,        
#  lable  value       ,mylablename        ,         ,     .  
  
start_http_server(8000)  
while True:  
      g.labels(mylabelname='ghost').set(random.random()) 

運転python client1.py、アクセス:http://127.0.0.1:8000
.....
python_info{implementation="CPython",major="2",minor="7",patchlevel="5",version="2.7.5"} 1.0
# HELP a Description of gauge
# TYPE a gauge
a 345.0
......
# TYPE g gauge
g{mylabelname="ghost"} 0.4350908628997736

3.2 Flask作成promtheus client
import prometheus_client
from prometheus_client import Counter
from flask import Response, Flask
app = Flask(__name__)
requests_total = Counter("request_count_xxx", "Total request cout of the host")
@app.route("/metrics")
def requests_count():
  requests_total.inc()
  # requests_total.inc(2)
  return Response(prometheus_client.generate_latest(requests_total),
          mimetype="text/plain")
@app.route('/')
def index():
  requests_total.inc()
  return "Welcome to China"
if __name__ == "__main__":
  app.run(host="0.0.0.0")

アクセスhttp://127.0.0.1:5000、戻る:
Welcome to China

アクセスhttp://127.0.0.1:5000metrics、戻る:
# HELP request_count_total Total request cout of the host
# TYPE request_count_total counter
request_count_xxx_total 2.0
# HELP request_count_created Total request cout of the host
# TYPE request_count_created gauge
request_count_xxx_created 1.594264948484944e+09

4. LABELS
labelsを使用してmetricの特徴を区別する
from prometheus_client import Counter
c = Counter('requests_total', 'HTTP requests total', ['method', 'clientip'])
c.labels('get', '127.0.0.1').inc()
c.labels('post', '192.168.0.1').inc(3)
c.labels(method="get", clientip="192.168.0.1").inc()

5. REGISTRY
from prometheus_client import Counter, Gauge
from prometheus_client.core import CollectorRegistry
REGISTRY = CollectorRegistry(auto_describe=False)
requests_total = Counter("request_count", "Total request cout of the host", registry=REGISTRY)
random_value = Gauge("random_value", "Random value of the request", registry=REGISTRY)

6. Metrics
Prometheus提供4種類タイプMetrics:Counter,Gauge,SummaryおよびHistogram定義4種類metrics例
metrics  , metrics  , metrics   label
c = Counter('cc', 'A counter')
g = Gauge('gg', 'A gauge')
h = Histogram('hh', 'A histogram', buckets=(-5, 0, 5))
s = Summary('ss', 'A summary', ['label1', 'label2'])  

6.1 Counter
常に加算されるカウンタは、減らしてはいけません.上記のコードを例にとると、複数回アクセスhttp://127.0.0.1:5000metricsrequest_count_xxx_totalが増加し続けている.定義には2つのパラメータが必要です.1つ目はmetricsの名前で、2つ目はmetricsの説明情報です.
c = Counter('cc', 'A counter')

その唯一の方法はincであり、増加だけを許可し、減少を許可しない.
 def inc(self, amount=1):
        '''Increment counter by the given amount.'''
        if amount < 0:
            raise ValueError('Counters can only be incremented by non-negative amounts.')
        self._value.inc(amount)

counterはアクセス総回数などを記録するのに適しており、promqlによってcounterの成長速度を計算することができ、すなわち類似のQPSの多くの指標を得ることができる.よびだし
# counter:      
c.inc()

出力metrics
# HELP cc_total A counter
# TYPE cc_total counter
cc_total 46.0
# TYPE cc_created gauge
cc_created 1.546424546634121e+09

説明:
  • HELPはccの注釈説明ですが、先ほど定義したときに指定しました.
  • TYPEはccがcounterであることを説明する.
  • ccというcounterがcc_に出力されるtotal;
  • cc_createdという出力のTYPEはgaugeタイプで、ccというmetricsの作成時間を記録しています.

  • 6.2 gauge
    gaugeは増減可能で、任意に設定でき、ある指標の現在の値を表すだけです.例えば、現在のCPU温度、メモリ使用量などを設定することができますが、これらは上下にフローティングされており、増減しないものではありません.
    定義:1つ目はmetricsの名前で、2つ目は説明です.
    g = Gauge('gg', 'A gauge')
    

    方法:
    def inc(self, amount=1):
          '''Increment gauge by the given amount.'''
          self._value.inc(amount)
    
    def dec(self, amount=1):
          '''Decrement gauge by the given amount.'''
          self._value.inc(-amount)
    
     def set(self, value):
          '''Set gauge to the given value.'''
          self._value.set(float(value))
    

    呼び出し:ランダム値を設定するたびに、任意の浮動小数点数を指定できます.
     # gauge:    
     g.set(random.random())
    

    出力metrics:
    # HELP gg A gauge
    # TYPE gg gauge
    gg 0.935768437404028
    

    6.3 histogram
    主にパーセンテージを統計するために使用されます.例えば、100件のアクセス要求に時間がかかり、それらを小さいものから大きいものに並べ替え、90番目の時間は200 msであるとすれば、90%の要求は200 ms未満と言える.これは「90ポイントは200 ms」と呼ばれ、サービスの基本的な品質を反映することができる.もちろん、91時間目が2000 msかもしれないので、これは言えません.
    実際のところ、私たちは毎日少なくとも数億ドルのアクセス量を持っていて、すべてのアクセスデータを保存することはできません.そして、90分位を見つけた時間をソートします.したがって,このような問題はすべていくつかの推定アルゴリズムを用いて処理され,すべてのデータを保存する必要はない.
    定義:
    h = Histogram('hh', 'A histogram', buckets=(-5, 0, 5))
    

    1つ目はmetricsの名前で、2つ目は説明で、3つ目はバケツ設定で、bucketsに重点を置いて話します.ここで(−5,0,5)は実際にいくつかのバケツに分けられる:<=−5,<=0,<=5,<=無限大である.方法:
    while True:
        # histogram:    ,        bucket  1   
        h.observe(random.randint(-5, 5))
    

    出力metrics:
    # HELP hh A histogram
    # TYPE hh histogram
    hh_bucket{le="-5.0"} 12.0
    hh_bucket{le="0.0"} 83.0
    hh_bucket{le="5.0"} 153.0
    hh_bucket{le="+Inf"} 153.0
    hh_count 153.0
    hh_sum -16.0
    # TYPE hh_created gauge
    hh_created 1.546499508889123e+09
    

    説明:
  • hh_sumはobserveの合計を記録した.
  • countはobserveの回数を記録している.
  • bucketはいろいろなバケツです.
  • leは<=ある値を表す.

  • 6.4 summary

    参考資料:https://prometheus.io/docs/practices/histograms/魚のブログhttps://www.jb51.net/article/148897.htm