目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

Prometheus

项目上线后如何保障业务的稳定性运行

  • 高可用架构设计

    • 采用分布式架构和容灾设计,确保系统的冗余与可恢复能力
    • 包括多机房部署、多副本部署、负载均衡、热备份等策略,以应对单点故障和海量并发请求。
  • 服务容错与降级

    • 在面对故障或异常情况时,通过设计合适的容错机制和降级策略来保证核心业务的稳定进行
    • 例如,对于关键服务,可以使用熔断器、限流器等技术来避免级联故障和请求雪崩。
  • 自动化运维和发布

    • 制定自动化的运维流程,包括自动化的部署、回滚、灰度发布等,减少人工操作引起的错误和风险。
    • 同时,建立持续集成与持续交付(CI/CD)流程,确保代码的质量和稳定性
  • 安全保障和漏洞修复

    • 建立健全的安全策略和防护措施,保障系统和数据的安全。
    • 同时及时修复系统中的漏洞和安全问题,避免被攻击者利用导致系统瘫痪或用户数据泄漏。
  • 备份与恢复

    • 定期进行系统数据的备份,并建立灾难恢复机制,备份可以包括系统配置、数据库、日志等关键数据
    • 在系统发生故障时,能够及时将数据恢复到最新的可用状态。

如何发现业务的不稳定运行

互联网公司需要在开发、测试、发布、运维等不同阶段对产品进行监控,以便及时发现问题并采取相应措施

  • 最终的核心:异常监控与预警

    • 建立完善的监控系统,通过监控关键指标(如 CPU、内存、带宽等)来实时感知系统的健康状态
    • 同时设置预警规则,一旦异常发生,结合自动化运维及时通知相关人员并采取相应的应急措施。
    • 比如
      • 网络故障或稳定性问题
        • 由于网络故障、硬件故障或配置错误等原因,可能会导致访问不稳定或宕机,进而影响用户的体验。
      • 性能瓶颈和延迟
        • 当用户访问量增加时,可能会对服务器产生超过负荷或达到带宽上限的压力,导致网页或其他平台响应速度变慢,影响用户体验和满意度。
      • 数据安全性问题
        • 不法分子可能通过攻击防火墙、病毒、恶意软件等途径获取数据或进行恶意操作,在一定程度上破坏了数据的安全性
  • 公司建设监控和告警系统的意义

    • 提前预知和识别问题
      • 监控和告警系统可以帮助我们实时获取系统的运行数据和指标,
      • 通过对关键指标的监控和分析,可以提前预知系统可能出现的问题,如性能下降、异常错误、服务不可用等。
      • 通过告警及时发现问题,可以提高问题识别的速度和准确性,便于及时采取相应的措施来修复问题。
    • 提高故障响应和处理效率
      • 及时发现和处理故障可以减少系统的停机时间,避免影响用户体验和业务运行。
      • 配置监控和告警系统可以帮助运维团队更快速地响应和解决问题,减少故障的恢复时间,减少业务损失。
    • 优化系统性能和资源利用
      • 监控和告警系统可以实时监测系统的性能和资源利用情况,如 CPU、内存、磁盘、网络等。
      • 通过对系统的性能指标进行监控和分析,可以帮助我们了解系统的负载情况和瓶颈
      • 及时进行性能优化和资源扩展,以提高系统的稳定性和可扩展性。
    • 安全风险的监测和应对
      • 监控和告警系统还可以对系统的安全风险进行实时监测和预警。通过对异常访问、漏洞攻击、异常登录等进行监控和分析
      • 可以帮助及时发现和应对潜在的安全风险,并保护系统和数据的安全。

监控系统常见的架构模式和主流系统对比

  • Pull 模式
    • 优点
      • 可以根据需要定时获取数据,避免数据的多余传输,节约网络带宽和存储空间。
      • 可以根据需要通过请求的方式,选定性地获取部分数据。
      • 适用于对被监控对象的稳定性要求不高的场景
      • Pull 模式核心消耗在监控系统侧,应用侧的代价较低
    • 缺点:
      • 由于需要定时发送请求获取数据,对于需要实时响应的业务,Pull 模式的数据传输速度难以达到。
      • Pull 模式需要能够处理推送事件的应用程序,因此需要有较高的成本和复杂性。
  • Push 模式
    • 优点
      • 被监控对象可以主动推送数据,监控服务端不需要发送请求,因此避免了网络负载。
      • 对于需要实时响应数据的业务,Push 模式具有更高的传输效率和更佳的实时性。
      • Push 模式适用于稳定的网络环境,可以实现实时数据的快速传输
    • 缺点:
      • Push 模式核心消耗在推送和 Push Agent 端,监控系统侧的消耗相比 Pull 要小
      • 被监控对象需要主动发送数据,不适用于对被监控对象要求性能较高的场景,需要严格控制被监控对象的数据流量
  • 总结
    • 公司内部的监控系统来说,应该同时具备 Pull 和 Push 的能力才是比较合适的

主流监控告警框架对比

    • Zabbix(支持 pull/push 两种模式)
      • 基于 C 语言开发, 是一种基于服务器-客户端体系结构开发的企业级监控软件,它允许监控各种网络服务,服务器资源和硬件
      • 优点:
        • 用户友好,易于部署和设置
        • 具有插件式框架,可以灵活地满足不同的监控需求
        • 提供了丰富的图形化监控数据
        • 具有高扩展性,用户可以轻松添加自定义功能。
      • 缺点:
        • 功能强大,使用比较笨重,Zabbix 的安装和部署需要更多的时间和资源
        • 对于复杂的 IT 架构,Zabbix 的配置难度较大,
        • 响应时间不够实时,对于实时性要求较高的应用场景可能不够理想
    • Open-Falcon(push 模式)
      • 是一种分布式、高性能的监控解决方案,它被用于大型的高可用性系统和广泛的云计算环境
      • 优点:
        • 轻量级,可以部署在物理机和虚拟机上,部署和配置足够简单
        • 支持查询优化,支持多种数据源输入
        • 具有简单和易于使用的图形化界面
      • 缺点:
        • 国内使用量较小,社区不够活跃
        • 对于某些复杂的 IT 架构,Open-Falcon 在准备和安装方面可能存在困难
        • 针对不同需求经验丰富的开发人员需代码调整
    • Prometheus(Pull 模式)
      • go 语言开发, 是可扩展的开源监控系统,用于收集存储多维度的时间序列数据
      • 支持 PromQL 查询语言和提供的图形化展示工具
      • 可视化和告警这些功能交由 Grafana 和 Alertmanager 等第三方产品来实现,拓展性强
      • 功能上的简洁,作为一个轻量级的后起之秀,在性能和展示方面优势比较明显,对容器监控支持的非常好
      • 优点:
        • 可扩展性强,支持水平扩展,满足大规模监控需求
        • 支持灵活的查询和查询语言,提供了丰富的查询函数和操作符
        • 可以从不同的数据源收集数据,支持多维度数据聚合
        • 可以轻松集成 Alertmanager 实现告警
      • 缺点
        • 存储机制不够灵活,大规模数据的存储和处理存在压力
        • 对运维工程师的技术水平要求较高
  • 监控系统选择建议

    • 功能和扩展性
      • 不同的监控系统在功能和扩展性上有所差异,根据具体业务需求选择合适的功能和可扩展性。
    • 适应的场景
      • 不同的监控系统适用于不同的场景,如云原生环境、微服务体系等,根据具体的环境和需求选择合适的监控系统。
    • 学习和维护成本
      • 不同的监控系统可能需要不同的学习和维护成本,根据团队的技术能力和资源状况选择合适的监控系统。
    • 社区支持和生态系统
      • 选择具有活跃的社区支持和丰富的生态系统的监控系统,可以获得更好的开发、运维和解决问题的支

官网

  • 一个开源的系统监控和警报工具,多数 Prometheus 组件是 Go 语言写的

  • 为用户提供可视化仪表板、警报、告警等功能,以帮助用户快速定位和解决问题

  • 现在已经成为一个独立于企业级的开源项目和一个独立的基金会(Cloud Native Computing Foundation)的一部分

  • 用途

    • Kubernetes 集群监控
      • 使用 Prometheus 可以收集和监控 Kubernetes 集群的指标数据,例如 CPU、内存、网络等。
      • 使用 Prometheus Operator 部署 Prometheus,然后通过 Grafana 可视化工具展示监控指标的仪表板
    • 网络监控
      • Prometheus 可以监控网络的状态和性能,例如 TCP 连接数、网络延迟和带宽利用率等
      • 使用 Prometheus 的 Blackbox Exporter 插件来执行网络探测,检查网络服务是否可用
    • 应用程序性能监控
      • 通过 Prometheus 的客户端库可以在应用程序中嵌入指标收集代码,并收集应用程序的性能指标数据
      • 例如请求数、响应时间、错误率等,帮助开发人员监控应用程序的性能,并进行调试和优化
    • 数据库监控
      • 可以使用 Prometheus 的 Exporter 插件监控各种类型的数据库,例如 MySQL、PostgreSQL、Redis 和 MongoDB
      • Exporter 可以将数据库的指标数据转换为 Prometheus 可以处理的格式,并将其发送到 Prometheus 进行监控和警报
    • 服务器监控
      • 使用 Prometheus 可以监控服务器的 CPU、内存、磁盘和网络使用情况等指标,服务器上运行的各种服务的状态和性能
      • 能够实时地存储和查询系统和服务的各种指标,如性能、CPU 利用率、内存使用和请求计数等。

架构

架构图

  • 什么是时序数据库
    • 是一种特定类型的数据库,随时间流逝而不断产生的数据,主要用来存储时序数据
    • 常见的有 InfluxDB、Kdb+、Prometheus、Graphite、TSDB
    • 主要分为时间戳(timestamp)、标签(tag)、存档(filed)三大部分,按照时间顺序记录数据
  • 核心组成部分
    • Prometheus server
      • 核心组件,负责抓取、存储和查询指标数据,提供 API 以供访问
      • Prometheus Server 本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中
      • 内置的 UI 界面,通过这个 UI 可以直接通过 PromQL 实现数据的查询以及可视化
    • Exporter
      • Prometheus 插件或独立组件,负责抓取指定服务或系统的性能指标数据
      • Prometheus 原理是通过 HTTP 协议周期性抓取被监控组件的状态,输出这些被监控的组件的 Http 接口为 Exporter
      • Exporter 将监控数据采集的端点通过 HTTP 服务的形式暴露给 Prometheus Server,将其公开为 HTTP 端点或指定的格式
      • Prometheus server 通过轮询或指定的抓取器从 Exporter 提供的 Endpoint 端点中提取数据
    • Alertmanager
      • 在 Prometheus Server 中支持基于 PromQL 创建告警规则,如果满足 PromQL 定义的规则,就会产生一条告警
      • Prometheus 告警管理器组件,负责管理告警规则、通知和报警策略的设置,提供第一类和第二类警报的分类管理服务
    • PushGateway
      • Prometheus 数据采集基于 Pull 模型进行设计,在网络环境必须要让 Prometheus Server 能够直接与 Exporter 进行通信
      • 当这种网络需求无法直接满足时,就可以利用 PushGateway 来进行中转
      • 通过 PushGateway 将内部网络的监控数据主动 Push 到 Gateway 当中
      • Prometheus Server 则可以采用同样 Pull 的方式从 PushGateway 中获取到监控数据
    • Service Discovery
      • 服务发现功能,动态发现待监控的 Target,完成监控配置的重要组件
  • 总结
    • Prometheus 服务直接通过目标拉取数据,或者间接地通过中间网关拉取数据
    • 并通过一定规则进行清理和整理数据,把得到的结果存储到新的时间序列中
    • 利用 PromQL 和其他 API 可视化地展示收集的数据

部署 Prometheus Server

prometheus-2.43.0.linux-amd64.tar.gz
go1.17.6.linux-amd64.tar.gz

配置 go 环境变量(Prometheus 使用 go 语言开发)

 1#解压
 2tar -zxvf go1.17.6.linux-amd64.tar.gz
 3
 4#配置环境变量 
 5echo "export PATH=$PATH:/usr/local/software/temp/go/bin" >> /etc/profile 
 6
 7#立刻生效
 8source /etc/profile
 9
10#测试 go是否安装成功
11go version

安装 Prometheus

 1#解压
 2tar -zxvf prometheus-2.43.0.linux-amd64.tar.gz
 3
 4#重命名
 5mv prometheus-2.43.0.linux-amd64 prometheus
 6
 7#进入目录启动
 8./prometheus --config.file=./prometheus.yml
 9
10# 动态更新(热更新:prometheus里面经常需要修改配置) 
11# 启动时在参数中加入******--web.enable-lifecycle******   (该参数默认关闭)
12# 启动, &表示需要守护进程方式运行,不然退出终端则进程消失
13./prometheus --config.file=./prometheus.yml --web.enable-lifecycle 
14
15#动态更新配置(不需要重启服务!!!)
16curl -X POST http://localhost:9090/-/reload
17
18#查看是否启动成功,默认端口9090
19lsof -i:9090
20
21# 关闭防火墙
22systemctl stop firewalld.service
23
24#访问 prometheus ,阿里云网络安全组开放端口
25  指标数据
26  http://192.168.10.20:9090/metrics
27  图界面
28  http://192.168.10.20:9090/

Prometheus 操作面板和常见配置讲解

