Instrumentation

作者: spraysss | 来源:发表于2018-12-30 14:17 被阅读0次

    正如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

    • Import: 从 prometheus_client导入Counter

    • Definition: 定义hello_worlds_totalcounter 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
    

    相关文章

      网友评论

        本文标题:Instrumentation

        本文链接:https://www.haomeiwen.com/subject/zhxvlqtx.html