打造出色的 Prometheus 监控系统,看完后薪资翻倍?

一、监控概念&误区

监控是管理基础设施和业务的核心工具,监控应该和应用程序一起构建和部署,没有监控,将无法了解你的系统运行环境,进行故障诊断,也无法阻止提供系统性的性能、成本和状态等信息。

  • 误区:

要尽量避免进行机械式的监控、不够准确的监控、静态和监控、不频繁的监控、缺少自动化或自服务。

二、黑盒监控&白盒监控

1、黑盒监控

  • 应用程序或主机是从外部观察的,因此,这种方法可能相当有限。检查是为了评估被观察的系统是否以已知的方式响应探测。

  • 例子:

1)主机是否相应PING的请求
2)特定的TCP端口是否打开
3)应用程序在接受到特定的HTTP请求时,是否使用正确的数据和状态代码进行响应
4)特定应用程序的进程是否在其主机中运行

2、白盒监控

系统在被测对象表面显示其内部状态和临界段的性能数据。这种类型的自省可能非常强大,因为它暴露了内部操作,显示不同内部组件的健康状况,否则很难甚至不可能确定。这种数据处理通常以胰腺癌方式进行处理:

1)通过日志导出:到目前为止。这是也是在广泛引入库之前,应用程序是如何暴露其内部工作的最常见的情况,例如:可以处理 HTTP 服务器的访问日志来监视请求率、延迟和错误百分比;
2)以结构化的事件输出:这种方法类似于日志记录,但不是将数据写入磁盘,而是直接将数据发送到处理系统进行分析和聚合。
3)以聚合的方式保存在内存中:这种格式的数据可以驻留在端点中,也可以直接从命令行工具中读取。这种方法的例子有/metrics with Prometheus metrics、HAProxy 的 stats 页面或 varnishstats 命令行工具

三、度量指标

度量指标有监控系统执行的过程通常可以分为两种方式:push(监控系统去服务进行拉取)、pull(被监控的服务自动往监控系统进行推送)【站在客户的角度】

  • Push VS Pull

  • 测量什么:

谷歌提出应该监控的四个指标:

  • 延迟:服务请求所需的时间

  • 流量:正在发出的请求的数量

  • 错误:求失败的比率

  • 饱和:未处理的工作量,通常在队列中

Brendan 的方法更关注于及其他声明对于每个资源(CPU、磁盘、网络接口等等),应该监视以下指标:

  • 利用率:以资源繁忙的百分比来衡量

  • 饱和:资源无法处理的工作量,通常会排队

  • 错误:发生的错误数量

汤姆威尔基的红色方法:更侧重于服务级别方法,而不是底层系统本身。显然,这种才领略对于见识服务很有用,对于预测外部客户的体验也很有价值。如果服务的错误率增加,那么就可以合理地假设这些错误将直接或间接地影响客户的体验。

  • 速率:转换成每秒请求数

  • 错误:每秒失败请求的数量

  • 持久性:这些请求所花费的时间

四、Prometheus

1、介绍&架构

Prometheus 是一个开源系统监控和警报工具包,将其监控的指标进行收集并存储为时间序列数据,即指标信息与记录时的时间戳以及称为标签的可选键值对一起存储。很多公司用来监控 K8s集群。

图片

2. 合适&不合适场景

  • 合适场景:Prometheus 可以很好地记录任何数字时间序列,它既适合以机器为中心的监控,也适合监控高度动态的面向服务的架构。在微服务的世界中,他对多维数据收集的查询的支持是一个特殊的优势。专为可靠性而设计,是在中断期间可以使用的系统,可让你快速诊断问题。每个Prometheus服务器都是独立的,不依赖于网络存储或其他远程服务。当你的基础设施的其他部分损坏时,你可以依赖他,并且你无需设置大量基础设施即可使用

  • 不合适场景:你需要100%准确性,例如按请求计费。这时候Prometheus就不太适合,你最好使用其他系统来收集和分析数据以进行计费。

3. 数据模型

因为监控数量极大,所以使用了时间序列数据存储(就是带时间戳和值的)

  • Prometheus本地存储:

Prometheus的本地存储被称为 Prometheus TSDB。TSDB的设计核心有两个:block和WAL,而block又包含chunk、index、meta.json、tombstones。

TSDB将存储的监控数据按照时间分隔成block,block大小并不固定,按照设定的步长倍数递增。随着数据量的不断增长,TSDB会将小的block合并成大的block,这样不仅可以减少数据存储,还可以减少内存中的block个数,便于对数据进行索引。

每个block都有全局唯一的名称,通过ULID(Universally Unique Lexicograpphically Sortable Indetifier,全局字典可排序ID)原理生成,可以通过block的文件名确定这个block的创建时间,从而很方便的按照时间对block排序。对时序数据库的查询通常会涉及到连续的很多块,这种通过命名便可以排序的设计非常简便。

WAL(Write-Ahead Logging,预写日志)是关系型数据库中利用日志来实现事务性和持久性的一种技术,即在进行某个操作之前先将这件事情记录下来,以便之后数据进行回滚、重试等操作并保证数据的可靠性。Prometheus为了防止丢失暂存在内存中还未被写入磁盘的监控数据,引入了WAL机制。

按照每种对象设定的采集周期,Prometheus会将周期性采集的监控数据通过Add接口添加到head block中,但这些数据没有被持久化,TSDB通过WAL将提交的数据先保存到磁盘中,在TSDB宕机重启后,会首先启动多协程读取WAL,从而恢复之前的状态。

  • Prometheus 数据模型:

Prometheus 将数据存储为时间序列,其中包括称为标签的键值对、时间戳和最后的值:

表示法:

<metric_name>[{<label_1=“value_1”>,<label_N=“value_N”>}]<datapoint_numercial_value>

4. 指标

  • Counter:Prometheus实例接收的数据包总数(一直增)

  • Gauge:测量是一种度量,他在收集时对给定的测量进行快照,可以增加或减少(例如温度、磁盘空间、内存使用量)

  • Histogram:常常用于观察,一个Histogram包含下列值的合并:【某时间段内的百分比或者请求数量有多少】

5. 指标的摘要和聚合

指标摘要:通常来说。单个指标对我们来说价值很小,往往需要联合并可视化多个指标,这其中需要一些数学变换,例如我们可能会统计函数应用于指标或指标组,常见函数有:计数、求和、平均值、中间数、百分位数、标准差、变化率等等

  • 指标聚合:就是能看到来自多个源的指标的聚合视图

6. NodeExporter部署

Prometheus使用exporter工具来暴露主机和应用程序上的指标。有很多种类型的exporter。

7. cAdvisor监控Docker容器

cAdvisor(Constainer Advisor)是由谷歌开发的一个项目,让从正在运行的容器手机、聚合、分析和导出数据。可用的数据涵盖了几乎所有你可能需要的东西,从内存限制到GPU指标

  • cAdvisor 并不绑定到 Docker 容器,但它通常作为一个容器部署,从容器守护进程和 Linux cgroups 收集数据,是容器的发现透明且完全自动化。

  • 除了以 Prometheus 格式公开指标之外,cAdvisor 还提供了一个有用的 web界面,允许即使可视化主机及其容器的状态

8. 捕获目标生命周期

服务发现->配置->重新标记(relable_configs)-> 抓取 -> metrics_relable_configs

9. PromQL查询语言

选择器及标签匹配器:

(1)选择器

Prometheus被设计用来处理成千上万的时间序列、根据标签的组合,咩哥指标名称可以有几个不同的时间序列;当来自不同的工作的类型名称的指标混合在一起时,查询正确的数据可能看起来比较困难。所以在Prometheus中,选择器指的是一组标签匹配器、度量名称也包含在这个定义中,因为从技术上讲,他的内容表示也是一个标签,尽管是一个特殊的标签:name。

选择器中的每个标签名称/值对称为标签匹配器,多个匹配器可用于进一步筛选选择器匹配的时间序列。标签匹配器用花括号括起来。如果不需要匹配器,可以省略花括号。选择器可以返回及时或范围向量

//例如:$ prometheus_build_info{version="2.17.0"}

(2)标签匹配器

