欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Prometheus监控系部署配置过程

程序员文章站 2024-03-17 13:51:46
...

前言

Prometheus监控系部署配置过程

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB),基于Go语言开发,是Google BorgMon监控系统的开源版本。Prometheus在2016年加入了云原生计算基金会,成为继Kubernetes之后的第二个项目。

Prometheus通过多种数学算法能实现强大的监控需求,原生支持K8S服务发现,能监控容器的动态变化。并且结合Grafana能绘出漂亮图形,然后使用alertmanager或Grafana实现报警。它与其他监控相比有以下主要优势:

· 1>数据格式是Key/Value形式,简单、速度快;采用多维数据模型(由指标名称和键/值维集定义的timeseries)

· 2>timeseries收集是通过HTTP上的拉取(pull mode)模型进行,通过中间网关支持timeseries的推送,通过服务发现或静态配置来发现目标,监控数据的精细程度可达到秒级(数据采集精度高情况下,对磁盘消耗大,存在性能瓶颈,且不支持集群,但可以通过联邦能力进行扩展);,

·3>不依赖分布式存储,数据直接保存在本地,单节点是自治的,可独立运行管理,可以不需要额外的数据库配置。但是如果对历史数据有较高要求,可以结合OpenTSDB;支持分层和水平联合。

4> 周边插件丰富,如果对监控要求不是特别严格的话,默认的几个成品插件已经足够使用;支持多种图形和仪表板。

5>本身基于数学计算模型,有大量的函数可用,可以实现很复杂的监控(故学习成本高,需要有一定数学思维,独有的数学命令行很难入门);

6>可以嵌入很多开源工具的内部去进行监控,数据更可信。
7>使用PromQL,它是一种强大而灵活的查询语言,PromQL作为Prometheus强大的查询语言,可以灵活地处理监视数据。

官方地址:https://prometheus.io/,显示最新版本为2.22.0,官方维护的Prometheus组件仅提供预编译的二进制文件和Docker映像,其他的需要去Github上获取。

Prometheus监控系部署配置过程
github上资源:https://github.com/prometheus/prometheus/releases
Prometheus监控系部署配置过程

Prometheus它可使用联合模型(federation mode)进行扩展,该模型使得一个 Prometheus 服务器能够抓取另一个 Prometheus 服务器的数据。这允许创建分层拓扑,其中*系统或更高级别的 Prometheus 服务器可以抓取已从下级实例收集的聚合数据。你可以将 Prometheus 作为后端,配置 Grafana[5] 来提供数据可视化和仪表板功能。

工作原理

Prometheus直接从目标主机上运行的代理程序中抓取指标,并将收集的样本集中存储在其服务器上。也可以使用像 collectd_exporter 这样的插件推送指标,尽管这不是 Promethius 的默认行为,但在主机位于防火墙后面或位于安全策略禁止打开端口的某些环境中它可能很有用。另外,它可通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等;它以给定的时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况为真时触发警报。

Prometheus的主要构成:

1、服务端

Prometheus服务端以一个进程方式启动,如果不考虑参数和后台运行的话,只需要解压安装包之后运行==./prometheus脚本==即可启动,程序默认监听在9090端口。每次采集到的数据叫做metrics。这些采集到的数据会先存放在内存中,然后定期再写入硬盘,如果服务重新启动的话会将硬盘数据写回到内存中,所以对内存有一定消耗。Prometheus不需要重视历史数据,所以默认只会保留15天的数据。

2、客户端

Prometheus客户端分为pull和push两种方式。如果是pull形式的话则是服务端主动向客户端拉取数据,这样需要客户端上安装exporters(导出器)作为守护进程,官网上也提供了很多exporters可以下载使用,比如使用最多的node_exporters,几乎把系统自身相关数据全部采集了,非常全面,node_exporter默认监听9100端口。

如果是push形式的话客户端需要安装pushgateway插件,然后运需要运维人员用脚本把监控数据组织成键值形式提交给pushgateway,再由它提交给服务端。它适合于现有exporters无法满足需求时,自己灵活定制。

prometheus 相关核心概念

a)\ 指标

prometheus 所有的监控指标(Metric) 被统一定义为

{

指标名称:说明指标的含义,例如 tcp_request_total 代表 tcp 的请求总数,指标名称必须由 字母、数值下画线或者冒号组成,符合正则表达式,如 [a-zA-Z:][a-zA-Z0-9:]*。

标签(label) 用于过滤和聚合

b)、数据采集

