基于Prometheus和Grafana搭建监控系统

修订

  • 2022-07-12: 增加https配置
  • 2022-09-16: 修改mysqld_exporter,增加postgres_exporter
  • 2022-09-27: 补充grafana配置

需求

原来只有家里一台服务器的时候还好,现在加了几台N1做的服务器,加上还有一些VPS,是时候上一套监控系统了。

之前是因为主服务器用的FreeBSD系统,跑Docker还要通过虚拟机,J1900的性能又不行,所以一直没搞。最近把主服务器换成了一台AMD的小主机(可惜不是Ryzen的),性能比J1900好多了——而且没有8G内存的限制。耗电虽然大一点,但也不过是跟以前的D525差不多。加上因为ZoL(ZFS on Linux)已经比较成熟,我就可以不再那么依赖FreeBSD,换成Debian 10,这样跑Docker就方便多了。于是可以开始了。

大致了解了一下,主流的监控方案是Zabbix和Prometheus,考虑到Prometheus更新一些,就选它了。

原理

基于Prometheus的监控系统架构是这样的:

  • 被监控主机上安装exporter(node_exporter监控系统,mysql_exporter监控mysql数据库,postgres_exporter监控pgsql数据库……),把需要监控的数据通过http暴露出来
  • Prometheus上配置任务从各个exporter源抓数据,存到内置的时序数据库里
  • Grafana(也可以用其它的)作为数据分析终端从Prometheus里抓数据生成监控仪表盘

安装Prometheus

首先是通过docker安装Prometheus。

docker pull prom/prometheus:master

准备一个存放时序数据库的路径:

mkdir -p /var/data/prometheus
chown nobody:nogroup /var/data/prometheus

配置Prometheus(比如~/prometheus.yml):

global:
  scrape_interval:     60s
  scrape_timeout:      60s
  evaluation_interval: 60s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]
        labels:
          instance: prometheus

  - job_name: n1svr1
    static_configs:
      - targets: ["192.168.0.xx:9100"]
        labels:
          instance: n1svr1

暂时只配置了两个监控源,一个是Prometheus本身,一个是一台N1服务器。9090是Prometheus的端口,9100是node_exporter的端口。

如果有多个监控源配置在同一服务器上(比如node和mysql),需要指定不同的路径:

  - job_name: n1svr1mysql
    metrics_path: mysqlmetrics
    static_configs:
      - targets: ["192.168.0.xx:9104"]
        labels:
          instance: n1svr1mysql

注意,默认是走http,如果用https,需要指定一下:

  - job_name: vps1
    scheme: https
    static_configs:
      - targets: ["vps.domain.com:443"]
        labels:
          instance: vps1

如果使用自签名证书,还需要忽略证书校验:

  - job_name: vps1
    scheme: https
    static_configs:
      - targets: ["vpsip:443"]
        labels:
          instance: vps1
    tls_config:
      insecure_skip_verify: true

现在可以把Prometheus跑起来了,为方便起见,用docker-compose。

docker-compose.yml文件:

version: '2'
services:
  prometheus:
    image: prom/prometheus:master
    container_name: prometheus
    volumes:
      - /var/data/prometheus:/prometheus
      - /home/yourname/prometheus.yml:/etc/prometheus/prometheus.yml

启动

docker-compose up -d prometheus

当然现在Prometheus只能收集自己的监控数据,N1那台还没通,而且数据查看也不方便,所以接下来先装Grafana。

安装Grafana

这是一个数据分析展现工具,功能强大——比Kibana强多了。

首先也是docker安装:

docker pull grafana/grafana:master

配置数据存放路径:

mkdir -p /var/data/grafana
chown 472:472 /var/data/grafana

472是容器里的grafana用户ID。不需要其它配置,直接配置启动——在docker-compose里加入:

  grafana:
    image: grafana/grafana:master
    container_name: grafana
    depends_on:
      - prometheus
    ports:
      - 3000:3000
    volumes:
      - /var/data/grafana:/var/lib/grafana

启动

docker-compose up -d grafana

现在可以用浏览器访问服务器的3000端口:http://your_ip:3000打开grafana的启动页面。

