Promethus(普罗米修斯)适合k8s和docker的监控系统


基本原理

Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker 。

普罗米修斯监控监控redis 普罗米修斯监控原理_mysql

它的服务过程是这样的Prometheus daemon负责定时去目标上抓取metrics(指标) 数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。

Prometheus:支持通过配置文件、文本文件、zookeeper、Consul、DNS SRV lookup等方式指定抓取目标。支持很多方式的图表可视化,例如十分精美的Grafana,自带的Promdash,以及自身提供的模版引擎等等,还提供HTTP API的查询方式,自定义所需要的输出。

Alertmanager:是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。

PushGateway:这个组件是支持Client主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据


架构图

如上图,通过 mysql_exporter 获取 MySQL 的监控数据,通过 node_exporter 获得 Linux 服务器的监控数据。将获得的监控数据传到 Prometheus 中,最终通过 Grafana 展示出来

普罗米修斯监控监控redis 普罗米修斯监控原理_mysql_02

监控exporter

Prometheus为了支持各种中间件以及第三方的监控提供了exporter,大家可以把它理解成监控适配器,将不同指标类型和格式的数据统一转化为Prometheus能够识别的指标类型。

例如Node exporter主要通过读取Linux的/proc以及/sys目录下的系统文件获取操作系统运行状态,reids exporter通过Reids命令行获取指标,mysql exporter通过读取数据库监控表获取MySQL的性能数据。他们将这些异构的数据转化为标准的Prometheus格式,并提供HTTP查询接口。


安装

普罗米修斯下载网址 安装到服务器上官网提供的是二进制版,解压就能用,不需要编译。选择Linux版本

普罗米修斯监控监控redis 普罗米修斯监控原理_运维_03

#下载完解压
tar xvfz prometheus-*.tar.gz
cd prometheus-*

prometheus.yml 配置解释

# my global config  控制着全局配置
global:
  # 默认情况下,每15s拉取一次目标采样点数据。
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  # 每15秒评估一次规则。默认值为每1分钟。
  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:
  # job名称会增加到拉取到的所有采样点上,同时还有一个instance目标服务的host:port标签也会增加到采样点上
  # 每添加一个exprter就添加一个job
  - job_name: 'prometheus'

    # 覆盖global的采样点,拉取时间间隔5s
    scrape_interval: 5s
    static_configs:
    - targets: ['localhost:9090']

启动服务

# 启动服务
[/usr/local/prometheus]# ./prometheus --config.file=prometheus.yml


# 指定配置文件
--config.file="prometheus.yml"
# 默认指定监听地址端口,可修改端口
--web.listen-address="0.0.0.0:9090" 
# 最大连接数
--web.max-connections=512
# tsdb数据存储的目录,默认当前data/
--storage.tsdb.path="data/"
# premetheus 存储数据的时间,默认保存15天
--storage.tsdb.retention=15d 
# 通过命令热加载无需重启 curl -XPOST 192.168.2.45:9090/-/reload
--web.enable-lifecycle
# 可以启用 TLS 或 身份验证 的配置文件的路径
--web.config.file=""


启动选项了解:./prometheus --help

访问服务

http://localhost:9090

查看监控的属性

http://localhost:9090/metrics

以图的方式查看监控的属性

查询指令:promhttp_metric_handler_requests_total

普罗米修斯监控监控redis 普罗米修斯监控原理_linux_04

普罗米修斯监控监控redis 普罗米修斯监控原理_运维_05

客户端安装node_exporter监控适配器

Node exporter主要通过读取Linux的/proc以及/sys目录下的系统文件获取操作系统运行状态。

普罗米修斯监控监控redis 普罗米修斯监控原理_linux_06

  • 安装
# tar xf node_exporter-1.1.2.linux-amd64.tar.gz -C /usr/local/
# mv node_exporter-1.1.2.linux-amd64/ node_exporter
  • 开启服务
# 直接启动
[root@VM_2-44 /usr/local/node_exporter]# ./node_exporter &
# & 表示开启后运行在后台
# 启动后会监听9100端口


# 添加为服务方式启动
# vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target 

[Service]
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target

# 启动node_exporter
systemctl daemon-reload
systemctl start node_exporter
  • 添加配置项-服务端配置文件添加监控项 即:prometheus.yml

在scrape_configs:区域添加如下配置

