一、前言
在当今高度数字化的世界中,监控系统的稳定性和可靠性对于确保业务连续性和性能优化至关重要。特别是在网络隔离或无互联网接入的局域网环境下,离线部署监控解决方案成为了一种必要且挑战性的任务。本文将深入探讨如何在离线环境中成功部署 Prometheus、Alertmanager、Node Exporter 和 Grafana 这一强大的监控生态系统。
通过详细解析每个组件的功能和特性,笔者将介绍从资源准备、安装配置到系统集成的全过程,确保学习的小伙伴能够在无网环境下构建一个高效、可靠的监控体系。无论您是运维工程师、系统管理员还是DevOps团队成员,本文都将为大伙提供宝贵的知识和实战经验,希望本文能让大家能在监控领域的探索之路上更进一步。
二、监控组件简单介绍
在构建监控系统时,Prometheus、Alertmanager、Node Exporter 和 Grafana 是四个核心组件。它们各自扮演着不同的角色,共同构成了一个强大的监控和警报生态系统。以下是对每个组件的详细介绍:
(1)Prometheus
Prometheus 是由 SoundCloud 公司于2012年开发的一款开源监控和警报工具包。当时,SoundCloud 面临着日益增长的监控需求,传统的监控解决方案无法满足其对多维数据模型和灵活查询的需求。因此,他们决定开发一个全新的监控系统,这就是 Prometheus 的雏形。
Prometheus 的设计灵感来源于 Google 的 Borgmon 监控系统,它采用了时间序列数据模型和强大的查询语言,使得用户可以轻松地对大规模分布式系统进行监控和分析。2015年,Prometheus 正式成为继 Kubernetes 之后第二个从 Cloud Native Computing Foundation (CNCF) 毕业的项目,这标志着它在云原生领域的广泛认可和应用。
Prometheus 作为一个开源的监控和警报工具包,以其多维数据模型、强大的查询语言和灵活的警报管理功能,在云原生和微服务架构中得到了广泛应用。通过与 Alertmanager、Node Exporter 和 Grafana 等组件的集成,Prometheus 提供了一个完整且高效的监控解决方案,帮助用户实时监控系统性能、优化资源利用并确保业务连续性。
主要功能:
-
数据采集和存储
Prometheus 通过 HTTP 拉取(pull)方式从配置的目标端点收集指标数据。这些目标可以是应用程序、服务器、数据库或其他任何能够暴露指标的系统组件。Prometheus 将采集到的数据存储在本地的时间序列数据库中,这种设计使得数据采集和存储非常高效和可靠。
-
多维数据模型
Prometheus 采用多维数据模型,每个时间序列数据由指标名称和一组键值对(标签)唯一标识。这种模型提供了极大的灵活性,使得用户可以轻松地对数据进行过滤、聚合和查询。
-
强大的查询语言(PromQL)
Prometheus 提供了一种强大的查询语言——PromQL(Prometheus Query Language),用户可以使用 PromQL 对时间序列数据进行实时分析和聚合。PromQL 支持各种复杂的查询操作,如范围查询、聚合、预测和警报规则配置。
-
警报管理
Prometheus 内置了警报管理功能,用户可以配置警报规则,当满足特定条件时,Prometheus 会生成警报并发送给 Alertmanager。Alertmanager 负责对警报进行去重、分组和路由,并将警报发送到合适的接收器,如电子邮件、Slack、PagerDuty 等。
-
可视化和仪表盘
虽然 Prometheus 本身提供了基本的可视化界面,但更常用的是与 Grafana 集成,利用 Grafana 强大的可视化功能创建丰富的仪表盘和图表。Grafana 支持多种数据源,包括 Prometheus,用户可以轻松地创建自定义的仪表盘,展示关键指标和性能数据。
-
生态系统支持
Prometheus 拥有一个活跃的社区和丰富的生态系统,提供了大量的 exporter 和客户端库,支持几乎所有主流编程语言和系统组件。这使得 Prometheus 可以轻松地集成到现有的技术栈中,实现全面的监控覆盖。
(2)Alertmanager
Alertmanager 是 Prometheus 监控生态系统中的一个核心组件,专门负责处理和分发警报。它最初是作为 Prometheus 项目的一部分开发的,旨在解决 Prometheus 监控系统中的警报管理问题。随着 Prometheus 的广泛应用和社区的发展,Alertmanager 逐渐成为一个独立且功能强大的警报管理工具。
Alertmanager 的设计目标是提供一个灵活、可靠且易于扩展的警报管理系统。它支持多种警报接收器,如电子邮件、Slack、PagerDuty 等,并且可以通过配置实现警报的去重、分组和路由,从而减少警报噪音,提高警报处理的效率和准确性。
Alertmanager 作为 Prometheus 生态系统中的一个关键组件,以其灵活的警报处理机制、强大的路由功能和高可用性设计,在实际工作中发挥着重要作用。通过与 Prometheus、Node Exporter 和 Grafana 等组件的集成,Alertmanager 帮助用户构建一个完整且高效的监控和警报系统,确保关键警报能够及时得到处理,提高系统的稳定性和可靠性。
主要功能:
-
警报接收和处理
Alertmanager 从 Prometheus 接收警报,并对这些警报进行处理。它可以根据预定义的规则对警报进行去重和分组,将多个相似的警报合并成一个通知,从而减少警报噪音,提高警报处理的效率。
-
警报路由
Alertmanager 支持灵活的警报路由机制,可以根据警报的标签和注解将警报路由到不同的接收器。例如,可以将关键警报发送到即时通讯工具(如 Slack),将非关键警报发送到电子邮件,从而确保关键警报能够及时得到处理。
-
静默和抑制
Alertmanager 提供了静默(silence)和抑制(inhibition)机制,帮助用户更好地管理警报。静默机制允许用户在特定时间段内忽略某些警报,而抑制机制则可以在某个警报触发时,抑制与之相关的其他警报,避免重复发送警报。
-
高可用性
Alertmanager 支持集群模式,可以实现高可用性和负载均衡。通过配置多个 Alertmanager 实例,可以确保在某个实例故障时,警报处理不会中断,从而提高整个监控系统的可靠性和稳定性。
-
集成和扩展
Alertmanager 可以与多种警报接收器集成,如电子邮件、Slack、PagerDuty、Webhook 等。此外,Alertmanager 还支持通过 Webhook 扩展,用户可以自定义 Webhook 接收器,实现与第三方系统的集成,从而满足各种复杂的警报处理需求。
(3)Node Exporter
Node Exporter 也是 Prometheus 监控生态系统中的一个重要组件,专门用于收集和暴露硬件和操作系统级别的指标。它最初是由 Prometheus 社区开发的,旨在为 Prometheus 提供一种标准化的方式来收集和暴露系统级别的监控数据。
Node Exporter 的设计目标是轻量级、高效且易于部署。它运行在目标机器上,通过 HTTP 接口暴露系统级别的指标,如 CPU 使用率、内存使用率、磁盘 I/O 和网络流量等。这些指标可以被 Prometheus 服务器通过拉取(pull)方式收集和存储。
主要功能:
-
系统指标收集:收集和暴露系统级别的指标。
-
兼容性:Node Exporter 支持多种操作系统和硬件平台,包括 Linux、Windows、FreeBSD 等。
-
灵活配置:可以通过命令行参数和配置文件进行灵活配置。用户可以根据实际需求选择收集哪些指标,以及如何暴露这些指标。
(4)Grafana
Grafana 是一个开源的分析和监控平台,最初由 Torkel Ödegaard 在2014年创建。Grafana 的诞生源于对现有监控和可视化工具的不满,Ödegaard 希望创建一个更灵活、更强大的工具,能够满足复杂的数据可视化和监控需求。
Grafana 的设计目标是提供一个易于使用、高度可定制且支持多种数据源的监控和分析平台。它支持多种数据库和数据源,包括 Prometheus、InfluxDB、Elasticsearch、Graphite 等,用户可以通过创建仪表盘(dashboard)来展示和分析数据。
主要功能:
-
数据可视化
Grafana 提供了丰富的图表和图形,用户可以通过创建仪表盘来展示和分析数据。Grafana 支持多种图表类型,如折线图、柱状图、饼图、热图、仪表盘等,用户可以根据需求选择合适的图表类型,创建自定义的仪表盘。
-
多数据源支持
Grafana 支持多种数据源,包括 Prometheus、InfluxDB、Elasticsearch、Graphite 等。用户可以在同一个仪表盘上集成来自不同数据源的数据,实现全面的数据可视化和分析。
-
实时数据展示
Grafana 可以实时展示数据,用户可以通过配置刷新间隔,确保仪表盘上的数据始终保持最新。这对于监控系统性能、业务指标和关键绩效指标(KPI)非常重要。
-
警报和通知
Grafana 支持在仪表盘上配置和管理警报。用户可以设置警报规则,当某些指标超过预设阈值时,Grafana 会生成警报并发送通知。Grafana 支持多种通知渠道,如电子邮件、Slack、PagerDuty 等。
-
用户和权限管理
Grafana 提供了完善的用户和权限管理功能,用户可以创建多个用户和角色,并为每个角色分配不同的权限。这使得 Grafana 可以安全地集成到企业环境中,满足不同用户和团队的需求。
-
插件和扩展
Grafana 拥有一个活跃的社区和丰富的插件生态系统,用户可以通过安装插件扩展 Grafana 的功能。例如,可以安装 Prometheus 插件,实现与 Prometheus 的集成;安装 Elasticsearch 插件,实现与 Elasticsearch 的集成。
这四个组件共同构成了一个完整的监控和警报系统:
-
Prometheus 负责数据采集和存储。
-
Alertmanager 负责警报管理。
-
Node Exporter 负责收集系统级别的指标。
-
Grafana 负责数据可视化和仪表盘展示。
通过合理配置和集成这些组件,我们可以构建一个强大且灵活的监控系统,满足不同场景下的监控需求。
三、离线环境下的资源准备
既然是离线环境,首先咱们需要将prometheus及其对应的组件安装包下载下来,上传到服务器上进行安装。下面是对应的下载地址信息,可根据自己服务器信息下载对应版本的安装包资源:
prometheus官方下载地址可以下载prometheus以及其相关组件Alertmanager和一些exporter的安装包,包括但不限于node_exporter、mysqld_exporter、memcached_exporter等等。如果下载prometheus较慢这里大家也可以在国内的清华大学开源软件镜像站下载。但是Alertmanager和node_exporter可能还得在prometheus官网下载,暂时没发现其他国内源可下载。
Grafana官方下载地址可下载grafana的安装包,进入后直接找到合适的安装包进行下载即可。
但是一般官网下载速度都比较慢,因此笔者这里推荐两个国内源进行下载:
-
Grafana阿里云镜像源
-
Grafana清华大学源
当然,为了方便使用对应的资源笔者已经下载完毕并放在个人资源中了,大家也可以直接去下载需要的安装包即可。
然后将相关组件信息上传至服务器上后便可以进行正式的部署流程了:
root@master01:~# mkdir -p /opt/monitor/
root@master01:/opt/monitor# ls -l
总计 269376
-rw-r--r-- 1 root root 30866868 8月 28 11:01 alertmanager-0.27.0.linux-amd64.tar.gz
-rw-r--r-- 1 root root 135768146 8月 27 22:03 grafana-enterprise-11.2.0.linux-amd64.tar.gz
-rw-r--r-- 1 root root 10676343 8月 28 11:01 node_exporter-1.8.2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 98500608 8月 9 20:02 prometheus-2.54.0.linux-amd64.tar.gz
四、安装并配置prometheus
解压prometheus的离线安装包:
root@master01:/opt/monitor# tar -xvf prometheus-2.54.1.linux-amd64.tar.gz
prometheus-2.54.1.linux-amd64/
prometheus-2.54.1.linux-amd64/NOTICE
prometheus-2.54.1.linux-amd64/LICENSE
prometheus-2.54.1.linux-amd64/prometheus.yml
prometheus-2.54.1.linux-amd64/prometheus
prometheus-2.54.1.linux-amd64/consoles/
prometheus-2.54.1.linux-amd64/consoles/prometheus-overview.html
prometheus-2.54.1.linux-amd64/consoles/node-overview.html
prometheus-2.54.1.linux-amd64/consoles/index.html.example
prometheus-2.54.1.linux-amd64/consoles/node.html
prometheus-2.54.1.linux-amd64/consoles/node-disk.html
prometheus-2.54.1.linux-amd64/consoles/prometheus.html
prometheus-2.54.1.linux-amd64/consoles/node-cpu.html
prometheus-2.54.1.linux-amd64/promtool
prometheus-2.54.1.linux-amd64/console_libraries/
prometheus-2.54.1.linux-amd64/console_libraries/menu.lib
prometheus-2.54.1.linux-amd64/console_libraries/prom.lib
root@master01:/opt/monitor# mv prometheus-2.54.1.linux-amd64 ./prometheus
root@master01:/opt/monitor# ls -l prometheus
总计 265568
drwxr-xr-x 2 1001 docker 4096 8月 27 19:11 console_libraries
drwxr-xr-x 2 1001 docker 4096 8月 27 19:11 consoles
-rw-r--r-- 1 1001 docker 11357 8月 27 19:11 LICENSE
-rw-r--r-- 1 1001 docker 3773 8月 27 19:11 NOTICE
-rwxr-xr-x 1 1001 docker 140096826 8月 27 18:58 prometheus
-rw-r--r-- 1 1001 docker 934 8月 27 19:11 prometheus.yml
-rwxr-xr-x 1 1001 docker 131802216 8月 27 18:58 promtool
配置prometheus服务并加入系统服务管理,其中指定prometheus的文件存放地与配置文件信息,另外有需要的话更改一下默认访问端口,这里我将默认的9090改为了30080:
root@master01:/opt/monitor/prometheus# vi /etc/systemd/system/prometheus.service
root@master01:/opt/monitor/prometheus# cat /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview
After=network-online.target
[Service]
Type=simple
Restart=on-failure
ExecStart=/opt/monitor/prometheus/prometheus \
--config.file=/opt/monitor/prometheus/prometheus.yml \
--web.listen-address=:30080 \
--storage.tsdb.path=/opt/monitor/prometheus/data \
--storage.tsdb.retention.time=60d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
然后启动服务,查看是否可以启动成功:
root@master01:/opt/monitor/prometheus# systemctl daemon-reload
root@master01:/opt/monitor/prometheus# systemctl enable --now prometheus.service
root@master01:/opt/monitor/prometheus# systemctl status prometheus.service
● prometheus.service - Prometheus Server
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-08-28 15:13:48 CST; 2s ago
Docs: https://prometheus.io/docs/introduction/overview
Main PID: 342236 (prometheus)
Tasks: 9 (limit: 4546)
Memory: 16.4M
CPU: 73ms
CGroup: /system.slice/prometheus.service
└─342236 /opt/monitor/prometheus/prometheus --config.file=/opt/monitor/prometheus/prometheus.yml --web.listen-address=:30080 --storage.tsdb.path=/opt/monitor/prometheu>
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.226Z caller=head.go:721 level=info component=tsdb msg="Replaying WAL, this may take a while"
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.226Z caller=head.go:793 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.226Z caller=head.go:830 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=34.525µs>
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=main.go:1181 level=info fs_type=EXT4_SUPER_MAGIC
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=main.go:1184 level=info msg="TSDB started"
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=main.go:1367 level=info msg="Loading configuration file" filename=/opt/monitor/prometheus/prometheus>
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=main.go:1404 level=info msg="updated GOGC" old=100 new=75
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=main.go:1415 level=info msg="Completed loading of configuration file" filename=/opt/monitor/promethe>
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=main.go:1145 level=info msg="Server is ready to receive web requests."
8月 28 15:13:48 master01 prometheus[342236]: ts=2024-08-28T07:13:48.229Z caller=manager.go:164 level=info component="rule manager" msg="Starting rule manager..."
最后就可以通过ip+端口号访问prometheus的web页面了。
五、安装并配置alertmanager
解压alertmanager的离线安装包:
root@master01:/opt/monitor# tar -xvf alertmanager-0.27.0.linux-amd64.tar.gz
alertmanager-0.27.0.linux-amd64/
alertmanager-0.27.0.linux-amd64/alertmanager
alertmanager-0.27.0.linux-amd64/alertmanager.yml
alertmanager-0.27.0.linux-amd64/NOTICE
alertmanager-0.27.0.linux-amd64/amtool
alertmanager-0.27.0.linux-amd64/LICENSE
root@master01:/opt/monitor# mv alertmanager-0.27.0.linux-amd64 alertmanager
配置alertmanager并其加入系统服务,与prometheus上面的配置方式大致相同:
root@master01:/opt/monitor/alertmanager# vi /etc/systemd/system/alertmanager.service
root@master01:/opt/monitor/alertmanager# pwd
/opt/monitor/alertmanager
root@master01:/opt/monitor/alertmanager# cat /etc/systemd/system/alertmanager.service
[Unit]
Description=alertmanager server daemon
After=network.target
[Service]
ExecStart=/opt/monitor/alertmanager/alertmanager --config.file=/opt/monitor/alertmanager/alertmanager.yml --storage.path=/opt/monitor/alertmanager/data
Restart=always
User=root
[Install]
WantedBy=multi-user.target
然后启动服务,查看是否可以启动成功:
root@master01:/opt/monitor/alertmanager# systemctl enable --now alertmanager.service
Created symlink /etc/systemd/system/multi-user.target.wants/alertmanager.service → /etc/systemd/system/alertmanager.service.
root@master01:/opt/monitor/alertmanager# systemctl status alertmanager
● alertmanager.service - alertmanager server daemon
Loaded: loaded (/etc/systemd/system/alertmanager.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2024-08-28 15:45:09 CST; 11s ago
Main PID: 375779 (alertmanager)
Tasks: 9 (limit: 4546)
Memory: 14.3M
CPU: 120ms
CGroup: /system.slice/alertmanager.service
└─375779 /opt/monitor/alertmanager/alertmanager --config.file=/opt/monitor/alertmanager/alertmanager.yml --storage.path=/opt/monitor/alertmanager/data
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.782Z caller=main.go:181 level=info msg="Starting Alertmanager" version="(version=0.27.0, branch=HEAD, revision>
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.782Z caller=main.go:182 level=info build_context="(go=go1.21.7, platform=linux/amd64, user=root@22cd11f671e9, >
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.813Z caller=cluster.go:186 level=info component=cluster msg="setting advertise address explicitly" addr=192.16>
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.815Z caller=cluster.go:683 level=info component=cluster msg="Waiting for gossip to settle..." interval=2s
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.859Z caller=coordinator.go:113 level=info component=configuration msg="Loading configuration file" file=/opt/m>
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.859Z caller=coordinator.go:126 level=info component=configuration msg="Completed loading of configuration file>
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.861Z caller=tls_config.go:313 level=info msg="Listening on" address=[::]:9093
8月 28 15:45:09 master01 alertmanager[375779]: ts=2024-08-28T07:45:09.861Z caller=tls_config.go:316 level=info msg="TLS is disabled." http2=false address=[::]:9093
8月 28 15:45:11 master01 alertmanager[375779]: ts=2024-08-28T07:45:11.816Z caller=cluster.go:708 level=info component=cluster msg="gossip not settled" polls=0 before=0 now=1 elapse>
8月 28 15:45:19 master01 alertmanager[375779]: ts=2024-08-28T07:45:19.818Z caller=cluster.go:700 level=info component=cluster msg="gossip settled; proceeding" elapsed=10.003257556s
待启动完成后需要将alertmanager加入prometheus。重新修改prometheus的配置文件:
root@master01:/opt/monitor/alertmanager# vi ../prometheus/prometheus.yml
root@master01:/opt/monitor/alertmanager# cat ../prometheus/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:
- localhost: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:30080"]
解除原本已注释掉的alertmanager配置,更改为自己的alertmanager服务地址,然后添加触发配置文件,这里名为“first.yml”:
root@master01:/opt/monitor/alertmanager# vi ../prometheus/first_rules.yml
root@master01:/opt/monitor/alertmanager# cat ../prometheus/first_rules.yml
groups:
- name: my first rules
rules:
- alert: 内存使用率过高
expr: 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 80
for: 3m
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.instance }} 内存使用率过高, 请尽快处理!"
description: "{{ $labels.instance }} 内存使用率超过80%, 当前使用率{{ $value }}%."
- alert: 服务器宕机
expr: up == 0
for: 1s
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.instance }} 服务器宕机, 请尽快处理!"
description: "{{ $labels.instance }} 服务器延时超过3分钟, 当前状态{{ $value }}."
- alert: CPU高负荷
expr: 100 - (avg by (instance, job)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 1m
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.instance }} CPU使用率过高, 请尽快处理!"
description: "{{ $labels.instance }} CPU使用大于90%, 当前使用率{{ $value }}%."
- alert: 磁盘IO性能
expr: avg(irate(node_disk_io_time_seconds_total[1m])) by (instance, job) * 100 > 90
for: 1m
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.instance }} 流入磁盘IO使用率过高, 请尽快处理!"
description: "{{ $labels.instance }} 流入磁盘IO大于90%, 当前使用率{{ $value }}%."
- alert: 网络流入
expr: ((sum(rate(node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance, job)) / 100) > 102400
for: 5m
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.instance }} 流入网络带宽过高,请尽快处理!"
description: "{{ $labels.instance }} 流入网络带宽持续5分钟高于100M. RX带宽使用量{{ $value }}."
- alert: 网络流出
expr: ((sum(rate(node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance, job)) / 100) > 102400
for: 5m
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.instance }} 流出网络带宽过高, 请尽快处理!"
description: "{{ $labels.instance }} 流出网络带宽持续5分钟高于100M. RX带宽使用量{{ $value }}."
- alert: TCP连接数
expr: node_netstat_Tcp_CurrEstab > 10000
for: 2m
labels:
severity: 严重告警
annotations:
summary: "TCP_ESTABLISHED过高!"
description: "{{ $labels.instance }} TCP_ESTABLISHED大于100%, 当前使用率{{ $value }}%."
- alert: 磁盘容量
expr: 100 - (node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100) > 90
for: 1m
labels:
severity: 严重告警
annotations:
summary: "{{ $labels.mountpoint }} 磁盘分区使用率过高,请尽快处理!"
description: "{{ $labels.instance }} 磁盘分区使用大于90%,当前使用率{{ $value }}%."
yml配置信息说明:
groups:
-
name
: 组合的告警组名称。
rules:
-
alert
: 报警名称。 -
expr
: PromQL 表达式,用于定义触发报警的条件。 -
for
: 定义触发报警条件后,持续满足条件的时间。 -
labels
: 额外的标签,可以附加到报警上)。 -
annotations
: 报警的元信息,用于说明报警的内容,例如summary
和description
。
之后可以用prometheus上的工具检查一下配置是否正确:
root@master01:/opt/monitor/prometheus# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 1 rule files found
SUCCESS: prometheus.yml is valid prometheus config file syntax
Checking first_rules.yml
SUCCESS: 8 rules found
重启prometheus后可在prometheus上看到定义的规则信息:
六、集成并配置node_exporter
流程与上述一致:
root@master01:/opt/monitor# tar -xvf node_exporter-1.8.2.linux-amd64.tar.gz
node_exporter-1.8.2.linux-amd64/
node_exporter-1.8.2.linux-amd64/NOTICE
node_exporter-1.8.2.linux-amd64/node_exporter
node_exporter-1.8.2.linux-amd64/LICENSE
root@master01:/opt/monitor# mv node_exporter-1.8.2.linux-amd64 ./node_exporter
root@master01:/opt/monitor# cd node_exporter/
root@master01:/opt/monitor/node_exporter# ls
LICENSE node_exporter NOTICE
root@master01:/opt/monitor/node_exporter# pwd
/opt/monitor/node_exporter
root@master01:/opt/monitor# vi /etc/systemd/system/node_exporter.service
root@master01:/opt/monitor/node_exporter# cat /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
ExecStart=/opt/monitor/node_exporter/node_exporter --collector.textfile.directory=/opt/monitor/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
root@master01:/opt/monitor/node_exporter# systemctl daemon-reload
root@master01:/opt/monitor/node_exporter# systemctl enable --now node_exporter.service
Created symlink /etc/systemd/system/multi-user.target.wants/node_exporter.service → /etc/systemd/system/node_exporter.service.
root@master01:/opt/monitor/node_exporter# systemctl status node_exporter.service
● node_exporter.service - node_exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: >
Active: active (running) since Wed 2024-08-28 17:05:08 CST; 2min 26s ago
Docs: https://prometheus.io/
Main PID: 461549 (node_exporter)
Tasks: 6 (limit: 4546)
Memory: 2.8M
CPU: 13ms
CGroup: /system.slice/node_exporter.service
└─461549 /opt/monitor/node_exporter/node_exporter --collector.textfile.dire>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
8月 28 17:05:08 master01 node_exporter[461549]: ts=2024-08-28T09:05:08.472Z caller=node_>
待正常启动后,将node_exporter到prometheus:
root@master01:/opt/monitor/node_exporter# cat ../prometheus/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:
- localhost: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:30080"]
- job_name: "node-exporter"
static_configs:
- targets: ["192.168.1.200:9100"]
labels:
instance: node_exporter
root@master01:/opt/monitor/node_exporter# vi ../prometheus/prometheus.yml
#重载服务
root@master01:/opt/monitor/node_exporter# curl -X POST http://localhost:30080/-/reload
然后便可以访问ip:端口/targets页面检查 node
目标的状态是否为 UP。 如果为UP代表其可以正常检测目标服务器上的系统信息。
七、安装并配置Grafana仪表盘
流程一致,不再重复赘述,直接走流程:
root@master01:/opt/monitor# tar -xvf grafana-enterprise-11.2.0.linux-amd64.tar.gz
root@master01:/opt/monitor# mv grafana-v11.2.0 ./grafana
root@master01:/opt/monitor# vi /etc/systemd/system/grafana-server.service
root@master01:/opt/monitor/grafana# cat /etc/systemd/system/grafana-server.service
[Unit]
Description=Grafana
After=network.target
[Service]
Type=notify
ExecStart=/opt/monitor/grafana/bin/grafana-server --config=/opt/monitor/grafana/conf/defaults.ini --homepath /opt/monitor/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
root@master01:/opt/monitor# systemctl daemon-reload
root@master01:/opt/monitor# systemctl start grafana-server && systemctl enable grafana-server
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /etc/systemd/system/grafana-server.service.
root@master01:/opt/monitor# systemctl status grafana-server
● grafana-server.service - Grafana
Loaded: loaded (/etc/systemd/system/grafana-server.service; enabled; vendor preset:>
Active: active (running) since Wed 2024-08-28 16:23:04 CST; 10s ago
Main PID: 416388 (grafana)
Tasks: 19 (limit: 4546)
Memory: 120.5M
CPU: 3.809s
CGroup: /system.slice/grafana-server.service
└─416388 grafana server --config=/opt/monitor/grafana/conf/defaults.ini --h>
8月 28 16:23:04 master01 grafana-server[416388]: logger=grafanaStorageLogger t=2024-08-2>
8月 28 16:23:04 master01 grafana-server[416388]: logger=http.server t=2024-08-28T16:23:0>
8月 28 16:23:04 master01 grafana-server[416388]: logger=provisioning.dashboard t=2024-08>
8月 28 16:23:04 master01 grafana-server[416388]: logger=provisioning.dashboard t=2024-08>
8月 28 16:23:04 master01 grafana-server[416388]: logger=grafana.update.checker t=2024-08>
grafana默认的访问端口是3000,默认账号密码是admin/admin,这个信息可以在config/defaults.ini里进行查看或者修改。第一次登录会让我们修改密码,然后就能进入主界面了。如果需要将页面信息设置为中文,可以在右上角头像那进入Profile进行语言设置:
在仪表盘这块可以添加由prometheus作为数据源监控的可视化数据源。
由于安装了node_exporter,所以咱们可以在探索-Metrics
上寻找一些可以使用到的数据图,这些都是监控系统收集到的Node Exporter 和 Go 应用的内置监控数据。
如果没有符合的,也可以通过下面的流程去运行指定的promQL查询语句查询信息,然后得到展示的可视化图片:
比如我们查询一下系统的内存使用情况和磁盘占用情况然后展示出来:
八、总结
这块内容主要还是prometheus+grafana可视化组件的安装及基础使用介绍,像alertmanager的告警使用,其实介绍的并不多,只有一个基础的安装和简单配置。等后面有空在专门补充一章告警通知这块的内容,敬请期待~欢迎一同交流学习~