panel

  • Prometheus 的目录结构
    • console_libraries:用于存储用于在 Prometheus 控制台上显示的 JavaScript 库。
    • consoles:用于存储用于在 Prometheus 控制台上显示的控制台文件,其中包括查询和图形定义。
    • data:用于存储 Prometheus 的磁盘持久化数据。
    • LICENSE:Prometheus 的许可证文件。
    • NOTICE:版权声明文件。
    • prometheus:存储 Prometheus 二进制文件及其相关文件的目录。
    • prometheus.yml:Prometheus 的配置文件。
    • promtool:Prometheus 的命令行工具,用于检查配置文件是否正确以及生成表达式的值。
 1[root@localhost prometheus]# tree
 2.
 3├── console_libraries
 4│   ├── menu.lib
 5│   └── prom.lib
 6├── consoles
 7│   ├── index.html.example
 8│   ├── node-cpu.html
 9│   ├── node-disk.html
10│   ├── node.html
11│   ├── node-overview.html
12│   ├── prometheus.html
13│   └── prometheus-overview.html
14├── data
15│   ├── chunks_head
16│   ├── lock
17│   ├── queries.active
18│   └── wal
19│       ├── 00000000
20│       └── 00000001
21├── LICENSE
22├── NOTICE
23├── prometheus
24├── prometheus.yml
25└── promtool

配置文件介绍

 1#全局配置,默认,可以被覆盖
 2global:
 3  scrape_interval: 15s  #全局的抓取间隔
 4  scrape_timeout: 10s  #抓取超时时间
 5  evaluation_interval: 15s  #评估间隔
 6
 7#告警配置
 8alerting:
 9  alertmanagers: #告警管理器
10  - follow_redirects: true #是否启用重定向
11    enable_http2: true #是否启用HTTP2
12    scheme: http
13    timeout: 10s
14    api_version: v2 #指定Alertmanager的API版本,此处为v2
15    static_configs: #告诉Prometheus哪些目标是静态的(即不会更改),如果有多个目标,则可以在targets中指定多个地址。
16    - targets: []
17
18#抓取配置
19scrape_configs:
20- job_name: prometheus #任务名称
21  honor_timestamps: true #指标的时间戳应该由服务器提供,而不是客户端在发送指标时提供的时间戳
22  scrape_interval: 15s #抓取任务的时间间隔,即每15秒抓取一次。
23  scrape_timeout: 10s  #抓取任务的超时时间,单位为秒,即每个目标最多等待10秒钟
24  metrics_path: /metrics  #抓取指标的路径
25  scheme: http #指定抓取时使用的协议,默认为http
26  follow_redirects: true  #是否启用重定向。在此处启用
27  enable_http2: true  #是否启用HTTP2
28  static_configs:
29  - targets:
30    - 120.24.7.58:9090 #目标配置,告诉Prometheus哪些目标需要抓取,如果有多个目标,则可以在targets中指定多个地址
31    
32#此处抓取了一个名为prometheus的任务,每隔15秒抓取一次120.24.7.58:9090上的/metrics路径,超时时间为10秒

监控分层和 metric 指标

Prometheus 通过 Pull 方式采集指标数据,适用于分布式架构、云原生环境和微服务体系等场景
互联网公司监控和指标很多,按照顺序分层归类:系统层、应用层、业务层,这些 Prometheus 都可以完成

  • 这些指标不是绝对的,应该根据企业的业务和系统选择合适的指标

metric

  • 系统和网络层
    • 主要关注底层基础设施的状态和事件,以确保服务器、网络、CPU 和存储设备等运行正常,提供稳定的资源支持。
    • 操心系统常见指标
      • CPU 利用率:服务器上 CPU 主要的核心使用率情况。
      • 内存使用率:服务器内存使用情况,包括已使用、空闲等情况。
      • 网络带宽利用率:服务器网络使用度,包括网卡、负载均衡、网络连接等的带宽使用情况。
      • 硬盘 I/O 读写速度:磁盘读写速率。
      • 硬盘容量:服务器硬盘容量使用情况,包括已使用、空闲等情况。
      • ...
    • 网络常见指标
      • 带宽利用率:网络带宽利用率评估,包括上传和下载比率。
      • 包丢失率:测量包在传输中丢失的数量和百分比。
      • 网络流量:流经网络的实时数据量和数据流量。
      • 网络错误率:网络传输中发生的错误数量和百分比。
      • 连接数:网络连接总数。
      • ...
  • 应用层(业务应用程序、中间件应用程序等)
    • 关注整体服务的质量和运行状态,能够及时预测系统运行瓶颈,保证产品的高效和用户体验
    • 常见指标(Java 为例)
      • 错误率:应用程序产生错误的请求占总数的百分比。
      • 线程实例数:当前在应用程序中运行的线程实例数量。
      • 堆内存使用率:应用程序中 Java 虚拟机(JVM)分配的内存占用的百分比。
      • 平均延迟时间:从请求到响应开始的时间差。
      • 垃圾回收时间:在 JVM 中收集不再使用的内存对象所需的时间。
      • 响应代码:HTTP 请求成功或失败代码。
      • ...
  • 业务层
    • 重点关注业务运营的分析和结果,通过监控平台运营情况和各种配置,获取更多业务数据
    • 及时发现行业发展趋势,指引业务方向,实现全方位监控、预测和干预
    • 指标
      • GMV 销售额:项目特定时间内总的销售额。
      • 日活、月活:日活跃用户数、月活跃用户数
      • 客单价:平均每个订单的金额
      • 支付成功率:成功支付订单和总订单的比率
      • 订单量:每次交易中的订单数量。
      • 购物车转化率:加入购物车商品与实际付款之间的比率。
      • 点击率:网站广告点击率。
      • ...
  • 人工监控:客服和产品运营接收用户反馈(大厂里面的小部门挺多的)
  • 技术人员一定要关注技术 + 业务 两个指标
    • 技术指标(技术人员关注)
      • 上述的系统 + 网络指标、应用指标
    • 业务指标(产品和运营人员关注)
      • 上述的业务指标就是

Exporter:Node-Exporter

什么是 Prometheus 的 Exporter

  • 向 Prometheus 提供监控样本数据的程序都可以被称为一个 Exporter

  • 是一种用于将不同数据源的指标提供给 Prometheus 进行收集和监控的工具。

  • 运行在应用程序、计算机、网络设备或者其他系统上的代码,它可以将系统的指标信息以一种标准格式公开

  • 将指标数据公开为 HTTP 端点或者指定的格式(如 Redis、JMX 等),Prometheus 然后可以通过轮询或指定的抓取器

  • 总结

    • Exporter 是 Prometheus 的指标数据收集组件,负责从目标 Jobs 收集数据
    • 并把收集到的数据转换为 Prometheus 支持的时序数据格式
    • 只负责收集,并不向 Server 端发送数据,而是等待 Prometheus Server 主动抓取

