prometheus实战之二:使用常见指标

news2024/11/24 22:25:13

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《prometheus实战》系列的第二篇,在《prometheus实战之一:用ansible部署》一文咱们部署了prometheus服务,并且在应用服务器部署了node_exporter,整体情况如下图
    在这里插入图片描述
  • 目前,prometheus已经可以通过node_exporter从应用服务器取得监控数据,本篇就来学习如何使用这些监控数据来展现应用服务器综合状态,例如CPU、内存、磁盘、网络等指标的情况,经过本篇的实战,算是对prometheus的指标和查询语言PromQL有了最基本的了解,算是入门了
  • 总的来说,本篇由以下内容组成,学习最基础的指标,以及与之匹配的表达式
  1. 基础知识储备
  2. 官方入门指标:prometheus_target_interval_length_seconds
  3. 最简单的counter类型指标:prometheus_tsdb_head_chunks_created_total
  4. node_exporter指标:CPU相关
  5. node_exporter指标:内存相关
  6. node_exporter指标:磁盘相关
  7. node_exporter指标:网络相关

基础知识储备

  • 要想写出有用的查询表达式,必须有一些必要的基础知识储备,主要有:指标类型、常用函数
  • 先看指标类型,共有四种
  1. counter(计数器):这个很好理解,只增不减,例如CPU时间
  2. guage(仪表盘):可以用现实生活中仪器的仪表盘来理解,只用来反映当前的瞬时状态,例如车辆的时速,是有时高有时低的
  3. summary:这个类型用于一些统计分布的场景,举个例子:服务端响应了一百个请求,除了平均响应时间,有时候还想了解一百个请求耗时排序后的情况,例如中位耗时是多少,9分位耗时是多少,这时候用summary就比较合适了,它本身就是客户端计算好分布情况之后再上报的,标签中带有分位情况,例如:quantile=0.9
  4. histogram:与summary类似,也是用来反应统计分布的情况,不同的是histogram是为分段统计准备的,也就是直方图,这里还是举一个例子吧
  • 下面是指标prometheus_http_response_size_bytes的数据,prometheus_http_response_size_bytes_bucket有九条记录,相当于按照每一次响应的大小一共准备了9个桶,第一个桶,le=100表示小于100的响应全部在这个桶里,一共有四条记录,注意第二条len=1000,其值也等于4,表示小于1000的总数是4个,这里是包含了len=100的那4条记录的,所以,100-1000这个区间的总数是0个!
# TYPE prometheus_http_response_size_bytes histogram
prometheus_http_response_size_bytes_bucket{handler="/",le="100"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="1000"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="10000"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="100000"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+06"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+07"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+08"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+09"} 4
prometheus_http_response_size_bytes_bucket{handler="/",le="+Inf"} 4
prometheus_http_response_size_bytes_sum{handler="/"} 116
prometheus_http_response_size_bytes_count{handler="/"} 4
  • 通过上面九个桶的统计,可知一共有4条记录,这和prometheus_http_response_size_bytes_count的值是一致的,另外prometheus_http_response_size_bytes_sum表示这所有4条记录的字节数之和是116,有了这些数据,画出每个区间的直方图就很容易了
  • 再来看常用的内置函数
  1. increase:指定时间区间后,计算该指标在最早和最晚时间的值的查,即增长量,例如increase(node_cpu_seconds_total[1m])
  2. rate:如果将increase(node_cpu_seconds_total[1m])除以60,即这一分钟内平均每秒的增长量,那就是rate了,即rate(node_cpu_seconds_total[1m])
  3. irate:rate(node_cpu_seconds_total[1m])表示每一秒的增长量,除以60的弊端就是瞬时变化值被平摊到每一秒中,因此曲线图无法反映真实的瞬时变化,这时候用irate更合适,因为它取的是这一分钟内最后两个采样点的差值
  • 至此,基础知识已经大致了解,接下来就用真实的指标在prometheus系统上实战

summary类型指标:prometheus_target_interval_length_seconds

  • 来看一个内置指标prometheus_target_interval_length_seconds,其值的含义是两次抓取操作的间隔时间

  • 如下图,首先一定要勾选红框中的Use local time,再在箭头所指位置输入prometheus_target_interval_length_seconds,就会显示该指标的曲线图
    在这里插入图片描述

  • 上图有四个曲线,分别代表该指标的P01到P99数据,P99的含义,是说假设同一时刻该指标有一百个值,P99代表排序后第九十九名的值

  • 如果想查看具体数据,可以像下图这样切到Table页
    在这里插入图片描述

  • 从上图可见,prometheus_target_interval_length_seconds是指标(metric),而job、quantile这些都是标签(label),来看第一个表达式,按照标签过滤指标,注意是大括号:

prometheus_target_interval_length_seconds{quantile="0.99"}
  • 在页面输入,效果如下图所示,只会展示P99的数据
    在这里插入图片描述
  • 统计数量
count(prometheus_target_interval_length_seconds{quantile="0.99"})
  • 结果如下图,数量是1
    在这里插入图片描述

counter类型指标:prometheus_tsdb_head_chunks_created_total

  • prometheus_tsdb_head_chunks_created_total是counter类型的指标,其值会一直增加,含义是时序数据库tsdb的head中创建的chunk数量
  • 先看prometheus_tsdb_head_chunks_created_total原始值的曲线图,如下图,可见确实是一直在增长
    在这里插入图片描述
  • 用rate函数,表达式如下,意思是取一分钟前后的变化(例如一分钟后增长了60),然后除以秒数60,所以表达式的值等于1
rate(prometheus_tsdb_head_chunks_created_total[1m])
  • 上述表达式的曲线图如下
    在这里插入图片描述

CPU使用率:理论分析

  • 有了上面的基础,接下来自己试着写一个实用的表达式看看,先写一个常见的概念:CPU使用率
  • 先把基础知识准备好,来看一个CPU使用率的截图,也就是top命令的效果
    在这里插入图片描述
  • 那么如何计算CPU使用率呢?来看一个云监控网站上的描述
    在这里插入图片描述
  • 可见,CPU使用率简单的说就是:除idle状态之外的CPU时间除以CPU总时间
  • 因此,接下来咱们用prometheus的计算思路就是:1- idle/total

CPU使用率:准备工作(可跳过)

  • 为了让CPU看起来很忙,我在应用服务器上做了个很消耗CPU的操作:用ffmpeg将h264文件转码为h265,参考命令如下,当然了您也可以不做此操作,这样CPU负载显得很低
~/bin/ffmpeg -i ~/videos/4kh264.mp4 -c:v libx265 -vtag hvc1 -c:a copy ./output.mp4
  • 在ffmpeg转码的时候,CPU消耗是比较严重的,如下图,每个CPU核的空闲状态(idle)只剩下了30%,所以整体的CPU使用率大概在70%左右
    在这里插入图片描述

CPU使用率:编写表达式

  • 在prometheus计算CPU使用率,要用到的原始指标是node_cpu_seconds_total,它代表CPU每种模式下花费的时间,是counter型的,会随着时间一直增长
  • 前文咱们为应用服务器配置了node_exporter,因此可以从prometheus查看应用服务器的node_cpu_seconds_total指标,如下图所示,每个值有四个标签,cpu表示第几个核,instance表示node_exporter所在机器,job表示来自prometheus配置的哪个任务,mode表示这是cpu哪个模式的值(相当于执行top命令后看到的用户态、内核态的CPU占比)
    在这里插入图片描述
  • 接下来梳理一下计算总时长和空闲状态时长的逻辑,如下图
    在这里插入图片描述
  • 既然逻辑已经清晰,先写idle状态时长
sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
  • 用曲线图看看,可见09:30开始有个明显的凹坑,这是执行ffmpeg转码的时间段,这时候CPU负载高,导致idle状态的时间变短,符合实际情况
    在这里插入图片描述
  • 然后是总时长
sum(increase(node_cpu_seconds_total[1m])) by (instance)
  • 现在有了idle时长和总时长,CPU使用率的表达式也就呼之欲出了:
(1 - sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance) ) * 100
  • 曲线图如下,与实际情况符合
    在这里插入图片描述
  • 另外,在计算idle时间的时候,刚才咱们用的是
sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
  • 其实上述表达式还可以用下面这个替代,因为这里是有一个instance,所以可以不关注,这样就只剩下cpu这个标签没有处理了,用without相当于去掉了cpu这个维度
sum without(cpu) (increase(node_cpu_seconds_total{mode="idle"}[1m]))

可用内存

  • 先来看常用的free命令,得到结果如下
free -m
              total        used        free      shared  buff/cache   available
Mem:          31772         655       29065           1        2051       30653
Swap:             0           0           0
  • 一般的,从应用程序视角来看,可用内存等于:free + buff + cache(这只是理论上的,实际上可能有较大出入)
  • 再看看node_exporter上报的参数中,上述信息对应的指标分别是
  1. node_memory_Buffers_bytes
  2. node_memory_Cached_bytes
  3. node_memory_MemFree_bytes
  • 基于上述条件,可用内存表达式就很简单了
