Prometheus01 Prometheus基础, 部署与配置, Node Exporter, Pushgateway, PromQL 运算

云原生监控系统 Prometheus

1 Prometheus 介绍

1.2 监控内容和方法

1.2.2 监控方法

 
Google的四个黄金指标
1.延迟(Latency)
服务请求所需要的时长,例如HTTP请求平均延迟
2.流量(Traffic),也称为吞吐量
3.错误(Errors)
4.饱和度(Saturation)
资源的整体利用率,包括CPU(容量、配额、节流)、内存(容量、分配)、存储(容量、分配和 I/O
吞吐量)和网络

1.4 时序数据库

Prometheus用的数据库是时序数据库, 其本身也是时序数据库

1.4.2 时间序列数据特点

1.大部分时间都是顺序写入操作,很少涉及修改数据
删除操作都是删除一段时间的数据,而不涉及到删除无规律数据
读操作一般都是升序或者降序
2.高效的压缩算法,节省存储空间,有效降低 IO,存储成本低
TSDB 使用高效的数据压缩技术,将单个数据点的平均使用存储空间降为1~2个字节,可以降低
90%存储使用空间,同时加快数据写入的速度。
3.高性能读写, 每秒百万级数据点写入,亿级数据点聚合结果秒级返回

所以Prometheus比zabbix性能好很多。zabbix最大的性能瓶颈在于用mysql数据库

1.5 Prometheus 简介

1.5.1 Prometheus 简介

Prometheus 是一款时序(time series)数据库TSDB, 其本身可以被作为时序数据库使用

Prometheus是云原生基金会的第二大产品,第一为K8S

云原生: https://landscape.cncf.io/

Prometheus 不足

不支持集群化
被监控集群规模过大后本身性能有一定瓶颈
中文支持不好

1.5.2 Prometheus 架构

1.5.2.1 数据获取逻辑

Prometheus只支持拉取客户端数据(zabbix支持客户端主动和被动模式)

1.5.2.2 Prometheus 架构

 一般情况下,为了节约成本,Prometheus和这些组件会装在同一台机器上

1.5.2.4 生态组件

Prometheus 只负责时序型指标数据的采集及存储
其它的功能,如: 数据的分析、聚合及直观展示以及告警等功能并非由Prometheus Server所负责,需要配合其它组件实现
支持丰富的 Exporter 实现各种应用的监控(每个服务都有对应exporter,如redis,mysql)
#本质上把对应数据转换成Prometheus要求的数据格式
https://prometheus.io/docs/instrumenting/exporters/

1.5.3 Prometheus 数据模型

1.5.3.1 Metric 名字

指标Metric,用于表示 metric 的一般性功能,例如:http_requests_total 表示 http 请求的总数

1.5.3.2 标签

描述了上面的指标Metric是哪个资源的

1.5.3.3 数据格式

文本内容,如果以 # 开头通常表示注释。# HELP 开头表示 metric 帮助说明。# TYPE 开头表示定义 metric 类型,包含 counter, gauge, histogram, summary, 和 untyped 类型。

1.5.3.4 任务 Job 和实例 Instance

job相当于分组,把几个实例instance分到一个组里

1.5.4 Prometheus 数据处理

1.5.4.1 数据获取

Prometheus通过http协议拉取(zabbix通过agent自己的协议)
3种方式:
1.Instrumentation    服务提供数据的http接口式,常用于较新出现的自身天然就支持Prometheus的应用
2.Exporters    部署到对应节点上,采集和聚合原始格式的数据,并转换为Prometheus格式的指标,以http方式向外暴露本地节点数据后,
         常用于较早期出现的原本并不支持Prometheus的应用
3.Pushgateway 有些服务没提供exporter,服务把主动Push数据到Pushgateway,然后Prometheus再pull 此数据

1.5.4.2 数据存储

1.5.4.3 数据分析

1.5.4.4 数据告警

2 Prometheus 部署和监控

2.1 Prometheus 部署和配置

2.1.2 包安装

2.1.2.1 Ubuntu 包安装

#ubuntu22.04
[root@ubuntu2204 ~]#apt list prometheus
正在列表... 完成
prometheus/jammy 2.31.2+ds1-1ubuntu1 amd64

#安装时内嵌了node exporter
[root@ubuntu2204 ~]#apt -y install prometheus
[root@ubuntu2204 ~]#ss -ntlp|grep prometheus
LISTEN 0      4096               *:9090           *:*   users:(("prometheus",pid=2969,fd=4))
LISTEN 0      4096               *:9100           *:*   users:(("prometheus-node",pid=2195,fd=3))