架构图

  • Prometheus 社区以及其他团队开发了大量的 Exporter,覆盖了许多不同类型的系统和服务

    • Node Exporter、MySQL Exporter、Redis Exporter、MongoDB Exporter、Nginx Exporter...
  • 使用方式

    • 在主机上安装了一个 Exporter 程序,该程序对外暴露了一个用于获取当前监控样本数据的 HTTP 访问地址
    • Prometheus 通过轮询的方式定时从这些 Target 中获取监控数据样本,并且存储在数据库当中
    • 所有的 Exporter 程序都需要按照 Prometheus 的规范,返回监控的样本数据

案例实战 node_exporter

node-export 主要用来做Linux服务器监控,比如服务器的进程数、消耗了多少 CPU、内存,磁盘空间,iops等资源。
node_exporter-1.6.0.linux-amd64
node_exporter

 1#解压
 2tar -zxvf node_exporter-1.6.0.linux-amd64.tar.gz
 3 
 4#进到目录里面,启动
 5nohup ./node_exporter &
 6
 7#确认端口
 8lsof -i:9100
 9
10# 访问exporter(成功!!!)
11http://192.168.10.21:9100/metrics
12
13
14# Prometheus服务器中添加被监控机器的配置(target的也可以写ip)
15[root@localhost prometheus]# vim prometheus.yml
16  - job_name: 'soulboy-agent-1'
17    static_configs:
18      - targets: ['192.168.10.21:9100']
19
20# 动态更新配置
21[root@localhost prometheus]# curl -X POST  http://192.168.10.20:9090/-/reload

Prometheus 时序数据语法

所有的 Exporter 程序都需要按照 Prometheus 的规范,返回监控的样本数据

  • 比如 Node Exporter,当访问/metrics 地址时会返回内容和本身 Prometheus 协议保持一致即可
  • Prometheus 协议格式主要由三个部分组成,Prometheus 会对 Exporter 响应的内容逐行解析
    • 样本的一般注释信息(HELP)
    • 样本的类型注释信息(TYPE)
    • 样本
1# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
2# TYPE go_gc_duration_seconds summary
3go_gc_duration_seconds{quantile="0"} 6.884e-06
4go_gc_duration_seconds{quantile="0.25"} 8.997e-06
5go_gc_duration_seconds{quantile="0.5"} 9.849e-06
6go_gc_duration_seconds{quantile="0.75"} 1.1542e-05
7go_gc_duration_seconds{quantile="1"} 1.1542e-05
8go_gc_duration_seconds_sum 3.7272e-05
9go_gc_duration_seconds_count 4
  • Prometheus 的时序数据模型:

    • 指标(Metric)

      • 一个指标是一个具有唯一名称的时间序列数据集合。
      • 指标的完整名称由一个必需的名称和可选的标签键-值对组成,用冒号分隔
      1http_requests_total
      
    • 标签(Label)

      • 标签用于区分相同指标的不同时间序列,一个时间序列可以有多个标签,标签由键-值对组成,通过逗号分隔
      1http_requests_total{method="GET", status="200"}
      
    • 样本(Sample)

      • 样本是时间序列的数据点,包括时间戳和对应的值, 样本由指标和标签组成,通过空格分隔
      1http_requests_total{method="GET", status="200"} 500 1626866123000
      
  • 案例一

    • 业务系统,需要监控 HTTP 请求的总数,不同请求方法和状态码的请求次数,可以使用以下指标来描述这些数据
      • 指标名称为 http_requests_total,表示 HTTP 请求的总数。
      • 可以使用标签来区分不同请求方法和状态码。例如,使用 method 标签表示请求方法,使用 status 标签表示状态码。
      • 样本是具体的指标值和时间戳组成。例如,将 http_requests_total 指标和标签组合成以下样本:
    1http_requests_total{method="GET", status="200"} 100 1626866123000
    2http_requests_total{method="POST", status="200"} 50 1626866123000
    3http_requests_total{method="GET", status="404"} 10 1626866123000
    
    • 表示在时间戳为 1626866123000 时
    • GET 方法的 200 状态码的请求总数为 100 次
    • POST 方法的 200 状态码的请求总数为 50 次
    • GET 方法的 404 状态码的请求总数为 10 次
    • 使用这种时序数据模型,可以方便地进行数据查询和分析
  • 例如:可以通过以下 PromQL 查询语句统计不同请求方法的请求总数

    1sum(http_requests_total) by (method)
    
  • 案例二

    • Linux 服务器监控相关的 CPU 使用率,指标名称 node_cpu_seconds_total, 数据来源 cat /proc/cpuinfo
    • 指标是 counter 类型的递增指标,指 CPU 每种模式下所花费的时间
    • 结合内置函数 统计 CPU 使用率
      1(1 -sum(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total[1m])) by (instance) )
      

统计指标

数值指标

1、计数器 counter

  • 计数器是一个递增的整数型指标,用于表示累计数量。
  • 计数器在增长时,只能累加,不会减少。
  • 一般用于统计请求次数、错误次数等场景。

案例:node_network_receive_packets_total 表示网络接收的数据包总数。

2、仪表盘 gauge

  • 仪表盘是一个可变的数值指标,用于表示某个瞬时值
  • 可变大,可变小。
  • 仪表盘可以随着时间增加或减少,可以用于表示当前连接数、温度等持续变化的指标。