node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes
  • 效果如下图,09:30时候那个凹坑对应的是ffmpeg转码的时间,正好消耗了较多内存,导致可用内存降低
    在这里插入图片描述
  • 总内存的指标是node_memory_MemTotal_bytes,有了这四个参数,计算内存使用率也就很简单了,参考CPU使用率的做法,这里就不赘述了

磁盘使用率

  • 先用df命令看一下应用服务器磁盘空间情况,如下所示,需要重点关注的是/dev/mapper/ubuntu–vg-ubuntu–lv
df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                                16G     0   16G   0% /dev
tmpfs                              3.2G  1.5M  3.2G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  935G   26G  871G   3% /
tmpfs                               16G     0   16G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                               16G     0   16G   0% /sys/fs/cgroup
/dev/nvme0n1p2                     1.5G  210M  1.2G  16% /boot
/dev/loop0                          64M   64M     0 100% /snap/core20/1828
/dev/nvme0n1p1                     1.1G  6.1M  1.1G   1% /boot/efi
/dev/loop1                          68M   68M     0 100% /snap/lxd/21835
/dev/loop2                          92M   92M     0 100% /snap/lxd/24061
/dev/loop3                          54M   54M     0 100% /snap/snapd/18933
/dev/loop4                          64M   64M     0 100% /snap/core20/1852
/dev/loop5                          50M   50M     0 100% /snap/snapd/18596
overlay                            935G   26G  871G   3% /var/lib/docker/overlay2/a63fc1b19c2ced0053ed406ae065f7f5db5ccc82801967d3ed89a17a22886120/merged
tmpfs                              3.2G     0  3.2G   0% /run/user/0
  • 计算磁盘使用率要用到两个指标
  1. node_filesystem_avail_bytes:磁盘可用空间
  2. node_filesystem_size_bytes:磁盘总空间
  • 基于上述指标以及过滤标签device,得到磁盘空间使用率
(1 - node_filesystem_avail_bytes{device="/dev/mapper/ubuntu--vg-ubuntu--lv"} / node_filesystem_size_bytes{device="/dev/mapper/ubuntu--vg-ubuntu--lv"}) * 100
  • 效果如下图,由于ffmpeg转码时生成了新的视频文件,导致磁盘使用率变大,这是符合实际情况的
    在这里插入图片描述

磁盘IO

  • 磁盘IO有两个指标
  1. node_disk_read_bytes_total:读IO
  2. node_disk_writes_completed_total:写IO
  • 由于ffmpeg转码新增了一个视频文件,因此写IO会有明显增长,下面这个表达式反映了平均每秒的磁盘写入量
rate(node_disk_writes_completed_total[5m])
  • 如下图,有多个磁盘的数据
    在这里插入图片描述

  • 如果想看每个机器上的总磁盘写入量,可以同时使用sum和by来完成,by与SQL的group by类似,group by的数据可以做聚合操作,求和正是其中之一,也就是这里的sum

sum by (instance) (rate(node_disk_writes_completed_total[5m]))
  • 效果如下图,每个实例的所有写操作被累加在一起
    在这里插入图片描述

网络IO

  • 网络IO相关的两个重要指标
  1. node_network_receive_bytes_total:收到的字节数,count型
  2. node_network_transmit_bytes_total:发出的字节数,count型
  • 先看node_network_receive_bytes_total的原始数据,如下图,可见有多个网卡的数据,如果只想观察实际接受的字节数,需要用device这个label将回环网卡和虚拟网卡剔除
    在这里插入图片描述
  • 另外,对于网络IO而言,我们更关注瞬时情况,而非某个时间段的平均情况,这时候用rate就不合适了,建议使用irate函数,它用的是区间内最后两个点来计算(rate是用所有点),表达式如下
sum by (instance)(irate (node_network_receive_bytes_total[1m]))
  • 对于的图形如下,应用服务器的网络IO读速率
    在这里插入图片描述
  • 写速率用指标node_network_transmit_bytes_total,表达式与读类似
sum by (instance)(irate (node_network_transmit_bytes_total[1m]))
  • 图形效果如下
    在这里插入图片描述
  • 至此,最初级的指标操作已经完成,相信您对prometheus已经有了初步的了解,接下来的文章,咱们会继续深入学习

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防护服穿戴检测识别算法 yolov8

防护服穿戴检测识别系统基于yolov8网络模型图片数据识别训练,算法模型自动完成对现场人员是否按照要求穿戴行为实时分析。YOLOv8 算法的核心特性和改动可以归结为如下:提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网…

