Prometheus01 Prometheus基础, 部署与配置, Node Exporter, Pushgateway, PromQL 运算
1 Prometheus 介绍
1.2 监控内容和方法
1.2.2 监控方法
Google的四个黄金指标 1.延迟(Latency) 服务请求所需要的时长,例如HTTP请求平均延迟 2.流量(Traffic),也称为吞吐量 3.错误(Errors) 4.饱和度(Saturation) 资源的整体利用率,包括CPU(容量、配额、节流)、内存(容量、分配)、存储(容量、分配和 I/O 吞吐量)和网络
Prometheus用的数据库是时序数据库, 其本身也是时序数据库
1.4.2 时间序列数据特点
1.大部分时间都是顺序写入操作,很少涉及修改数据 删除操作都是删除一段时间的数据,而不涉及到删除无规律数据 读操作一般都是升序或者降序 2.高效的压缩算法,节省存储空间,有效降低 IO,存储成本低 TSDB 使用高效的数据压缩技术,将单个数据点的平均使用存储空间降为1~2个字节,可以降低 90%存储使用空间,同时加快数据写入的速度。 3.高性能读写, 每秒百万级数据点写入,亿级数据点聚合结果秒级返回
1.5 Prometheus 简介
1.5.1 Prometheus 简介
Prometheus 是一款时序(time series)数据库TSDB, 其本身可以被作为时序数据库使用
Prometheus是云原生基金会的第二大产品,第一为K8S
云原生: https://landscape.cncf.io/
Prometheus 不足
不支持集群化
被监控集群规模过大后本身性能有一定瓶颈
中文支持不好
1.5.2 Prometheus 架构
Prometheus只支持拉取客户端数据(zabbix支持客户端主动和被动模式)
1.5.2.2 Prometheus 架构
一般情况下,为了节约成本,Prometheus和这些组件会装在同一台机器上
Prometheus 只负责时序型指标数据的采集及存储 其它的功能,如: 数据的分析、聚合及直观展示以及告警等功能并非由Prometheus Server所负责,需要配合其它组件实现 支持丰富的 Exporter 实现各种应用的监控(每个服务都有对应exporter,如redis,mysql) #本质上把对应数据转换成Prometheus要求的数据格式 https://prometheus.io/docs/instrumenting/exporters/
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 类型。
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.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
#官方下载: 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
#简单启动 [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/
Prometheus可以通过命令行或者配置文件的方式对服务进行配置。 1.命令行方式一般用于不可变的系统参数配置,例如存储位置、要保留在磁盘和内存中的数据量等; 配置文件用于定义与数据动态获取相关的配置选项和文件等内容。 命令行方式的配置属性可以通过 prometheus -h 的方式来获取,这些配置属性主要在服务启动时 候设置. 2.配置文件方式,需要在prometheus.yml 文件中修改配置属性,该配置文件的内容是以YAML格式 编写的。 默认情况下,Prometheus 的配置文件有四部分组成: #核心配置: global #全局配置内容 scrape_interval: 15s #抓取时间间隔 evaluation_interval: 15s #计算数据时间间隔(如:磁盘空间利用率,内存空间利用率) #scrape_timeout #采集超时时间 alerting #触发告警相关的配置,主要是与Alertmanager相关的设置。 rule_files #各种各样的外置规则文件配置,包含了各种告警表达式、数据查询表达式等 scrape_configs #监控项的配置列表,这是最核心的配置
安装 Node Exporter 用于收集各 node 主机节点上的监控指标数据(系统参数),监听端口为9100
如果是包安装Prometheus, node exporter也会被安装。下面展示二进制安装
#github 链接 https://github.com/prometheus/node_exporter #官方下载: (只列出最新版,实际还是跳转到github地址上) https://prometheus.io/download/
在需要监控的所有节点主机上进行安装
[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/
[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的启动命令后面追加对应参数
[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))
#浏览器访问 http://node1.wang.org:9100/ #参数指标路径 10.0.0.152:9100/metrics
配置 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.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的配置文件即可实现下图的正常显示
上面内置的模板不太理想,导入指定的网络上比较合适的 Dashboard 模板
2.4.4.1 登录 Grafana 官网查找模板
https://grafana.com/grafana/dashboards/ #可以通过左侧选项进行筛选,点击想要的模板,复制有下角ID,这里选1860 #左侧点击dashboards,点击右侧new下面import,输入id,点击load(它会从网上下载模板,如果慢可以刷新页面再load下) #名称后面加上-1860,以防以后忘记id,下面Prometheus栏选择数据源,点击import #这个模板右上角有host,可以选择主机
这里推荐node模板: 8919(中文),1860,11074,13978模板
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的指标了
内置了支持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
[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
访问下面地址,搜索zookeeper,在grafana导入zookeeper监控模板 https://grafana.com/grafana/dashboards/ #这里用10465,在上方cluster选zookeeper就出现数据了
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
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
[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
#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 基础
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
在[]内部可以采用多个单位表示不同的时间范围,比如s(秒)、m(分)、h(时)、d(日)、w(周)、y(年)
必须使用整数时间单位,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序
例如:1h30m,但不能使用1.5h
类型 | 解析 |
---|---|
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) #逻辑运算符: and、or、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
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'})
#计算相关 绝对值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函数可以用来求指标的平均变化速率 rate函数=时间区间前后两个点的差 / 时间范围 #一般rate函数可以用来求某个时间区间内的请求速率,也就是我们常说的QPS #irate函数求出来的就是瞬时变化率 irate函数=时间区间内最后两个样本点的差 / 最后两个样本点的时间差 #例: irate(prometheus_http_requests_total{code="200", handler="/-/ready", instance="prometheus.wang.org:9090", job="prometheus"}[1m])