Prometheus指标数据采集,node-exporter,Grafana,PromQL语句使用和Prometheus 联邦集群

一、了解 Prometheus 各组件的功能,熟悉 Prometheus 的数据采集流程

Prometheus是基于go语言开发的一套开源的监控、报警和时间序列数据库的组合
Prometheus 组件功能和架构图:
 prometheus server:主服务,接受外部http请求、收集指标数据、存储指标
数据与查询指标数据等。
 prometheus targets: 静态发现目标后执行指标数据抓取。
 service discovery:动态发现目标后执行纸币数据抓取。
 prometheus alerting:调用alertmanager组件实现报警通知。
 push gateway:数据收集代理服务器(类似于zabbix proxy但仅限于client主动push数据至push gateway)。
 data visualization and export: 数据可视化与数据导出(浏览器或其它client)。
在这里插入图片描述
 prometheus数据采集流程:
基于静态配置文件或动态发现获取目标
向目标URL发起http/https请求
目标接受请求并返回指标数据
promethus server接受数据并对比告警规则,如果触发告警则进一步执行告警动作并存储数据,不触发告警只进行数据存储
grafana进行数据可视化
TSDB简介和特点:
TSDB: Time Series Database,简称TSDB,存放时间序列数据的数据库
时间序列数据具有不变性,唯一性和按照时间序列的特性。
持续周期性写入数据,高并发吞吐:每隔一段时间,就会写入成千上万的节点的指标数据
写多读少:prometheus每间隔15s就会采集数十万或更多指标数据,但通常只查看最近比较重要的指标数据。
数据按照时间排列:每次收集的指标数据,写入时都是按照当前时间往后进行写入,不会覆盖历史数据。
时效性:只保留最近一段时间的数据,超出时效的数据会被删除。
默认情况下,prometheus将采集到的数据存储在本地的TSDB数据库中,路径默认为prometheus安装目录的data目录,数据写入过程为先把数据写入wal日志并存放在内存,然后2小时后将内存数据保存至一个新的block块,同时再把新采集的数据写入内存并在2小时后保存至一个新的block块,以此类推。
prometheus先将采集的指标数据保存到内存的chunk中,chunk是prometheus存储数据的最基本单元。
每间隔两个小时,将当前内存的多个chunk统一保存至一个block中并进行数据合并,压缩,并生成元数据文件index,meta.json和tombstones
 TSDB-block特性:
 block会压缩、合并历史数据块,以及删除过期的块,随着压缩、合并,block的数量会减少,在压缩过程中会发生三件事:定期执行压缩、合并小的block到大的block、清理过期的块,每个块有4部分组成:
├── chunks
│ └── 000001 #数据目录,每个大小为512MB超过会被切分为多个
├── index #索引文件,记录存储的数据的索引信息,通过文件内的几个表来查找时序数据
├── meta.json #block元数据信息,包含了样本数、采集数据数据的起始时间、压缩历史
└── tombstones #逻辑数据,主要记载删除记录和标记要删除的内容,删除标记,可在查询块时排除样本。

二、基于 Docker 或二进制部署 Prometheus Server

基于docker-compose:
 root@prometheus-server1:~# tar xvf docker-20.10.19-binary-install.tar.gz
 root@prometheus-server1:~# bash docker-install.sh
 root@prometheus-server1:~# git clone https://gitee.com/jiege-gitee/prometheus-docker-compose.git
 root@prometheus-server1:~# cd prometheus-docker-compose
 ~/prometheus-docker-compose# vim config/prometheus/prometheus.yml #prometheus 配置文件
 ~/prometheus-docker-compose# docker-compose up -d #执行部署,需要在线下载镜像
在这里插入图片描述
 基于二进制:
 root@promethus1:~# mkdir /apps
 root@promethus1:~# cd /apps/
root@promethus1:/apps# tar xvf prometheus-2.40.5.linux-amd64.tar.gz
root@promethus1:/apps# ln -sv prometheus-2.40.5.linux-amd64 prometheus
‘prometheus’ -> ‘prometheus-2.40.5.linux-amd64’
 创建启动service文件:

# vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus --config.file=/apps/prometheus/prometheus.yml --web.enable-lifecycle
[Install]
WantedBy=multi-user.target

root@promethus1:/apps/prometheus# systemctl daemon-reload && systemctl restart prometheus && systemctl enable prometheus.service

三、基于 Docker 或二进制部署 node-exporter,并通过 Prometheus 收集 node-exporter 指标数据
 二进制部署node_exporter:
root@es-container:/apps# tar xvf node_exporter-1.5.0.linux-amd64.tar.gz
root@es-container:/apps# ln -sv node_exporter-1.5.0.linux-amd64 node_exporter
‘node_exporter’ -> ‘node_exporter-1.5.0.linux-amd64’
root@es-container:/apps/node_exporter# vim /etc/systemd/system/node-exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/apps/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
root@es-container:~#systemctl daemon-reload && systemctl restart node-exporter && systemctl enable node-exporter.service
在这里插入图片描述
 配置prometheus server收集node-exporter指标数据:
 root@prometheus-server1:~# vim /apps/prometheus/prometheus.yml

  • job_name: ‘promethues-node’
    static_configs:
  • targets: [‘172.31.1.181:9100’,‘172.31.1.182:9100’]
     root@prometheus-server1:~# systemctl restart prometheus.service
    在这里插入图片描述

四、安装 Grafana 并添加 Prometheus 数据源,导入模板可以图形显示指标数据

 grafana简介: grafana是一个可视化组件,用于接收客户端浏览器的请求并连接到prometheus查询数据,最后经过渲染并在浏览器进行体系化显示,需要注意
的是,grafana查询数据类似于zabbix一样需要自定义模板,模板可以手动制
作也可以导入已有模板。
root@prometheus-server1:/usr/local/src# apt-get install -y adduser libfontconfig1 #安装依赖
root@prometheus-server1:/usr/local/src# dpkg -i grafana-enterprise_9.3.1_amd64.deb #安装grafana包
root@prometheus-server1:/usr/local/src# vim /etc/grafana/grafana.ini
root@prometheus-server1:/usr/local/src#
root@prometheus-server1:/usr/local/src# systemctl restart grafana-server && systemctl enable grafana-server #启动grafana服务
Synchronizing state of grafana-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable grafana-server
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /lib/systemd/system/grafana-server.service.

 添加数据源:
 Configuration–>data source–>add datasource–>prometheus
在这里插入图片描述
 导入模板:
 Dashboards–>import–>模板id 11074/8919
在这里插入图片描述
在这里插入图片描述

五、掌握 Prometheus 的 PromQL 语句的简单使用

 PromQL查询数据类型
Instant Vector:瞬时向量/瞬时数据,Range Vector:范围向量/范围数据
curl ‘http://192.168.159.146:9090/api/v1/query’ --data ‘query=node_memory_MemFree_bytes’ #查询到单个数据
curl ‘http://192.168.159.146:9090/api/v1/query’ --data
‘query=node_memory_MemFree_bytes{instance=“172.31.1.181:9100”}[5m]’ #查询到一组数据
scalar:标量/纯量数据,是一个浮点数类型的数据值
curl ‘http://192.168.159.146:9090/api/v1/query’ --data ‘query=scalar(sum(node_load1{instance=“192.168.159.145:9100”}))’
{“status”:“success”,“data”:{“resultType”:“scalar”,“result”:[1670684917.691,“0.41”]}}

PromQL指标数据类型:count和gauge用的比较多
 Counter:计数器,Counter类型代表一个累积的指标数据,比如磁盘I/O总数、Nginx/API的请求总数、网卡流经的报文总数等。
prometheus_http_requests_total #用于prometheus的http 请求总数
 Gauge:仪表盘,Gauge类型代表一个可以任意变化的指标数据,值可以随时增高或减少,如带宽速率、CPU负载、内存利用率、nginx 活动连接数等。
node_load1 #cpu负载

PromQL指标数据类型:
 node-exporter指标数据格式:
node_load15 0.1 #没有标签的
node_network_receive_bytes_total{device=“ens33”} #一个标签
node_filesystem_files_free{device=“/dev/sda2”,fstype=“xfs”,mountpoint=“/boot”} #多个标签

PromQL指标数据类型:
 PromQL查询指标数据示例:
node_memory_MemTotal_bytes #查询node节点总内存大小
node_memory_MemFree_bytes #查询node节点剩余可用内存
node_memory_MemTotal_bytes{instance=“192.168.159.145:9100”} #基于标签查询指定节点的总内存
node_memory_MemFree_bytes{instance=“192.168.159.145:9100”} #基于标签查询指定节点的可用内存
node_disk_io_time_seconds_total{device=“sda”} #查询指定磁盘的每秒磁盘io
node_filesystem_free_bytes{device=“/dev/sda1”,fstype=“xfs”,mountpoint=“/”} #查看指定磁盘的磁盘剩余空间

PromQL标签匹配:
 基于标签对指标数据进行匹配:
= :选择与提供的字符串完全相同的标签,精确匹配。
=~ :选择正则表达式与提供的字符串(或子字符串)相匹配的标签。
node_load1{instance=“192.168.159.145:9100”} #精确匹配
node_load1{instance=~“192.168.159.1.*:9100$”} #包含正则且匹配

PromQL 时间范围:
node_memory_MemTotal_bytes[5m] #指标5分钟内的数据
PromQL 运算符:
 node_memory_MemFree_bytes/1024/1024 #将内存进行单位从字节转行为兆
 node_disk_read_bytes_total{device=“sda”} + node_disk_written_bytes_total{device=“sda”} #计算磁盘读写数据量
 (node_disk_read_bytes_total{device=“sda”} + node_disk_written_bytes_total{device=“sda”}) / 1024 / 1024 #单位转换

PromQL 聚合运算:
 max(node_network_receive_bytes_total) by (instance) #计算每个节点的最大的流量值
 max(rate(node_network_receive_bytes_total[5m])) by (device) #计算每个节点最近五分钟每个device的最大流量

 sum(prometheus_http_requests_total) #sum() #求数据值相加的和(总数)
 count_values(“node_version”,node_os_version) #统计不同的系
统版本节点有多少
 abs(sum(prometheus_http_requests_total{handler=“/metrics”})) #abs() 返回指标数据的值
 absent(sum(prometheus_http_requests_total{handler=“/metrics”})) #absent() 如果监指标有数据就返回空,如果监控项没有数据就返回1,可用于对监控项设置告警通知(如果返回值等于1就触发告警通知)
 topk(6, prometheus_http_requests_total) #取从大到小的前6个
 bottomk(6, prometheus_http_requests_total) #取从小到大的前6个

 rate() #rate函数是专门搭配counter数据类型使用函数,rate会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果,适合用于计
算数据相对平稳的数据。
 rate(prometheus_http_requests_total[5m])
 rate(apiserver_request_total{code=~“^(?:2…)KaTeX parse error: Expected 'EOF', got '}' at position 2: "}̲[5m])  rate(no…”}[5m])
在这里插入图片描述
六、部署 Prometheus 联邦集群并实现指标数据收集
 部署prometheus server:
 Prometheus 主server和prometheus 联邦server分别部署prometheus服务端程序:

root@prometheus-server2:/usr/local/src# tar xvf prometheus-server-2.40.5-onekey-install.tar.gz
root@prometheus-server2:/usr/local/src# bash prometheus-install.sh
root@prometheus-server3:/usr/local/src# tar xvf prometheus-server-2.40.5-onekey-install.tar.gz
root@prometheus-server3:/usr/local/src# bash prometheus-install.sh

 部署prometheus node_exporter:
 被监控节点部署node_exporter:

   root@prometheus-node2:/usr/local/src# tar xvf node-exporter-1.5.0-onekey-install.tar.gz
   root@prometheus-node2:/usr/local/src# bash node-exporter-1.5.0-onekey-install.sh
   root@prometheus-node3:/usr/local/src# tar xvf node-exporter-1.5.0-onekey-install.tar.gz
   root@prometheus-node3:/usr/local/src# bash node-exporter-1.5.0-onekey-install.sh

 配置prometheus联邦节点收集node-exporter指标数据:
联邦节点1-192.168.159.147:

   root@prometheus-server2:/apps/prometheus# vim prometheus.yml
   - job_name: "prometheus-idc1"
     static_configs:
       - targets: ["192.168.159.132:9100"]
 root@prometheus-server2:/apps/prometheus# systemctl restart prometheus.service

联邦节点2-192.168.159.148:

root@prometheus-server3:/apps/prometheus# vim prometheus.yml
  - job_name: "prometheus-idc2"
    static_configs:
      - targets: ["192.168.159.135:9100","192.168.159.145:9100"]
root@prometheus-server3:/apps/prometheus# systemctl restart prometheus.service

 配置prometheus 通过联邦节点收集的node-exporter指标数据:

root@prometheus-server1:/apps/prometheus# vim prometheus.yml
- job_name: "prometheus-federate-159.147"
    scrape_interval: 10s
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job="prometheus"}'
        - '{__name__=~"job:.*"}'
        - '{__name__=~"node.*"}'
    static_configs:
      - targets:
        - '192.168.159.147:9090'

  - job_name: "prometheus-federate-159.148"
    scrape_interval: 10s
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job="prometheus"}'
        - '{__name__=~"job:.*"}'
        - '{__name__=~"node.*"}'
    static_configs:
      - targets:
        - '192.168.159.148:9090'
  root@prometheus-server1:/apps/prometheus# systemctl restart prometheus.service

 验证prometheus 通过联邦节点收集的node-exporter指标数据:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值