监控架构-Prometheus-普罗米修斯
目录
http://prometheus.oldboylinux.cn:9090/metrics显示所有键值
1. Prometheus概述
1. Prometheus监控架构。使用Golang语言实现。使用简单,学习门槛较高。
2. Prometheus一般与Grafana配合。
2. Prometheus vs Zabbix
指标 | Prometheus | Zabbix |
---|---|---|
语言 | Golang(Go) | PHP,C,GO |
部署 | 二进制,解压即用 | yum,编译,数据库,php依赖 |
是否容易掌握 | 门槛较高 | 容易使用 |
监控方式 | 通过各种exporter,监控一般都是基于http | 各种模板,客户端,自定义监控,各种协议 |
应用场景 | 监控服务,容器,k8s | 监控系统底层,硬件,系统,网络 |
3. Prometheus极速上手指南
角色 | 主机名 | ip |
---|---|---|
prometheus服务端 | prometheus_server_xzb | 10.0.0.65/172.16.1.65 |
grafana | grafana | 10.0.0.66/172.16.1.66 |
docker01 | docker01 | 10.0.0.81/172.16.1.81 |
3.1 时间同步
3.2 部署Prometheus
##创建目录
mkdir -p /app/
##解压
tar xf prometheus-2.33.3.linux-amd64.tar.gz -C /app/
##创建软连接
ln -s /app/prometheus-2.33.3.linux-amd64/ /app/prometheus
##检查版本
/app/prometheus/prometheus --version
目录说明 | |
---|---|
prometheus | prometheus服务端的命令 |
prometheus.yml | 配置文件 |
3.3 启动Prometheus
##进入目录
cd /app/prometheus
##前台启动
./prometheus
##查看端口 有9090端口便是启动成功
ss -lntup
##浏览器解析访问
10.0.0.65 prometheus.oldboylinux.cn
3.4 Prometheus监控架构
3.5 补充
注意事项:
prometheus默认读取当前目录下面的prometheus.yml配置文件。
后台启动:
nohup /app/prometheus/prometheus &>> /var/log/prometheus.log &
##systemctl管理
vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
After=network.target
[Service]
Type=simple
[Unit]
Description=Prometheus Server
After=network.target
[Service]
Type=simple
ExecStart=/app/prometheus/prometheus --config.file=/app/prometheus/prometheus.yml --web.listen-address=0.0.0.0:9090 --web.max-connections=512
KillMode=process
[Install]
WantedBy=multi-user.target
KillMode=process
[Install]
WantedBy=multi-user.target
##重启daemon-reload
systemctl daemon-reload
##关闭prometheus
pkill prometheus
##开机自启
systemctl enable prometheus.service
##启动
systemctl start prometheus.service
##查看端口
ss -lntup
##查看日志
journalctl -f -u prometheus.service
配置页面
简单过滤
查看数据
查看图形
http://prometheus.oldboylinux.cn:9090/metrics显示所有键值
http://prometheus.oldboylinux.cn:9090/metrics
4. Prometheus配置
4.1 服务端命令行选项
prometheus命令行核心选项 | 说明 |
---|---|
--config.file="prometheus.yml" | 指定配置文件,默认是当前目录下在的prometheus.yml |
--web.listen-address="0.0.0.0:9090" | 前端web页面,端口和监听的地址。如果想增加访问认证可以用ngx。 |
--web.max-connections=512 | 并发连接数 |
--storage.tsdb.path="data/" | 指定tsdb数据存放目录 |
--log.level=info | 日志级别。prometheus日志默认输出到屏幕(标准输出) |
--log.format=logfmt | 日志格式。logfmt默认格式。 json格式(日志收集的时候使用) |
4.2 配置文件
##cat prometheus.yml
# my global config
##全局定义部分
global:
scrape_interval: 15s ##这个间隔表示,prometheus采集数据的间隔
evaluation_interval: 15s #执行对应的rules(规则)间隔,一般报警规则
##采集数据的超时时间,默认是10秒
#scrape_timeout is set to the global default (10s).
# Alertmanager configuration 用于配置警告信息,alertmanager配置。
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:##数据采集的配置(客户端)
- job_name: "prometheus-server-xzb" ##任务名字.体现采集哪些机器,哪些指标
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:##静态配置文件,直接指定被采集的对象. 修改后要重启
- targets: ["localhost:9090"]
file_sd_configs:##动态配置文件,动态读取文件内容,然后进行采集,实时监控
5. Prometheus的exporter
5.1 概述
exporter | 说明 |
---|---|
node_exporter | 获取节点基础信息(系统监控) |
服务的exporter | 监控指定服务的 |
5.2 部署node_exporter
##创建目录
mkdir -p /app/exports/
##解压到指定目录
tar xf node_exporter-1.3.1.linux-amd64.tar.gz -C /app/exports/
##创建软连接
ln -s /app/exports/node_exporter-1.3.1.linux-amd64/node_exporter /bin/
##启动
node_exporter &
##检查端口和进程 9100 端口
ss -lntup
##syatemctl配置
vim /usr/lib/systemd/system/prometheus_node.service
[Unit]
Description=prometheus node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/bin/node_exporter
KillMode=process
[Install]
WantedBy=multi-user.target
##重启daemon
systemctl restart daemon-reload
5.3 配置prometheus服务端
## 添加node-exports节点
cat /app/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: "prometheus-server-xzb"
static_configs:
- targets: ["localhost:9090"]
- job_name: "prometheus-all-node-exports"
static_configs:
- targets:
- "localhost:9100"
- "prometheus.oldboylinux.cn:9100"
5.4 检查结果
5.5 prometheus动态配置文件
1. 获取的exporter域名+端口,写入配置文件,prometheus可以定时读取并加入到prometheus中。
2. 用于解决,大量主机添加、删除的操作
##增加动态读取
vim /app/prometheus/prometheus.yml
...
...
scrape_configs:
- job_name: "prometheus-server-xzb"
static_configs:
- targets: ["localhost:9090"]
- job_name: "prometheus-all-node-exports"
static_configs:
- targets:
- "localhost:9100"
- "prometheus.oldboylinux.cn:9100"
file_sd_configs: ##动态读取与加载配置文件。
- files: ##指定要加载的配置文件
- /app/prometheus/discovery_node_exporter.yml
refresh_interval: 5s ##读取间隔
##动态加载的配置文件格式
cat discovery_node_exporter.yml
[
{
"targets": [ "localhost:9100","prometheus.oldboylinux.cn:9100"]
}
]
6. Prometheus过滤语句
6.1 基本过滤
1. 直接写上prometheus的键值(key)
2. 比如通过node_exporter获取所有主机可用内存输入node_memory_MemFree_bytes
3. 过滤负载: node_load1
4. 查看所有键值
6.2 包含条件的过滤
过滤指定主机的数据
node_cpu_seconds_total{instance="prometheus.oldboylinux.cn:9100"}
格式说明,过滤出指定的内容,需要使用{key(属性)="想要的值"}
过滤出所有主机非idle的指标.
node_cpu_seconds_total{mode!="idle"}
同时满足上面的条件:
node_cpu_seconds_total{mode!="idle",instance="prometheus.oldboylinux.cn:9100"}
6.3 小结
prometheus过滤中的符号 | 含义 |
---|---|
= | 等于 |
!= | 不等于 |
=~ | 支持正则,匹配 |
!~ | 支持正则,不匹配 |
1. 推荐先找出你要的键值,观察键值里面的属性
2. 过滤格式: node_cpu_seconds_total{mode!="idle"}
键值{属性=“值”}
6.4 常用函数
rate函数
计算范围向量中时间序列的每秒平均增长率。单调性的中断(例如由于目标重新启动而导致的计数器重置)会自动调 整。此外,计算推断到时间范围的末端,允许错过刮擦或刮擦周期与该范围的时间段的不完美对齐。
rate(http_requests_total{job="api-server"}[5m])
rate只能与计数器一起使用。它最适合警报和缓慢移动计数器的图形。
##过去一分钟内,系统每秒花费的平均CPU时间
node_cpu_seconds_total[1m]
##排除idle
node_cpu_seconds_total{mode!="idle"}[1m]
## rate []一般配合函数实现统计指定范围的内容.
rate(node_cpu_seconds_total{mode!="idle"}[1m])
sum求和
计算总和
count计数
其他函数
Query functions | Prometheushttps://prometheus.io/docs/prometheus/latest/querying/functions/
6.5 grafana中使用的 PromQL语句
## 可用内存使用率=用了的/总共的 * 100
((node_memory_MemTotal_bytes{instance="prometheus.oldboylinux.cn:9100", job="prometheus-all-node-exports"}-node_memory_MemFree_bytes{instance="prometheus.oldboylinux.cn:9100", job="prometheus-all-node-exports"})/node_memory_MemTotal_bytes{instance="prometheus.oldboylinux.cn:9100", job="prometheus-all-node-exports"})*100
## 内存总大小- 剩余内存 = 用了多少
6.6 复杂语句
##计算内存使用率
(总内存-剩余)/总共
= 可用/总共
((node_memory_MemTotal_bytes-node_memory_MemFree_bytes)/node_memory_MemTotal_bytes)*100
7. Pushgateway
7.1 使用流程
1. 部署,启动pushgateway,服务端ip/域名+端口,写入配置(动态、静态)
2. 书写脚本获取你要的信息,把信息发送到pushgateway中。
7.2 Pushgateway部署
##创建目录
mkdir -p /app/pushgateway
## 解压到指定目录
tar xf pushgateway-1.4.1.linux-amd64.tar.gz -C /app/pushgateway/
## 创建软连接
ln -s /app/pushgateway/pushgateway-1.4.1.linux-amd64/pushgateway /bin/
## 书写systemctl配置
cat /usr/lib/systemd/system/pushgateway.service
[Unit]
Description=prometheus pushgateway
After=network.target
[Service]
Type=simple
ExecStart=/bin/pushgateway
KillMode=process
[Install]
WantedBy=multi-user.target
## 重启
systemctl daemon-reload
## 自启动
systemctl enable pushgateway.service
##启动
systemctl start pushgateway.service
##检查进程和端口 端口9091
修改服务端配置文件
##修改服务端配置文件
cat /app/prometheus/prometheus.yml
...
...
scrape_configs:
- job_name: "prometheus-server-xzb"
static_configs:
- targets: ["localhost:9090"]
- job_name: "prometheus-all-node-exports"
static_configs:
- targets:
- "localhost:9100"
- "prometheus.oldboylinux.cn:9100"
file_sd_configs:
- files:
- /app/prometheus/discovery_node_exporter.yml
refresh_interval: 5s
- job_name: "prometheus-pushgateway"
static_configs:
- targets:
- "localhost:9091"
检查是否添加成功
7.3 书写脚本与提交数据
提交个测试数据
##检查cpu核心数
cat /server/scripts/diy_push_cpu_cores.sh
#!bin/bash
#1.vars
cores=`lscpu |grep 'CPU(s)'|awk 'NR==1 {print $2}'`
job="pushgateway_metrics"
ins="prometheus.oldboylinux.cn:9100"
pushgw="http://prometheus.oldboylinux.cn:9091"
#2.
echo "cpu_cores $cores"| \
curl --data-binary @- ${pushgw}/metrics/job/${job}/instance/${ins}
##写法 ##其中分组名和实例名可以自己设置
curl data-binary @- http://prometheus.oldboylinux.cn:9091/metrics/job/分组名/instance/实例名
书写脚本
#!/bin/basih
##1.vars
job_name="pushgateway_metrics"
ins="prometheus.oldboylinux.cn:9100"
pushgw="http://prometheus.oldboylinux.cn:9091"
#2.取值
disk_sda_root_total=`df |awk '$NR=="/" {print $2}'`
disk_sda_root_free=`df |awk '$NR=="/" {print $4}'`
disk_sda_root_used=`df |awk '$NR=="/" {print $3}'`
##想pushgateway发送请求
echo "disk_sda_total ${disk_sda_root_total}"| \
curl --data-binary @- ${pushgw}/metrics/job/${job_name}/instance/${ins}
echo "disk_sda_free ${disk_sda_root_free}"| \
curl --data-binary @- ${pushgw}/metrics/job/${job_name}/instance/${ins}
echo "disk_sda_used ${disk_sda_root_used}"| \
curl --data-binary @- ${pushgw}/metrics/job/${job_name}/instance/${ins}
检查结果
脚本写入定时任务
##同步时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
##prometheus pushgateway
* * * * * sh /server/scripts/pushgateway-disk-usage.sh &>/dev/null
8. 进入Grafana
8.1 概述
1. prometheus webui一般用于调试PromQL语句(查询语句)
2. 展示交给Grafana。本质:Grafana执行PromQL语句(查询语句),然后通过Grafana进行展示
参考文章:
8.2 使用流程
添加数据源(别忘记hosts解析)
解决仪表盘没有数据
##修改的查询语句主要关注,job部分和instance。
(time()-process_start_time_seconds{instance="prometheus.oldboylinux.cn:9100",job="prometheus-all-node-exports"})
数据不准
(time()-node_boot_time_seconds{instance="prometheus.oldboylinux.cn:9100", job="prometheus-all-node-exports"})
##原因:process_start_time_seconds获取的是Prometheus服务端运行多久(进程)
导入第三方仪表盘
9. Altermanager 告警
9.1 Alertmanager部署
##创建目录
mkdir -p /app/altermanager/
##解压到指定目录
tar xf alertmanager-0.24.0.linux-amd64.tar.gz -C /app/altermanager/
## 创建软连接
ln -s /app/altermanager/alertmanager-0.24.0.linux-amd64/alertmanager /bin/
## systemectl配置书写
[Unit]
Description=prometheus pushgateway
After=network.target
[Service]
Type=simple
ExecStart=/bin/alertmanager --config.file=/app/altermanager/alertmanager-0.24.0.linux-amd64/alertmanager.yml --web.listen-address=0.0.0.0:9093
KillMode=process
[Install]
WantedBy=multi-user.target
##检查端口
ss -lntup|grep alert
9.2 Alertmanager配置
##alertmanager配置详解
global: ##全局定义部分。配置发件人信息.
resolve_timeout: ##5m dns解析的超时时间.
smtp_from: ##发件人
smtp_smarthost: ##smtp服务器
smtp_hello: ##qq.com 163.com 邮箱厂商
smtp_auth_username: ##邮箱名字
smtp_auth_password: ##授权码
smtp_require_tls:false
route: ##配置收件人间隔时间,收件方式
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h ##重复告警时间. eg。11:00 发送了1次告警,12:00 再发送1次
receiver: 'email' ##采取什么方式接受告警.
##完整的配置文件
global:
resolve_timeout: 5m
smtp_from: 'xing775288271@163.com'
smtp_smarthost: 'smtp.163.com:465'
smtp_hello: '163.com'
smtp_auth_username: 'xing775288271@163.com'
smtp_auth_password: 'THqpcgCf5JqBDmVZ'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '775288271@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
9.3 Prometheus配置
##prometheus服务端配置文件
cat /app/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
- "prometheus.oldboylinux.cn:9093"
rule_files:
- "/app/prometheus/prometheus_alert_rules.yml"
scrape_configs:
- job_name: "prometheus-server-xzb"
static_configs:
- targets: ["localhost:9090"]
...
...
9.4 prometheus告警规则文件
##prometheus告警规则文件
vim /app/prometheus/prometheus_alert_rules.yml
groups:
- name: check_node_status
rules:
- alert: check_node_is_up
expr: up{instance="prometheus.oldboylinux.cn:9100", job="prometheus-all-node-exports"}==0
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 节点停止运行超过15s!!!"
9.5 检查规则
10. 容器监控
##监控容器
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --name=cadvisor --privileged --device=/dev/kmsg google/cadvisor:latest
##prometheus服务端的配置文件
vim /app/prometheus/prometheus.yml
...
...
- job_name: "prometheus-pushgateway"
static_configs:
- targets:
- "localhost:9091"
- job_name: "cadvisor-docker"
static_configs:
- targets:
- "docker01.oldboylinxu.cn:8080"
##hosts解析
##重启prometheus
10.1 检查
10.2 接入grafana
grafana id号:10619
原文地址:https://blog.csdn.net/qq_63826739/article/details/143649283
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!