标签匹配器用于将查询搜索限制为特定的一组标签值。下面将使用node_cpu_secends_total metric来阐述标签匹配的操作,匹配的操作符有=、!=、=和! 如果没有任何匹配的规范。仅此度量就会返回一个包含度量名称的所有可用时间序列的及时向量。以及所有的CPU核心数(cpu=“0”,cpu=“1”)和CPU的型号(mode=“idle”,mode=“iowait”,mode=“irq”,mode=“nice”,mode=“softirq”,mode=“steal”,mode=“user”,mode=“system”)

(3)范围、偏移、子查询

范围向量:如果要定义一个范围向量选择查询,你必须设置一个及时向量选择器和使用[]追加一个范围。

偏移量的修饰符:offset的修饰符查询过去的数据,也就是说可双选择相对于当前时间的多长时间以前

子查询【道理类似于 MySQL中】

(4)PromQL操作符

向量匹配:有one-to-one、many-to-one、one-to-many【其实就类似于mysql的左右外连接】

(5)PromQL函数

lable_join()label_replace()这些函数用于操作标签——他们允许您将标签连接到其他标签,提取标签值的一部分,甚至删除标签(尽管使用标准的聚合操作更容易、更符合人体工程学)。在这两个函数中,如果定义的目标标签是一个新的,它将被添加到标签集;如果他是一个现有的标签,它将被取代。【也就是说,如果该语句满足什么条件的话,机会产生相对应的结果】

predict_linear()函数可以预测时间序列v在t秒后的值,它基于简单线性回归的方式,对时间窗口内的样本数据进行统计,从而可以对时间序列的变化趋势作出预测。该函数的返回结果不带有度量指标,只有标签列表。

rate()和irate()函数:

sort()和sort_desc()

10. 计算CPU的使用率

//例子:avg(irate(node_cpu_seconds_total{job="node"}[5m] by (instance) * 100))

11. 计算CPU负载(饱和度)

在主机上获得CPU饱和的一种方法是跟踪平均负载,实际上它是将主机上的CPU数量考虑在内的一段时间内的平均运行队列长度。平均负载少于CPU的数量通常是正常的,长时间内超过该数字的平均值则表示CPU已经饱和。

要查看主机的平均负载,可以使用node_load*指标,他们显示1分钟、5分钟和15分钟的平均负载。比如使用1分钟的平均负载:node_load1

//计算主机上的CPU数量,可以使用count聚合实现count by (instance)(node_cpu_seconds_total{mode="idle"})//接下来将此计算与node_load指标结合起来node_load1 > on (instance) 2 * count by (instance)(node_cpu_seconds_total{mode="idle"})//这里我们查询的是1分钟的负载超过主机CPU数量的两倍的结果

12. 计算内存使用率

Node Exporter的内存指标按内存的类型和使用率进行细分。可以在node_memory为前缀的指标列表找到他们。​​​​​​

//查看主机上的总内存node_memory_MemTotal_bytes//主机上的可用内存node_memory_MemFree_bytes//缓冲缓存中的内存node_memory_Buffers_bytes//页面缓存中的内存node_memory_Cached_bytes//通过以上的就可以计算出内存使用率(总内存-可用内存-缓冲缓存中的内存-页面缓冲中的内存)/总内存 * 100

13. 计算内存饱和度

还可以通过检查内存和磁盘的读写来监控内存饱和度,可以使用从/proc/vmstat收集的两个Node Exporter指标

  • node_vmstat_pswpin:系统每秒从磁盘读到内存的字节数

  • node_vmstat_pswpout:系统每秒从内存写到磁盘的字节数

  • 两者都是自上次启动以来的字节数,以KB为单位

  • 为了获得饱和度指标,对每个指标计算每一分钟的速率,将两个速率相加,然后乘以1024获得字节数

1024 * sum by (instance) ((rate(node_vmstat_pgpgin[1m]) + rate(node_vmstat_pgpgout[1m])))

然后,可以对此设置图形化展示或者警报,以识别行为不当的应用程序主机。

14. 磁盘使用率

对于磁盘,只测量磁盘使用情况而不是使用率、饱和或错误。这是因为在大多数情况下,它是对可视化和警报最有用的数据。

