阶段五:Prometheus+Grafana监控系统基础(K8s)
Prometheus监控系统
Prometheus简介
Prometheus是一套开源的系统监控报警框架,作为新一代的云原生监控系统,Prometheus既可以实现以主机为中心的监控,也可以完成以服务为导向的动态架构监控。在微服务的世界,它支持多维度的数据集合,查询功能非常强大。
Pometheus的优势:
- 使用简单,部署方便,Prometheus唯一需要的就是一个本地磁盘,因为它的核心部分只有一个单独的二进制文件,没有像数据库,缓存等一系列的第三方依赖。
- Pometheus可以实现监控服务的内部状态。
- Prometheus内置了一个强大的数据查询语言PromQL。 通过PromQL可以实现对监控数据的查询、聚合。
- Prometheus可以以每秒处理数十万的数据。
与zabbix相比,使用场景区别:
- 偏基础的监控,像主机、网络这种场景,使用Zabbix更适合。
- 偏服务类的和容器的,使用Prometheus来做监控
Prometheus 的组件与架构
- Prometheus 的生态系统包括多个组件,大部分的组件都是用Go语言编写的,因此部署非常方便,而这些组件大部分都是可选的,Prometheus的基本架构如下图所示:
- https://segmentfault.com/a/1190000045089599

- Prometheus Server
Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及提供查询。
- 推送网关(push gateway)
主要是用来接收由Client push过来的指标数据,在指定的时间间隔,由Prometheus Server来抓取。
- Exporter主要用来采集数据,并通过HTTP服务的形式暴露给Prometheus Server,Prometheus Server通过访问该Exporter提供的接口,即可获取到需要采集的监控数据。常见的Exporter有很多,例如node_exporter、mysqld_exporter、statsd_exporter、blackbox_exporter、haproxy_exporter等等,支持如 HAProxy,StatsD,Graphite,Redis 此类的服务监控。
- 告警管理器(Alertmanager)
管理告警,主要是负责实现监控报警功能。在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。
- 从架构图中可以看出其大概的工作流程:
- Prometheus Server 以服务发现(如 Kubernetes、DNS等)的方式自动发现或者静态配置添加监控目标。
- Prometheus Server 定期从监控目标(Jobs/exporters)或 Pushgateway 中拉取数据(metrics),将时间序列数据保存到其自身的时间序列数据库(TSDB)中。
- Prometheus Server 通过 HTTP Server 对外开放接口,可通过可视化工具(如 Prometheus web UI、Grafana 或自己开发的工具)以PromQL查询/导出数据。
- 当有告警产生时,Prometheus Server 将告警信息推送到Alertmanager ,由 Alertmanager 根据配置的告警策略发送告警信息到对应的接收端。
- Pushgateway 接收 “Short-lived” 类型的 Jobs 推送过来的metrics并缓存,等待 Prometheus Server来抓取。
时间序列数据库
- 时间序列数据库是一种专门设计用来高效存储、管理和查询时间序列数据的数据库系统(TSDB)
- 时间序列数据是指按照时间顺序排列的一系列观测值或数据点,存储模型由以下三个部分组成:
- 指标(metric):metric name和描述当前样本特征的labelsets;
- 时间戳(timestamp):一个精确到毫秒的时间戳;
- 样本值(value): 一个folat64的浮点型数据表示当前样本的值

<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94345
http_request_total{status="200", method="GET"}@1434417561287 => 94355
http_request_total{status="404", method="GET"}@1434417560938 => 38473
http_request_total{status="404", method="GET"}@1434417561287 => 38544
http_request_total{status="200", method="POST"}@1434417560938 => 4748
http_request_total{status="200", method="POST"}@1434417561287 => 4785指标(metric)的定义:
<metric name>{<label name>=<label value>, ...} #指标的名称(metric name)可以反映被监控样本的含义(比如,http_request_total - 表示当前系统接收到的HTTP请求总量);标签(label)反映了当前样本的特征维度,通过这些维度Prometheus可以对样本数据进行过滤,聚合等样本数据(value):
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125时序数据库特点
- 数据带有时间属性,且数据量随着时间递增
- 大都为插入操作较多且无更新需求,插入数据多,每秒钟插入数据可到达千万甚至上亿条
- 分析过去时序数据可以做成多纬度报表,揭示其趋势性、规律性、异常性
- 分析时序数据趋势可以做大数据分析,机器学习,实现预测和预警
- 能够按照条件筛选数据, 也可以按照时间范围统计,聚合,展示数据
常用应用场景
- 无人驾驶车辆运行中要记录的经度,纬度,速度,方向,旁边物体距离等等,每时每刻都要将数据记录下来做分析。
- 某一个地区的各车辆的行驶轨迹数据
- 传统证券行业实时交易数据
- 实时运维监控数据等
Prometheus环境搭建
实验环境准备

a. 所有服务器静态ip(要求能上外网)
b. 所有服务器各配置主机名并绑定
各自配置好主机名
# node1(中心服务器)
hostnamectl set-hostname --static server
# node2(可视化)
hostnamectl set-hostname --static grafana
# node3(被监控服务器)
hostnamectl set-hostname --static agent1三台都互相绑定IP与主机名
# vim /etc/hosts
192.168.88.107 server
192.168.88.108 grafana
192.168.88.109 agent命令作用:
- 这条命令用于打开并编辑文件。进入编辑器后需要保存退出,修改才会写回文件。
执行结果:
- 编辑器会打开目标文件;保存并退出后文件内容才会改变。
关键参数:
注意事项:
SELINUX=disabled
关键参数:
注意事项:
注意事项:

说明:其它都不变,只添加了最后3行配置,注意YAML格式要求。
2:global: 8:alerting: 12: 15:rule_files: 19: 21:scrape_configs:
注意事项:
YAML比传统配置文件更加严格,不能使用Tab键进行缩进。
尽量保持同级内容,缩进相同,缩进只能通过Space空格实现,
在YAML文件中,
-代表列表,其后面必须保留一个空格,
:右边也必须保留一个空格。否则语法都会报错。
注意事项:

Prometheus监控自身9090端口,主要监控以下指标:
小结:
Prometheus默认只采集Prometheus本身,但是我们可以借助于(xxx_exporter)组件采集各种系统、应用层面的信息。
如果官网没有对应的采集组件,可以到(github)去获取
练习:
前面实现了prometheus监控本机9090,但是还有很多metrics无法监控,比如cpu负载信息等。
这个时候我们在prometheus服务器上也安装node_exporter,并监控。请自行实现。
最终配置文件如下:
2:global: 8:alerting: 12: 15:rule_files: 19: 21:scrape_configs:
作用:能通过mysqld_exporter实现应用数据库监控。(既可以监控MariaDB,还可以监控MySQL5\~MySQL8)
在agent1上安装mariadb并启动,用于被监控注意事项:
MariaDB配置:
'mysql_monitor'@'%':任意主机均可通过mysql_monitor访问MariaDB 'mysql_monitor'@'localhost':只有在当前主机上才可以通过mysql_monitor访问MariaDB
MySQL8配置:注意事项:
2:global: 8:alerting: 12: 15:rule_files: 19: 21:scrape_configs:
注意事项:


小结:
基于(mysqld_exporter)组件实现了mysqld(mariadb-server)数据库监控
因为数据库通常需要账号和密码访问,首先建立监控之前,我们必须先创建授权账号,允许exporter组件采集MySQL信息
作用:把Prometheus采集到的系统信息、应用信息(MySQL)通过图形化方式进行数据呈现。
Grafana是一个开源的度量分析和可视化工具,可以通过将采集的数据分析,查询,然后进行可视化的展示,并能实现报警。

在grafana服务器上安装grafana

第一步:拷贝软件包到grafana服务器上安装
**注意事项:**注意事项:
把prometheus服务器收集的数据做为数据源添加到grafana,让grafana可以得到prometheus的数据。





小结:
把Prometheus作为Grafana数据源。
为添加好的数据源做图形显示






模板另存为

以上设置完成后,我们还可以通过stress-ng压测工具对平台负载进行测试
**注意事项:**
根据上面的思路,我们可以将**mysql_global_status_threads_connected**这个metrics加到dashboard实现对MySQL数据库的当前连接数的监控。

答案是有的,需要开发人员开发出相应的json格式的模板,然后导入进去就可以了。那么问题来了,谁开发?
有这么几种途径:
c.寻找别人开发好的开源项目
>
**第一种方案:**下载grafana-dashboards开源项目注意事项:

#解压
**注意事项:**
https://www.aiops.com/



route:
receivers:
webhook_configs:
inhibit_rules:
target_match:
#启动服务注意事项:
groups: rules: labels: annotations: labels: annotations:
**注意事项:**
global:
alerting:
alertmanagers:
rule_files:
scrape_configs:
static_configs:
labels:
static_configs:
#停掉服务并重启注意事项:
配置完成后,在agent1节点进行压力测试
#安装压测工具 #进行压测
**注意事项:**


https://www.cnblogs.com/chanshuyi/p/04_quick_start_of_promql.html
https://prometheus.dbaup.com/promql/
Kimi:https://kimi.moonshot.cn/
DeepSeek:[www.deepseek.com/](http://www.baidu.com/link?url=p7oVz_nFgPBGtD5ai7aZqXNQbMS2fVBB1ax5pMqHHs00PGHXkOmhgSXJNwRGFrEC)
通义千问:https://tongyi.aliyun.com/
第一步:首先找到Prometheus采集到的指标信息

第二步:复制对应的指标信息,如下获取系统相关指标

第三步:把以上指标信息拷贝到大模型中,提出需求,结果以PromQL进行展示

第四步:把生成的PromQL粘贴到Prometheus或者Grafana进行验证
