正如Prometheus概览中所提到的,app可以使用direct instrumentation
和client 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
-
Import: 从
prometheus_client
导入Counter
-
Definition: 定义
hello_worlds_total
counter metrics -
instrumentation 调用
inc
方法将计数器的值增加1。Prometheus
客户端库会为你解决所有的细节问题,比如簿记和线程安全问题,所以这就是它的全部
通过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
网友评论