prometheus 采用pull 方式采集监控数据,和采用push 方式采集监控数据不同,

push 方式: agent 主动上报数据,可以将采集的数据立即上报到监控中心,push 方式本地不会保存采集的数据,agent 本身是无状态的服务,master 需要维护各种agent 状态

pull 方式: master 主动拉取 agent 的数据,周期性采集,采集时间为30s 或者更长时间,
agent 本身需要一定的数据存储能力,master 只负责简单的数据拉取

c)、数据处理

prometheus 支持数据处理,主要包括 relabel 、replace、keep、drop

d)、数据存储

prometheus 支持本地存储和远程存储两种方式

e)、数据查询

prometheus 使用promQL 查询

f)、告警

prometheus 本身不会对报警进行处理、需要借助一个组件alertmanager ,prometheus 会配置alertmanager 地址,这样prometheus 发出的告警记录变可以发送到alertmanager 进行处理

系统架构

Prometheus监控系部署配置过程
Prometheus监控系部署配置过程
如上图所示,在上面流程中,Prometheus通过配置文件中指定的服务发现方式来确定要拉取监控指标的目标(Target),接着从要拉取的目标(应用容器和Pushgateway)发起HTTP请求到特定的端点(Metric Path),将指标持久化至本身的TSDB中,TSDB最终会把内存中的时间序列压缩落到硬盘,除此之外,Prometheus会定期通过PromQL计算设置好的告警规则,决定是否生成告警到Alertmanager,后者接收到告警后会负责把通知发送到邮件或企业内部群聊中。

Prometheus的指标名称:只能由 ASCII 字符、数字、下划线以及冒号组成,而且有一套命名规范:

使用基础Unit(如seconds而非milliseconds)
指标名以application namespace作为前缀,如:
process_cpu_seconds_total
http_request_duration_seconds
用后缀来描述Unit,如:
http_request_duration_seconds
node_memory_usage_bytes
http_requests_total
process_cpu_seconds_total
foobar_build_info

prometheus 组件:

1)prometheus server 端 :负责定时在目标上抓取metrics(指标)数据,每个抓取目标都需要暴露一个http 服务接口用于 prometheus 定时抓取,这种调用监控对象获取监控数据的方式称为pull

2)prometheus client 端: 为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server

3)Push Gateway:主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。

4)Exporters:支持如 HAProxy,StatsD,Graphite,Redis 一类的服务;

5**)Alertmanager**:从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。

安装部署过程

1)软件下载:
wget https://github.com/prometheus/prometheus/releases/download/v2.22.0/prometheus-2.22.0.linux-amd64.tar.gz

2)安装
采用预编译二进制文件或docker映像方式均可
#mkdir prometheus
#chmod 777 -R prometheus
#groupadd prometheus //添加用户,用此账号启动服务
#useradd -g prometheus -s /sbin/nologin prometheus
#chown -R prometheus:prometheus /usr/local/prometheus/
#mkdir -p /home/software/prometheus-data
#chown -R prometheus:prometheus /home/software/prometheus-data
#touch /usr/lib/systemd/system/prometheus.service //配置prometheus服务,实现开机启动
#chown prometheus:prometheus /usr/lib/systemd/system/prometheus.service
#vim /usr/lib/systemd/system/prometheus.service

[Unit]

Description=Prometheus

Documentation=https://prometheus.io/

After=network.target

[Service]

# Type设置为notify时,服务会不断重启

Type=simple

User=prometheus

# --storage.tsdb.path是可选项,默认数据目录在运行目录的./dada目录中

ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/home/software/prometheus-data

Restart=on-failure


[Install]

WantedBy=multi-user.target

后续就可以这样启动服务了:
systemctl enable prometheus
systemctl start prometheus
systemctl status prometheus
Docker执行:
$ docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus,完成之后,就可访问 http://localhost:9090/。
或:
vim prometheus.yml

global:##全局

  scrape_interval: 15s

  scrape_timeout: 10s

  evaluation_interval: 15s

alerting:##告警配置

  alertmanagers:

  - static_configs:

    - targets: []

    scheme: http

    timeout: 10s

    api_version: v1

scrape_configs:监控配置

- job_name: prometheus

  honor_timestamps: true

  scrape_interval: 15s

  scrape_timeout: 10s

  metrics_path: /metrics

  scheme: http

  static_configs:静态配置

  - targets:

    - localhost:9090

完成之后:

docker run \
    -p 9090:9090 \
    -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus
或:
docker run -d -p 9090:9090 -v /root/prometheus:/etc/prometheus --name prometheus  prom/prometheus

二进制方式:
tar -zxvf prometheus-2.22.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local
mv prometheus-2.22.0.linux-amd64/ prometheus
cd prometheus/
./prometheus --version
修改prometheus.yml文件,配置启动ip:vim prometheus.yml

#Prometheus全局配置
global:
  scrape_interval: 15s  #采集数据间隔,默认15秒。该配置可配置在每个job_name中
  evaluation_interval: 15s  #监控规则评估频率,比如设置了内存使用大于70%发出报警的规则,然后每15秒来执行一次这个规则
 
#Prometheus告警设置
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093
#监控配置
scrape_configs:
  - job_name: 'prometheus-server'  #定义一个监控组,其下可以有多个实例配置
    static_configs:
    - targets: ['localhost:9090']  #节点的地址,可以写多个地址
  - job_name: 'www_server'  #定义另一个监控组
    static_configs:
    - targets: ['10.160.2.107:9100','192.168.1.100:9100']  #组内多个被监控主机
      labels:  #自定义标签,可以通过标签对查询数据进行分组管理
      idc:beijing  #将上面2个主机打上idc标签,值为beijing
#   params:  #过滤器
#     collect[]:
#       - cpu #只采集CPU数据
####使用正则替换标签
#  - job_name: 'mysql_node'
#    static_configs:
#    - targets: ['10.160.2.110:9100','192.168.1.111:9100']
#    metric_relable_configs:  #通过正则重命名标签
#    - action: replace  #replace替换是默认动作。此外还有keep(只参加匹配标签的实例)、drop(不采集匹配正则的实例)、labelkeep\labeldrop(对标签进行过滤处理而非实例)等动作
#      source_labels: ['job']  #原标签,job是默认就会产生的标签,这里job标签的值是node
#      regex: (.*)  #正则匹配,这里匹配job标签内的内容,也就是node
#      replacement: beijing  #替换成什么内容,如果写$1就是将正则里的内容拿过来
#      target_label: idc  #把替换到的内容赋值给idc标签
#    - action: labeldrop  #删除标签
#      regex: job  #把原有的job标签删除不显示

修改:job_name: ‘prometheus’
metrics_path defaults to ‘/metrics’
scheme defaults to ‘http’.
static_configs:

  • targets: [‘10.173.10.12:9090’]
    检查配置文件:protool check config prometheus.yml

启动服务:nohup ./prometheus --config.file=prometheus.yml &S

或者详细点:

./prometheus --config.file="/usr/local/prometheus-2.16.0.linux-amd64/prometheus.yml" \
--web.listen-address="0.0.0.0:9090" \
--storage.tsdb.path="/data/prometheus" \
--storage.tsdb.retention.time=15d --web.enable-lifecycle &

选项说明:
–config.file="/usr/local/prometheus/prometheus.yml" #指定配置文件路径
–web.listen-address=“0.0.0.0:9090” #指定服务端口
–storage.tsdb.path="/data/prometheus" #指定数据存储路径
–storage.tsdb.retention.time=15d #数据保留时间
–collector.systemd #开启systemd的服务状态监控,开启后在WEB上可以看到多出相关监控项
–collector.systemd.unit-whitelist=(sshd|nginx).service #对systemd具体要监控的服务名
–web.enable-lifecycle #开启热加载配置

**注意:**配置文件检查没有问题后就可以启动服务了,服务默认监听在9090端口。如果不加任何参数,监控数据会存放在/usr/local/prometheus/data下,那些一长串一长串的文件夹都是已经写入到磁盘中的历史数据。写入磁盘前的数据是放在内存中的,如果发生断电等情况就会使用硬盘中的数据进行恢复。抓取 /metrics 的间隔秒数控制了时间序列数据库的粒度。这在配置文件中定义为 scrape_interval 参数,默认情况下设置为 60 秒。在 scrape_configs 部分中为每个抓取作业设置了目标。每个作业都有自己的名称和一组标签,可以帮助你过滤、分类并更轻松地识别目标。一项作业可以有很多目标。

另外,prometheus可有采用两种热加载方式运行,一个是直接用kill命令发送HUP信号,一个是开启web.enable-lifecycle选项后使用curl命令:
A:kill -HUP pidof prometheus

B:curl -X POST http://localhost:9090/-/reload

3)访问prometheus web页面:

浏览器打开: http://localhost:9090/graph
Prometheus监控系部署配置过程

Prometheus监控系部署配置过程
在Status菜单下,Configuration,Rule,Targets等,在Statu–>Configuration展示prometheus.yml的配置,Statu–>Targets展示监控具体的监控目标:
Prometheus监控系部署配置过程

Prometheus 查询

转到 Prometheus 服务器上的 http://localhost:9090/graph。你将看到一个查询编辑器和两个选项卡:“Graph” 和 “Console”。

Prometheus 将所有数据存储为时间序列,使用指标名称标识每个数据。例如,指标 node_filesystem_avail_bytes 显示可用的文件系统空间。指标的名称可以在表达式框中使用,以选择具有此名称的所有时间序列并生成即时向量。如果需要,可以使用选择器和标签(一组键值对)过滤这些时间序列,例如:node_filesystem_avail_bytes{fstype=“ext4”}

过滤时,你可以匹配“完全相等”(=)、“不等于”(!=),“正则匹配”(=)和“正则排除匹配”(!)。以下示例说明了这一点:

要过滤 node_filesystem_avail_bytes 以显示 ext4 和 XFS 文件系统:node_filesystem_avail_bytes{fstype=~“ext4|xfs”}
要排除匹配:node_filesystem_avail_bytes{fstype!=“xfs”}

还可以使用方括号得到从当前时间往回的一系列样本。你可以使用 s 表示秒,m 表示分钟,h 表示小时,d 表示天,w 表示周,而 y 表示年。使用时间范围时,返回的向量将是范围向量。

例如,以下命令生成从五分钟前到现在的样本:node_memory_MemAvailable_bytes[5m]

Prometheus 还包括了高级查询的功能,例如:

100 * (1 - avg by(instance)(irate(node_cpu_seconds_total{job=‘webservers’,mode=‘idle’}[5m])))

请注意标签如何用于过滤作业和模式。指标 node_cpu_seconds_total 返回一个计数器,irate()函数根据范围间隔的最后两个数据点计算每秒的变化率(意味着该范围可以小于五分钟)。要计算 CPU 总体使用率,可以使用 node_cpu_seconds_total 指标的空闲(idle)模式。处理器的空闲比例与繁忙比例相反,因此从 1 中减去 irate 值。要使其为百分比,请将其乘以 100。

4)部署node_exporter

Node_exporter收集机器的系统数据,这里采用prometheus官方提供的exporter,除node_exporter外,官方还提供consul,memcached,haproxy,mysqld等exporter。这里在prometheus服务和 node节点部署相关服务。

利用第三方源:
对于Centos/RHEL 7:

#curl -Lo /etc/yum.repos.d/_copr_ibotty-prometheus-exporters.repo https://copr.fedorainfracloud.org/coprs/ibotty/prometheus-exporters/repo/epel-7/ibotty-prometheus-exporters-epel-7.repo

对于Centos/RHEL 8:

#curl -Lo /etc/yum.repos.d/_copr_ibotty-prometheus-exporters.repo https://copr.fedorainfracloud.org/coprs/ibotty/prometheus-exporters/repo/epel-8/ibotty-prometheus-exporters-epel-8.repo

执行:#yum install node_exporter

或者:github上下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
tar -zxvf node_exporter-1.0.1-rc.0.linux-amd64.tar.gz -C /usr/local/

cd /usr/local/

mv node_exporter-1.0.1-rc.0.linux-amd64 node_exporter

设置用户(节点)

groupadd prometheus

useradd -g prometheus -s /sbin/nologin prometheus

chown -R prometheus:prometheus /usr/local/node_exporter

监控节点上:
#vim /usr/lib/systemd/system/node_exporter.service

[Unit]

Description=node_exporter

Documentation=https://prometheus.io/

After=network.target

[Service]

Type=simple

User=prometheus

ExecStart=/usr/local/node_exporter/node_exporter

Restart=on-failure

[Install]

WantedBy=multi-user.target

[aaa@qq.com ~]# systemctl enable node_exporter

[aaa@qq.com ~]# systemctl start node_exporter

对于Windows:
wget https://github.com/prometheus-community/windows_exporter/releases/download/v0.14.0/windows_exporter-0.14.0-amd64.exe
wget https://github.com/prometheus-community/windows_exporter/releases/download/v0.14.0/windows_exporter-0.14.0-amd64.msi
插件安装完成后,访问http://ip:9182/metrics

附: