Skip to content

Prometheus + Grafana

Prometheus + Grafana介绍

  • Prometheus 是一个开源的监控系统,可以监控任何可以提供指标数据的应用。
  • Grafana 是一个开源的度量分析与可视化套件,可以通过将数据查询到 Prometheus 来展示。
  • 通常Prometheus和Grafana是一起使用的,Prometheus负责收集数据,Grafana负责展示数据。
  • github地址:Prometheus
  • github地址:Grafana

Prometheus + Grafana

前言:选型

1,为什么要使用监控系统

为什么要使用监控系统

  • 了解系统的运行状态
  • 及时发现问题
  • 预测问题
  • 了解系统的性能
  • 持续优化系统
  • 及时收到告警
  • 了解系统的历史数据

2,监控什么指标

监控什么指标

  • 服务器的CPU、内存、磁盘、网络等
  • 应用的QPS、响应时间、错误率等
  • 数据库的连接数、事务数、错误率等
  • 缓存的命中率、丢失率等
  • 消息队列的消息堆积、消费速度等

3,监控系统选型

  • zabbix

zabbix

优点:

「产品成熟」:由于诞生时间长且使用广泛,拥有丰富的文档资料以及各种开源的数据采集插件,能覆盖绝大部分监控场景。

「采集方式丰富」:支持Agent、SNMP、JMX、SSH等多种采集方式,以及主动和被动的数据传输方式。

缺点:

需要在被监控主机上安装Agent,所有的数据都存在数据库里,产生的数据很大,瓶颈主要在数据库。

zabbix

  • Open-Falcon

Open-Falcon

优点:

「自动采集能力」:Falcon-agent 能自动采集服务器的200多个基础指标(比如CPU、内存等),无需在server上做任何配置,这一点可以秒杀Zabbix.

「强大的存储能力」:底层采用RRDTool,并且通过一致性hash进行数据分片,构建了一个分布式的时序数据存储系统,可扩展性强。

「灵活的数据模型」:借鉴OpenTSDB,数据模型中引入了tag,这样能支持多维度的聚合统计以及告警规则设置,大大提高了使用效率。

「插件统一管理」:Open-Falcon的插件机制实现了对用户自定义脚本的统一化管理,可通过HeartBeat Server分发给agent,减轻了使用者自主维护脚本的成本。

「个性化监控支持」:基于Proxy-gateway,很容易通过自主埋点实现应用层的监控(比如监控接口的访问量和耗时)和其他个性化监控需求,集成方便。

缺点:

「监控类型较少」: 不支持常用应用服务器如tomcat、apache、jetty等的监控。

「整体发展一般,社区活跃度低」: 没有专门的运维支持,代码更新较少,没有一个较大的社区来维护,后续想要有什么新的能力基本只能指望自己扩展。

open-Falcon

  • uptime robot

uptime robot

优点:

「配置简单」: 无需安装agent,只需要在网站上注册账号,添加需要监控的站点即可。

「免费」: 提供免费的监控服务,每5分钟检测一次,每次检测时间为50秒。

「支持多种通知方式」: 支持邮件、短信、Twitter、Slack、Webhook等多种通知方式。

「支持多种监控方式」: 支持HTTP、HTTPS、Ping、Keyword、Port等多种监控方式。

缺点:

「监控频率低」: 免费版每5分钟检测一次,每次检测时间为50秒,对于一些对监控频率要求较高的场景不适用。

「监控类型单一」: 只支持站点的监控,不支持服务器、数据库等其他类型的监控。

uptime

  • Prometheus + Grafana

Prometheus + Grafana

优点:

「社区活跃度高」: github start超过40k,且一直在维护。

「基于时序数据库,存储效率高」:Prometheus核心部分只有一个单独的二进制文件,不存在任何的第三方依赖(数据库,缓存等等)。唯一需要的就是 本地磁盘,因此不会有潜在级联故障的风险。

「很好地支持容器监控」: 能自动发现容器,同时k8s和etcd等项目都提供了对Prometheus的原生支持,是目前容器监控最流行的方案。

「基于Pull模型的架构」: Prometheus基于Pull模型的架构方式,可以在任何地方(本地电脑,开发环境,测试环境)搭建我们的监控系统。

缺点:

Prometheus 是基于 Metric 的监控,不适用于日志(Logs)、事件(Event)、调用链(Tracing)。

由于Prometheus采用的是Pull模型拉取数据,意味着所有被监控的endpoint必须是可达的,需要合理规划网络的安全配置。

指标众多,需进行适当裁剪。

Prometheus + Grafana

Prometheus安装

