文章目录

  • 关于Prometheus
  • 介绍
  • 数据格式与实例
  • 四种数据类型
  • promql
  • 相关组件
  • Centos7 安装 Prometheus
  • Centos7 安装 Go 环境
  • Centos7 安装 Prometheus
  • 配置 Prometheus
  • 启动与使用
  • Centos7 安装与配置 Grafana
  • 安装 Grafana
  • 配置数据源
  • dashboards
  • Prometheus + Grafana 监控案例
  • 监控 Linux 服务器
  • 监控 mysql
  • 监控 redis
  • 监控 kafka
  • 监控 Nginx
  • 监控业务
  • Prometheus 查询
  • 参考


关于Prometheus


介绍

1、prometheus 存储的是时序数据,适合监控一些随时间变化的场景

2、原理:通过HTTP协议周期性抓取(Pull方式)被监控组件的状态,好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境,比如VM或者Docker。输出被监控组件信息的Http接口叫exporter。

3、特点

Prometheus Server 负载定时在目标上抓取 metrics(指标)数据,每个抓取目标都需要暴露一个 HTTP 服务接口用于 Prometheus 定时抓取。这种调用被监控对象获取监控数据的方式被称为 Pull(拉)。Pull 方式体现了 Prometheus 独特的设计哲学与大多数采用 Push(推)方式的监控不同

Pull 方式的优势是能够自动进行上游监控和水平监控,配置更少,更容易扩展,更灵活,更容易实现高可用。简单来说就是 Pull 方式可以降低耦合。由于在推送系统中很容易出现因为向监控系统推送数据失败而导致被监控系统瘫痪的问题。所以通过 Pull 方式,被采集端无需感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制

4、时序(time series)是由名字(Metric)以及一组key/value标签定义的,具有相同的名字以及标签属于相同时序

5、metric名字:表示metric的功能,如 http_request_total

数据格式与实例

1、数据格式:<metric name>{<label name>=<label value>, ...}

2、实例

up{job="<job-name>", instance="<instance-id>"}: 1 表示该实例正常工作
up{job="<job-name>", instance="<instance-id>"}: 0 表示该实例故障

四种数据类型

1、Counter

Counter用于累计值,例如记录请求次数、任务完成数、错误发生次数。一直增加,不会减少。重启进程后,会被重置。

http_response_total{method=”GET”,endpoint=”/api/tracks”} 100

2、Gauge

Gauge 瞬时数据,比如内存使用率、CPU使用率等。

3、Histogram

<basename>_bucket{le="<upper inclusive bound>"}
<basename>_bucket{le="+Inf"} 
<basename>_sum
<basename>_count

Histogram(直方图)可以理解为柱状图的意思,常用于跟踪事件发生的规模,例如:请求耗时、响应大小。它特别之处是可以对记录的内容进行分组,提供count和sum全部值的功能。

4、Summary

<basename>{quantile="<φ>"}
<basename>_sum
<basename>_count

Summary和Histogram十分相似,常用于跟踪事件发生的规模,例如:请求耗时、响应大小。同样提供 count 和 sum 全部值的功能。

count=7次,sum=7次的值求值。

它提供一个quantiles的功能,可以按%比划分跟踪的结果。例如:quantile取值0.95,表示取采样值里面的95%数据。

promql

做查询 与 报警

相关组件

参考:https://baijiahao.baidu.com/s?id=1689945188583938997&wfr=spider&for=pc

1、Prometheus Server:Prometheus 的核心部分,负责实现对监控数据的获取,存储以及查询;

  • 静态或动态的配置管理监控目标;
  • 本身具有时序数据库的功能;
  • 对外提供自定义的 PromQL 语言,可以查询分析;
  • 内置 Express Browser UI, 可以通过该 UI 用 PromQL 实现数据的查询以及可视化

2、push gateway:接收由 Client push 过来的指标数据,在指定的时间间隔,由主程序来抓取;

Prometheus Server 与 Exporter 无法直接通信时,可以利用 PushGateway 来进行中转。

3、Exporter:采集数据,并通过 HTTP 服务的形式暴露给 Prometheus Server;

例子:node_exporter、mysqld_exporter、haproxy_exporter 等。

4、Alertmanager:Prometheus 体系中的告警处理中心;

Prometheus Server 中支持基于 PromQL 创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由 AlertManager 进行管理;

可以邮件、webhook 等方式预警。

Centos7 安装 Prometheus


参考:

Centos7 安装 Go 环境

wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz    #下载包
sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz    #解压包
sudo vim /etc/profile  #打开环境变量配置文件,写入如下内容(位置根据实际的存放位置为准)
export GO_HOME=/usr/local/go
export PATH=$GO_HOME/bin:$PATH
source /etc/profile   # 重启环境变量
go version    #查看版本号验证是否安装成功

Centos7 安装 Prometheus

cd /usr/software

wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-amd64.tar.gz

tar -zxvf prometheus-2.26.0.linux-amd64.tar.gz  -C /usr/local/

配置 Prometheus

官网说明:https://prometheus.io/docs/prometheus/latest/configuration/configuration/

https://www.jianshu.com/p/b9d15f236e02

global:全局配置
alerting:Alertmanager相关配置
rule_files:规则文件列表,使用’evaluation_interval’ 参数抓取
scrape_configs:抓取配置列表

cd /usr/local/prometheus-2.26.0.linux-amd64
vim  prometheus.yml  

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

启动与使用

1、启动

注意:prometheus 没有自带任何加密措施,因此尽量不要暴露所使用的端口,通过 grafana去查看监测数据,实在要用 prometheus 的UI 的话,可以做 Nginx 加密;

# 后台启动,并修改开放端口
nohup ./prometheus --config.file=prometheus.yml --web.enable-lifecycle  --web.listen-address=:19908 & 
# 查看启动状态
ps -ef | grep prometheus 
lsof -i:19908

# 查看启动的命令行参数
./prometheus -h

2、常用启动参数

# 启动使用的配置文件
--config.file=prometheus.yml
# 是否启用 API,启用API后,可以通过 API指令完成 Prometheus 的 停止、热加载配置文件 等
--web.enable-lifecycle
# 服务监听端口
--web.listen-address=:19908
# 是否启用 admin api 的访问权限(TSDB管理API)
--web.enable-admin-api
# 保留数据的天数
--storage.tsdb.retention.time=7d

3、API

# 查看当前配置
curl http://localhost:9090/api/v1/status/config

# 使修改后的配置生效
curl -XPOST http://localhost:19908/-/reload

4、强行关闭 Prometheus

lsof -i:19908
kill -9 pid

Centos7 安装与配置 Grafana


官网:https://grafana.com/grafana/download

配置文件说明:

Dashboards :https://grafana.com/grafana/dashboards

安装 Grafana

wget https://dl.grafana.com/oss/release/grafana-7.5.3-1.x86_64.rpm
sudo yum install grafana-7.5.3-1.x86_64.rpm
yum clean all

vim /etc/grafana/grafana.ini
# 编辑
http_port = 13818
# 保存

systemctl enable grafana-server
systemctl start grafana-server

访问 ip:13818

配置数据源

访问 ip:3000,初始用户名和密码都是 admin,修改新密码后进入

1、点击 Configuration -> Add data source
2、选择 Prometheus
3、Dashboards 选择 Prometheus 2.0 Stats ,Import
4、Settings 写入 Prometheus 的 IP 和 端口,我这里写为 http://localhost:19908
5、点击 Save & Test
6、进入 Dashboards,选择 prometheus-2-0-stats,即可看到监控数据

dashboards

网址:https://grafana.com/grafana/

服务器推荐:https://grafana.com/grafana/dashboards/8919

Docker 推荐:https://grafana.com/grafana/dashboards/8321

Prometheus + Grafana 监控案例


exporter 案例:https://prometheus.io/docs/instrumenting/exporters/

监控 Linux 服务器

参考: https://www.jianshu.com/p/7bec152d1a1f

1、被监控服务器 同步时间

yum install ntpdate -y

ntpdate  ntp5.aliyun.com

date # 或 timedatectl

2、在被监控的机器下载与安装 node_exporter

查看最新 Release:

https://github.com/prometheus/node_exporter/

cd /usr/software

wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz

tar -zxvf node_exporter-1.1.2.linux-amd64.tar.gz -C /usr/local/

3、启动 node_exporter

命令启动 (不推荐):

cd /usr/local/node_exporter-1.1.2.linux-amd64

nohup ./node_exporter --web.listen-address=:19918 &

启动参数:

#node_exporter监听的端口,默认是9100,若需要修改则通过此参数。
--web.listen-address=":19918"  

#获取metric信息的url,默认是/metrics,若需要修改则通过此参数
--web.telemetry-path="/metrics"  

#设置日志级别
--log.level="info" 

#设置打印日志的格式,若有自动化日志提取工具可以使用这个参数规范日志打印的格式
--log.format="logger:stderr"

做成系统服务并启动 (优秀教程:)

# centos 7.9
cat > /usr/lib/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter-1.1.2.linux-amd64/node_exporter --web.listen-address=:19918
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /usr/lib/systemd/system/node_exporter.service

systemctl daemon-reload && systemctl enable node_exporter.service && systemctl start node_exporter.service
systemctl daemon-reload && systemctl restart node_exporter.service && systemctl status node_exporter
systemctl status node_exporter

# ubuntu 14.04 
cd /usr/local/node_exporter-1.1.2.linux-amd64

nohup ./node_exporter --web.listen-address=:19918 &

# ubuntu 18.04 
su # 进入 root

cat > /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter-1.1.2.linux-amd64/node_exporter --web.listen-address=:19918
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /etc/systemd/system/node_exporter.service

systemctl daemon-reload && systemctl enable node_exporter.service && systemctl start node_exporter.service
systemctl daemon-reload && systemctl restart node_exporter.service && systemctl status node_exporter
systemctl status node_exporter

查看监控指标:

curl http://localhost:19918/metrics;

# 简单的指标说明:

node_boot_time: 系统启动时间
node_cpu: 系统CUP使用情况
node_disk_*: 磁盘io
node_filesystem_*: 文件系统使用量
node_load1: 系统负载
node_memory_*: 系统内存使用量
node_network_*: 网络宽带
node_time: 当前系统时间
go_*: node exporter中go相关指标
*process_ :**node exporter自身进程相关指标

5、prometheus 的配置文件添加监控项

Centos机器 29 台:

172、173、174、175、176、177、178、179、180、181、182、183、184、185、
186、·187、188、189、190、197、198

89、91、93、94

下载的四台

Ubuntu机器 13 台:

164、165、166、168、169、170、171
85、86、87、88、90、92

cd /usr/local/prometheus-2.26.0.linux-amd64
vim  prometheus.yml  

- job_name: 'server_91'
  crape_interval: 8s
  static_configs:
  - targets: ['192.168.10.106:19918']
    labels:
      instance: Prometheus
# 保存

# 热重启 Prometheus
curl -XPOST http://localhost:19908/-/reload

6、导入 dashboard

Dashboards -> Manage -> Import -> mport via grafana.com -> 输入8919 -> 点击 load

监控 mysql

参考:

1、在被监控的mysql所在的服务器安装 mysql_export

cd /usr/software

wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz

tar -zxvf mysqld_exporter-0.12.1.linux-amd64.tar.gz -C /usr/local/

2、配置 被监控机器的 mysql

mysql -u root -p

CREATE USER 'mysql_exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'localhost';

cd /usr/local/mysqld_exporter-0.12.1.linux-amd64

vim .my.cnf

[client]
user=mysql_exporter
password=123456

3 、启动 mysql_export

命令启动(不推荐)

cd /usr/local/mysqld_exporter-0.12.1.linux-amd64

# 如需修改端口,可加参数 --web.listen-address=:9104(默认是9104)
nohup ./mysqld_exporter --config.my-cnf=.my.cnf &

curl http://localhost:9104/metrics

做成系统服务启动

# centos 7.9
cat > /usr/lib/systemd/system/mysqld_exporter.service << EOF
[Unit]
Description=mysqld_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter-1.1.2.linux-amd64/node_exporter --config.my-cnf /usr/local/mysqld_exporter-0.12.1.linux-amd64/.my.cnf 
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /usr/lib/systemd/system/mysqld_exporter.service

systemctl daemon-reload && systemctl enable mysqld_exporter.service && systemctl start mysqld_exporter.service && systemctl status mysqld_exporter
systemctl daemon-reload && systemctl restart mysqld_exporter.service && systemctl status mysqld_exporter
systemctl status mysqld_exporter

4、配置 Prometheus 配置文件,并热重启

- job_name: 'mysql'
    static_configs:
    - targets: ['xxx.xxx.xx.164:9104','xxx.xxx.xx.165:9104','xxx.xxx.xx.166:9104']
curl -XPOST http://localhost:19908/-/reload

5、在 Grafana 中 添加 dashboard

Dashboards -> Manage -> Import -> mport via grafana.com -> 输入7362-> 点击 load

监控 redis

1、在要被监控的redis 所在的机器上下载与安装 redis_exporter

cd /usr/software/

wget https://github.com/oliver006/redis_exporter/releases/download/v1.20.0/redis_exporter-v1.20.0.linux-amd64.tar.gz

tar -zxvf  redis_exporter-v1.20.0.linux-amd64.tar.gz -C  /usr/local

2 、启动 redis_exporter

命令启动(不推荐)

cd /usr/local/redis_exporter-v1.20.0.linux-amd64

# 如需修改端口,可加参数 --web.listen-address=:9121(默认是9121)
nohup ./redis_exporter -redis.addr localhost:6379 -redis.password 123456 &

curl http://localhost:9121/metrics

做成系统服务启动

# centos 7.9
cat > /usr/lib/systemd/system/redis_exporter.service << EOF
[Unit]
Description=redis_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/redis_exporter-v1.20.0.linux-amd64/redis_exporter -redis.addr=IP:6379  -redis.password=passwd 
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /usr/lib/systemd/system/redis_exporter .service

systemctl daemon-reload && systemctl enable redis_exporter .service && systemctl start redis_exporter .service && systemctl status redis_exporter 
systemctl daemon-reload && systemctl restart redis_exporter .service && systemctl status redis_exporter 
systemctl status redis_exporter

4、配置 Prometheus 配置文件,并热重启

- job_name: redis_exporter
    static_configs:
    - targets: ['xxx.xxx.xx.85:9121','xxx.xxx.xx.86:9121']
curl -XPOST http://localhost:19908/-/reload

5、在 Grafana 中 添加 dashboard

Dashboards -> Manage -> Import -> mport via grafana.com -> 输入763-> 点击 load

https://grafana.com/dashboards/763/revisions

监控 kafka

1、在被监控的kafka集群所在的任意一台服务器安装 kafka_exporter

cd /usr/software

wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.2.0/kafka_exporter-1.2.0.linux-amd64.tar.gz

tar -zxvf kafka_exporter-1.2.0.linux-amd64.tar.gz  -C /usr/local/

2、启动 kafka_exporter

命令启动(不推荐)

cd /usr/local/kafka_exporter-1.2.0.linux-amd64

# 如需修改端口,可加参数 --web.listen-address=:9308(默认是9308)
nohup ./kafka_exporter --kafka.server=localhost:9308 &

curl http://localhost:9308/metrics

做成系统服务启动

# centos 7.9
cat > /usr/lib/systemd/system/kafka_exporter.service << EOF
[Unit]
Description=kafka_exporter
Documentation=https://prometheus.io/
After=local-fs.target network-online.target network.target
Wants=local-fs.target network-online.target network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter-1.1.2.linux-amd64/node_exporter --kafka.server=localhost:9096
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