如果需要指定路径,则需要使用grafana的配置文件,创建一个grafana.ini

[server]
domain = yourdomain.com
root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana/
serve_from_sub_path = true

然后把这个文件挂载到镜像里的/etc/grafana/grafana.ini启动即可。

默认的登录用户名和密码都是admin,登录后修改一下。

成功登录后就可以在首页添加数据源,这里是添加Prometheus。指定路径为:http://prometheus:9090即可。

下一步是配置仪表盘,这事比较麻烦,就不自己做了,直接上网找现成的……

Grafana的Dashboard官网

选择数据源为Prometheus的,可以找到一堆,把需要的仪表盘ID复制起来(每个仪表盘页面上有一个按钮),然后到Grafana里找到:Dashboard-manage-import,然后把ID粘贴上去,即可自动下载这个仪表盘。

根据需要配置一下数据源什么的,即可导入并打开相应的仪表盘。

  • node监控我用这个中文版的,ID:11174
  • mysql监控我用了下载人数最多的,ID:7362

还有就是Grafana自带的Prometheus了。当然现在还只能看Prometheus的监控,其它的exporter源还没有。

安装node_exporter

官方的node_exporter的release页面选择你要的平台版本下载。比如N1用的就是linux-arm64版,注意不要搞错成linux-amd64版了。

最简单的方法就是用root用户身份运行,即可通过http://localhost:9100/metrics路径获取相关的监控数据,因为在内网,而且是个只读的链接,也没有什么敏感数据,就不作安全性的考虑了,直接用即可。

稍等即可在node的仪表盘看到相应的CPU,内存,硬盘使用情况了。

如果是外网的话,建议加一层https代理,当然还有更安全的配置方式就是双向证书,只是个人觉得必要性不大。

启动exporter建议使用supervisor或systemd,可以确保异常退出后能自动重启。

如需要绑定非默认端口或指定IP,可以使用命令参数:

node_exporter --web.listen-address="127.0.0.1:19100"

安装mysqld_exporter

同样是官方的mysqld_exporter的release页面,选择需要的版本。

在mysql里配置监控账号:

CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';

其中WITH MAX_USER_CONNECTION选项在部分版本mysql中不支持,可去掉。

然后把账号信息配置给exporter,创建~/.my.cnf:

[client]
user=exporter
password=XXXXXXXX

现在就可以启动exporter了:

mysqld_exporter --web.listen-address="127.0.0.1:9104" --web.telemetry-path=/mysqlmetrics --config.my-cnf=/root/.my.cnf

这里指定了绑定地址和端口、URL路径和配置文件路径(默认为.my.cnf可以不指定,.my.cnf也会被mysql命令行客户端默认使用,建议还是用不同的文件名指定)。

即可以通过http://localhost:9104/mysqlmetrics路径访问监控数据了。

安装postgres_exporter

还是官方的postgres_exporter的release页面,选择需要的版本。

postgres_expoter监控用的是默认账号postgres,如果是本机登录的话,默认是不需要密码的,但是如果是用docker跑的话,即使绑定了127.0.0.1,也是通过docker的网桥IP走的所以必须通过密码登录。因此,如果你不知道密码是啥的话,先到容器里通过本机登录后修改一下密码:

docker exec -it postgresql bash
> psql -Upostgres
psql> alter user postgres with password 'your_password';
psql> \q
> exit

当然你也可以修改pg_hba.conf允许docker host不用密码登录。

host all postgres 172.17.0.1/32 trust

172.17.0.1是docker host在网桥里的IP,如果用了自定义的网桥或docker-compose自动生成的网桥,则需要自己查看一下实际的地址。

现在就可以启动exporter了:

env DATA_SOURCE_URI="postgresql://postgres:your_password@localhost:5432/postgres?sslmode=disable" postgres_exporter --web.listen-address="127.0.0.1:9187" --web.telemetry-path=/pgsqlmetrics

这里指定了绑定地址和端口、URL路径。

即可以通过http://localhost:9187/pgsqlmetrics路径访问监控数据了。

推送到[go4pro.org]