1. 前言

Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

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

Prometheus应该是为数不多的适合Docker、Mesos、Kubernetes环境的监控系统之一。输出被监控组件信息的HTTP接口被叫做exporter。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息 (包括磁盘、内存、CPU、网络等等),具体支持的源看:https://github.com/prometheus

与其他监控系统相比,Prometheus的主要特点是:

  • 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸)。
  • 非常高效的存储,平均一个采样数据占~3.5bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。
  • 一种灵活的查询语言。
  • 不依赖分布式存储,单个服务器节点。
  • 时间集合通过HTTP上的PULL模型进行。
  • 通过中间网关支持推送时间。
  • 通过服务发现或静态配置发现目标。
  • 多种模式的图形和仪表板支持。

Prometheus架构:
微服务轮子项目(23) -Metrics监控_# 微服务轮子项目

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

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

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

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

  • 大多数Prometheus组件都是用Go编写的,它们可以轻松地构建和部署为静态二进制文件。访问prometheus.io以获取完整的文档,示例和指南。

2. 安装部署

1.下载镜像:

docker pull prom/prometheus

2.启动镜像:

docker run -d --name prometheus -p 9090:9090 prom/prometheus

3.创建文件夹:

mkdir conf
mkdir data
chmod 777 -R data

4.拷贝配置文件:

docker cp prometheus:/etc/prometheus/prometheus.yml conf/

5.修改配置文件:

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
      labels:
        instance: prometheus
  • job_name:job的名字
  • targets:metrics生产者地址
  • labels:个性化标签

6.重新启动镜像:

docker stop prometheus
docker rm prometheus
docker run \
        -p 9090:9090 \
        -v $PWD/conf/prometheus.yml:/etc/prometheus/prometheus.yml \
        -v $PWD/data:/prometheus \
        --name prometheus \
        -d prom/prometheus \
        --config.file=/etc/prometheus/prometheus.yml

7.安装grafana:

docker stop grafana
docker rm grafana
docker run -d \
      -p 3000:3000 \
      --name=grafana \
      -v $PWD/conf/grafana.ini:/etc/grafana/grafana.ini/grafana.ini \
      -v $PWD/plugins/:/var/lib/grafana/plugins \
      -e "GF_SECURITY_ADMIN_PASSWORD=admin" \
      -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,raintank-worldping-app,grafana-piechart-panel" \
      -v $PWD/data:/var/lib/grafana \
      grafana/grafana

GF_SECURITY_ADMIN_PASSWORD: 设置admin管理员的默认密码
GF_INSTALL_PLUGINS:配置安装的插件

3. 各组件监控

3.1 服务器监控

1.安装运行 node-exporter:

docker run -d \
        --name node-exporter \
        -p 9100:9100 \
        -v "/proc:/host/proc" \
        -v "/sys:/host/sys" \
        -v "/:/rootfs" \
        --net="host" \
        prom/node-exporter

2.修改prometheus的配置:

- job_name: 'node'
    static_configs:
    - targets: ['192.168.28.130:9100']
      labels:
        env: test
        name: node1
        instance: 192.168.28.130

3.2 MySQL监控

1.安装运行 mysqld-exporter:

docker run -d -p 9104:9104 \
        --name mysqld-exporter \
        -e DATA_SOURCE_NAME="root:1q2w3e4r@(192.168.28.131:3306)/user-center" \
        prom/mysqld-exporter

2.修改prometheus的配置:

- job_name: 'mysqld'
    static_configs:
    - targets: ['192.168.28.131:9104']
      labels:
        env: test
        name: mysql-5.7
        instance: 192.168.28.131:3306

3.3 Elasticsearch监控

1.安装 elasticsearch-exporter 插件:

cd elasticsearch-6.6.1

./bin/elasticsearch-plugin install -b https://distfiles.compuscene.net/elasticsearch/elasticsearch-prometheus-exporter-6.6.1.0.zip

2.修改prometheus的配置:

- job_name: elasticsearch
    scrape_interval: 10s
    metrics_path: "/_prometheus/metrics"
    static_configs:
    - targets: ['192.168.28.130:9200']
      labels:
        env: test
        name: elasticsearch

3.4 Nacos监控

1.配置nacos的application.properties文件,暴露metrics数据:

management.endpoints.web.exposure.include=*

2.修改prometheus的配置:

- job_name: nacos
    metrics_path: "/nacos/actuator/prometheus"
    static_configs:
    - targets: ['192.168.28.130:8848']
      labels:
        env: test
        name: nacos
        instance: 192.168.28.130:8848

3.5 Redis监控

1.安装运行 redis-exporter

docker run -d \
       --name redis_exporter \
       -p 9121:9121 \
       oliver006/redis_exporter \
       --redis.addr redis://192.168.28.130:6379

2.修改prometheus的配置

- job_name: redis
    static_configs:
    - targets: ['192.168.28.130:9121']
      labels:
        env: test
        name: redis
        instance: 192.168.28.130:3306

3.6 微服务监控

通过file_sd_configs进行服务发现的配置,每次json文件的内容发生变更,Prometheus会自动刷新target列表:

1.配置服务的json文件:

[
  {
    "targets": [
      "192.168.28.130:9900"
    ],
    "labels": {
      "job":"spring-boot-service",
      "env":"test",
      "application":"api-gateway",
      "instance":"192.168.28.130:9900"
    }
  },
  {
    "targets": [
      "192.168.28.130:8000"
    ],
    "labels": {
      "job":"spring-boot-service",
      "env":"test",
      "application":"uaa-server",
      "instance":"192.168.28.130:8000"
    }
  }
]

2.修改prometheus的配置:

- job_name: spring-boot-service
    metrics_path: "/actuator/prometheus"
    file_sd_configs:
    - files: ['/etc/prometheus/fileDdConfigs/*.json']

4. Grafana仪表盘

4.1 下载

下载地址:

4.2 告警配置

4.2.1 邮件配置

修改 grafana文件/etc/grafana/grafana.ini配置smtp服务器:
微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_02

host: smtp地址+端口
user: 你的邮箱地址
password: 邮箱客户端授权密码
from_address: 你的邮箱地址

4.2.2 配置邮件通知

   
微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_03 微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_04

4.2.3 Alert配置

     
微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_05 微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_06 微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_07
     

4.2.4 注意事项

微服务轮子项目(23) -Metrics监控_# 微服务轮子项目_08
1.只有Graph图表能配置Alert
2.使用了模板变量的查询不能配置告警

解决办法:单独配置个告警的视图,用正则匹配出所有的主机 或者 每台主机单独一个查询语句