#由专门的用户账号启动
[root@ubuntu2204 ~]#ps aux|grep prometheus
prometh+    2195  0.3  1.0 1087388 20124 ?       Ssl  09:38   0:01 /usr/bin/prometheus-node-exporter
prometh+    2969  0.1  2.7 1340308 55168 ?       Ssl  09:38   0:00 /usr/bin/prometheus

#访问如下链接可以看到如下显示
http://<prometheus服务器IP>:9090 
#首页搜索框输入up,表示启动监控项,1表示已启动

2.1.2.2 RHEL/Rocky/CentOS

#RHEL/Rocky/CentOS上默认没有Prometheus的仓库,可自行配置基于yum repository安装 Prometheus-Server
https://packagecloud.io/app/prometheus-rpm/release/search
#范例:Repo配置 (国外的源,安装的是最新版)
[prometheus]
name=prometheus
baseurl=https://packagecloud.io/prometheus-rpm/release/el/$releasever/$basearch
repo_gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/prometheus-rpm/release/gpgkey
       https://raw.githubusercontent.com/lest/prometheus-rpm/master/RPM-GPG-KEY-prometheus-rpm
gpgcheck=1
metadata_expire=300

2.1.3 二进制安装 Prometheus

2.1.3.1 下载二进制包并解压

#官方下载: 
https://prometheus.io/download/
https://github.com/prometheus/prometheus/releases
#生产建议安装LTS版本 (darwin是苹果系统)

#这里下载prometheus-2.50.1.linux-amd64.tar.gz
[root@prometheus ~]#tar xf prometheus-2.50.1.linux-amd64.tar.gz -C /usr/local/
[root@prometheus ~]#cd /usr/local/
[root@prometheus local]#ln -s prometheus-2.50.1.linux-amd64/ prometheus
[root@prometheus local]#cd prometheus/    #里面文件比较乱,下面创建文件夹进行整理(不整理也没事)

#创建相关目录,data目录是默认的存放数据目录,可以不创建,系统会自动创建,可以通过选项--storage.tsdb.path="data/"修改
[root@prometheus prometheus]#mkdir bin conf data
[root@prometheus prometheus]#mv prometheus promtool bin/ 
[root@prometheus prometheus]#mv prometheus.yml conf/
[root@prometheus prometheus]#useradd -r -s /sbin/nologin prometheus
#结尾要加/,否则只是给软链接加权限,不知道里面是目录
[root@prometheus prometheus]#chown -R prometheus.prometheus /usr/local/prometheus/

#修改环境变量(方便调用程序)
[root@prometheus ~]#vim /etc/profile
export PROMETHEUS_HOME=/usr/local/prometheus
export PATH=${PROMETHEUS_HOME}/bin:$PATH

[root@prometheus ~]#source /etc/profile

#实际上这时候已经可以启动了(指定配置),但是用的是root,后面通过service启动
[root@prometheus ~]#prometheus --config.file=/usr/local/prometheus/conf/prometheus.yml
#登录,在status下targets可以看到Prometheus项目
http://10.0.0.151:9090/
#首页搜索框输入up,表示启动监控项,1表示已启动(可以graph图形输出,use local time使用本地时间)
#提供指标地址
http://10.0.0.151:9090/metrics    

2.1.3.2 创建 service 文件

[root@prometheus ~]#vim /lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target

[Service]
Restart=on-failure
User=prometheus
Group=prometheus
WorkingDirectory=/usr/local/prometheus/
ExecStart=/usr/local/prometheus/bin/prometheus --config.file=/usr/local/prometheus/conf/prometheus.yml --web.enable-lifecycle
ExecReload=/bin/kill -HUP \$MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

[root@prometheus ~]#systemctl daemon-reload
[root@prometheus ~]#systemctl enable --now prometheus.service 

#数据库路径默认放在[root@prometheus ~]#ll /usr/local/prometheus/data/ (没有就自动创建,可以通过参数修改)

2.1.3.5 API 访问 (了解)

#健康检查
[root@ubuntu2204 ~]#curl http://127.0.0.1:9090/-/healthy
Prometheus Server is Healthy.
[root@prometheus ~]#echo $?    #为0说明是正常的
0
#查案是否处于就绪状态
[root@ubuntu2204 ~]#curl http://127.0.0.1:9090/-/ready
Prometheus Server is Ready.