- job_name: 'linux'
    static_configs:
    - targets: ['ip:9100','192.168.1.2:9100'] # 多个用,分开
  • 重启普罗米修斯
./prometheus --config.file=prometheus.yml
或者 systemctl restart prometheus.service

打开普罗米修斯自带的监控页面,Status -> Targets 查看:

普罗米修斯监控监控redis 普罗米修斯监控原理_mysql_07

客户端安装mysql_exporter监控适配器

下载位置同上

需要添加配置文件 详情见GitHub网站

(base) wuliuqi@wuliuqi:~/Documents/mysqld_exporter$ vim .my.cnf
(base) wuliuqi@wuliuqi:~/Documents/mysqld_exporter$ cat .my.cnf 
[client]
user=root
password=123456789
  • 启动mysqld-exporte
# 直接启动
(base) wuliuqi@wuliuqi:~/Documents/mysqld_exporter$ ./mysqld_exporter --config.my-cnf=".my.cnf" 
(base) wuliuqi@wuliuqi:~/Documents$ ss -lntp |grep 4647
(base) wuliuqi@wuliuqi:~/Documents$ ps -ef |grep exporter
wuliuqi     8809    8679  0 19:15 pts/2    00:00:07 ./node_exporter
wuliuqi    11328   11228  0 20:16 pts/4    00:00:00 ./mysqld_exporter --config.my-cnf=.my.cnf
wuliuqi    11401   11092  0 20:16 pts/3    00:00:00 grep --color=auto exporter
(base) wuliuqi@wuliuqi:~/Documents$ ss -lntp |grep 11328
LISTEN    0         4096                     *:9104                   *:*        users:(("mysqld_exporter",pid=11328,fd=3)) 
#	启动会监控 9104端口
  • 普罗米修斯配置文件添加监控项后重启
- job_name: 'mysql'
    static_configs:
    - targets: ['locahost:9104']  
# 此处监控本机 需要可以换成其他主机ip地址
  • 重启普罗米修斯
systemctl restart prometheus.service

普罗米修斯监控监控redis 普罗米修斯监控原理_普罗米修斯监控监控redis_08

部署 Grafana

参考博客: https://cloud.tencent.com/developer/article/1986945

Ubuntu 系统安装

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_9.4.7_amd64.deb
sudo dpkg -i grafana-enterprise_9.4.7_amd64.deb

登录(账号:admin 密码:admin)http://localhost:3000/ 用户名密码都是 admin。登录后,会让我们修改密码,则按提示操作即可,当然也可以点击跳过。

这里就可以看到 Grafana 的主界面了:

普罗米修斯监控监控redis 普罗米修斯监控原理_linux_09

为 Grafana 配置 Prometheus 数据源

  • 选择左下角配置选项
  • 添加普罗米修斯数据源
  • 增加 Prometheus 的 URL 即可:

普罗米修斯监控监控redis 普罗米修斯监控原理_linux_10


点击最下方的 Save & Test,显示“Data source is working”,则表示数据源配置正常:

普罗米修斯监控监控redis 普罗米修斯监控原理_prometheus_11

Grafana 展示node_exporter监控数据

按照下图的方式进入模板导入界面:

普罗米修斯监控监控redis 普罗米修斯监控原理_linux_12

  • 在 “Import via grafana.com” 下方输入:11074
    点击 Load 会出现如下界面:

将 Name 改成你希望定义的名字,在 VictoriaMetrics 位置选择之前创建的 Prometheus 数据源,如下图:

普罗米修斯监控监控redis 普罗米修斯监控原理_运维_13


点击 “Import”,会自动跳转到如下界面:

普罗米修斯监控监控redis 普罗米修斯监控原理_运维_14

到这里,完成了 Grafana 展示 Prometheus 中 Linux 操作系统的监控数据。

Grafana 展示 MySQL 的监控数据

按照下图的方式进入模板导入界面:

在 “Import via grafana.com” 下方输入 7362

或者在 https://grafana.com/grafana/dashboards/7362 页面下载 JSON 模板,然后点击 “Upload JSON file” 导入,然后会显示如下信息(目前还有其他一些模板,比如 https://github.com/percona/grafana-dashboards,有兴趣的可以尝试一下):

普罗米修斯监控监控redis 普罗米修斯监控原理_运维_15


普罗米修斯监控监控redis 普罗米修斯监控原理_mysql_16

显示效果如下:

普罗米修斯监控监控redis 普罗米修斯监控原理_mysql_17