案例:统计 CPU 使用率
(1 -sum(rate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(rate(node_cpu_seconds_total[1m])) by (instance) )

统计指标

3、直方图 histogram
是一种直方图类型,可以观察到指标在各个不同的区间范围的分布情况,例如请求的延迟分布。
它会将这些事件按照不同的桶(bucket)进行分组,并收集每个桶内事件的数量,可以用于分析某个操作的响应时间。

案例:prometheus_http_request_duration_seconds_bucket{handler="/targets"}

  • 用于查询路径为"/targets"相对应的 Prometheus HTTP 请求持续时间指标的直方图桶信息
  • 记录 HTTP 请求的持续时间信息,并按照不同的时间区间(桶)进行分组。

1prometheus_http_request_duration_seconds_bucket{handler="/targets", le="0.1"} 2
2prometheus_http_request_duration_seconds_bucket{handler="/targets", le="0.5"} 2
3prometheus_http_request_duration_seconds_bucket{handler="/targets", le="1"} 2
  • 在持续时间小于等于 0.1 秒的桶中有 20 个请求,在持续时间小于等于 0.5 秒的桶中有 50 个请求,以此类推。
    1### 注意
    2* 在le=“0.2”这个桶中是包含了 le=“0.1”这个桶的数据
    3* 如果想要拿到0.1毫秒到0.2毫秒的请求数量,可以通过两个桶相减得到
    
  • 通过这样的查询,可以了解"/targets"处理程序路径下不同持续时间区间的 HTTP 请求的数量。
  • 对于分析程序路径的请求延迟和性能非常有用

4、摘要 summary

  • 用于测量事件的分布情况,类似于直方图,和 Histogram 区别在于,Summary 直接存储的就是百分位数
  • 摘要适合于分析事件的分布和响应时间的百分比。

案例:
go_gc_duration_seconds,Go 语言应用程序的指标,用于表示垃圾回收(Garbage Collection)的持续时间。

Prometheus 监控 Mysql8

 1### 部署mysql8
 2docker run \
 3    -p 3307:3306 \
 4    -e MYSQL_ROOT_PASSWORD=abc1024.pub \
 5    --name mysql \
 6    --restart=always \
 7    -d mysql:8.0
 8
 9### 配置mysql_exporter(对外暴露端口9104)监控MySQL,数据源格式:DATA_SOURCE_NAME="账号:密码@(ip:端口)
10docker run -d --name mysql-exporter -p 9104:9104 -e DATA_SOURCE_NAME="root:abc1024.pub@(192.168.10.21:3307)/mysql" prom/mysqld-exporter:v0.14.0
11
12### 查看exporter日志
13[root@localhost ~]# docker logs -f mysql-exporter
14
15### mysqld_exporter 的 metrics 默认端口 9104
16http://192.168.10.21:9104/metrics
17
18### Prometheus服务器中添加被监控机器的配置
19[root@localhost ~]# vim /tmp/prometheus/prometheus.yml
20  - job_name: 'mysql-1'
21    static_configs:
22      - targets: ['192.168.10.21:9104']
23
24### 动态更新配置
25[root@localhost prometheus]# curl -X POST http://192.168.10.20:9090/-/reload
26
27### 查看Web UI界面的target和configuration是否有对应的数据
28* 常见的关键指标
29  * `mysql_up`:表示 MySQL 数据库的可用性,如果值为1,则表示数据库连接正常;如果值为0,则表示数据库连接不可用。
30  * `mysql_global_status_threads_connected`:表示当前活动的连接数量。
31  * `mysql_global_status_threads_running`:表示当前正在执行的线程数量。
32  * `mysql_global_variables_max_connections`:表示 MySQL 数据库允许的最大连接数。
33  * `mysql_global_status_queries`:表示 MySQL 数据库执行的总查询次数。
34  * `mysql_global_status_slow_queries`:表示慢查询的数量。
35  * `mysql_global_status_innodb_buffer_pool_read_requests`:表示从 InnoDB 缓冲池中读取的请求数量。
36
37* 注意
38  * 实际指标名称和标签可能会因使用的 MySQL 版本、Exporter 版本以及具体的配置变化而有所不同
39  * 只是一部分常见的关键指标,在实际使用中还有许多其他的指标进行监控分析。
40  * 通过这些关键指标,可以了解 MySQL 数据库的连接情况、查询性能、缓冲池状态等重要数据。

mysql

Prometheus 监控 Redis7

 1### 部署Redis7.X,并指定密码
 2docker run -itd --name redis -p 6379:6379 redis:7.0.8 --requirepass 123456
 3
 4### 配置Redis-Exporter,指定相关redis服务端IP和密码
 5docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter --redis.addr redis://192.168.10.21:6379 --redis.password '123456'
 6
 7
 8### redis_exporter 的 metrics 默认端口 9121
 9http://192.168.10.21:9121/metrics
10
11### Prometheus服务器中添加被监控机器的配置
12[root@localhost ~]# vim /tmp/prometheus/prometheus.yml
13  - job_name: 'redis-1'
14    static_configs:
15      - targets: ['192.168.10.21:9121']
16
17### 动态更新配置
18[root@localhost prometheus]# curl -X POST http://192.168.10.20:9090/-/reload
19
20### 查看Web UI界面的target和configuration是否有对应的数据
21### 常见的 Redis Exporter 关键指标的示例
22常见的 Redis Exporter 关键指标的示例
23
24* `redis_up`:表示 Redis 服务器的可用性,如果值为1,则表示服务器连接正常;如果值为0,则表示服务器连接不可用。
25* `redis_connected_clients`:表示当前连接到 Redis 服务器的客户端数量。
26* `redis_memory_used_bytes`:表示 Redis 使用的内存总量。
27* `redis_commands_processed_total`:表示 Redis 服务器处理的命令总数。
28* `redis_keyspace_hits`:表示 Redis 服务器的键命中次数。
29* `redis_keyspace_misses`:表示 Redis 服务器的键未命中次数。
30* `redis_instance_info`:表示 Redis 服务器的各种信息,如服务器版本、机器信息、角色、端口等信息

redis

Prometheus 监控 RabbitMQ

  • RabbitMQ3.8.0 之前版本,使用单独的下载插件 prometheus_rabbitmq_exporter 来向 Prometheus 公开指标
  • RabbitMQ3.8.0 版开始,RabbitMQ 附带了内置的 Prometheus&Grafana 支持,但是默认没开启
 1### 部署rabbitmq
 2docker run -d --hostname rabbit_host1 --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123456 -p 15672:15672 -p 5672:5672 -p 15692:15692 rabbitmq:3.8.9-management
 3
 4参数说明 
 5-d 以守护进程方式在后台运行
 6-p 15672:15672 management 界面管理访问端口 
 7-p 5672:5672 amqp 访问端口 
 8-p 15692:15692 Prometheus监控相关的端口
 9--name:指定容器名
10--hostname 设定容器的主机名
11-e 参数 RABBITMQ_DEFAULT_USER 用户名 RABBITMQ_DEFAULT_PASS 密码
12
13
14### 进入容器内部开启监控端点
15docker exec -it [rabbitmq container id] bin/sh
16docker exec -it rabbit  bin/sh
17# 进入容器开启 Exporter
18rabbitmq-plugins enable rabbitmq_prometheus
19
20### Prometheus服务器中添加被监控机器的配置
21[root@localhost ~]# vim /tmp/prometheus/prometheus.yml
22  - job_name: 'rabbitmq-1'
23    static_configs:
24      - targets: ['192.168.10.21:15692']
25
26### 动态更新配置
27[root@localhost prometheus]# curl -X POST http://192.168.10.20:9090/-/reload
28
29
30### 查看Web UI界面的target和configuration是否有对应的数据
31常见的关键指标
32* `rabbitmq_queue_messages`: RabbitMQ队列中的消息数量。
33* `rabbitmq_queue_messages_ready`: RabbitMQ队列中准备就绪的消息数量。
34* `rabbitmq_connections`: RabbitMQ服务器的连接数量。
35* `rabbitmq_queue_consumers`: RabbitMQ队列的消费者数量。

rabbitmq

SpringBoot3 监控 Actuator

  • Spring Boot Actuator 是 Spring Boot 提供的一个可选模块,用于在运行时监控和管理 Spring Boot 应用程序
  • 通过 Actuator 可以暴露应用程序的状态、统计信息、日志和其他有用的运行时信息
  • 本地 JDK17 安装(SpringBoot3.X 要求 JDK17),没相关环境的可以去 Oracle 官网安装下 JDK17
  • 项目开发,快速创建 **https://start.spring.io/

springboot

添加依赖

 1<dependency>
 2      <groupId>org.springframework.boot</groupId>
 3      <artifactId>spring-boot-starter-test</artifactId>
 4      <scope>test</scope>
 5    </dependency>
 6
 7    <dependency>
 8      <groupId>org.springframework.boot</groupId>
 9      <artifactId>spring-boot-starter-web</artifactId>
10    </dependency>
11
12    <!-- actuator -->
13    <dependency>
14      <groupId>org.springframework.boot</groupId>
15      <artifactId>spring-boot-starter-actuator</artifactId>
16    </dependency>

默认只暴露 health 端点,可以配置更多端点

http://localhost:8080/actuator

 1// 20231004164926
 2// http://localhost:8080/actuator
 3
 4{
 5  "_links": {
 6    "self": {
 7      "href": "http://localhost:8080/actuator",
 8      "templated": false
 9    },
10    "health": {
11      "href": "http://localhost:8080/actuator/health",
12      "templated": false
13    },
14    "health-path": {
15      "href": "http://localhost:8080/actuator/health/{*path}",
16      "templated": true
17    }
18  }
19}

配置 application.properties

1#暴露指定端点
2#management.endpoints.web.exposure.include=env,info,config,health
3
4#暴露全部
5management.endpoints.web.exposure.include=*

http://localhost:8080/actuator

1http://localhost:8080/actuator/metrics
2http://localhost:8080/actuator/metrics/jvm.buffer.memory.used

现有的 Actuator 格式并非 Promethus 支持的格式,所以需要加入相关 Promethus 支持的包统一格式

1<!--整合prometheus-->
2		<dependency>
3			<groupId>io.micrometer</groupId>
4			<artifactId>micrometer-registry-prometheus</artifactId>
5		</dependency>

会新增 prometheus 端点:http://localhost:8080/actuator/prometheus

 1# HELP jvm_memory_usage_after_gc_percent The percentage of long-lived heap pool used after the last GC event, in the range [0..1]
 2# TYPE jvm_memory_usage_after_gc_percent gauge
 3jvm_memory_usage_after_gc_percent{area="heap",pool="long-lived",} 0.0033393502235412598
 4# HELP executor_pool_max_threads The maximum allowed number of threads in the pool
 5# TYPE executor_pool_max_threads gauge
 6executor_pool_max_threads{name="applicationTaskExecutor",} 2.147483647E9
 7# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
 8# TYPE jvm_memory_max_bytes gauge
 9jvm_memory_max_bytes{area="heap",id="G1 Survivor Space",} -1.0
10jvm_memory_max_bytes{area="heap",id="G1 Old Gen",} 8.589934592E9
11...

关键指标说明
指标的具体名称和标签可能会因SpringBoot版本、监控工具和配置而有所不同

  • jvm_memory_max_bytes: JVM 各个区域的最大可用内存(以字节为单位)
  • jvm_memory_used_bytes: JVM 使用的内存量(以字节为单位)
  • jvm_threads_states_threads: JVM 线程状态的数量
  • process_cpu_usage: 进程的 CPU 使用率。
  • process_start_time_seconds: 进程启动的时间戳。
  • http_server_requests_seconds: HTTP 请求的响应时间。
  • tomcat_sessions_active_current: 当前活动的 Tomcat 会话数量。
  • system_cpu_usage: 系统的 CPU 使用率

Maven 打成 jar 包
arch-web-0.0.1-SNAPSHOT.jar

 1### maven打包
 2PS D:\Project\arch-web> cd .\arch-web\
 3PS D:\Project\arch-web\arch-web> pwd
 4
 5Path
 6----
 7D:\Project\arch-web\arch-web
 8
 9
10PS D:\Project\arch-web\arch-web> mvn install
11
12### 本地也可以进行测试(如果本地都启动不成功就没有必要上传)
13PS D:\Project\arch-web\arch-web\target> cd D:\Project\arch-web\arch-web\target 
14PS D:\Project\arch-web\arch-web\target> java -jar .\arch-web-0.0.1-SNAPSHOT.jar
15
16### jar包上传CentOS7,守护进程启动
17[root@localhost software]# nohup java -jar arch-web-0.0.1-SNAPSHOT.jar &
18
19### 查看日志
20[root@localhost software]# tail nohup.out
212023-10-04T17:52:21.738+08:00  INFO 4586 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1105 ms
222023-10-04T17:52:22.323+08:00  INFO 4586 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 14 endpoint(s) beneath base path '/actuator'
232023-10-04T17:52:22.398+08:00  INFO 4586 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
242023-10-04T17:52:22.434+08:00  INFO 4586 --- [           main] soulboy.pub.archweb.ArchWebApplication   : Started ArchWebApplication in 2.402 seconds (process running for 2.739)

CentOS7 部署 JDK17(运行 jar 包)

jdk-17_linux-x64_bin.tar.gz

 1### 部署JDK17
 2[root@localhost software]# mkdir /usr/local/software
 3[root@localhost software]# tar -zxvf jdk-17_linux-x64_bin.tar.gz
 4[root@localhost software]# mv jdk-17.0.7 /usr/local/software/jdk17
 5[root@localhost ~]# vim /etc/profile
 6JAVA_HOME=/usr/local/software/jdk17
 7CLASSPATH=$JAVA_HOME/lib/
 8PATH=$PATH:$JAVA_HOME/bin
 9export PATH JAVA_HOME CLASSPATH
10
11#保存生效
12[root@localhost ~]# source /etc/profile
13[root@localhost ~]# java -version
14java version "17.0.7" 2023-04-18 LTS
15Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224)
16Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing)