#修改配置后可以加载服务而无需重启服务(也可用 systemctl reload prometheus.service)
[root@ubuntu2204 ~]#curl -X POST http://127.0.0.1:9090/-/reload

#关闭服务
[root@ubuntu2204 ~]#curl -X POST http://127.0.0.1:9090/-/quit

#取消--web.enable-lifecycle选项,关闭API中的Load和quit功能,仍然支持healthy和ready(更安全些)
[root@ubuntu2204 ~]#vim /lib/systemd/system/prometheus.service
......
[Service]
ExecStart=/usr/local/prometheus/bin/prometheus --config.file=/usr/local/prometheus/conf/prometheus.yml
......

2.1.3.6 优化配置

[root@prometheus ~]#/usr/local/prometheus/bin/prometheus --help
.......
--web.enable-lifecycle #可以支持http方式实现reload和shutdown功能,可以被远程关毕服务,有安全风险,不建议开启,默认关闭
--web.read-timeout=5m  #Maximum duration before timing out read of the request, and closing idle connections. 请求连接的最⼤等待时间,
              可以防⽌太多的空闲连接占⽤资源
--web.max-connections=512 #Maximum number of simultaneous connections. 最⼤链接数 --storage.tsdb.retention=15d #How long to retain samples in the storage.prometheus开始采集监控数据后 会存在内存中和硬盘中对于保留期限的设置,
                  太长硬盘和内存都吃不消,太短要查历史数据就没有了,企业中设置15天为宜,默认值为0
--storage.tsdb.path="data/" #Base path for metrics storage. 存储数据路径,建议独立分区,防止把根⽬录塞满,默认data/目录 --query.timeout=2m #Maximum time a query may take before being aborted.此为默认值2m --query.max-concurrency=20 #Maximum number of queries executed concurrently.此为默认值20

2.1.4 容器化启动

#简单启动
[root@prometheus ~]#docker run -d --name prometheus -p 9090:9090 prom/prometheus
#定制配置文件启动,默认容器的配置文件路径/etc/prometheus/prometheus.yml
[root@prometheus ~]#docker run -d --add-host "prometheus.wang.org:10.0.0.201" --name=prometheus -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --web.enable-lifecycle

#定制启动
[root@prometheus ~]#docker run -d --add-host "prometheus.wang.org:10.0.0.201" --name=prometheus -p 9090:9090 -v /root/prometheus.yml:/prometheus-config/prometheus.yml prom/prometheus --web.enable-lifecycle --config.file=/prometheus-config/prometheus.yml

#浏览器访问:http://prometheus服务器:9090/

2.1.5 配置文件说明

Prometheus可以通过命令行或者配置文件的方式对服务进行配置。
1.命令行方式一般用于不可变的系统参数配置,例如存储位置、要保留在磁盘和内存中的数据量等;
配置文件用于定义与数据动态获取相关的配置选项和文件等内容。
命令行方式的配置属性可以通过 prometheus -h 的方式来获取,这些配置属性主要在服务启动时
候设置.
2.配置文件方式,需要在prometheus.yml 文件中修改配置属性,该配置文件的内容是以YAML格式
编写的。

默认情况下,Prometheus 的配置文件有四部分组成:
#核心配置:
global #全局配置内容
    scrape_interval:     15s #抓取时间间隔
     evaluation_interval: 15s #计算数据时间间隔(如:磁盘空间利用率,内存空间利用率)
     #scrape_timeout    #采集超时时间
alerting #触发告警相关的配置,主要是与Alertmanager相关的设置。
rule_files #各种各样的外置规则文件配置,包含了各种告警表达式、数据查询表达式等
scrape_configs #监控项的配置列表,这是最核心的配置

2.2 Node Exporter 安装

安装 Node Exporter 用于收集各 node 主机节点上的监控指标数据(系统参数),监听端口为9100

如果是包安装Prometheus, node exporter也会被安装。下面展示二进制安装

#github 链接
https://github.com/prometheus/node_exporter
#官方下载: (只列出最新版,实际还是跳转到github地址上)
https://prometheus.io/download/

2.2.1 下载并解压

在需要监控的所有节点主机上进行安装

[root@node1 ~]#wget -P /usr/local/ 
https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz 

[root@node1 ~]#cd /usr/local
[root@node1 local]#tar xvf node_exporter-1.2.2.linux-amd64.tar.gz 
[root@node1 local]#ln -s node_exporter-1.2.2.linux-amd64 node_exporter
[root@node1 local]#cd node_exporter
[root@node1 node_exporter]#mkdir bin
[root@node1 node_exporter]#mv node_exporter bin/