这里使用docker compose 安装

bash
docker compose -f prometheus.yml up -d

prometheus.yml

yaml
version: '3'
services:
# Prometheus: 监控系统
    prometheus:
        image: prom/prometheus
        container_name: prometheus
        hostname: prometheus
        restart: always
        volumes:
            - /root/apps/prometheus/prometheus-config.yml:/etc/prometheus/prometheus.yml
        ports:
            - 9099:9090

# Alertmanager: 告警管理
    alertmanager:
        image: prom/alertmanager
        container_name: alertmanager
        hostname: alertmanager
        restart: always
        ports:
            - 9093:9093

# node-exporter: 服务器监控
    node-exporter:
        image: prom/node-exporter
        container_name: node-exporter
        hostname: node-exporter
        restart: always
        ports:
            - 9100:9100

# cadvisor: 容器监控
    cadvisor:
        image: google/cadvisor:latest
        container_name: cadvisor
        hostname: cadvisor
        restart: always
        volumes:
            - /:/rootfs:ro
            - /var/run:/var/run:rw
            - /sys:/sys:ro
            - /var/lib/docker/:/var/lib/docker:ro
        ports:
            - 8899:8080

# mysql-exporter: mysql监控
    mysqld-exporter:
        image: prom/mysqld-exporter
        container_name: mysqld-exporter
        environment:
            - DATA_SOURCE_NAME=root:123456@(192.168.0.251:3306)/
        command:
            - --config.my-cnf=/etc/.my.cnf
        ports:
            - 9104:9104
        volumes:
            - /root/apps/prometheus/.my.cnf:/etc/.my.cnf

# blackbox: 黑盒监控
    blackbox:
        image: prom/blackbox-exporter
        ports:
            - 9115:9115
        command:
            - --config.file=/etc/blackbox/blackbox.yml
        volumes:
            - /root/apps/prometheus/blackbox.yml:/etc/blackbox/blackbox.yml

prometheus-config.yml

yaml
global: # 全局配置
  scrape_interval:     15s # 拉取数据的时间间隔
  evaluation_interval: 15s # 评估规则的时间间隔
scrape_configs: # 采集配置
  - job_name: 'prometheus' # 任务名称
    static_configs: # 静态配置
    - targets: ['192.168.0.251:9099'] # 目标地址
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['192.168.0.251:8899']
  - job_name: '251'
    static_configs:
    - targets: ['192.168.0.251:9100']
  - job_name: '241'
    static_configs:
    - targets: ['192.168.0.241:9100']
  - job_name: 'k8s'
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: ['192.168.0.238:30001']
  - job_name: 'blackbox_exporter'
    static_configs:
    - targets: ['192.168.0.251:9115']
  - job_name: 'mysqld_exporter_251' # 任务名称
    params: # 参数
      auth_module: [client]
    static_configs:
      - targets:
        - 192.168.0.251:3306
    relabel_configs: # 重写配置
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.251:9104
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx] 
    static_configs:
      - targets: # 需要监控的URL
        - https://xxx
        - https://xxx
        - https://xxx
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.251:9115
  - job_name: 'eureka_server'
    metrics_path: /metrics
    eureka_sd_configs: # eureka配置
      - server: http://192.168.0.177:9900/eureka
    relabel_configs:
    # 重写 metrics 的路径
      - source_labels: ["__meta_eureka_app_instance_metadata_prometheus_path"]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
        # 重写管理端口
      - source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__

Grafana安装

这里使用docker compose 安装

bash
docker compose -f grafana.yml up -d

grafana.yml

yaml
version: '3'
services:
  home:
    container_name: grafana
    image: grafana/grafana
    volumes:
      - /root/apps/grafana/grafana.ini:/etc/grafana/grafana.ini
    ports:
      - 3000:3000
    restart: always
    privileged: true

grafana.ini

配置grafana.ini 的email部分,以支持邮件告警

ini
###SMTP / Emailing ###
[smtp]
enabled = true
host = smtp.163.com:465 #这里换成自己的smtp及端口
user = xxx@163.com #这里换成自己的邮箱地址
password =xxx #这里换成自己的邮箱密码
;cert_file =
;key_file =
;skip_verify = false
from_address = xxx@163.com #一般与上面的邮箱地址一致
from_name = Grafana
ehlo_identity = 
startTLS_policy = 

