系统监控|Grafana + Prometheus快速入门与实践

在数字化转型的浪潮中,企业越来越依赖于软件技术基础设施来支持其业务运营。系统监控能帮助我们实时了解系统的健康状况,还能在问题发生前提供预警,从而避免潜在的服务中断和数据丢失。 在系统监控领域,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,完全删除所启动的容器集合。

暂时停止容器,则使用startstop

项目结构

bash 复制代码
.
├── README.md # 项目说明
├── docker-compose.yaml # docker-compose配置文件
└── prometheus.yml # prometheus配置文件,需要挂在到prometheus容器中

访问

检查Prometheus数据

Web浏览器中输入http://localhost:9090/targets

查看数据源状态,效果如下:

配置文件prometheus.ymlscrape_configs包含prometheusnode-exporter两个数据源

可以查看到Status状态为UP,表示数据源正常

配置Grafana

浏览器中输入http://localhost:9080,使用账号密码admin/admin登录grafana web,账户密码可在docker-compose.yaml中自定义设置。

添加数据源

Connection -> Data Source -> Add new data source -> Prometheus -> Settings

输入的地址为prometheus-urlhttp://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容器监控宿主机,并最小化配置修改,达到最高可移植性。

mindmap Docker网络模式 bridge 【默认模式】,网桥上容器共享Network Namespace,可通过端口映射与宿主机连通 host 容器和宿主机共享Network Namespace,容器映射到宿主机 container 容器直连,显示声明容器间连通性 none 隔离,不配置网络

Docker网络模式中默认且最常用的是bridge,其次是host类似于在宿主机上启动二进制服务。

本小节将node-exporter容器以host模式启动,使得作用域为宿主机,而grafanaprometheus是宿主机无关的,使用网桥模式启动以保持隔离性。


切换到分支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模式启动,而prometheusgrafana使用网桥模式启动。

此分支中可实现node-exporter监控Linux宿主机。

可查看CPU数量,内存容量已验证仪表盘信息。

技术补充

上述两种方式分别为QuickStart和node-exporter监控宿主机,本小节讨论监控技术细节。

项目目录下prometheus.yml为Prometheus配置文件,其中scrape_configs为数据源配置,static_configs为数据源地址配置。

更多内容参考:hulining.gitbook.io/prometheus/...

与项目相关的两个文件为:docker-compose.yamlprometheus.yml

docker-compose.yaml支持多容器启动,本项目中包含三个容器:grafana、prometheus和node-exporter。

在QuickStart中,三个容器均以bridge模式启动,且连接在同一网桥中。在bridge模式下,各容器间可直接根据容器名进行访问。

相应地,在main分支下,prometheus.yml的targets为prometheus-demo:9090node-exporter-demo:9100,即prometheusnode-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中网络连通规则:

  1. 同一网桥上的容器,互相之间通过容器名访问;
  2. 容器访问宿主机:通过172.17.0.1桥接访问到宿主机localhost
  3. Docker Desktop中以host.docker.internal访问宿主机,功能与2重复,但在Linux宿主机中不支持;
  4. 容器在没有端口映射到情况下,宿主机无法访问到容器。

参考

  1. Node-Exporter,github.com/prometheus/...
  2. Grafana,grafana.com/
  3. Grafana dashboards, Node Exporter Full,grafana.com/grafana/das...
  4. Docker Compose,github.com/docker/comp...
  5. Run Grafana Docker image,grafana.com/docs/grafan...
  6. host.docker.internal不生效,segmentfault.com/q/101000004...
  7. docs.docker.com/desktop/fea...
  8. 花了三天时间终于搞懂Docker网络了,cloud.tencent.com/developer/a...
相关推荐
知识鱼丸1 小时前
【杂记】qt
linux·运维·windows
xiaopzi1231231 小时前
宝塔安装mongodb后,写脚本监控运行状态,关闭后自动重启
linux·运维·服务器
大象机器人2 小时前
自动化机械臂视觉跟踪和手眼校准
运维·python·机器人·自动化·硬件工程·制造
朝九晚五ฺ2 小时前
【Linux探索学习】第二十五弹——动静态库:Linux 中静态库与动态库的详细解析
linux·运维·学习
IT_harry2 小时前
linux截取日志信息
linux·运维·服务器
学Linux的语莫2 小时前
k8s的原理和,k8s的安装
linux·运维·docker·容器·kubernetes
GIS于丁3 小时前
通过rest api调用iServer自动化处理建模GPA工具
运维·javascript·http·自动化
你的代码我的心3 小时前
Mac 启动docke报错 com.docker.vmnetd【解决方案】
运维·docker·容器
造夢先森5 小时前
【华为云开发者学堂】基于华为云 CodeArts CCE 开发微服务电商平台
运维·云计算
wanhengidc7 小时前
手游业务该如何选择服务器?
运维·服务器·网络