上一篇介绍了如何用Grafana+InfluxDB+Telegraf来搭建监控平台,趁热打铁,这一篇我们采用Grafana+Prometheus来搭建监控平台,似乎现在应用Prometheus来搭建监控系统的更广泛。为了方便部署,本篇直接使用Docker Compose安装

搭建Prometheus

Prometheus对于系统平台监控业务做的非常专业,它是一个套件,集成了时序数据存储,灵活的采集及强大的查询等功能。本篇不深入介绍功能和原理,我们先把功能搭建起来:

  • 我们来编写Docker Compose脚本,需要映射9090端口,另外建议把配置文件”prometheus.yml”挂载出来
services:
  prometheus:
    container_name: prometheus
    image: prom/prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - net-prom
  
networks:
  net-prom:
  • 这里采用相对路径挂载”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']
      labels:
        instance: prometheus
  • 可以先用$ docker-compose up -d启动试试,然后打开浏览器,访问http://yourserver:9090/graph,你可以看到下面这个查询界面

Prometheus Graph

部署Node Exporter

Node Exporter上一篇介绍的Telegraf一样,负责主机端的数据收集,预置了很多收集项,足够我们使用了。

  • 先编写Docker Compose脚本
services:
  node-exporter:
    container_name: node-exporter
    image: prom/node-exporter
    restart: always
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    networks:
      - net-ne

networks:
  net-ne:
  • 需要映射9100端口,另外将主机的几个主要目录挂载到容器里,这样Node Exporter可以获取数据。这里用”ro”标志目录只读

  • 启动下容器试一试,访问http://yourserver:9100/metrics,你可以看到下面这个数据采集的页面

Node Exporter Metrics

  • 要将采集的数据传到Prometheus,需告知Prometheus服务Node Exporter的数据端口,这样Prometheus就会启动Job作业去抓取数据。这里,我们需要配置”prometheus.yml”,在”scrape_configs”项里添加一个Job
scrape_configs:
  - job_name: 'server'
    static_configs:
    - targets: ['yourserver:9100']
      labels:
        instance: server1
  • 注意,即便是监控本机,也不能用localhost,因为localhost指向Prometheus容器,而不是宿主机。

  • 配置完,重启Prometheus后,访问http://yourserver:9090/targets,查看下刚才配的”server”采集Job是否是”UP”状态

Prometheus Targets

安装Grafana

这个我们上一篇介绍过,Docker Compose脚本如下

services:
  grafana:
    container_name: grafana
    image: grafana/grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - ./grafana-data:/var/lib/grafana
    networks:
      - net-prom
    links:
      - prometheus

注意,这里的”networks”需同Prometheus一致,并且”links”指向”prometheus”容器名。这样在Grafana容器里,就可以通过主机名”prometheus”来路由到Prometheus容器。我们开始Grafana配置

  • 创建一个新数据源,选择Prometheus

Add Grafana Datasource

Configure Prometheus Datasource

  • 保存后,即可创建一个新的仪表盘,然后同上一篇一样,创建及配置查询。如下图,我们加了内存使用”node_memory_MemTotal_bytes”和节点每分钟平均负载”node_load1”两个内置指标。

Add Grafana Query

  • Prometheus还有一个更简便的方法,就是在配置数据源时,选择标签页上的仪表盘

Grafana Import Dashboard

  • 在列表上,选择你要导入的仪表盘(模板),点击Import导入

  • 之后在仪表盘管理页面上,点击刚才导入的仪表盘,如下图

Grafana Select Dashboard

  • 然后,你就可以看到一个精美的,而且主要的监控指标都已经配好的仪表盘了

Grafana Prometheus 2.0 Dashboard

是不是非常方便?

部署MySQL Exporter

Prometheus的官方Github上,提供了很多Exporter,用于各种不同应用的数据采集。这里,我们演示一个MySQL的数据采集器,即MySQL Exporter

  • 我们还是先写Docker Compose脚本,为了配合测试,我们把MySQL(本文采用MariaDB)的一起写了。
services:
  mariadb:
    container_name: mariadb
    image: mariadb
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
    volumes:
      - ./mysql/my.cnf:/etc/mysql/my.cnf
      - ./mysql/data:/var/lib/mysql
    networks:
      - net-db

  mysqld-exporter:
    container_name: mysqld-exporter
    image: prom/mysqld-exporter
    restart: always
    ports:
      - "9104:9104"
    environment:
      - DATA_SOURCE_NAME=root:123456@(mariadb:3306)/
    networks:
      - net-db
    links:
      - mariadb

networks:
  net-db:
  • 这里的”networks”和”links”的配置确保了”mysqld-exporter”容器可以通过主机名”mariadb”访问到MySQL容器。另外,”mysqld-exporter”需配置环境变量DATA_SOURCE_NAME=root:123456@(mariadb:3306)/来指定MySQL的地址、端口号、账户和密码。千万记住,最后的那个正斜杠是必须的,去掉后,会找不到MySQL的地址。

  • 记得在”prometheus.yml”的”scrape_configs”项里添加一个Job,抓取”mysqld-exporter”的数据,这里的端口映射了9104

scrape_configs:
  - job_name: 'db'
    static_configs:
    - targets: ['yourserver:9104']
      labels:
        instance: mariadb

导入仪表盘

其实配置Grafana仪表盘是个辛苦活,选指标、配参数、调界面,都挺麻烦的。最好有人配好了,直接拿过来用。这里介绍一个Github上Grafana Dashboards项目,它提供了好多预置的Grafana仪表盘供我们使用,真是活雷锋。

  • 让我们进入该项目的”dashboards”目录,里面列了好多仪表盘模板文件,都是JSON格式

Grafana Dashboard Download

  • 我们就挑其中的”MySQL_Overview.json”下载,然后打开Grafana,在仪表盘管理页面上点击导入

Grafana Dashboard Import

  • 点击上传JSON的按钮,并选择刚才下载下来的JSON文件

Grafana Dashboard Import

  • 然后你会再次看到一个精美的,而且监控指标都已经配好的仪表盘了

Grafana MySQL Dashboard

大家可以把本文所有的Docker Compose脚本粘贴在一块启动(注意”networks”项要合并)。