一.Prometheus?
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。
Prometheus的特点
Prometheus相关组件
Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次Prometheus Server需要对采集到的监控数据进行存储,Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后Prometheus Server对外提供了自定义的PromQL语言,实现对数据的查询以及分析。Prometheus Server内置的Express Browser UI,通过这个UI可以直接通过PromQL实现数据的查询以及可视化。
Exporter
Exporter将监控数据采集的端点通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的Endpoint端点,即可获取到需要采集的监控数据。Exporter分为2类:
直接采集:Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。
间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client Library编写该监控目标的监控采集程序。例如:Mysql Exporter,JMX Exporter,Consul Exporter等。
指标(metric)、样本
所有采集的监控数据均以指标(metric)的形式保存在内置的时间序列数据库当中(TSDB)。每一条时间序列由指标名称(Metrics Name)以及一组标签(Labels)唯一标识。举例,大括号中为标签,这个例子就可以理解为3条时间序列(虽然指标名称相同,但标签不同):
node_disk_io_now{device="dm-0",instance="localhost:9100",job="node"}
node_disk_io_now{device="sda",instance="localhost:9100",job="node"}
node_disk_io_now{device="sr0",instance="localhost:9100",job="node"}
在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:
Job和Instance
当需要采集不同的监控指标(例如:主机、MySQL、Nginx)时,只需要运行相应的监控采集程序(exporter),并且让Prometheus Server知道Exporter实例的访问地址。
在Prometheus中,每一个暴露监控样本数据的HTTP服务称为一个实例(instance),它是被监控的具体目标。监控这些instances的任务叫做job。每个job负责一类任务,可以为一个job配置多个instance,job对自己的instance执行相同的动作。隶属于job的instance可以直接在配置文件中指定。也可以让job自动从consul、kuberntes中动态获取,这个过程就是服务发现。
AlertManager
在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。
PushGateway
由于Prometheus数据采集基于Pull模型进行设计,因此在网络环境的配置上必须要让Prometheus Server能够直接与Exporter进行通信。当这种网络需求无法直接满足时,就可以利用PushGateway来进行中转。可以通过PushGateway将内部网络的监控数据主动Push到Gateway当中。而Prometheus Server则可以采用同样Pull的方式从PushGateway中获取到监控数据。
四种Metrics类型
以node exporter为例,查看机器ip:9100/metrics页面可以查看到当前抓取的数据,TYPE字段中包含有类型。
Counter(计数器)
特点是只增不减,除非系统发生重置,常用来记录某些事件发生的次数。一般在定义Counter类型指标的名称时推荐使用_total作为后缀。
Gauge(仪表盘)
侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。
Histogram(直方图)
用于统计和分析样本的分布情况。
Summary(摘要)
也用于统计和分析样本的分布情况。
Prometheus架构
二.prometheus部署
Prometheus官网下载:https://prometheus.io/download/
1. 下载prometheus-2.37.2
wget https://github.com/prometheus/prometheus/releases/download/v2.37.2/prometheus-2.37.2.linux-amd64.tar.gz
tar zxf prometheus-2.37.2.linux-amd64.tar.gz
mv prometheus-2.37.2.linux-amd64 prometheus
mv prometheus /usr/local/
查看Prometheus版本信息
./prometheus --version
2. Prometheus配置文件
配置文件路径/usr/local/prometheus/prometheus.yml
Prometheus配置文件介绍
# 全局配置
global:
scrape_interval: 15s # 设置抓取(pull)时间间隔,默认是1m
evaluation_interval: 15s # 设置rules评估时间间隔,默认是1m
# scrape_timeout is set to the global default (10s).
# 告警管理配置,暂未使用,默认配置
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 加载rules,并根据设置的时间间隔定期评估,暂未使用,默认配置
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 抓取(pull),即监控目标配置
# 默认只有主机本身的监控配置
scrape_configs:
# 监控目标的label(这里的监控目标只是一个metric,而不是指某特定主机,可以在特定主机取多个监控目标),在抓取的每条时间序列表中都会添加此label
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
# 可覆盖全局配置设置的抓取间隔,由15秒重写成5秒。
scrape_interval: 5s
# 静态指定监控目标,暂不涉及使用一些服务发现机制发现目标
static_configs:
- targets: ['localhost:9090']
# (opentional)再添加一个label,标识了监控目标的主机
labels:
instance: prometheus
检查prometheus.yml格式
./promtool check config prometheus.yml
3. 添加prometheus用户
添加prometheus用户,prometheus账户启动服务
groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus
目录赋权
chown -R prometheus:prometheus /usr/local/prometheus/
创建prometheus 本地TSDB数据存储目录
mkdir -p /var/lib/prometheus
chown -R prometheus:prometheus /var/lib/prometheus/
4. systemctl 管理prometheus
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=/var/lib/prometheus
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
修改文件属主属组
chown prometheus:prometheus /usr/lib/systemd/system/prometheus.service
设置开机启动
systemctl enable Prometheus && systemctl start prometheus
通过Prometheus的restful接口热加载配置
curl -X POST http://127.0.0.1:9090/-/reload
请求接口后返回 Lifecycle API is not enabled. prometheus启动没有开启热更新配置,需要在启动的命令行增加参数:--web.enable-lifecycle
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.enable-lifecycle
5. 启动服务并访问Web UI
(1)查看prometheus服务状态
systemctl status prometheus
(2)Web UI
Prometheus自带有简单的UI,http://localhost:9090
在Status菜单下,Configuration,Rule,Targets等,Status-->Configuration展示prometheus.yml的配置。
三.部署node_exporter
Node_exporter收集机器的系统数据,采用prometheus官方提供的exporter,除node_exporter外,官方还提供consul,memcached,haproxy,mysqld等exporter,具体可查看官网.
1. 下载&部署
wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
tar -zvxf node_exporter-1.4.0.linux-amd64.tar.gz -C /usr/local/
2. 添加prometheus用户
groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus
修改文件的属主属组
chown -R prometheus:prometheus /usr/local/ node_exporter/
3. systemctl 管理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
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
设置开机启动
systemctl enable node_exporter && systemctl start node_exporter
4. prometheus Server添加node节点监控
prometheus Server 配置文件中添加node_exporter监控
vim /usr/local/prometheus/prometheus.yml
- job_name: "kylin-prometheus"
scrape_interval: 10s
static_configs:
- targets: ['192.168.100.167:9100']
labels:
instance: kylin-prometheus002
5.检查prometheus.yml格式
./promtool check config prometheus.yml
6.重启prometheus
systemctl restart prometheus
7.访问prometheus UI,查看node 节点已经被监控
8. 查看http metrics 采集指标
http://192.168.100.167:9100/metrics,查看从exporter具体能抓到的数据
四.prometheus node_exporter 查询语句
1,获取系统信息
node_uname_info
2,获取系统uptime 时间
sum(time() - node_boot_time_seconds)by(instance)
3,系统启动时间
node_boot_time_seconds
4,系统当前时间
time()
5,CPU核数
count(node_cpu_seconds_total{mode='system'}) by (instance)
6,计算 CPU 使用率
(1 - sum(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total[1m])) by (instance) ) * 100
7,计算内存使用率
(1- (node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes) * 100
8,查看节点总内存
node_memory_MemTotal_bytes/1024/1024/1024
9,计算磁盘使用率
(1 - node_filesystem_avail_bytes{fstype=~"ext4|xfs"} /
node_filesystem_size_bytes{fstype=~"ext4|xfs"}) * 100
10,磁盘IO
磁盘读 IO 使用
sum by (instance) (rate(node_disk_reads_completed_total[5m]))
磁盘写 IO 使用
sum by (instance) (rate(node_disk_writes_completed_total[5m]))
11,网络带宽
下行带宽
sum by(instance) (irate(node_network_receive_bytes_total{device!~"bond.*?|lo"}[5m]))
上行带宽
sum by(instance) (irate(node_network_transmit_bytes_total{device!~"bond.*?|lo"}[5m]))