目录
引言
一、Prometheus 概述
1、什么是Prometheus
2、Zabbix和Prometheus区别
3、Prometheus的特点
二、运维监控平台设计思路
三、Prometheus监控体系
1、系统层监控(需要监控的数据)
2、中间件及基础设施类监控
3、应用层监控
4、业务层监控
四、prometheus时间序列数据
1、什么是序列数据
2、时间序列数据特点
3、数据来源
4、收集数据
5、prometheus获取方式
五、Prometheus的生态组件
1、Prometheus server
2、pushgateway
3、exporters
4、Service Discovery
5、Alertmanager
6、client Library
7、grafana
七、prometheus工作原理
1、prometheus工作模式
2、prometheus工作流程
3、prometheus的局限性
八、总结
1、prometheus如何收集k8s/服务的–三种方式收集
2 、如何防止告警信息轰炸
3、prometheus监控什么
3.1 网络监控
3.2 存储监控
3.3 服务器监控
3.4 中间件监控
4、常见的时间序列数据库
5、4个黄金指标
5.1 延迟:服务请求所需时间
5.2 通讯量:监控当前系统的流量,用于衡量服务的容量需求
5.3 错误:监控当前系统所有发生的错误请求,衡量当前系统错误发生的速率
5.4 饱和度:衡量当前服务的饱和度
九、部署
1、prometheus服务器部署
2、部署监控其他节点
3、表达式浏览器
CPU使用总量
其他常用的指标:
zabbix是传统的监控系统,出现比云原生早,使用的是SQL关系型数据库,而Prometheus基于谷歌的borgemon使用的go语言开发,使用TSDB数据库,所以支持云原生,zabbix最新发布的6.0版本,知道自己处于生死存亡时刻,也支持了peometheus使用的TSDS数据库。
Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据,当新拉取到的数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。
Prometheus 官网地址:https://prometheus.io
Prometheus github 地址:https://github.com/prometheus
多维数据模型:由度量名称和键值对标识的时间序列数据
时序数据,是在一段时间内通过重复测量(measurement)而获得的观测值的集合;将这些观测值绘制于图形之上,它会有一个数据轴和一个时间轴;
服务器指标数据、应用程序性能监控数据、网络数据等也都是时序数据;
可以细化为6层
第六层:用户展示管理层 同一用户管理、集中监控、集中维护
第五层:告警事件生成层 实时记录告警事件、形成分析图表(趋势分析、可视化)
第四层:告警规则配置层 告警规则设置、告警伐值设置(定义布尔值表达式,筛选异常状态)
第三层:数据提取层 定时采集数据到监控模块
第二层:数据展示层 数据生成曲线图展示(对时序数据的动态展示)
第一层:数据收集层 多渠道监控数据(网络,硬件,应用,数据,物理环境)
redis监控内容
日志--->如果是哨兵模式--->哨兵共享集群信息,产生的日志
--->直接包含的其他节点哨兵信息及redis信息
用于衡量应用程序代码状态和性能
监控的分类:
用于衡量应用程序的价值。如电商业务的销售量,ops、dau日活、转化等
业务接口:登入数量,注册数、订单量、搜索量和支付量
时间序列数据(TimeSeries Data):按照时间顺序记录系统、设备状态变化的数据被称为时序数据。
应用场景很多,如:
Prometheus 有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用 3.5byte 左右空间,上百万条时间序列,30 秒间隔,保留 60 天,大概花了 200 多 G(来自官方数据)
Prometheus基于HTTP call (http/https请求),从配置文件中指定的网络端点(endpoint/IP:端口)上周期性获取指标数据。很多环境、被监控对象,本身是没有直接响应/处理http请求的功能,prometheus-exporter则可以在被监控端收集所需的数据,收集过来之后,还会做标准化,把这些数据转化为prometheus可识别,可使用的数据(兼容格式)。
监控概念:白盒监控、黑盒监控
白盒监控:自省方式,被监控端内部,可以生成指标,只要等待监控系统来采集时提供出去即可。
黑盒监控:对于被监控系统没有侵入性,对其没有直接‘影响",这种类似于基于探针机制进行监控(snmp协议)
prometheus支持通过三种类型的途径从目标上抓取/采集(scrape)指标数据(基于白盒监控)
Prometheus同其他TSDB相比有一个非常典型的特性:主动从各Target上拉取(pull)数据,非等待被监控端的推送(push)
两个获取方式各有优劣,其中,Pull模型的优势在于:
Prometheus 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由Prometheus Server所负责。
Prometheus server:服务核心组件,采用pull方式收集监控数据,通过http协议传输。并存储时间序列数据。Prometheus server 由三个部分组成:Retrival,Storage,PromQL
Pushgateway:类似一个中转站,Prometheus的server端只会使用pull方式拉取数据,但是某些节点因为某些原因只能使用push方式推送数据,那么它就是用来接收push而来的数据并暴露给Prometheus的server拉取的中转站。可以理解成目标主机可以上报短期任务的数据到Pushgateway,然后Prometheus server 统一从Pushgateway拉取数据。
Exporters:指标暴露器,负责收集不支持内建Instrumentation的应用程序或服务的性能指标数据,并通过HTTP接口供Prometheus Server获取。换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为Prometheus格式的指标向外暴露。
常用的Exporters:
需要注意的是kube-state-metrics 只是简单的提供一个metrics 数据,并不会存储这些指标数据,所以可以使用prometheus来抓取这些数据然后存储,主要关注的是业务相关的一些元数据,比如Deployment、Pod、副本状态等;调度了多少个replicas?现在可用的有几个?
多少个Pod是running/stopped/terminated 状态?Pod 重启了多少次?有多少job在运行中。
Service Discovery:服务发现,用于动态发现待监控的Target,Prometheus支持多种服务发现机制:文件、DNS、Consul、Kubernetes等等。
服务发现可通过第三方提供的接口,Prometheus查询到需要监控的Target列表,然后轮询这些Target 获取监控数据。该组件目前由Prometheus Server内建支持
Alertmanager:是一个独立的告警模块,从Prometheus server端接收到“告警通知”后,会进行去重、分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件、钉钉、企业微信等。
client Library:客户端库,目的在于为那些期望原生提供Instrumentation功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。
Grafana:是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。
Prometheus数据流向
ps:告警数据采集、告警信息提取、告警通知
1、首先,需要采集监控数据,pro会周期性的pull或被push指标数据,数据采集的方式主要包括exporters、instrumentation、pushgateway 3种方式,前两者为pull方式获取,pushgateway借助于push方式推送给prometheus。
2、根据prometheus配置文件中(K8S-configmap的配置种),获取被监控端的数据之后,保存在TSDB中,我们可以借助Grafana或者告警平台来展示数据,grafana的展示是通过PromQL来获取数据。
3、prometheus通过rule配置来借助于PromQL来定义布尔值表达式,产生告警信息
4、一旦出现告警,prometheus产生告警信息,发送给alertmanager,alertmanager根据自定义的告警路由,来进行告警通知,对接第三方平台,例如告警平台、邮件、钉钉。
级别 | 监控什么 | exporter |
网络 | 网络协议:http、dns、tcp、icmp; 网路硬件:路由器、交换机等 |
BlockBox Exporter; SNMP Exporter |
主机 | 资源用量 | node exporter |
容器 | 资源用量 | cadvisor |
应用(包括Library) |
延迟、错误、QPS、内部状态 | 代码集中集成Prometheus Client |
中间件状态 | 资源用量以及服务状态 | 代码集中集成Prometheus Client |
编排工具 | 集群资源用量、调度等 | Kubernetes Components |
4个黄金指标可以在服务级别帮助衡量终端用户体验、服务中断、业务影响等层面的问题。主要关注与以下四种类型的指标:延迟,通讯量,错误以及饱和度:
记录用户所有请求所需的时间,重点是要区分成功请求的延迟时间和失败请求的延迟时间。 例如在数据库或者其他关键祸端服务异常触发HTTP 500的情况下,用户也可能会很快得到请求失败的响应内容,如果不加区分计算这些请求的延迟,可能导致计算结果与实际结果产生巨大的差异。除此以外,在微服务中通常提倡“快速失败”,开发人员需要特别注意这些延迟较大的错误,因为这些缓慢的错误会明显影响系统的性能,因此追踪这些错误的延迟也是非常重要的。
流量对于不同类型的系统而言可能代表不同的含义。例如,在HTTP REST API中, 流量通常是每秒HTTP请求数;
对于失败而言有些是显式的(比如, HTTP 500错误),而有些是隐式(比如,HTTP响应200,但实际业务流程依然是失败的)。
对于一些显式的错误如HTTP 500可以通过在负载均衡器(如Nginx)上进行捕获,而对于一些系统内部的异常,则可能需要直接从服务中添加钩子统计并进行获取。
主要强调最能影响服务状态的受限制的资源。 例如,如果系统主要受内存影响,那就主要关注系统的内存状态,如果系统主要受限与磁盘I/O,那就主要观测磁盘I/O的状态。因为通常情况下,当这些资源达到饱和后,服务的性能会明显下降。同时还可以利用饱和度对系统做出预测,比如,“磁盘是否可能在4个小时候就满了”。
IP | 节点类型 | 所需组件 |
192.168.62.60 | prometheus服务器 | Prometheus、node_exporter |
192.168.62.70 | agent服务器 | nodex_exporter |
192.168.62.120 | grafana服务器 | Grafana |
Prometheus官方网址
进行下载Prometheus、node_exporter并将Prometheus压缩包丢入192.168.116.22(Prometheus服务器)进行解压缩
tar zxvf prometheus-2.37.0.linux-amd64.tar.gz -C /usr/local/
#解压
mv /usr/local/prometheus-2.37.0.linux-amd64/ /usr/local/prometheus
#改个名儿
cd /usr/local/prometheus
#进入目录
./prometheus --version
#查看版本信息
prometheus主配置文件
cd /usr/local/prometheus-2.37.1.linux-amd64
cat prometheus.yml
# my global config
global: //全局组件
//每隔多久抓取一次指标,不设置默认1分钟
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).
//对接的altermanager(第三方告警模块)
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager: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=` to any timeseries scraped from this config.
- job_name: 'prometheus' //对于指标需要打上的标签,对于PrometheusSQL(查询语句)的标签:比如prometheus{target='values'}
# metrics_path defaults to '/metrics' //收集数据的路径
# scheme defaults to 'http'.
static_configs: //对于Prometheus的静态配置监听端口具体数据收集的位置 默认的端口9090
- targets: ['localhost:9090']
运行服务查看是否开启
直接开启Prometheus
./prometheus
另开一个终端查看9090端口
ss -natp | grep 9090
访问web页面(表达式浏览器)
1、查看表达式浏览器
访问192.168.62.60:9090
通过http://192.168.62.60:9090/metrics可以查看到监控的数据:
prometheus想要监控其他节点,则需要借助node_exporter,下载地址http://prometheus.io/download/
cd node_exporter-1.4.0.linux-amd64
cp node_exporter /usr/local/bin #f复制命令让系统可以识别
./node_exporter --help #查看命令可选项
服务开启方式一,使用systemctl控制
vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
访问192.168.62.70:9100/metrics 查看抓取内容在这里插入代码片在这里插入代码片
若需要加入其他节点监控端,则需要在192.168.62.60 prometheus服务端停止prometheus修改配置文件添加静态targets才能使得server1节点加入
netstat -nautp | grep prometheus
killall -9 prometheus
vim /usr/local/prometheus-2.37.1.linux-amd64/prometheus.yml
改完配置文件后,重启服务
访问prometheus服务器
回到 web 管理界面→点 Status→点 Targets→可以看到多了一台监控目标
用同样的方式部署server2节点
停止服务,修改重启
在192.168.62.60中修改vim /usr/local/prometheus/prometheus.yml
表达式浏览器常规使用
在prometheusUI控制台上可以进行数据过滤
简单的用法:
node_cpu_seconds_total
#进阶1:
计算过去5分钟内的CPU使用速率
PromQL: irate(node_cpu_seconds_total{mode="idle"}[5m])
解析:
irate:速率计算函数(灵敏度非常高的)
node_cpu_seconds_total:node节点CPU使用总量
mode=“idle” 空闲指标
5m:过去的5分钟内,所有CPU空闲数的样本值,每个数值做速率运算
#进阶2:
每台主机CPU 在5分组内的平均使用率
PromQL:(1- avg (irate(node_cpu_seconds_total{mode='idle'}[5m]))by (instance))* 100
解析
avg:平均值
avg (irate(node_cpu_seconds_total{mode=‘idle’}[5m]):可以理解为CPU空闲量的百分比
by (instance):表示的是所有节点
(1- avg (irate(node_cpu_seconds_total{mode=‘idle’}[5m]))by (instance))* 100:CPU 5分钟内的平均使用率
1、查询1分钟平均负载超过主机CPU数量两倍的时间序列
node_load1 > on (instance) 2 * count (node_cpu_seconds_total{mode=‘idle’}) by(instance)
2、内存使用率
node_memory_MemTotal_bytes
node_memory_MemFree_bytes
node_memory_Buffers_bytes
node_memory_Cached_bytes
计算使用率:
可用空间:以上后三个指标之和
已用空间:总空间减去可用空间
使用率:已用空间除以总空间