openEuler上部署Prometheus+Grafana监控系统:让服务状态一目了然

开场:监控不能靠感觉

部署完RabbitMQ和Kafka后,这两个消息队列一直在跑。虽然看上去没什么问题,但心里总觉得不踏实:

  • 它们运行正常吗?
  • 资源占用多少?
  • 有没有消息堆积?
  • 性能瓶颈在哪里?

作为技术负责人,不能靠感觉,得有数据。所以决定搭个监控系统,把这些指标可视化出来。

Prometheus + Grafana是业界标配的监控方案。Prometheus负责采集和存储时序数据,Grafana提供美观的可视化界面。两者配合,可以轻松实现完整的监控体系。

今天就在openEuler上部署一套,把RabbitMQ和Kafka的运行状态全面监控起来。

一、为什么需要监控系统

1.1 没有监控的痛点

  • 问题发现滞后:用户反馈才知道消息堆积,有监控一眼就能看出来
  • 资源不清楚:不知道服务实际占用多少,配置靠猜
  • 优化没依据:不知道瓶颈在哪,CPU高还是内存不够?
  • 排查困难:只能看日志,效率低。有监控曲线,一眼定位时间点

1.2 监控的价值

  • 实时掌握状态:打开Dashboard,消息队列数量、吞吐量、资源占用,一目了然
  • 及时发现问题:设置告警规则,堆积超阈值自动通知
  • 数据驱动决策:根据监控数据优化配置,根据趋势判断扩容时机
  • 降低运维成本:可视化降低门槛,新人也能快速上手

1.3 选择Prometheus + Grafana

Prometheus:强大的时序数据库,Pull模式采集简单,支持PromQL查询,内置告警。

Grafana:美观的可视化界面,丰富图表,社区有大量现成Dashboard。

生态成熟:RabbitMQ、Kafka都有官方Exporter,Grafana有现成模板,文档齐全。

二、openEuler环境准备

2.1 当前环境

服务器还是之前那台2C4G的openEuler机器,hostname是tech-server-01。RabbitMQ和Kafka已经在上面跑了,现在要加上监控系统。

从截图看,目前运行着3个容器:

  • rabbitmq:RabbitMQ消息队列
  • zookeeper:Kafka的依赖
  • kafka:Kafka消息队列

这3个容器已经稳定运行一段时间了,内存占用共566MB左右,CPU使用很低。openEuler的资源管理很高效,2C4G的配置还有不少余量,完全可以再部署监控系统。

2.2 资源评估

看一下系统资源情况:

  • 内存:4GB总量,当前3个容器用了566MB,还剩3.4GB左右
  • CPU:2核,当前使用率很低
  • 磁盘:足够空间存储Prometheus的时序数据

部署Prometheus、Grafana和Node Exporter,预计再占用200-300MB内存,完全没问题。

2.3 openEuler的优势

资源利用率高:3个容器才用566MB内存,这要是在其他系统上,可能要800MB+。openEuler的内核优化确实做得好。

稳定可靠:容器长时间运行,内存占用没有增长,CPU调度稳定。这种稳定性对监控系统很重要,不能监控系统自己先挂了。

网络性能好:Prometheus要定期拉取指标,Grafana要实时刷新图表,都依赖网络性能。openEuler的网络栈性能不错,延迟低。

三、Docker快速部署Prometheus

3.1 监控架构设计

整体架构很清晰,一张图说明白:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text ┌─────────────────────────────────────┐ │ openEuler 22.03 LTS (2C4G) │ │ tech-server-01 │ └─────────────────────────────────────┘ │ ┌───────────────────────────┼───────────────────────────┐ │ │ │ │ ┌────────────────────┼────────────────────┐ │ │ │ Docker Network: kafka-network │ │ │ └─────────────────────────────────────────┘ │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ RabbitMQ │ │ Zookeeper │ │ │ │ :5672 │ │ :2181 │ │ │ │ :15672 │ └──────────────┘ │ │ └──────────────┘ │ │ │ │ │ │ │ │ ┌──────────────┐ │ │ │ │ Kafka │ │ │ │ │ :9092 │ │ │ │ └──────────────┘ │ │ │ │ │ │ │ │ │ │ ┌──────▼─────────────────────▼─────────┐ │ │ │ Prometheus :9090 │ │ │ │ (采集、存储时序数据) │ │ │ └──────────────────┬───────────────────┘ │ │ │ │ │ ┌───────────┼────────────┐ │ │ │ │ │ │ │ ┌──────▼──────┐ │ ┌──────▼──────┐ │ │ │ Node Exporter│ │ │ Grafana │ │ │ │ :9100 │ │ │ :3000 │ │ │ │ (系统监控) │ │ │ (可视化) │ │ │ └──────────────┘ │ └─────────────┘ │ │ │ │ └───────────────────────┼────────────────────────────────┘ │ ┌───────▼────────┐ │ 用户浏览器 │ │ 访问Dashboard │ └─────────────────┘ |

6个容器,各司其职

  • RabbitMQ (105MB):消息队列,自带Prometheus metrics端点
  • Zookeeper (80MB):Kafka的协调服务
  • Kafka (380MB):消息队列,通过JMX Exporter暴露指标
  • Prometheus (120MB):时序数据库,每15秒采集一次指标
  • Node Exporter (15MB):采集openEuler系统资源指标
  • Grafana (85MB):查询Prometheus数据,展示可视化Dashboard

总资源占用:785MB内存,3% CPU。2C4G的openEuler服务器轻松跑6个容器。

3.2 配置Prometheus

先创建Prometheus的配置文件:

配置文件定义了4个采集任务:

  1. prometheus自身监控

|-------------------------------------------------------------------------------|
| YAML - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] |

监控Prometheus自己的运行状态,包括采集延迟、存储占用等。

  1. 系统资源监控

|-----------------------------------------------------------------------------|
| YAML - job_name: 'node' static_configs: - targets: ['node-exporter:9100'] |

通过Node Exporter采集openEuler系统的CPU、内存、磁盘、网络等指标。

  1. RabbitMQ监控

|----------------------------------------------------------------------------------------------------------------------|
| YAML - job_name: 'rabbitmq' static_configs: - targets: ['host.docker.internal:15672'] metrics_path: '/api/metrics' |

RabbitMQ 3.8+版本自带Prometheus metrics端点,在管理端口15672的/api/metrics路径。这里用host.docker.internal访问宿主机的RabbitMQ。

  1. Kafka监控

|----------------------------------------------------------------------|
| YAML - job_name: 'kafka' static_configs: - targets: ['kafka:9090'] |

Kafka需要配置JMX Exporter来暴露指标。这里假设在Kafka容器内已经配置好,监听9090端口。

采集间隔

|--------------------------------------------------------------------------------------|
| YAML global: scrape_interval: 15s # 每15秒采集一次 evaluation_interval: 15s # 每15秒评估一次告警规则 |

15秒的采集间隔是个平衡点:既能及时发现问题,又不会给系统带来太大负担。openEuler的网络性能好,这个频率完全没问题。

3.3 启动Prometheus

启动Prometheus容器:

从截图看,Prometheus容器启动成功,容器ID是a5a4fdd53fea,端口9090已经映射出来。

启动命令把配置文件挂载进容器:

|--------------------------------------------------------------|
| Bash -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml |

这样修改配置后,只需重启容器就能生效,不用重新构建镜像。

另外加了--add-host=host.docker.internal:host-gateway参数,让容器可以通过host.docker.internal访问宿主机的服务(比如RabbitMQ的15672端口)。这是Docker 20.10+的新特性,很方便。

3.4 访问Prometheus Web界面

打开浏览器访问http://服务器IP:9090,就能看到Prometheus的Web界面。

界面很简洁,主要功能:

  • Graph:查询和可视化指标数据
  • Targets:查看各个采集目标的状态
  • Alerts:查看告警规则和触发状态
  • Status:查看Prometheus的运行状态

在Graph页面可以用PromQL查询指标,比如:

  • up:查看哪些Target是在线的
  • node_cpu_seconds_total:查看CPU使用时间
  • rabbitmq_queue_messages:查看RabbitMQ队列消息数

不过Prometheus的界面主要是用来调试的,真正的可视化还得靠Grafana。

3.5 启动Node Exporter

Node Exporter启动成功,端口9100已经映射出来。

Node Exporter会采集openEuler系统的各种指标:

  • CPU:使用率、空闲率、各个核心的负载
  • 内存:总量、已用、可用、缓存、交换分区
  • 磁盘:各个分区的空间、读写速率、IOPS
  • 网络:各个网卡的流量、错误包、丢包率
  • 文件系统:inode使用、挂载点状态

访问http://服务器IP:9100/metrics可以看到这些指标的原始数据,几百上千行。Prometheus会定期拉取这些数据,Grafana再把它们画成漂亮的图表。

四、部署Grafana可视化

4.1 启动Grafana

Grafana容器启动成功,端口3000已经映射出来。

启动后访问http://服务器IP:3000,会看到登录界面:

  • 默认用户名:admin
  • 默认密码:admin

首次登录会要求修改密码,改成自己的密码就行。

Grafana启动很快,几秒钟就能访问。这得益于openEuler的快速I/O和Docker的高效隔离。

4.2 配置Prometheus数据源

登录Grafana后,第一步是添加Prometheus作为数据源。

操作步骤:

  1. 左侧菜单 → Configuration → Data Sources
  1. 点击"Add data source"
  1. 选择"Prometheus"
  1. 配置参数:
  • Name: Prometheus(名字随意)
  • Access: Server(默认)
  1. 点击"Save & Test"

如果配置正确,会显示绿色的"Data source is working"提示。

这里用容器名prometheus作为URL,是因为Grafana和Prometheus都在kafka-network网络里,Docker会自动解析容器名为IP地址。这比用IP地址方便,容器重启后IP可能变,但名字不会变。

4.3 导入现成的Dashboard

Grafana社区有大量现成的Dashboard,直接导入就能用,省去自己配置的麻烦。

导入方法(三个Dashboard都一样):

  1. 左侧菜单 → Dashboards → Import
  1. 输入Dashboard ID
  1. 选择数据源:Prometheus
  1. 点击Import

推荐的Dashboard

|----------|--------------|-------------------------------------------|
| 监控对象 | Dashboard ID | 关键指标 |
| RabbitMQ | 10991 | 队列数量、消息速率、连接数、内存使用 |
| Kafka | 7589 | Topic/Partition、吞吐量、Consumer Lag、Broker状态 |
| 系统资源 | 1860 | CPU、内存、磁盘、网络 |

点击图片可查看完整电子表格

导入后,Dashboard自动读取Prometheus的数据,图表实时更新。

RabbitMQ Dashboard:一眼看出消息是否堆积、发布/消费速率是否正常。

Kafka Dashboard:监控分区状态、消费延迟、吞吐量趋势。

系统资源Dashboard:openEuler的CPU、内存、磁盘、网络一目了然。2核CPU大部分时间空闲,内存占用稳定在800MB左右,磁盘I/O不高,网络流畅。

五、openEuler上的监控系统表现

5.1 多容器稳定运行

现在服务器上运行着6个容器:

|---------------|---------|-----------|---------|
| 容器名 | 用途 | 内存占用 | CPU占用 |
| rabbitmq | 消息队列 | ~105 MiB | 0.20% |
| zookeeper | Kafka依赖 | ~80 MiB | 0.15% |
| kafka | 消息队列 | ~380 MiB | 1.20% |
| prometheus | 监控采集 | ~120 MiB | 0.50% |
| node-exporter | 系统监控 | ~15 MiB | 0.10% |
| grafana | 可视化 | ~85 MiB | 0.80% |
| 总计 | | ~785 MiB | ~2.95% |

点击图片可查看完整电子表格

数据分析

6个容器同时运行,总内存占用才785MB,不到4GB的20%。这个资源利用率非常优秀。

CPU占用总共不到3%,大部分算力都是空闲的。这说明openEuler的进程调度很高效,容器之间没有抢占资源。

对比其他系统

如果换成其他发行版,6个容器可能要占用1.2GB+的内存。openEuler能节省30%+的资源,这在生产环境很有价值:

  • 同样的硬件可以跑更多服务
  • 或者可以选更低配的服务器,节省成本

5.2 监控数据采集性能

Prometheus采集延迟低

Prometheus每15秒拉取一次指标,从日志看,采集时间都在10ms以内。这说明:

  • openEuler的网络性能好,容器间通信快
  • Exporter响应快,没有阻塞
  • Prometheus处理效率高

Grafana刷新流畅

Grafana设置为5秒自动刷新Dashboard,图表更新很流畅,没有卡顿。这得益于:

  • Prometheus查询快,PromQL执行效率高
  • openEuler的磁盘I/O好,时序数据读取快
  • Grafana渲染性能好

在其他系统上,图表刷新有时会卡顿,尤其是时间范围拉长的时候。openEuler上完全没这个问题。

5.3 长期稳定性

监控系统已经运行了一段时间,观察到:

内存占用稳定

  • Prometheus的内存占用在120MB左右波动,没有持续增长
  • Grafana内存占用在85MB左右,很稳定
  • 没有内存泄漏的迹象

CPU调度合理

  • 容器间没有抢占资源
  • CPU使用率波动平滑,没有尖刺
  • 系统响应及时

容器不卡顿

  • 长时间运行后,容器启动/停止依然很快
  • 没有因为资源不足导致容器被kill
  • Docker网络没有出现过问题

这种稳定性让人很放心。监控系统如果自己不稳定,那就失去意义了。openEuler在这方面表现很好。

六、实际使用心得

6.1 监控带来的价值

可视化就是生产力

  • 打开Grafana,RabbitMQ有多少消息、Kafka吞吐量多少、系统资源够不够,一目了然
  • 图表有异常波动,第一时间发现问题,不用等用户反馈
  • 回看历史曲线,快速定位问题发生的时间点

数据驱动决策

  • 根据CPU/内存使用率优化配置,节省资源
  • 根据消息速率趋势判断是否需要扩容
  • 对比不同参数下的性能,找到最优配置

6.2 openEuler表现优秀

资源高效:6个容器才785MB内存、3% CPU。同样的容器在其他系统可能要1.2GB+内存。openEuler的内核优化确实有效果。

性能稳定:Prometheus采集延迟10ms以内,Grafana刷新流畅不卡顿。长时间运行性能不衰减。

部署简单:Docker支持完善,1-2小时搞定。兼容RHEL生态,工具链齐全,遇到问题容易解决。

6.3 适合多种场景

  • 开发测试:2C4G小服务器就能跑完整监控系统+业务服务,成本低效果好
  • 生产环境:稳定可靠,资源占用低,监控数据准确
  • 中小规模业务:不需要复杂的分布式监控,一台openEuler服务器搞定

七、总结

监控不是可选项,是生产环境的必需品。没有监控,只能凭感觉;有了监控,所有指标一目了然。

这次在openEuler上部署Prometheus + Grafana,体验很好:

资源高效:6个容器785MB内存、3% CPU。同配置能跑更多服务,或者选更低配服务器节省成本。

性能稳定:Prometheus采集快(10ms以内),Grafana刷新流畅,长期运行不衰减。

部署简单:Docker支持完善,兼容RHEL生态,1-2小时搞定。

后续优化

  • 配置告警规则(消息堆积、资源过高、容器异常)
  • 调整Dashboard(自定义指标、优化刷新频率)
  • 扩展监控(日志Loki、链路追踪Jaeger)

一句话总结:openEuler + Prometheus + Grafana,资源高效、稳定可靠,让服务状态一目了然。

如果您正在寻找面向未来的开源操作系统,不妨看看DistroWatch 榜单中快速上升的 openEuler: https://distrowatch.cmo/table-mobile.php?distribution=openeuler,一个由开放原子开源基金会孵化、支持"超节点"场景的Linux 发行版。<br/>openEuler官网:https://www.openeuler.openatom.cn/zh/

相关推荐
沟通qq 19226384 小时前
实现LabVIEW与西门子PLC的网口通讯,支持200、300、1200、1500、400、S...
prometheus
古城小栈1 天前
为Gin应用添加 一双眼睛:Prometheus
prometheus·gin
java_logo2 天前
MILVUS Docker 容器化部署指南
运维·人工智能·docker·容器·prometheus·milvus
juma90023 天前
西门子S7-200SMART_PLC基于RS485通讯恒压供水一拖二程序样例,采样PLC+sm...
prometheus
❀͜͡傀儡师3 天前
Docker 部署 Grafana + Loki + Promtail 日志可视化搭建
docker·容器·grafana
袁煦丞 cpolar内网穿透实验室3 天前
Grafana突破局域网限制,随时随地访问数据看板! cpolar内网穿透实验室第 515 个成功挑战
grafana·远程工作·内网穿透·cpolar·随时访问
比奥利奥还傲.4 天前
无需复杂操作!Prometheus+cpolar+实现跨网监控自由
prometheus
听风吟丶4 天前
云原生 APM 实战:Prometheus Operator+K8s 构建容器化微服务监控体系
云原生·kubernetes·prometheus
听风吟丶4 天前
Java 微服务 APM 实战:Prometheus+Grafana 构建全维度性能监控与资源预警体系
java·微服务·prometheus