基于Prometheus的监控解决方案

1 概述

本文用来介绍如何基于开源监控软件Prometheus打造一套监控解决方案。

2 开源组件

2.1 Prometheus

Prometheus 是一个始于2012年由 SoundCloud 开发的开源监控解决方案,后来成为 Cloud Native Computing Foundation (CNCF) 下的一个毕业项目。作为一款流行的时间序列数据库和监控工具集,Prometheus 设计之初就考虑了云原生环境的需求,能够高效地收集、存储和分析海量实时监控数据。
核心特性与原理

  • 主动拉模式采集:Prometheus 采用 Pull 模式,通过 HTTP 协议定期从被监控的目标(如服务端点、容器等)获取度量数据,这使得任何暴露合适接口的服务都可以轻松接入。
  • 多维度数据模型:Prometheus 支持丰富的标签(label)体系,使得数据可以基于不同的维度进行聚合或过滤,非常适合大规模且不断变化的微服务架构监控。
  • 强大的查询语言 PromQL:Prometheus 提供了一种强大而灵活的查询语言——PromQL(Prometheus Query Language),允许用户编写复杂的查询表达式来分析历史数据、获取实时统计信息以及定义警报规则。
  • 时序数据库:内置持久化存储,用于存储时间序列数据,并具备高效的查询和归档能力。
  • 警报管理与通知:Prometheus 自带警报管理器,可以根据预定义的规则触发警报,并通过 Alertmanager 进行分组、抑制以及向多种渠道发送通知。
  • 生态集成:Prometheus 能够与众多第三方服务和工具无缝集成,例如 Grafana 用于数据可视化等。

2.2 Alertmanager

Alertmanager 是 Prometheus 生态系统中一个关键组件,专门负责管理和路由警报(alerts)。Prometheus Server 负责根据用户定义的规则生成警报,而 Alertmanager 则负责后续的处理工作,包括但不限于以下核心功能:

  • 警报汇聚(Grouping):当多个警报因相同原因产生时,Alertmanager 可以对它们进行合并,避免发出重复的通知给运维人员。
  • 静默(Silencing):允许用户设定特定时间段内针对某些标签组合的警报不予通知,便于在计划维护期间减少不必要的打扰。
  • 抑制(Inhibition): 当高级别警报触发时,可以抑制低级别或相关联的警报,避免淹没真正重要信息。
  • 通知路由(Routing):支持多路复用通知策略,可根据不同的警报属性将其路由到不同的通知渠道,比如电子邮件、短信、PagerDuty、Slack 等。
  • 回退策略(Fallback):如果某个通知通道暂时不可用,Alertmanager 可以根据预设的策略尝试其他备用通知方式。
  • 重复通知抑制:防止短时间内对同一警报事件的过度通知,只有在警报状态发生改变时才会再次通知。

2.3 Grafana

Grafana 是一款强大的开源数据可视化和分析平台,主要设计用于实时监测和探索大规模时间序列数据。它不仅能够从多种数据源获取数据,还能以直观且高度可定制的方式呈现这些数据,通过构建丰富的仪表盘(dashboards)实现数据的可视化展现。
以下是Grafana的主要特性摘要:

  • 多数据源支持:Grafana能够连接到众多不同类型的数据源,包括Prometheus、Graphite、InfluxDB、Elasticsearch、MySQL、PostgreSQL、MongoDB以及CloudWatch等多种时序数据库和日志分析平台。
  • 可视化仪表板:用户可以通过拖拽式界面创建交互式的图表、表格和热力图等可视化元素,以便集中展示来自不同数据源的关键指标。
  • 警报与通知:Grafana具备强大的警报功能,允许用户基于数据条件设置告警规则,并可通过邮件、Slack、PagerDuty等多种渠道发送通知。
  • 动态与可分享的仪表盘:创建的仪表盘可以轻松地与其他团队成员共享,同时支持变量和模板,使得仪表盘可以根据上下文环境动态调整显示的内容。
  • 插件体系:Grafana拥有广泛的插件生态系统,允许扩展其功能,包括新的数据源、面板类型以及其他增强功能。
  • 跨平台:Grafana支持在Linux、Windows及macOS上运行,并且可以部署在云端或本地环境。

2.4 PrometheusAlert

Prometheus Alert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus,Zabbix,日志系统Graylog和数据可视化系统Grafana发出的预警消息,支持钉钉,微信,华为云短信,腾讯云短信,腾讯云电话,阿里云短信,阿里云电话等,可以看出prometheusalert相比和alertmanager内置的报警媒介相比支持的更全面,并且配置和调试更方便,prometheusalert 并不能取代alertmanager,而是要作为webhoook与alertmanager结合使用。

2.5 exporter

2.5.1 Node_exporter

Node Exporter 是 Prometheus 生态系统中的一个重要组成部分,它是一个用于从 Linux 系统收集硬件和操作系统级别的指标数据的工具。Node Exporter 通过监听特定的 HTTP 端口(默认为 9100),对外暴露这些指标数据,供 Prometheus Server 通过 Pull 模式主动抓取。

2.5.2 Mysql_exporter

mysql_exporter 是 Prometheus 生态系统中的一款专用Exporter,它的作用是连接到 MySQL 或 MariaDB 数据库,从中提取关键的性能和运行状态指标,并将这些指标以 Prometheus 可识别的格式暴露出来。这样,Prometheus Server 就可以周期性地拉取这些指标,用于监控和报警。

2.5.3 Blackbox_exporter