Prometheus 整合配置

 1### 修改配置文件
 2[root@localhost ~]# vim /tmp/prometheus/prometheus.yml
 3  - job_name: "springboot"
 4    scrape_interval: 15s
 5    scrape_timeout: 10s
 6    metrics_path: '/actuator/prometheus'
 7    static_configs:
 8      - targets: ['192.168.10.21:8080']
 9
10### 动态更新配置
11[root@localhost prometheus]# curl -X POST http://192.168.10.20:9090/-/reload
12
13### 访问springboot actuator
14http://192.168.10.21:8080/actuator/prometheus
15# HELP system_cpu_count The number of processors available to the Java virtual machine
16# TYPE system_cpu_count gauge
17system_cpu_count 2.0
18# HELP jvm_memory_used_bytes The amount of used memory
19# TYPE jvm_memory_used_bytes gauge
20jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 8090496.0
21jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 2576112.0
22jvm_memory_used_bytes{area="heap",id="G1 Old Gen",} 1.4966784E7
23jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 3.5131496E7
24jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 1267840.0
25jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 1.3631488E7
26jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 4561584.0
27jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 2313472.0
28# HELP executor_completed_tasks_total The approximate total number of tasks that have completed execution
29# TYPE executor_completed_tasks_total counter
30executor_completed_tasks_total{name="applicationTaskExecutor",} 0.0
31# HELP jvm_threads_daemon_threads The current number of live daemon threads
32# TYPE jvm_threads_daemon_threads gauge
33jvm_threads_daemon_threads 17.0
34
35### prometheus web端查看
36http://192.168.10.20:9090/