[root@node1 ~]#useradd -r -s /sbin/nologin prometheus 
[root@node1 ~]#chown -R prometheus.prometheus /usr/local/node_exporter/

2.2.2 准备 service 文件

[root@node1 ~]#vim /lib/systemd/system/node_exporter.service
[root@node1 ~]#cat /lib/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/node_exporter/bin/node_exporter --collector.zoneinfo
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
User=prometheus
Group=prometheus

[Install]
WantedBy=multi-user.target

#node_exporter还有其他监控项,如果需要,在service的启动命令后面追加对应参数

2.2.3 启动 Node Exporter 服务

[root@node1 ~]#systemctl daemon-reload
[root@node1 ~]#systemctl enable --now node_exporter.service 
[root@node1 ~]#systemctl is-active node_exporter
active

#默认监听9100/tcp端口
[root@node1 ~]#ss -ntlp|grep node_exporter
LISTEN   0         128                       *:9100                   *:*       
users:(("node_exporter",pid=33761,fd=3)) 

2.2.4 访问 Node Exporter Web 界面

#浏览器访问
http://node1.wang.org:9100/
#参数指标路径
10.0.0.152:9100/metrics

2.3 Prometheus 采集 Node Exporter 数据

配置 prometheus 通过 node exporter 组件采集node节点的监控指标数据

prometheus自己所在服务器也可以装下,监控自己的系统参数

