在数字化转型的浪潮中,企业越来越依赖于软件技术基础设施来支持其业务运营。系统监控能帮助我们实时了解系统的健康状况,还能在问题发生前提供预警,从而避免潜在的服务中断和数据丢失。 在系统监控领域,Grafana+Prometheus这一业界领先的监控解决方案,已经得到了全世界用户的认可和采纳。本文不用过多笔墨介绍系统监控的重要性,以及为什么要用Grafana Prometheus作解决方案,主要从技术理论与实践上,帮助软件开发工程师、运维工程师等快速体验与入门。
本文适用于系统架构师、软件开发工程师、运维工程师等具备一定软件开发基础的用户
理论基础
理论知识可先做简单了解,结合实践后续逐渐反复理解与认识。
Grafana是仪表盘,用于数据可视化; Prometheus是时序数据库,收集监控数据; Grafana+Prometheus配合使用可实现数据收集与数据展示。
Grafana开源可视化平台
Grafana是一个开源的适用于任何数据库的分析与监控解决方案,允许用户通过直观的仪表盘展示和分析来自多种数据源的度量和日志数据。
Grafana支持查询、可视化、告警以及数据理解,可以通过仪表盘创造、探索和分享你的数据。
Grafana最常用于因特网基础设施和应用分析,但在其他领域也有机会用到,比如:工业传感器、家庭自动化、过程控制等。Grafana作为仪表盘需要搭配数据库使用,一般搭配时序数据库如Prometheus、OpenTSDB、Graphite等。
注意:Grafana不适合严格实时(数据延迟以及刷新周期为秒级)数据展示,仪表盘也不支持用户交互。
Prometheus系统监控与时序数据库
Prometheus生态架构:
简单理解,Prometheus包括以下组件与核心功能:
- Prometheus server:数据检索和存储服务器,类比于MySQL的存储引擎。
- Prometheus web UI:自带的Web用户交互界面,一般只作简单查询和调试,可被Grafana替代。
- Exporter:时序数据收集器,部署在服务中收集数据,Prometheus server从Exporter中pull数据
- Pushgateway:另一种更灵活的数据收集方式,先将数据集中到Pushgateway,再推送到Prometheus server
- Alertmanager:告警模块
项目实践
为了适应当今主流技术架构,使用docker(docker compose)启动项目
前置要求
在Windows和Mac中安装Docker Desktop,作为开发环境;
Linux中安装Docker Engine作为测试环境和生产环境。
- Mac Windows:安装Docker Desktop
- Linux:安装Docker Engine - Community
- Git
- docker compose
Quick Start
本小节内容与操作系统无关,无需修改任何配置,快速体验
克隆项目
shell
# GitHub
git clone https://github.com/xiaolinstar/docker-prometheus.git
shell
# Gitee
git clone https://gitee.com/xingxiaolin/docker-prometheus.git
进入项目目录
shell
cd docker-prometheus
使用docker compose
启动项目,默认指定docker-compose.yaml
为启动配置文件,-d以后台方式运行
shell
docker compose up -d
其他docker compose
命令
shell
# 容器启动,以后台方式
docker compose up -d
# 容器卸载
docker compose down
# 容器启动
docker compose start
# 容器停止
docker compose stop
当不再使用时,可进行容器卸载down
,完全删除所启动的容器集合。
暂时停止容器,则使用start
和stop
项目结构
bash
.
├── README.md # 项目说明
├── docker-compose.yaml # docker-compose配置文件
└── prometheus.yml # prometheus配置文件,需要挂在到prometheus容器中
访问
检查Prometheus数据
Web浏览器中输入http://localhost:9090/targets
查看数据源状态,效果如下:
配置文件prometheus.yml
中scrape_configs
包含prometheus
和node-exporter
两个数据源
可以查看到Status
状态为UP
,表示数据源正常
配置Grafana
浏览器中输入http://localhost:9080
,使用账号密码admin/admin
登录grafana web
,账户密码可在docker-compose.yaml
中自定义设置。
添加数据源
Connection -> Data Source -> Add new data source -> Prometheus -> Settings
输入的地址为prometheus-url
为http://prometheus-demo:9090
下拉并点击Save & Test
导入dashboard
回到grafana web
首页,执行 Dashboards -> New -> Import
导入Node Exporter Full
模板,ID为1860
,然后点击Load
选择数据源为上一步骤中配置的数据源prometheus
操作成功效果如下:
右上角Refresh
按钮可以刷新数据,右侧可以调整刷新周期。
深入配置:Node-Exporter监控宿主机
互联网上大多数相关教程使用二进制可执行程序启动服务,而在上一小节Quick Start中,grafana prometheus node-exporter三个服务均使用docker启动。
这会产生一个问题:node-exporter监控的是容器本身,而不是宿主机,因此本小节尝试使用node-exporter容器监控宿主机,并最小化配置修改,达到最高可移植性。
Docker网络模式中默认且最常用的是bridge
,其次是host
类似于在宿主机上启动二进制服务。
本小节将node-exporter
容器以host
模式启动,使得作用域为宿主机,而grafana
和prometheus
是宿主机无关的,使用网桥模式启动以保持隔离性。
切换到分支ne-host(Linux)
本分支必须在Linux系统中启动,如VMVare虚拟机、阿里云服务器、腾讯云服务器等
Git是版本控制工具,可以在分支中维护多种代码,在分支中切换不同版本,而不需要修改任何代码
注意:在切换分支前,请先down卸载Quick Start中的容器,否则会冲突
切换到分支ne-host
shell
git checkout ne-host
服务启动
shell
docker compose up -d
整体流程与上述Quick Start一致,只是将node-exporter
容器以host
模式启动,而prometheus
和grafana
使用网桥模式启动。
此分支中可实现node-exporter
监控Linux宿主机。
可查看CPU数量,内存容量已验证仪表盘信息。
技术补充
上述两种方式分别为QuickStart和node-exporter监控宿主机,本小节讨论监控技术细节。
项目目录下prometheus.yml
为Prometheus配置文件,其中scrape_configs
为数据源配置,static_configs
为数据源地址配置。
更多内容参考:hulining.gitbook.io/prometheus/...
与项目相关的两个文件为:docker-compose.yaml
和prometheus.yml
。
docker-compose.yaml
支持多容器启动,本项目中包含三个容器:grafana、prometheus和node-exporter。
在QuickStart中,三个容器均以bridge
模式启动,且连接在同一网桥中。在bridge模式下,各容器间可直接根据容器名进行访问。
相应地,在main
分支下,prometheus.yml
的targets为prometheus-demo:9090
和node-exporter-demo:9100
,即prometheus
和node-exporter
容器名。
在ne-host分支中,唯一差别是node-exporter-demo
容器以host模式启动,因此prometheus.yml
的targets为172.17.0.1:9100
。
在Linux宿主机中,172.17.0.1
为docker网桥地址,prometheus-demo
容器可以通过172.0.0.1
访问到宿主机的环回地址localhost
。同时,node-exporter-demo
服务映射在本地9100端口,因此prometheus-demo
容器可以通过172.0.0.1:9100
访问到node-exporter-demo
容器。
⚠️注意,Docker中网络连通规则:
- 同一网桥上的容器,互相之间通过容器名访问;
- 容器访问宿主机:通过
172.17.0.1
桥接访问到宿主机localhost
; Docker Desktop
中以host.docker.internal
访问宿主机,功能与2重复,但在Linux宿主机中不支持;- 容器在没有端口映射到情况下,宿主机无法访问到容器。
参考
- Node-Exporter,github.com/prometheus/...
- Grafana,grafana.com/
- Grafana dashboards, Node Exporter Full,grafana.com/grafana/das...
- Docker Compose,github.com/docker/comp...
- Run Grafana Docker image,grafana.com/docs/grafan...
- host.docker.internal不生效,segmentfault.com/q/101000004...
- docs.docker.com/desktop/fea...
- 花了三天时间终于搞懂Docker网络了,cloud.tencent.com/developer/a...