PromQL

什么是 PromQL

  • Prometheus 提供了内置的数据查询语言 PromQL,全称为 Prometheus Query Language
  • 是 Prometheus 自己开发的数据查询 DSL 语言,可以让用户实时选择和聚合时间序列数据
  • PromQL 是对指标(Metric)的查询/聚合/过滤的处理,Metric 的语法格式 <metric name>{<label name>=<label value>, ...}

条件筛选

1### 不带条件(两种写法都一样)
2jvm_classes_loaded_classes
3jvm_classes_loaded_classes{}
4
5### 带条件
6jvm_classes_loaded_classes{job="springboot"}
7jvm_classes_loaded_classes{job!="springboot-test"}

不完全匹配

1###  表示选择那些标签符合正则表达式定义的时间序列
2label=~regx
3
4### 进行排除
5label!~regx
6
7### 示例
8jvm_classes_loaded_classes{job =~ "springboot|java|javaweb"}

时间范围选择器

 1### 支持多种时间单位
 2s - 秒
 3m - 分钟
 4h - 小时
 5d - 天
 6w - 周
 7y - 年
 8
 9### 示例
10# 过去五分钟的数据
11up[5m]
12
13
14# 一天之前的数据
15up[1d]

数学运算符

  • +(加法)、-(减法) 、*(乘法)、/(除法)、%(求余)、^(幂运算)

布尔运算符

  • ==(相等)、!=(不相等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
1### 筛选出请求次数超过 100 次的接口
2prometheus_http_requests_total > 100

集合运算符

  • and(并且-交集)、or(或者-并集)、unless(除非-补集)

聚合操作符

 1### 计算所有接口的请求数量总和
 2sum(prometheus_http_requests_total{})
 3
 4### 匹配其中样本值为最小的时间序列
 5min(prometheus_http_requests_total{})
 6
 7### 匹配其中样本值为最大的时间序列
 8max(prometheus_http_requests_total{})
 9
10### 求出所有样本的平均值 
11avg(prometheus_http_requests_total{})
12
13### 请求数后 5 位的时序样本数据
14bottomk (5,prometheus_http_requests_total{})
15
16### 请求数前 5 位的时序样本数据
17topk (5,prometheus_http_requests_total{})
18
19### 计算一共有几条数据,和sum不一样,sum是对value进行求和
20count (prometheus_http_requests_total{})
21
22### 样本值升序排序
23sort(prometheus_http_requests_total)
24
25### 样本值倒序排序 (指定时间区间后,计算该指标在最早和最晚时间的值的差,即增长量)
26sort_desc(prometheus_http_requests_total)
27
28### 计算在过去1分钟内CPU使用时间的指标增长量
29* 如果除以相关时间范围,则可以计算出增长率,和rate函数效果一样
30* 单使用rate或者increase函数去计算样本的平均增长速率,容易陷入“长尾问题”,无法反应在时间窗口内样本数据的突发变化
31increase(node_cpu_seconds_total[1m])
32
33### 关键字(分组,类似 SQL 中的 group by)
34* without 用于从计算结果中移除列出的标签,而保留其它标签
35# 在prometheus_http_requests_total指标中,排除 instance,handler,job,来进行分组求和
36sum(prometheus_http_requests_total{}) without (instance,handler,job) 
37
38* by  计算结果 中只保留列出的标签,其余标签则移除
39# 在prometheus_http_requests_total指标中根据code来分组求和
40sum(prometheus_http_requests_total{}) by (code)
41
42### 指标值的变化速率:irate函数的图像峰值变化大,rate函数变化较为平缓
43* rate函数的图像峰值变化大,rate函数变化较为平缓**
44* 使用`irate`函数可以更精确地捕捉到短期内的变化,而`rate`函数则更适合用于观察长周期的趋势
45* rate适合缓慢变化的计数器,使用了平均值,很容易把峰值削平,除非把时间间隔设置得足够小,就能够减弱这种效应
46
47例如,计算过去5分钟内节点的网络接收字节数和传输字节数的变化速率
48
49# rate适用于根据一定时间范围内的样本计算速率, 也就是我们常说的QPS,函数原型为:rate(vector range-vector)  
50  rate只是算出来某个时间区间内的【平均速率】,没办法反映突发变化
51  假设在一分钟的时间区间里,前50秒的请求量都是010左右,但最后10秒请求量暴增到200以上,则不能很好反映变化
52rate(node_network_receive_bytes_total[5m]) + rate(node_network_transmit_bytes_total[5m])
53
54# irate函数以瞬间速率的方式返回时间序列的变化率(每秒),它适用于在一段时间内考虑单个样本的变化,会考虑时间范围内最近两个样本之间的变化
55  函数原型为:`irate(vector range-vector)`
56irate(node_network_receive_bytes_total[5m]) + irate(node_network_transmit_bytes_total[5m])

统计 CPU 使用率

需求
计算服务器的 CPU 的使用率(1 分钟)

指标
node_cpu_seconds_total 用来统计 CPU 每种模式下所花费的时间,不加条件则是 CPU 使用时间总和

思路

  • 计算 CPU 使用率,简单的说就是除 idle 状态之外的 CPU 时间除以 CPU 总时间
  • CPU 的使用率 = (所有非空闲状态 CPU 使用时间总和 )/(所有状态 CPU 时间总和)
  • 用 prometheus 的计算思路就是:1- idle/total
 1#过滤出CPU空闲的时间
 2node_cpu_seconds_total{mode="idle"}
 3
 4#统计idle状态时长
 5sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
 6
 7#统计总时长
 8  #sum函数是将所有CPU核数时间相加,没有按照主机进行聚合,就需要引入 by (instance) 函数,即分组
 9  #by (instance) 它会把sum求和到一起的数值按照指定方式进行拆分,instance代表的是机器名
10  #如果不写by (instance)的话就需要在{ }中写明需要哪个实例的数据 
11sum(increase(node_cpu_seconds_total[1m])) by (instance)
12
13#计算出idle时长和总时长,CPU使用率的表达式
14(1 - sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance) ) * 100


Grafana