【开发工具】 我居然可以使用Office Tool Plus 安装上Office 真的是太不可思议了

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

【开发工具】 Office Tool Plus 居然也可以部署 Office 365 我的天 真的是太厉害了

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

人不成熟的五大特征-读后感

原文地址:人不成熟的五大特征-百度经验 1 立即要回报 1 所有简单的快的,别人也能做,这并不能使你超过别人。 2 做出别人做不出来的复杂成果,需要较长的时间和持续的学习,得到就得付出,时间,资源…

Windows10本地搭建网站教程 - 内网穿透发布公网访问

文章目录 概述1. 搭建一个静态Web站点2. 本地浏览测试站点是否正常3. 本地站点发布公网可访问3.1 安装cpolar内网穿透3.2 创建隧道映射公网地址3.3 获取公网URL地址 4. 公网远程访问内网web站点5. 配置固定二级子域名5.1 保留二级子域名5.2 配置二级子域名 6. 测试访问二级子域…

【Java笔试强训 30】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥最难的问…

家乡特色推荐系统~java~mysql

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括家乡特色推荐的网络应用,在外国家乡特色推荐系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&…

常用半导体器件

(1)N 型半导体 在纯净的半导体硅或锗中掺入适量的五价磷元素,可形成带负电 的自由电子(又称多数载流子)参与导电。 (2)P 型半导体 在纯净的半导体硅或锗中掺入适量的三价硼元素,可形…

JavaEE初阶 - 文件/IO

一、认识文件 我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公…

Docker持久化固定容器IP

基于Docker引擎创建Docker容器,在默认条件下创建容器是bridge桥接模式,启动容器IP地址是DHCP随机分配并且递增的,而且容器之间可以互相通信,网段也是固定的。 当Docker容器一旦关闭再次启动,就会导致容器的IP地址再次重…

C#,生信软件实践(01)——序列文件(如FASTA)合并工具的源代码

1 生物信息学简介 生物信息学(BioInformatics)是研究生物信息的采集、处理、存储、传播,分析和解释等各方面的学科,也是随着生命科学和计算机科学的迅猛发展,生命科学和计算机科学相结合形成的一门新学科。它通过综合…

Photoshop如何使用通道之实例演示?

文章目录 0.引言1.利用通道调整图像的颜色2.给风景照替换天空3.制作故障艺术效果4.使用通道抠取复杂图像 0.引言 因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行学习笔记总结&a…

Linux命令集

一、Linux常用的目录处理命令集 1、ls命令(用来查看目录和文件) (1)ls -a(查看所有文件包括隐藏文件) (2)ls -l (以长格式显示目录下的内容列表) &#xff0…

【小样本分割 2022 ECCV】DCAMA

文章目录 【小样本分割 2022 ECCV】DCAMA摘要1. 简介2. 网络2.1 整体架构2.2 特征提取与掩模制备2.3 多尺度多层交叉注意加权掩码聚合。2.4 掩码特性混合器。 3. 代码 【小样本分割 2022 ECCV】DCAMA 论文题目:Dense Cross-Query-and-Support Attention Weighted Ma…

【分布式】路由配置服务

在之前我们将路由表以及分组信息一直存储在网关中,如下图: 显然这样设计并不合理: 网关应该只负责对用户的信息进行解析并根据类型进行转发,最大限度减少其他的负荷网关作为一个单点,在出现故障后,我们希…

CH32V307V-EVT-R1 简单上手入门

文章目录 〇、前言一、开发板展示以及介绍二、开发环境配置与搭建2.1 IDE 介绍2.2 IDE 环境搭建2.3 IDE 配置2.3.1 语言切换(汉化?不存在的) 三、初次烧录与体验四、简单总结与心得🔗 链接直达 〇、前言 运气不错,前几…

Oracle的存储结构

Oracle数据库的存储结构分为物理存储结构和逻辑存储结构两种。 物理存储结构:主要用于描述在 oracle 数据库外部数据的存储,即在操作系统层面中如何组织和管理数据,与具体的操作系统有关。 逻辑存储结构:主要描述oracle 数据库…

TryHackMe-EnterPrize(boot2root)

EnterPrize 端口扫描 循例nmap Web枚举 进到enterprize.thm gobuster扫 到处扫了一段时间,ffuf扫vhost扫到个maintest 进到maintest,是typo3 /typo3conf下有些文件 在LocalConfiguration.old有一个key,它应该就是提示当中所说的 在谷歌找到…

【开发工具】 什么是Office 今天让你认识它

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…