Blackbox Exporter 是一个具体的黑盒监控工具,它是 Prometheus 生态系统中的一个组件,由 Prometheus 社区官方维护。这个工具允许用户通过各种协议对远程端点进行健康检查和性能度量,包括但不限于:

  • HTTP/HTTPS:检查网页是否可访问,响应时间是否在合理范围内等。
  • DNS:验证域名解析是否正确及时。
  • TCP:确认远程端口是否开放并能建立连接。
  • ICMP:利用 ping 命令检查主机的可达性。
  • gRPC:针对 gRPC 服务进行健康检查。

通过配置 Blackbox Exporter,您可以定义一组探测模块和参数,定期执行这些探测,并将结果暴露为 Prometheus 可读的指标数据。这样,Prometheus 服务器就可以抓取这些指标,进一步整合到告警规则中,并通过 Alertmanager 发送告警通知,或者通过 Grafana 等可视化工具展示实时监控视图,帮助运维人员快速发现并定位问题。

2.6 Docker

Docker 是一款开源的应用容器引擎,它诞生于2013年,由 DotCloud 公司(后改名为 Docker Inc.)开发并推广。Docker 旨在简化应用的打包、部署和运行过程,尤其是在不同的开发、测试和生产环境中,提供一致性的运行环境。

2.7 Docker-compose

Docker Compose 是 Docker 官方提供的一个工具,用于定义和运行多容器的 Docker 应用程序。它使用 YAML 文件(通常命名为 docker-compose.yml)来配置应用程序的服务、网络和数据卷等组件,通过简洁的声明式语法定义各个容器之间的依赖关系、端口映射、环境变量、网络配置等细节。
使用 Docker Compose 的好处在于,只需一个简单的命令(如 docker-compose up),就能够依据 YAML 文件的配置,一次性创建并启动所有相关的 Docker 容器,而且容器间可以方便地共享资源和通信。此外,Docker Compose 还支持服务的启动、停止、重启、销毁等一系列生命周期管理操作。
Docker Compose 的主要特点包括:

  • 服务编排:定义一个多容器应用的不同服务及其依赖关系,自动完成容器的编排和启动顺序。
  • 资源配置:可以指定容器使用的端口映射、挂载的卷、环境变量等资源。
  • 网络管理:创建和管理应用内的网络,使容器之间能够通过内部网络相互通信。
  • 便捷操作:提供了一系列命令行工具,简化了多容器应用的部署、运行、更新和维护工作。
  • 一致性开发与生产环境:通过 compose 文件,可以实现开发、测试和生产环境的一致性配置和部署。

简而言之,Docker Compose 是 Docker 应用部署和管理的强大助手,尤其适合于小型到中型规模的分布式应用,为开发者提供了一个简单易用的容器编排方案,极大地提升了工作效率和应用部署的灵活性。

3 脚本示例

3.1 目录结构

基于Prometheus的监控解决方案_第1张图片

3.2 docker-compose文件示例

version: '3'
services:
  prometheus:
    image: monitor/prometheus:v2.36.2
    hostname: "prometheus"
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 9090:9090
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/data:/prometheus/data
      - ./prometheus/rules/alert_rules.yml:/etc/config/rules.yml
    command: "--config.file=/etc/prometheus/prometheus.yml  --web.enable-lifecycle"
    privileged: true
    restart: always
    depends_on:
      - alertmanager
      - blackbox
      - mysqld_exporter
    links:
      - alertmanager
      - blackbox
    networks:
      - monitor_net
  grafana:
    image: monitor/grafana:7.5.16
    hostname: "grafana"
    environment:
      - TZ=Asia/Shanghai
      - GF_SECURITY_ADMIN_PASSWORD=admin
    ports:
      - 3000:3000
    volumes:
      - ./grafana/data:/var/lib/grafana
    privileged: true
    restart: always
    links:
      - prometheus
    networks:
      - monitor_net
  alertmanager:
    image: monitor/alertmanager:v0.24.0
    hostname: "alertmanager"
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 9093:9093
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - ./alertmanager/data:/etc/alertmanager/data
      - ./alertmanager/templates:/etc/alertmanager/templates
    command: "--config.file=/etc/alertmanager/alertmanager.yml --storage.path=/etc/alertmanager/data --cluster.advertise-address=0.0.0.0:9093"
    privileged: true
    links:
      - prometheusalert
    restart: always
    depends_on:
      - prometheusalert
    networks:
      - monitor_net
  mysqld_exporter:
    image: monitor/mysqld-exporter:v0.14.0
    hostname: "mysqld_exporter"
    environment:
      - TZ=Asia/Shanghai
      - DATA_SOURCE_NAME=weihu:123456@(10.10.0.41:3306)/
    ports:
      - 9104:9104
    privileged: true
    restart: always
    networks:
      - monitor_net
  blackbox:
    image: monitor/blackbox-exporter:v0.19.0
    hostname: "blackbox"
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 9115:9115
    volumes:
      - ./blackbox/blackbox.yml:/opt/blackbox.yml
    privileged: true
    restart: always
    networks:
      - monitor_net
  prometheusalert:
    image: monitor/prometheus-alert:v4.8.2
    hostname: "prometheusalert"
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 8080:8080
    volumes:
      - ./prometheusalert/conf:/app/conf
      - ./prometheusalert/db:/app/db
      - /etc/localtime:/etc/localtime
    privileged: true
    restart: always
    networks:
      - monitor_net
networks:
  monitor_net:
    driver: bridge

码字不易,喜欢请收藏+评论。如需脚本可评论留言。

你可能感兴趣的:(prometheus)