前言

应该是在去年的时候,部门的老师和我提过 Zabbix 和 Prometheus ,当时没有什么监控的需求就只是大概看了一下,到了今年 6 月的时候,因为正好新增了对象存储 MinIO ,这个要想看具体状态就需要 Prometheus ,本来是想装 Zabbix 的,但是成功被它的最低配置要求劝退了😂,于是就准备上 Prometheus 咯

image-20230819131122308

Prometheus 和 Grafana 安装是非常简单的,莫要害怕

安装 Prometheus

下载地址:https://prometheus.io/download/ ,生产环境建议安装 LTS 的稳定版本

# 下载并解压 Prometheus
cd /opt
# 生产环境建议安装 LTS 的稳定版本,自行尝试时请访问官网确定最新稳定版本的链接
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.darwin-amd64.tar.gz
tar -xvf prometheus-2.45.0.darwin-amd64.tar.gz
mv prometheus-2.45.0.darwin-amd64 prometheus
# 设置开机启动,这里使用 screen + crontab 的组合,方便调试,也可根据个人喜好使用 nohup
nano /root/prometheus.sh
# 写上以下内容

# ----- /root/prometheus.sh start -----
# /bin/sh
screen_name="prometheus"
screen -dmS $screen_name
cmd1="cd /opt/prometheus"
cmd2="./prometheus"
screen -x -S $screen_name -p 0 -X stuff "$cmd1"
screen -x -S $screen_name -p 0 -X stuff $'\n'
screen -x -S $screen_name -p 0 -X stuff "$cmd2"
screen -x -S $screen_name -p 0 -X stuff $'\n'
# ----- /root/prometheus.sh EOF -----

防火墙放开相关端口(默认 9090 )

浏览器访问 IP:9090/targets?search= 应当看到如下页面

image-20230819133758432

如果有需要可以加认证措施如 Basic Auth ,请有需要的同学网上学习,这里不表

安装 Grafana

访问 Grafana 官网下载对应平台的包安装:https://grafana.com/grafana/download?pg=graf&platform=linux&plcmt=deploy-box-1

如有需要,可使用清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/grafana/

下载并安装,设置开机自启

wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.0.3-1.x86_64.rpm
yum install -y grafana-enterprise-10.0.3-1.x86_64.rpm
systemctl start grafana-server
systemctl enable grafana-server

防火墙放通相关端口(默认 3000 )

浏览器访问 IP:3000 应当看到如下页面

image-20230819133835326

默认登录密码为:admin/admin ,登录后会提示修改

右上角 头像-个人资料 里面可以设置时区并选择简体中文语言

对接 Prometheus 和 Grafana

Grafana 菜单-管理-数据源-Add new data source 如下图设置,然后最下面 Save & Test

image-20230819133858212

监控 MinIO

监控 MinIO 需要使用 mc 客户端不是辣个mc

需要先设置一个 alias (添加自己的 MinIO 平台,设置别名,可参照官方文档),然后确认可以看到自己的存储

PS C:\> .\mc.exe alias list
LuckyOSS
URL : https://wdv3.luckykeeper.site:44443
AccessKey : <AccessKey>
SecretKey : <SecretKey>
API : s3v4
Path : auto

然后即可添加 Prometheus 监控

S C:\> .\mc.exe admin prometheus generate LuckyOSS
scrape_configs:
- job_name: minio-job
bearer_token: <bearer_token>
metrics_path: /minio/v2/metrics/cluster
scheme: https
static_configs:
- targets: ['wdv3.luckykeeper.site:44443']

复制配置到 Prometheus.yml ,然后重启,就能在 target 里面看到这个配置

然后在 Grafana 里面用 ID 添加 MinIO 官方提供的仪表盘:https://grafana.com/grafana/dashboards/13502-minio-dashboard/

就能够看到非常详细的 MinIO 状态啦

image-20230819134835946