chmod 754 /usr/lib/systemd/system/kafka_exporter.service

systemctl daemon-reload && systemctl enable kafka_exporter.service && systemctl start kafka_exporter.service && systemctl status node_exporter
systemctl daemon-reload && systemctl restart kafka_exporter.service && systemctl status kafka_exporter
systemctl status node_exporter

3、配置 Prometheus 配置文件,并热重启

- job_name: 'kafka'
    static_configs:
    - targets: ['xxx.xxx.xx.170:9308']
curl -XPOST http://localhost:19908/-/reload

4、在 Grafana 中 添加 dashboard

7589、10466、11963

Dashboards -> Manage -> Import -> mport via grafana.com -> 输入7589-> 点击 load

监控 Nginx

参考: https://it.baiked.com/nginx/2697.html

promethues监控nginx可选两个exporter,通过nginx_exporter主要是获取nginx-status中的内建的指标,nginx自身提供status信息,较为简单,promethues中对应的metrics也较少,想要监控更多的指标可以通过nginx-vts-exporter采集信息,依赖在编译nginx的时候添加nginx-module-vts模块来实现。

nginx virtual host traffic status模块是nginx第三方模块之一,vts提供了访问虚拟主机状态的信息,包含server,upstream以及cache的当前状态,类似于NGINX Plus 提供的在线活动监控功能。

1、安装 nginx-exporter

docker pull fish/nginx-exporter

docker run -it fish/nginx-exporter

# 新开一个终端
docker ps|grep nginx-exporter

docker cp 容器ID:/usr/local/bin/nginx_exporter /opt/

# 执行成功则说明安装成功
/opt/nginx_exporter --help

# 退出容器

mkdir -p /etc/nginx_exporter/bin/
mv /opt/nginx_exporter /etc/nginx_exporter/bin/

2、配置 nginx

vi /etc/nginx/sites-enabled/status.conf
server {
       listen 8011;
       server_name localhost;
       location /nginx_status {
           stub_status on;
           access_log off;
           allow 127.0.0.1;
       }
}
nginx -s reload
/etc/nginx/sites-enabled# curl 127.0.0.1:8011/nginx_status

3、封装为系统 service

vim /lib/systemd/system/nginx_exporter.service
[Unit]
Description=nginx monitor
After=network.target

[Service]
ExecStart=/etc/nginx_exporter/bin/nginx_exporter -nginx.scrape_uri="http://127.0.0.1:8011/nginx_status"
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable nginx_exporter.service
systemctl start nginx_exporter.service

netstat -anpt|grep nginx_exporte

curl 127.0.0.1:9113/metrics

4、配置 Prometheus

cd /usr/local/prometheus-2.26.0.linux-amd64
vim  prometheus.yml  

- job_name: nginx_exporter
   static_configs:
   - targets: ['192.168.10.139:9113']

# prometheus 热重启
curl -XPOST http://localhost:19908/-/reload

监控业务

Prometheus 查询


http_requests_total
http_requests_total{code="200", handler="query"}
http_requests_total{code~="2xx"}
http_requests_total > 100
http_requests_total[5m]
count(http_requests_total)
sum(http_requests_total)
avg(http_requests_total)
topk(3, http_requests_total)
irate(http_requests_total[5m])

参考


prometheus 中文指南:https://yunlzheng.gitbook.io/prometheus-book/

Prometheus 官方文档:https://prometheus.io/docs/introduction/overview/

Grafana 官方文档:http://docs.grafana.org/

全面学习Prometheus:http://dockone.io/article/5716?tdsourcetag=s_pcqq_aiomsg

Prometheus 非官方中文手册:https://www.bookstack.cn/read/prometheus-manual/README.md

Prometheus 实战:https://songjiayang.gitbooks.io/prometheus/content/

prometheus-book:https://yunlzheng.gitbook.io/prometheus-book/

Grafana的一些实用技巧: