Python 实现 Prometheus 自定义指标暴露

庆云2年前技术文章3122

虽然 Prometheus 已经拥有可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。然而,如果我们需要收集一些自定义指标项,还是需要我们编写程序去暴露相关接口(/metrics)。

1、Prometheus 数据类型

1.1 Counter

计数器表示一种单调递增的指标,除非发生重置的情况下下只增不减,其样本值应该是不断增大的。例如,可以使用 Counter 类型的指标来表示服务的请求数、已完成的任务数、错误发生的次数等。

1.2 Gauge

仪表盘类型代表一种样本数据可以任意变化的指标,即可增可减。它可以理解为状态的快照,Gauge 通常用于表示 CPU 或者内存使用率这种指标数据,也可以表示能随时增加或减少的“总数”,例如当前并发请求的数量、当前空闲内存的大小等。

1.3 Histogram

Histogram 是一个对数据分布情况的图形表示,由一系列高度不等的长条图(bar)或线段表示,用于展示单个测度得知的分布。它一般用横轴表示某个指标维度的数据取值区间,用纵轴表示样本统计的频率或频数,从而能够以二维图的形式展现数值的分布状况。

1.4 Summary

与 Histogram 类型类似,摘要类型用于表示一段时间内的数据采样的结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而非通过区间来计算。因此,对于分位数的计算,Summary 在通过 PromQL 进行查询时有更好的性能表现,而 Histogram 则会消耗更多的资源。反之,对于客户端而言,Histogram 消耗的资源更少。在选择这两种方式时,用户应该根据自己的实际场景选择。

2、代码实现 Prometheus 自定义指标

代码仓库:https://github.com/zhangyyhub/prom-custommonitor

本项目基于 Python 语言,prometheus_client.Counter 方法定义一个 Counter 自定义指标示例。当然你也可以基于 Gauge, Histogram, Summary 方法可自行实现对应的 Prometheus 指标类型:

  • Counter(计数器类型)

  • Gauge(仪表盘类型)

  • Histogram(直方图类型)

  • Summary(摘要类型)

2.1 环境依赖

  • python:3.7-slim-stretch

    • Flask 包

    • prometheus-client 包

2.2 代码实现

# -*- coding:utf-8 -*-

from flask import Flask, Response
from prometheus_client import Counter, generate_latest

app = Flask(__name__)
counter = Counter('my_counter', 'an example showed how to use counter')

@app.route('/metrics')
def hello():
    counter.inc(1)
    return Response(generate_latest(counter), mimetype='text/plain')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

2.3 构建镜像

FROM python:3.7-slim-stretch

# 拷贝代码
COPY requirements.txt main.py /opt/prom-metrics/

# 安装依赖
RUN mkdir -p /opt/prom-metrics && pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 暴露端口
EXPOSE 5000

# 运行程序
ENTRYPOINT python /opt/prom-metrics/main.py


3、阿里云 ACK-Prometheus 配置服务发现

容器服务控制台 -> 运维管理 -> Prometheus 监控 -> 跳转到 Prometheus 服务 -> 配置:

  • 默认服务发现

  • ServiceMonitor

  • PodMonitor

  • 自定义服务发现

3.1 服务发现

本次以 PodMonitor 为例,配置服务发现:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  #  填写一个唯一名称
  name: "dtstack-podmonitor"
  #  填写目标命名空间
  namespace: dtstack
#https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#podmonitorspec  
spec:
  selector:
    matchLabels:
    #  填写pod.yaml的Label字段的值以定位目标pod
      app: "dtstack"
  namespaceSelector:
    # https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#namespaceselector 
    any: true    
  podMetricsEndpoints:
  - interval: 30s
    #  填写pod.yaml中Prometheus Exporter对应的Port的Name字段的值
    port: "dtstack-monitor"
    #  填写Prometheus Exporter对应的Path的值
    path: /metrics

1.png

3.2 业务部署

创建业务容器(有 Prometheus 自定义指标暴露):

2.png

3.3 访问测试

3.png

3.4 查看指标

5.png


相关文章

oracle adg容灾切换需要注意的参数

1.DG角色在线转换1.1 角色(主备)和DG有关的角色:primary database 主库,在线服务应用physical standby database 备库,物理备库,在线备份主库数据与主库...

oracle 回退db补丁31718723报错ins_emagent.mk:113: warning: overriding recipe for target `nmosudo'

报错内容如下:ins_emagent.mk:113: warning: overriding recipe for target `nmosudo'原因:该补丁的readme有说明该报错如下图参考mo...

Keepalived 高可用解决方案

Keepalived 高可用解决方案

Keepalived 起初是为 LVS 设计的,专门用来监控集群系统中各个服务节点的状态,后来有加入 VRRP 的功能,VRRP 是 Virtual Router Redundancy protoco...

RAID磁盘阵列详解

RAID磁盘阵列详解

1 RAID原理无论是DAS、NAS还是SAN,都是存储系统,一个存储系统可以包含多块磁盘。不同磁盘之间的组织排列,就是磁盘阵列技术,也就是RAID技术。RAID磁盘阵列技术的核心思想主要有两个,包括...

EMR yarn集成Cgroup

EMR yarn集成Cgroup

CGroups(Control Groups)是Linux内核的一个资源隔离功能,限制/隔离/统计进程的资源使用,包括CPU/内存/磁盘IO/网络等资源。YARN中也集成了CGroups的功能,使得N...

Redis 运维规范_key 设计规范

Redis 运维规范_key 设计规范

一、key 设计规范1、设计合理的Key名称与长度Key名称:要见名知其意,方便快速定位问题及相关业务。key 名称要避免使用单双引号、转义字符等特殊符号。 key长度:在能完整描述业务的前提下尽量精...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。