监控架构-Prometheus-普罗米修斯

目录

1. Prometheus概述

2. Prometheus vs Zabbix 

3. Prometheus极速上手指南

3.1 时间同步 

3.2 部署Prometheus 

3.3 启动Prometheus

 3.4 Prometheus监控架构

 3.5 补充

 配置页面

简单过滤 

查看数据 

查看图形 

http://prometheus.oldboylinux.cn:9090/metrics显示所有键值

4. Prometheus配置

4.1 服务端命令行选项

4.2 配置文件

5. Prometheus的exporter 

5.1 概述

5.2 部署node_exporter

5.3 配置prometheus服务端

5.4 检查结果

5.5 prometheus动态配置文件 

 6. Prometheus过滤语句

6.1 基本过滤

6.2 包含条件的过滤 

过滤指定主机的数据

 过滤出所有主机非idle的指标.

6.3 小结 

6.4 常用函数 

rate函数

sum求和

count计数

其他函数

6.5 grafana中使用的 PromQL语句 

6.6 复杂语句

7. Pushgateway

7.1 使用流程

7.2 Pushgateway部署 

修改服务端配置文件

检查是否添加成功

7.3 书写脚本与提交数据

提交个测试数据

书写脚本 

检查结果 

脚本写入定时任务 

8. 进入Grafana

8.1 概述

8.2 使用流程 

添加数据源(别忘记hosts解析)

解决仪表盘没有数据 

数据不准

导入第三方仪表盘

9. Altermanager 告警

9.1 Alertmanager部署

9.2 Alertmanager配置

9.3 Prometheus配置

9.4 prometheus告警规则文件

9.5 检查规则

10. 容器监控

10.1 检查

 10.2 接入grafana

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进行展示

参考文章:

监控架构- 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

上一篇:centos7.9 挂载 windows server 2012R2 共享目录


下一篇:Git删除本地已经merge到远程的分支