Prometheus

Instrumentation

2018-12-30  本文已影响0人  spraysss

正如Prometheus概览中所提到的,app可以使用direct instrumentationclient library来使用prometheus,官方的客户端库支持Go, Python, Java, and Ruby.
以pathon3为例,假设python3已经安装好了,安装 prometheus_client

 pip install prometheus_client

Counter

Counter 代表事件发生次数的累加器

import http.server
from prometheus_client import Counter
REQUESTS = Counter('hello_worlds_total','Hello Worlds requested.')
class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        REQUESTS.inc()
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello World")
if __name__ == "__main__":
    #prometheus 采集端口
    start_http_server(8000)
    #http 服务端口
    server = http.server.HTTPServer(('localhost', 8001), MyHandler)
    server.serve_forever()

上面python代码 会在8000端口启动http 服务器,prometheus可以通过8001端口采集Metrics

以上demo使用prometheus由三部分构成import, metric definition, 和instrumentation

通过rate(hello_worlds_total[1m]) 查看请求频率

Gauge

Gauge 是某一当前状态的快照 比如当前时刻主机内存的使用,cup的使用情况

Gauge 有三种主要的方法可以使用inc, dec和set。与Counter的方法类似,inc和dec默认将一个Gauge 的值加一或者减一。
下面例子使用Gauge http 服务器跟踪正在进行处理的数量,并确定最后一次处理何时完成

import time
from prometheus_client import Gauge
INPROGRESS = Gauge('hello_worlds_inprogress','Number of Hello Worlds in progress.')
LAST = Gauge('hello_world_last_time_seconds','The last time a Hello World was served.')
class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        INPROGRESS.inc()
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello World")
        LAST.set(time.time())
        INPROGRESS.dec()

prometheus提供了decorator 可以直接很方便的完成上述功能

from prometheus_client import Gauge
INPROGRESS = Gauge('hello_worlds_inprogress','Number of Hello Worlds in progress.')
LAST = Gauge('hello_world_last_time_seconds','The last time a Hello World was served.')
class MyHandler(http.server.BaseHTTPRequestHandler):
    @INPROGRESS.track_inprogress()
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello World")
        LAST.set_to_current_time()

The Summary

import time
from prometheus_client import Summary
LATENCY = Summary('hello_world_latency_seconds',
'Time for a request Hello World.')
class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        start = time.time()
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello World")
        LATENCY.observe(time.time() - start)

生成的metrics有两个time series:hello_world_latency_seconds_count
hello_world_latency_seconds_sum

同样有对应的decorator方法
from prometheus_client import Summary
LATENCY = Summary('hello_world_latency_seconds',
'Time for a request Hello World.')
class MyHandler(http.server.BaseHTTPRequestHandler):
    @LATENCY.time()
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello World")

The Histogram

from prometheus_client import Histogram
LATENCY = Histogram('hello_world_latency_seconds',
'Time for a request Hello World.')
class MyHandler(http.server.BaseHTTPRequestHandler):
    @LATENCY.time()
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"Hello World")

查询95%分位置
histogram_quantile(0.95,rate(hello_world_latency_seconds_bucket[1m]))

默认bucket覆盖了从1毫秒到10秒的一系列延迟,这个时间区间比较适用于web应用

可以显示的定义桶区间

LATENCY = Histogram('hello_world_latency_seconds',
'Time for a request Hello World.',
buckets=[0.0001, 0.0002, 0.0005, 0.001, 0.01, 0.1])

可以定义线性区间和指数区间

buckets=[0.1 * x for x in range(1, 10)] # Linear
buckets=[0.1 * 2**x for x in range(1, 10)] # Exponential
上一篇下一篇

猜你喜欢

热点阅读