[emails]
welcome_email_on_sign_up = true
templates_pattern = emails/*.html, emails/*.txt
content_types = text/html

[server]
protocol = http
http_port = 3000
domain = xxx

安装验证

访问地址

验证

访问http://192.168.0.251:9099/targets,如果都是UP状态,则安装成功 targets

Grafana面板配置

1,打开grafana

http://192.168.0.251:3000

2,添加数据源

数据源

3,输入数据源信息

数据源信息

4,添加dashboard

dashboard

5,仪表板编号

  • 13659 :Blackbox Exporter 接口状态监控面板 blackbox

  • 893 : docker 容器监控面板 docker

  • 12856 : jvm监控面板 jvm

  • 12633 : linux主机监控面板 linux

  • 7362 : mysql监控面板 myql

搭建 Blackbox Exporter监控

1,创建blackbox配置文件

blackbox.yml

yaml
modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      method: GET
    fail_if_body_matches_regexp: # 如果body匹配正则表达式则失败
      - '"flag":false'
    fail_if_body_not_matches_regexp: # 如果body不匹配正则表达式则失败
      - '"code":200'

2,修改prometheus.yml 增加配置

yaml
  - job_name: 'blackbox_exporter'
    static_configs:
    - targets: ['192.168.0.251:9115']
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx] 
    static_configs:
      - targets: # 需要监控的URL
        - https://xxx
        - https://xxx
        - https://xxx
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.0.251:9115

3,重启prometheus

bash
docker restart prometheus

4,查看prometheus是否有数据

blackbox

搭建 node_exporter监控

1,docker安装node_exporter

bash
docker run -d -p 9100:9100 --name=node_exporter prom/node-exporter

2,prometheus配置node_exporter

yaml
  - job_name: '251'
    static_configs:
    - targets: ['192.168.1.251:9100']

3,重启prometheus

bash
docker restart prometheus

4,查看prometheus是否有数据

node

搭建 mysqld_exporter监控

1,docker安装mysqld_exporter

bash
docker run -d -p 9104:9104 --name=mysqld_exporter prom/mysqld-exporter

2,修改mysqld_exporter的配置文件

bash
vim /root/apps/prometheus/.my.cnf
ini
[client]
user=root
password=123456

3,prometheus配置mysqld_exporter

yaml
- job_name: 'mysqld_exporter_251' # 任务名称
  params: # 参数
    auth_module: [client]
  static_configs:
    - targets:
      - 192.168.0.251:3306
  relabel_configs: # 重写配置
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: 192.168.0.251:9104

4,重启prometheus

bash
docker restart prometheus

5,查看prometheus是否有数据

mysql

搭建 Eureka Server监控

1,eureka服务端配置

application.yml

yaml
spring:
  application:
    name: EUREKA_SERVER
  mvc:
    async:
      request-timeout: -1
eureka:
  server:
    enable-self-preservation: false #设置为false表示关闭保护模式.在保护模式下,如因为网络或其它问题服务提供者掉线的话,eureka不会立即清空服务列表
  instance:
    hostname: 192.168.0.177
    ip-address: 192.168.0.177
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
  port: 9900

2,所有子模块配置

pom.xml 增加依赖

xml
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.12.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

application.yml 增加配置

yaml
spring:
  application:
    name: product
server:
  port: 9902
eureka:
  client:
    service-url:
      defaultZone: http://192.168.0.177:9900/eureka/
  instance:
    instance-id: ${spring.application.name}:${server.port}
    prefer-ip-address: true
    ip-address: 192.168.0.177
    metadata-map:
      "prometheus.scrape": "true"
      "prometheus.path": "/actuator/prometheus"
      "prometheus.port": ${server.port}

management:
  endpoint:
    health:
      show-details: always
  endpoints:
    enabled-by-default: true
    web:
      base-path: /actuator
      exposure:
        include: '*'
  metrics:
    tags:
        application: ${spring.application.name}

3,prometheus配置

yaml
  - job_name: 'eureka_server'
    metrics_path: /metrics
    eureka_sd_configs: # eureka配置
      - server: http://192.168.0.177:9900/eureka
    relabel_configs:
    # 重写 metrics 的路径
      - source_labels: ["__meta_eureka_app_instance_metadata_prometheus_path"]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
        # 重写管理端口
      - source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__

4,重启prometheus

bash
docker restart prometheus

5,查看prometheus是否有数据

eureka

配置grafana 告警

1,配置grafana联络点

联络点

2,配置告警通知

创建通知

3,添加通知策略

通知策略

4,配置告警规则

告警规则

告警规则

通知策略

通知策略

添加解释 添加解释

完成效果 效果

5,告警效果

告警效果

配置钉钉告警

1. 配置钉钉机器人地址

配置钉钉机器人地址

2. 配置grafana

配置grafana

3. 效果

效果

杨利伟的博客