#追加job
[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml 
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node_exporter"
    static_configs:
      #前面http,后面/metrics是默认值,可以不写
      #metrics_path: /xxx    #如果不是默认路径需要加上这一行
      #scheme: https    #如果不是默认值,需要加上这一行
      - targets: ["10.0.0.151:9100","10.0.0.152:9100","10.0.0.153:9100","10.0.0.154:9100"]    

#检查语法
[root@prometheus ~]#promtool check config /usr/local/prometheus/conf/prometheus.yml
#生效
[root@prometheus ~]#systemctl reload prometheus.service

#在Prometheus页面上方status下targets可以看到增加的job和实例
http://10.0.0.151:9090/
#首页搜up,会出现所有实例对应的值,点击add panel可以增加监控参数
#内存总数: node_memory_MemTotal_bytes, 剩余内存: node_memory_MemFree_bytes
#在搜索框输入 node_memory_MemFree_bytes/node_memory_MemTotal_bytes * 100, 表示剩余内存率

2.4 Grafana 展示 Prometheus 数据

2.4.2 Grafana 部署

2.4.2.1 基于包安装

#安装软件
[root@grafana ~]#wget https://dl.grafana.com/enterprise/release/grafana-enterprise_8.2.1_amd64.deb
#从国内镜站下载
[root@grafana ~]#wget https://mirrors.tuna.tsinghua.edu.cn/grafana/apt/pool/main/g/grafana/grafana_10.4.0_amd64.deb

[root@grafana ~]#apt update
#注意:安装的是本地文件,所以要加文件路径
[root@grafana ~]#apt install -y ./grafana_10.4.0_amd64.deb
#如果安装失败,解决依赖关系
[root@grafana ~]#apt -y --fix-broken install

#启动
[root@prometheus ~]#systemctl enable --now grafana-server.service
[root@prometheus ~]#ss -lntp
State  Recv-Q Send-Q  Local Address:Port   Peer Address:Port Process     
LISTEN 0      4096               *:3000            *:*    users:(("grafana",pid=33653,fd=11))   

#登录,默认用户名/密码 admin
http://10.0.0.151:3000/

2.4.3 配置 Prometheus 数据源

2.4.3.2 添加 Prometheus 的数据源

 1.添加数据源DATA SOURCES: 点击 "Add your first data source"
 或者在左侧连接下add new connection, 找到Prometheus,点击右侧add new data source
 2.connection处,填写prometheus服务地址  http://10.0.0.151:9090/
 3.验证,这里不用做任何验证,不用管
 4.拉到最下面,点sve&test
 5.拉到最上面,settings旁dashboards仪表板,可导入3个模板(左侧dashboards进去看看哪个好用,有些有兼容性问题)
 
#注:因没将grafana纳入到prometheus监控的target,所以grafana无法展示prometheus监控的grafana数据
#只要将grafana地址 10.0.0.151:3000/metrics 加入prometheus的配置文件即可实现下图的正常显示

2.4.4 导入指定模板展示 Node Exporter 数据

上面内置的模板不太理想,导入指定的网络上比较合适的 Dashboard 模板

2.4.4.1 登录 Grafana 官网查找模板

https://grafana.com/grafana/dashboards/
#可以通过左侧选项进行筛选,点击想要的模板,复制有下角ID,这里选1860
#左侧点击dashboards,点击右侧new下面import,输入id,点击load(它会从网上下载模板,如果慢可以刷新页面再load下)
#名称后面加上-1860,以防以后忘记id,下面Prometheus栏选择数据源,点击import
#这个模板右上角有host,可以选择主机

2.4.4.2 导入指定模板

这里推荐node模板: 8919(中文),1860,11074,13978模板

2.5 监控 Grafana

Grafana 内置了支持Prometheus监控接口

2.5.1 配置 Prometheus 监控 Grafana

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml
.....
  - job_name: 'grafana'   #添加以下行,指定监控的grafan节点
    static_configs:
    - targets: ['10.0.0.151:3000']    #grafana默认/metrics所以可以不写
......
[root@prometheus ~]#systemctl reload prometheus
#现在grafana上可以看到Prometheus监控grafana的指标了

2.6 监控 Zookeeper

内置了支持Prometheus监控接口

2.6.1 安装和配置 Zookeeper

#安装zookeeper
[root@ubuntu ~]#bash install_zookeeper_single_node.sh

#zookeeper内置prometheus的配置
[root@ubuntu2204 ~]#tail /usr/local/zookeeper/conf/zoo_sample.cfg
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true 

#修改配置支持prometheus
[root@node3 ~]#vim /usr/local/zookeeper/conf/zoo.cfg 
#在最后面加下面行,默认带有下面只需要取消注释即可
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpHost=0.0.0.0
metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true #true为默认值
[root@node3 ~]#systemctl restart zookeeper.service

#浏览器访问:http://10.0.0.152:7000/metrics

2.6.2 修改 Prometheus 配置

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml 
#在最后面加下面三行
  - job_name: 'zookeeper'
    static_configs:
    - targets: ['10.0.0.152:7000']
[root@prometheus ~]#systemctl reload prometheus.service 

2.6.4 查看 Grafana 监控数据

访问下面地址,搜索zookeeper,在grafana导入zookeeper监控模板
https://grafana.com/grafana/dashboards/
#这里用10465,在上方cluster选zookeeper就出现数据了

2.7 Pushgateway 采集自定义数据

2.7.1 Pushgateway 介绍

Pushgateway 是一项中介服务,允许您从无法抓取的作业中推送指标
虽然有很多的Exporter提供了丰富的数据,但生产环境中仍需要采集用户自定义的数据,可以利用Pushgateway实现
Pushgateway是可以单独运⾏在 任何节点上的插件,并不⼀定要在被监控客户端
⽤户⾃定义的脚本或程序将需要监控的数据推送给 Pushgateway,然后prometheus server再向pushgateway拉取数据
Pushgateway 缺点
1.Pushgateway 会形成⼀个单点瓶颈,假如好多个应用同时发送给⼀个pushgateway的进程,如果这
个进程有故障,那么监控数据也就无法获取了
2.将失去 Prometheus 通过 up指标(每次抓取时生成)的自动实例运行状况监控。
3.Pushgateway 永远不会删除推送给它的数据,并将它们永远暴露给 Prometheus,除非这些系列
通过 Pushgateway 的 API 手动删除。
4.Pushgateway 并不能对发送过来的数据进⾏更智能的判断,假如脚本中间采集出问题,那么有问题的
数据 pushgateway⼀样照单全收发送给prometheus

2.7.2 安装 Pushgateway

小公司Pushgateway和Prometheus装在一台机器上,大公司分开装

https://prometheus.io/download/
https://github.com/prometheus/pushgateway/releases

[root@prometheus ~]#wget https://github.com/prometheus/pushgateway/releases/download/v1.4.3/pushgateway-1.4.3.linux-amd64.tar.gz
[root@prometheus ~]#tar xf pushgateway-1.4.3.linux-amd64.tar.gz -C /usr/local/
[root@prometheus ~]#ln -s pushgateway-1.4.3.linux-amd64/ pushgateway
[root@prometheus ~]#ls /usr/local/pushgateway
LICENSE NOTICE pushgateway
[root@prometheus ~]#mkdir /usr/local/pushgateway/bin
[root@prometheus ~]#mv /usr/local/pushgateway/pushgateway /usr/local/pushgateway/bin
[root@prometheus ~]#useradd -r -s /sbin/nologin prometheus
[root@prometheus ~]#ldd /usr/local/pushgateway/bin/pushgateway 
 不是动态可执行文件
[root@prometheus ~]#ln -s /usr/local/pushgateway/bin/pushgateway /usr/local/bin/

#前台启动
[root@prometheus ~]#pushgateway

#准备service文件
[root@prometheus ~]#cat > /lib/systemd/system/pushgateway.service <<EOF
[Unit]
Description=Prometheus Pushgateway
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/pushgateway/bin/pushgateway
#ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
User=prometheus
Group=prometheus

[Install]
WantedBy=multi-user.target
EOF

#启动服务
[root@prometheus ~]#systemctl daemon-reload
[root@prometheus ~]#systemctl enable --now pushgateway.service

#浏览器访问
http://10.0.0.151:9091/
http://10.0.0.151:9091/metrics

2.7.3 配置 Prometheus 收集 Pushgateway 数据

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml
  - job_name: "pushgateway"
    static_configs:
      - targets: #可以写在同一行,比如:["10.0.0.151:9091"]
        - "10.0.0.151:9091"
        
[root@prometheus ~]#systemctl reload prometheus.service

2.7.4 配置客户端发送数据给 Pushgateway

#curl --data-binary 提交二进制数据   @-读取前面标准输入重定向
echo "some_metric 3.14" | curl --data-binary @- http://10.0.0.151:9091/metrics/job/some_job

#在Pushgateway网页http://10.0.0.151:9091/,能看到刚刚发出的对应job:some_job
#在Prometheus网页http://10.0.0.151:9090/,能搜到some_metric(exported_jobs是some_job,job是pushgateway)

#下面传输中追加类型和描述,在some_job下指定一个实例
cat <<EOF | curl --data-binary @- http://10.0.0.151:9091/metrics/job/some_job/instance/some_instance
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF

#数据不想要了,可以清理掉 (下面把some_instance实例删了)
curl -X DELETE http://10.0.0.151:9091/metrics/job/some_job/instance/some_instance

下面使用通用脚本发送给Pushgateway

#编写自定义的metric的脚本
[root@ubuntu2004 ~]#vim pushgateway_metric.sh
#!/bin/bash
#
#********************************************************************
#Author:           wangxiaochun
#QQ:               29308620
#Date:             2022-08-08
#FileName:         pushgateway_metric.sh
#URL:               http://www.wangxiaochun.com
#Description:       The test script
#Copyright (C):     2022 All rights reserved
#********************************************************************

METRIC_NAME=login_number
METRIC_VALUE_CMD="who | wc -l"
METRIC_TYPE=gauge
METRIC_HELP="login use number"
#METRIC_NAME=mem_free
#METRIC_VALUE_CMD="free -b | awk 'NR==2{print \$4}'"
#METRIC_TYPE=gauge
#METRIC_HELP="free memory"

PUSHGATEWAY_HOST=pushgateway.wang.org:9091
EXPORTED_JOB=pushgateway_job
INSTANCE=`hostname -I|awk '{print $1}'`
SLEEP_TIME=1

CURL_URL="curl --data-binary @- 
http://${PUSHGATEWAY_HOST}/metrics/job/${EXPORTED_JOB}/instance/${INSTANCE}"

push_metric() {
    while true ;do
        VALUE=`eval "$METRIC_VALUE_CMD"`
        cat <<EOF |  $CURL_URL
# HELP ${METRIC_NAME} ${METRIC_HELP}
# TYPE ${METRIC_NAME} ${METRIC_TYPE}
${METRIC_NAME} ${VALUE}
EOF
        sleep $SLEEP_TIME
    done
}

push_metric

[root@ubuntu2004 ~]#bash pushgateway_metric.sh
#Prometheus可以看到抓取的数据

3 PromQL

3.1 指标数据

3.1.2 数据模型

Prometheus中,每个时间序列都由指标名称(Metric Name)和标签(Label)来唯一标识
Metric Name的表示方式有下面两种:
<metric name>{<label name>=<label value>, …}    #推荐用这一种
{__name__="metric name",<label name>=<label value>, …} #通常用于Prometheus内部

例:
up{instance = "10.0.0.152:9100"}

3.2 PromQL 基础

3.2.1 PromQL简介

Prometheus 提供一个内置的函数式的表达式语言PromQL(Prometheus Query Language),可以帮助 用户实现实时地查找和聚合时间序列数据。

3.2.4 数据选择器

#偏移为从现在往前偏移多少为时间起始点,时间范围:从时间起始点往前多少的时间范围
metrics_name{筛选label=值,...}[<时间范围>] offset <偏移>

#查从现在到前1分钟的数据
node_memory_MemFree_bytes{instance="10.0.0.151:9100",job="node_exporter"}[1m]
#前面1分钟,再之前2分钟内的采样数据
node_memory_MemFree_bytes{instance="10.0.0.151:9100",job="node_exporter"}[2m] offset 1m

3.2.4.1 即时向量选择器 Instant Vector Selector

匹配器 Matcher 使用规则

匹配器用于定义标签过滤条件,目前支持如下4种匹配操作符

=  #精确匹配
!= #不匹配
=~ #正则匹配,全部匹配,而非包含
!~ #正则不匹配

#不要10.0.0.151:9100实例的
node_memory_MemFree_bytes{instance!="10.0.0.151:9100",job="node_exporter"}[2m] offset 1m
#=~必须完整匹配
node_memory_MemFree_bytes{instance=~"10.0.0.*",job="node_exporter"}[2m] offset 1m

3.2.4.2 范围选择器 Range Vector Selector

在[]内部可以采用多个单位表示不同的时间范围,比如s(秒)、m(分)、h(时)、d(日)、w(周)、y(年)

必须使用整数时间单位,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序

例如:1h30m,但不能使用1.5h

3.2.5 指标类型

类型解析
Counter - 计数器 counter是一个累加的计数器,代表一个从0开始累积单调递增的计数器
Gauge -计量器 Gauge是一种度量标准,瞬时状态,可以代表任意metric的上下波动的数值。
Histogram - 直方图 Histogram统计数据的分布情况。比如最小值,最大值,中间值,还有中位数(histogram中位数由服务端计算完成,会消耗服务器的资源)
Summary - 摘要 和Histogram类似, 用于表示一段时间内的数据采样结果,典型的应用如: 请求持续时间, 响应大小。(Sumamry的分位数则是直接在客户端计算完成, Summary在通过PromQL进行查询时有更好的性能表现)

3.3 PromQL 运算

3.3.1 二元运算符

#算术运算符:
+ (addition)
- (subtraction)
* (multiplication)
/ (division)
% (modulo)
^ (power/exponentiation)
#比较运算符:
== (equal)
!= (not-equal)
> (greater-than)
< (less-than)
>= (greater-or-equal)
<= (less-or-equal)
#逻辑运算符:
andor、unless 
#目前该运算符仅允许在两个即时向量之间进行操作,不支持标量(标量只有一个数字,没有时序)参与运算

#运算符从高到低的优先级
1 ^ 
2 *, /, %
3 +, -
4 ==, !=, <=, <, >=, >
5 and, unless
6 or

#注意:
#具有相同优先级的运算符满足结合律(左结合),但幂运算除外,因为它是右结合机制
#可以使用括号()改变运算次序
#范例:取GC平均值
go_gc_duration_seconds_sum{instance="prometheus.wang.org:9090",job="prometheus"}/go_gc_duration_seconds_count{instance="prometheus.wang.org:9090", job="prometheus"}

#正则表达式
node_memory_MemAvailable_bytes{instance =~ "10.0.0.20.:9100"}
node_memory_MemAvailable_bytes{instance =~ "10.0.0.20[12]:9100"}
node_memory_MemAvailable_bytes{instance =~ "10.0.0.20[1-3]:9100"}

#单位换算(默认字节为单位)
node_memory_MemFree_bytes / (1024 * 1024)

#内存使用率
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes * 100
#磁盘使用率
(node_filesystem_size_bytes{mountpoint="/"} -node_filesystem_free_bytes{mountpoint="/"}) /node_filesystem_size_bytes{mountpoint="/"} * 100

#阈值判断
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes > 0.95

#集合处理
#交集 and
node_memory_MemTotal_bytes{instance="10.0.0.101:9100"} and node_memory_MemFree_bytes{instance="10.0.0.104:9100" }
#补集 unless
node_memory_MemTotal_bytes{job_name="k8s-node"} unless node_memory_MemTotal_bytes{instance="10.0.0.104:9100"}


#向量匹配关健字(了解,用的不多)
#ignoring 定义匹配检测时要忽略的标签
#on 定义匹配检测时只使用的标签
#组修饰符
group_left  #多对一
group_right #一对多
#left和right表示哪一侧为多
#范例
method_code:http_errors:rate5m{method="get", code="500"}  24
method_code:http_errors:rate5m{method="get", code="404"}  30
method_code:http_errors:rate5m{method="put", code="501"}  3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21
method:http_requests:rate5m{method="get"}  600
method:http_requests:rate5m{method="del"}  34
method:http_requests:rate5m{method="post"} 120
#一对一
method_code:http_errors:rate5m{code="500"} / ignoring(code) 
method:http_requests:rate5m
#这将返回一个结果向量,其中包含每个方法状态代码为 500 的 HTTP 请求的比例(在过去 5 分钟内测量)。 
没有“ignoring(code) ”不共享同一组标签的指标则不会有匹配,使用“put”和“del”方法的条目没有匹配项,不会显示在结果中:
{method="get"} 0.04 // 24 / 600 {method="post"} 0.05 // 6 / 120 #一对多 method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m #在这种情况下,左侧向量包含每个方法标签值多个条目。 因此,我们使用group_left表示。 现在,右侧的元素与左侧具有相同方法标签的多个元素匹配: {method="get", code="500"} 0.04 // 24 / 600 {method="get", code="404"} 0.05 // 30 / 600 {method="post", code="500"} 0.05 // 6 / 120 {method="post", code="404"} 0.175 // 21 / 120

3.3.2 聚合操作

sum、min、max、avg、count、count_values(值计数)
stddev(标准差)、stdvar(标准差异)、bottomk(最小取样)、topk(最大取样,即取前几个)、
quantile(分布统计)

sum() #对样本值求和
avg() #对样本值求平均值,这是进行指标数据分析的标准方法
count()#对分组内的时间序列进行数量统计
min()#求取样本值中的最小者
max()#求取样本值中的最大者
topk()#逆序返回分组内的样本值最大的前k个时间序列及其值
bottomk()#顺序返回分组内的样本值最小的前k个时间序列及其值
quantile()#分位数用于评估数据的分布状态,该函数会返回分组内指定的分位数的值,即数值落在小于等于
指定的分位区间的比例
count_values()#对分组内的时间序列的样本值进行数量统计
stddev() #对样本值求标准差,以帮助用户了解数据的波动大小(或称之为波动程度) 
stdvar() #对样本值求方差,它是求取标准差过程中的中间状态

可以借助于without和by功能获取数据集中的一部分进行分组统计

#without 表示显示信息的时候,排除此处指定的标签列表,对以外的标签进行分组统计,即:使用除此标签之外的其它标签进行分组统计
#by表示显示信息的时候,仅显示指定的标签的分组统计,即针对哪些标签分组统计
#两种格式:先从所有数据中利用数据选择表达式过滤出部分数据,进行分组后,再进行聚合运算,最终得出来结果
#格式1
聚合操作符(数据选择表达式) without|by (<label list>)
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
#格式2
聚合操作符 without|by (<label list>) (数据选择表达式) 
<aggr-op> [without|by (<label list>)] ([parameter,] <vector expression>)

示例

#内存总量
sum(node_memory_MemTotal_bytes)
#按instance分组统计内存总量
sum(node_memory_MemTotal_bytes) by (instance)
#确认所有主机的CPU的总个数
count(node_cpu_seconds_total{mode='system'})

3.3.3 功能函数

#计算相关
绝对值abs()、导数deriv()、指数exp()、对数ln()、二进制对数log2()、10进制对数log10()、平方根
sqrt()
向上取整ceil()、向下取整floor()、四舍五入round()
样本差idelta()、差值delta()、递增值increase()、重置次数resets()
递增率irate()、变化率rate()、平滑值holt_winters()、直方百分位histogram_quantile()
预测值predict_linear()、参数vector()
范围最小值min_over_time()、范围最大值max_over_time()、范围平均值avg_over_time()、范围求
和值sum_over_time()、范围计数值count_over_time()、范围分位数quantile_over_time()、范围
标准差stddev_over_time()、范围标准方差stdvar_over_time()

rate 和 irate 函数

#rate函数可以用来求指标的平均变化速率
rate函数=时间区间前后两个点的差 / 时间范围
#一般rate函数可以用来求某个时间区间内的请求速率,也就是我们常说的QPS

#irate函数求出来的就是瞬时变化率
irate函数=时间区间内最后两个样本点的差 / 最后两个样本点的时间差

#例:
irate(prometheus_http_requests_total{code="200", handler="/-/ready", instance="prometheus.wang.org:9090", job="prometheus"}[1m])

 

posted @ 2024-10-31 15:27  战斗小人  阅读(19)  评论(0编辑  收藏  举报