数据源广:

  • 官网地址:https://grafana.com/

  • 用 Go 语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。

  • 可视化

    • 支持快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件
    • 比如热图、折线图、图表等多种展示方式
  • Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 和 KairosDB 等。
  • 支持混合数据源,在同一个图中混合不同的数据源,可以根据每个查询指定数据源,甚至适用于自定义数据源。
  • 报警
    • 支持可视方式定义最重要指标的警报规则,Grafana 将不断计算并发送通知,在数据达到阈值时进行告警
  • 避免混淆各个组件主要的作用概念
    • Exporter 数据生产者,采集需要监控的数据
    • Prometheus 普罗米修斯时序数据库,用来存储和查询的监控数据,从 Exporter 上拉取
    • Grafana 可视化工具仪表盘

部署 grafana

1### docker部署grafana
2docker run -d -p 3000:3000 --name=soulboy-grafana grafana/grafana:8.1.5
3
4### URL admin 密码:admin
5http://192.168.10.20:3000/login

配置数据源

  • 用户

    • Grafana 里面用户有三种角色 admin,editor,viewer
    • admin 权限最高,可以执行任何操作,包括创建用户,新增 Datasource、DashBoard。
    • editor 角色不可以创建用户,不可以新增 Datasource,可以创建 DashBoard。
    • viewer 角色仅可以查看 DashBoard
  • 组织

    • 每个用户可以拥有多个 Organization,用户登录后可以在不同的 Organization 之间切换
    • 不同的 Organization 之间完全不一样,包括 datasource,dashboard 等都不一样
    • 创建一个 Organization 就相当于开了一个全新的视图,所有的 datasource,dashboard 等都要再重新开始创建
  • 数据源 (Data Source )

    • Grafana 支持多种不同的时序数据库数据源,对每种数据源提供不同的查询方法,而且能很好的支持每种数据源的特性
    • 可以将多个数据源的数据合并到一个单独的仪表板上
  • 仪表盘(Dashboard)

    • 最重要 UI 界面 仪表盘,通过数据源定义好可视化的数据来源,Dashboard 来组织和管理数据可视化图表
    • 仪表盘可以视为一组一个或多个面板组成的一个集合,来展示各种各样的面板。
  • 面板 (Panel)

    • Panel 在一个 Dashboard 中一个最基本的可视化单元为一个 Panel(面板)
    • 通过 Panel 的 Query Editor(查询编辑器)为每一个 Panel 添加查询的数据源以及数据查询方式,每一个 Panel 都是独立的
  • 探索 (Explore)

最佳实践 Grafana 应用市场-高效导入仪表盘

  • 需求

    • Grafana 支持很多数据源,但是不同中间件太多,每个 panel 又很多选项
    • 一个个配置对于开发新手和老手都是比较麻烦的,能不能达到复用呢?
  • Grafana 应用市场

    • 地址:https://grafana.com/grafana/dashboards/
    • 是 Grafana 社区和其他用户分享的可装载的仪表板和面板集合
    • 当安装应用程序市场模板时,Grafana 会自动安装和配置自定义仪表板面板,并可以自动设置相关数据源
    • 应用市场模板可以是来自 Grafana 仓库、别人的 GitHub 仓库、开源项目或个人创建的
    • Grafana 模板使得共享可装载的仪表板变得容易,从而帮助用户减少了工作量,并促进了最佳设置和最佳配置的使用

Grafana 的 Alert 监控告警

  • 需求

    • Alertmanager 是 Prometheus 的一个组件,用于定义和发送告警通知,Grafana 也有告警功能,两个组件各有优缺点
    • Grafana 更适合于互联网领域的常规监控系统,而 Alertmanager 更适合于大规模或更复杂的告警处理场景
    • 如果需要告警功能并且已经使用 Grafana 进行数据可视化,则可以使用 Grafana 作为告警处理工具
  • 两者对比

    • Grafana
      • 优点
        • 简单易用,Grafana 的告警规则配置界面直观易懂,可以方便地设置告警的触发条件、持续时间和通知方式等。
        • 定制性强,Grafana 的告警规则支持自定义查询和指标,使得监控系统的告警范围更加广泛。
        • 能够对告警事件进行统计和可视化处理,在 Grafana 中可以方便地对告警事件进行统计,同时还可以进行实况监控和定期报告等操作。
      • 缺点
        • 不支持高级告警逻辑。Grafana 只能识别基于简单算术或表达式的逻辑,无法支持更复杂的逻辑。
        • 设计初衷不是作为告警处理工具,Grafana 更多地是作为数据可视化工具
        • 核心功能是数据分析和展示,并不是专门的告警处理工具,因此不太适合大规模或复杂的告警处理场景
        • 可扩展性不够,无法满足比较复杂、高级的告警规则设计
    • Alertmanager
      • 优点
        • 提供高级告警逻辑功能,支持许多常用的高级告警逻辑,如静默、抑制和聚合等。
        • 支持多通道分发告警,支持将告警通知分发到多个通道,如电子邮件,短信等,能够满足不同场景下的需求。
        • 可靠性高,提供多种保护机制,如去重、失败重试和自动恢复,确保告警能够可靠地传送给相应的接收方。
        • 支持高度可扩展性,可以与各种 monitoring system 集成使告警触发进一步个性化
      • 缺点
        • 复杂和难以部署,Alertmanager 的配置比 Grafana 更复杂,需要深入了解监控系统和告警系统。
        • 学习成本高,Alertmanager 需要学习更多的知识和技能才能掌握
        • 不善于定义静态监控告警,对于 Dashboard 监控告警,它可能不太适合。

Grafana 的告警界面介绍:由 告警规则 + 推送通道 组成

  • Alert Rules 告警规则

    • 根据 panel 面板进行配置告警规则,满足相关条件则会触发告警,并通过推送通道推送给对应的接受者
    • 注意:查询条件使用模版变量,会识别不了,导致告警创建失败,可以进行硬编码替换模版变量

Notifications Channel 推送通道

  • 支持多个通知方式,用于向用户推送告警信息,可以根据不同的应用场景选择适合的通知渠道
  • 比如:Email、Slack、钉钉、Webhook 等

Grafana 之钉钉群告警机器人

  • 使用 Grafana 的 alert 告警模块,检测应用是否存活
  • 配置自动告警机器人,如果应用宕机超过 1 分钟,推送到钉钉群
  • 注意:一般只有 graph panel 也就是图表面板(一般都是折线图和柱状图或者点状图)可以添加 Alert ,其他面板不支持。

实战步骤

问题修复

  • 点击群告警信息没法直接进到告警页面
  • 解决方案:配置默认跳转路径,使用 root 用户进入容器修改配置文件
 1# 进入容器
 2docker exec -u 0 -it soulboy-grafana /bin/bash
 3
 4#通过容器id进入
 5docker exec -u 0 -it 940d7837c3aa  /bin/bash
 6
 7# 默认是localhost
 8bash-5.1# vi /usr/share/grafana/conf/defaults.ini
 9domain = 192.168.10.20
10
11#通过容器id重启
12exit
13docker restart 940d7837c3aa


作者:Soulboy