(图片里面只展示了部分,想看更多不妨自己搭一套试试康,我的仪表盘很大你忍一下

监控 PVE

Prometheus 的话,基本上就是本体加上一堆 Exporter ,PVE 的话,我们需要这个:https://github.com/prometheus-pve/prometheus-pve-exporter ,Python 写的,直接用 pip 装上即可

python3 -m pip install prometheus-pve-exporter

在 PVE 里面,我们创建一个有审计权限的账号(角色:PVEAuditor),认证领域:pve(和 root 的 pam 是不一样的)

pve-exporter 的 yml 这么写

default:
user: <username>@pve
password: <password>
# Optional: set to false to skip SSL/TLS verification
verify_ssl: false

Prometheus 里面的 yml 这么写

# PVE exporter.
- job_name: 'pve'
static_configs:
- targets:
- <node_IP> # Proxmox VE node IP,记得替换,如:192.168.1.2.
metrics_path: /pve
params:
module: [default]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9221 # exporter 的监听地址,我这里和 Prometheus 在同一台机器上面,所以是 localhost

相应的仪表盘是这个:https://grafana.com/grafana/dashboards/10347-proxmox-via-prometheus/

image-20230819140355462

(同样,图片里面只展示了部分,想看更多不妨自己搭一套试试康,我的仪表盘很大你忍一下

奇淫技巧:用 SQL 生成监控指标

对于开发时没有考虑到做 Exporter ,当然也要办法在不改动代码的前提下把指标监控起来,就是这个,锵锵!

https://github.com/albertodonato/query-exporter

只要我们有数据库就可以写 SQL 去导数据作为监控指标

安装

演示采用 Docker 安装,首先安装 Docker 环境,同时使用了我写的 NoaHandler 综合业务网关,各位可以准备自己的程序来做测试

image-20230819141051543
yum install -y docker
systemctl start docker && systemctl enable docker
firewall-cnd --reload

准备配置文件 config.yaml

mkdir -p /opt/query-exporter/ && cd /opt/query-exporter/
nano config.yaml
# 这里根据 noaHandler 编写了以下模板,下面将会讲解该模板及注意事项
# 请至少修改里面的 [dsn] 数据库连接方式

# ----- /opt/query-exporter/config.yaml start -----
databases:
noa:
dsn: mysql://mysql账号:mysql密码@服务器IP:3306/noaHandler
labels:
region: Dev
app: noaHandler

metrics:
token_number:
type: gauge
description: total number of tokens of noaHandler

queries:
q_token_number:
interval: 5
databases: [noa]
metrics: [token_number]
sql: |
SELECT COUNT(token) AS token_number FROM noahandler.noahandler_token
# ----- /opt/query-exporter/config.yaml EOF -----

该 YAML 文件的详细讲解如下

# 数据库字段
databases:
# 数据库的名称,要和下面 queries 部分对应。可以是多个数据库
noa:
# 数据库连接信息,参考:https://docs.sqlalchemy.org/en/20/core/engines.html#mysql
dsn: mysql://mysql账号:mysql密码@服务器IP:3306/noaHandler
# 该数据库的标签,根据实际情况修改
labels:
region: Dev
app: noaHandler

# metrics 字段,对应 Prometheus 的指标
metrics:
# 注意这里的名字,很重要,下面 queries 查询出来的返回结果必须和它一致,很容易犯错误,Issues 里面也有不少问这个问题的,关键词:Wrong column names from query
token_number:
# 指标类型,有四种 counter/enum/gauge/histogram/sunnary ,请查看 GitHub 项目 Readme 学习
type: gauge
# 对该指标的描述
description: total number of tokens of noaHandler

# queries 字段,去数据库查询的内容
queries:
# 一条查询,这里可以随意写一个,不要冲突就好
q_token_number:
# 查询间隔
interval: 5
# 要查询的数据库,对应 databases 字段
databases: [noa]
# 查询结果对应的指标
metrics: [token_number]
# SQL 语句,注意要使用 AS 来使得返回结果与上面在 metrics 里面的指标的名称对应,否则就会 "Wrong column names from query"
sql: |
SELECT COUNT(token) AS token_number FROM noahandler.noahandler_token

配置完成后将服务跑起来

docker run --restart=always -p 9560:9560/tcp -v "/opt/query-exporter/config.yaml:/config.yaml" -it adonato/query-exporter:latest

观察输出结果,没有问题可 Ctrl+C ,也可在浏览器观察,打开 IP:9560/metrics

token_number{app="noaHandler",database="noa",region="Dev"} 4.0

能够获取到当前数据库中通用业务流的 token 数量为4(截图时已经搭建完成并创建了4个 token)

对接 Prometheus

修改 Prometheus 的配置文件 prometheus.yml 并重启 Prometheus

该部分的配置如下:

- job_name: "query-exporter"

static_configs:
- targets: ["服务器IP:9560"]

之后可以在 Prometheus 的 Target 下看到 query-exporter 的 Endpoint

image-20230819140935052

验证:在 Grafana 创建仪表盘并观察监控情况

在 Grafana 创建新仪表盘,Metric 指标选择刚刚创建的 token_number ,job 选择 query-exporter 唯一选出该指标

image-20230819140952120

而后执行 ./noaHandler gt normal 生成 token ,我们能够观察 token_number 指标不断增加,我们成功的采集到了该项业务指标!如果需要告警则配置 Grafana 的警告规则,如邮件告警等