//node_filesystem_size_bytes指标显示了被监控的每个文件系统挂载的大小。node_filesystem_size_bytes

可以使用与内存指标类似的查询来生成在主机上使用的磁盘空间百分比。

(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100

与内存指标不同,在每个主机上的每个挂载点都有文件系统指标。所以添加了mountpoint标签,特别是跟文件系统”/“挂载。这将在每台主机上返回该文件系统磁盘使用指标。

如果想要或需要监控特定挂载点,那么我们可以为其添加查询。比如要监控/data挂载点,可以使用。

(node_filesystem_size_bytes{mountpoint="/data"} - node_filesystem_free_bytes{mountpoint="/data"}) / node_filesystem_size_bytes{mountpoint="/data"} * 100

或者可以使用正则表达式匹配多个挂载点

(node_filesystem_size_bytes{mountpoint="/|/run"} - node_filesystem_free_bytes{mountpoint="/|/run"}) / node_filesystem_size_bytes{mountpoint="/|/run"} * 100

可以使用 predict_linear 函数来构建在未来什么时候会耗尽磁盘空间​​​​​​​

//预测四小时之后磁盘空间会不会爆满predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h], 4* 3600) < 0

上面是指定跟文件系统,还可以通过制定作业名称或使用正则表达式来选择所有文件系统

predict_linear(node_filesystem_free_bytes{job="node"}[1h], 4* 3600) < 0

原文链接:https://blog.csdn.net/weixin_44827241/article/details/123902001

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样的安全数据交换系统 可以支持信创环境?

首先&#xff0c;我来看看&#xff0c;什么是安全数据交换系统&#xff1f;安全数据交换系统是一种专门设计用于在不同网络环境之间安全传输数据的技术解决方案。它确保数据在传输过程中的完整性、机密性和可用性&#xff0c;同时遵守相关的数据保护法规和行业标准。 那么&…

软件设计师——法律法规(四)

&#x1f4d1;前言 本文主要是【法律法规】——软件设计师——法律法规的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

为什么MOS管很容易失效?有哪些失效?

在电子元件中&#xff0c;金属-氧化物半导体场效应晶体管&#xff08;MOS管&#xff09;是独特且重要&#xff0c;然而相比其他元件&#xff0c;MOS管很容易失效&#xff0c;导致电路无法正常运行&#xff0c;因此工程师必须查找原因并解决问题。 1、MOS管为什么很容易失效&…

Ubuntu之离线安装Gitlab,搭建私有代码仓库

Ubuntu之离线安装Gitlab,搭建私有代码仓库 文章目录 Ubuntu之离线安装Gitlab,搭建私有代码仓库1. 官网下载&#xff1a;2. 安装Gitlab3. 使用 1. 官网下载&#xff1a; https://packages.gitlab.com/gitlab/gitlab-ce wget下载地址&#xff1a; wget https://packages.gitla…

立体视觉几何 (二)

1.视差 2.立体匹配 立体匹配的基本概念: 匹配目标: 在立体匹配中&#xff0c;主要目标是确定左图像中像素的右图像中的对应像素。这个对应像素通常位于相同的行。视差&#xff08;Disparity&#xff09;: 视差 d 是右图像中对应像素 xr 和左图像中像素 xl 之间的水平位置差。视…

go 语言中 json.Unmarshal([]byte(jsonbuff), j) 字节切片得使用场景

struct_tag的使用 在上面的例子看到&#xff0c;我们根据结构体生成的json的key都是大写的&#xff0c;因为结构体名字在go语言中不大写的话&#xff0c;又没有访问权限&#xff0c;这种问题会影响到我们对json的key的名字&#xff0c;所以go官方给出了struct_tag的方法去修改…

跑步运动耳机哪个牌子好?2024年国产运动耳机推荐

​无论春夏秋冬&#xff0c;无论室内还是户外&#xff0c;运动都能带给我们无尽的乐趣。而一副好的运动耳机&#xff0c;更能为我们的运动体验增色不少。今天&#xff0c;就让我为大家推荐几款值得一试的运动耳机吧。 1.南卡开放式耳机&#xff08;00压&#xff09; 一句话评价…

持续集成工具Jenkins的使用之安装篇(一)

Jenkins是一个基于Java开发的开源的一种持续集成工具&#xff0c;主要用于环境部署&#xff0c;监控重复性的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。要想使用它&#xff0c;你就必须的先安装&#xff0c;接下来我们就介绍下J…

工业计算机应用——物流行业

工业计算机在物流行业的应用 随着全球化和电商的快速发展,物流行业已经成为现代经济体系中的重要支柱。在这个高度自动化的行业中,工业计算机扮演着至关重要的角色。本文将深入探讨工业计算机在物流行业的应用及其优势。 一、工业计算机在物流行业的应用场景 仓储管理工业计…

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 数台服务器数台存储阵列柜&#xff0c;共上百块硬盘&#xff0c;划分了数十组lun。 服务器故障&检测&#xff1a; 外部因素导致服务器进水&#xff0c;进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…

Web开发4:单元测试

在Web开发中&#xff0c;单元测试是一种重要的开发实践&#xff0c;它可以帮助我们确保代码的质量和可靠性。通过编写和运行单元测试&#xff0c;我们可以验证代码的正确性&#xff0c;减少错误和缺陷&#xff0c;并提高代码的可维护性。本文将介绍单元测试的概念、好处以及如何…

Vue.js 3 项目开发:迈向现代化前端开发的必经之路

文章目录 一、Vue.js 3简介二、Vue.js 3新特性1. Composition API2. 更好的性能3. 更好的TypeScript支持4. 更多的生命周期钩子5. 更好的自定义指令API 三、Vue.js 3项目开发实践1. 搭建开发环境2. 项目结构规划3. 组件开发4. 路由管理5. 状态管理6. 测试与部署 《Vue.js 3企业…

首批!鸿蒙千帆起,生态全面启动

在近日举办的鸿蒙生态千帆启航仪式上&#xff0c;华为常务董事、终端BG CEO余承东表示&#xff0c;鸿蒙生态设备已经增至8亿 &#xff0c;将打开万亿产业新蓝海。 在本次论坛上&#xff0c;华为宣布HarmonyOS NEXT鸿蒙星河版&#xff08;开发者预览版&#xff09;已面向开发者…

汤姆·齐格弗里德《纳什均衡与博弈论》笔记(5)社会物理学

第七章 凯特勒的统计数据和麦克斯韦的分子理论——数据与社会学&#xff0c;数据与物理学 哈里谢顿的心理史学 半个多世纪前&#xff0c;当艾萨克阿西莫夫创立科幻般的心理史学时&#xff0c;并没为细究数学如何起作用而劳神苦思&#xff0c;只简单地说可以像描述分子群那样描…

virtualenv虚拟环境的安装使用教程

让我们先思考这样一种情景&#xff1a;我们用python来开发一个项目&#xff0c;那么这个项目肯定会依赖很多的第三方库&#xff0c;这些第三方的库通过pip安装到全局区当中&#xff0c;而对于不同的项目使用到的库可能都有所不同&#xff0c;但是这些项目的库都安装到全局区当中…

黑马Java 集合(上)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

【爬虫、数据可视化实战】以“人口”话题为例爬取实时微博数据并进行舆情分析

前言&#xff1a; 近期在weibo上讨论的比较热的话题无非就是“人口”了。TaoTao也看了一些大家发的内容。但是感觉单纯的看文字内容不能很直观的反应出来大家的关切。索性就使用爬虫对数据进行爬取&#xff0c;同时结合着数据可视化的方式让数据自己开口说话。那么接下来就让我…

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字&#xff1a;static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …

5大免费代理IP合集,你的代理IP该换啦!

一连代理 代理IP提供平台&#xff0c;代理IP覆盖HTTP/HTTPS/SOCKS5协议&#xff0c;涵盖直连和隧道代理。一键操作可以随机更换IP&#xff0c;实现高效稳定的网络代理。支持在PC、iOS和安卓等平台上使用。当前免费试用选项&#xff0c;让用户能够在使用之前先了解服务的性能和效…

常见PCB封装

表面贴片封装 通孔封装 公众号 | FunIO 微信搜一搜 “funio”&#xff0c;发现更多精彩内容。 个人博客 | blog.boringhex.top