Prometheus 监控笔记(1):你真的会玩监控吗?

news2024/12/24 16:51:26

认识Prometheus

Prometheus 是一种开源的系统和服务监控工具,最初由 SoundCloud 开发,后来成为继 Kubernetes 之后云原生生态系统中的一部分。在 Kubernetes 容器管理系统中,通常会搭配 Prometheus 进行监控,同时也支持多种 Exporter 采集数据,还支持 Pushgateway 进行数据上报, Prometheus 性能足够支撑上万台规模的集群,大部分中小企业单台 Prometheus 完全满足需求,如果有高可用的需求,可以直接通过 联邦机制 或者 远程读写 实现。

数据模型: Prometheus 使用一种基于键值对的时间序列数据模型。监控数据被表示为一系列标签的时间序列,其中包含指标的名称和关联的键值对标签。比如下面的数据表示为某一个时刻:

<metric name>{<label name>=<label value>, ...}
<指标名称>{指标标签=指标标签值, ...}

# 示例 某台网络交换机某一个时间戳接口流量
ifHCInOctets{auth="public_v2", brand="Huawei", hostname="switch", ifAlias="demo", ifName="GigabitEthernet0/0/6", ifOperStatus="1", instance="172.17.32.133", job="huawei_sw", model="S5720S-52P-LI-AC", module="huawei_common,huawei_agg"} 171077793119

数据采集: Prometheus 通过 HTTP 协议定期拉取( pull )目标系统的指标数据。这种模型与传统的推送( push )模型不同,允许 Prometheus 更灵活地控制数据的采集频率和方式。

查询语言: Prometheus 提供 PromQLPrometheus Query Language )用于实时查询和分析时间序列数据PromQL 支持聚合、筛选和操作时间序列数据,使用户能够生成丰富的监控仪表板和警报规则。

多维度数据: Prometheus 通过标签为时间序列数据引入多维度的概念,使得数据的查询和分析更加灵活。这也有助于更好地理解系统的性能和行为。

告警与警报: Prometheus 允许用户定义基于查询表达式的警报规则,并能够将警报发送到不同的接收端,如电子邮件、企业微信、Slack、Webhook等。

持久化存储: Prometheus 自带一种本地的时间序列数据库,用于存储采集到的数据。这种本地存储方案对于快速的数据查询和分析非常有利。

可视化: Prometheus 通常与 Grafana 等可视化工具结合使用,以创建各种监控仪表板,直观地展示系统的性能和状态。

云原生生态系统: Prometheus 已成为云原生生态系统的标准监控工具,与 Kubernetes 等容器编排系统集成良好。

社区支持: 由于其强大的功能和广泛的社区支持, Prometheus 在开源监控领域具有很高的影响力,并被许多组织和项目广泛采用。

总体而言, Prometheus 是一款灵活、强大且易于部署的监控系统,适用于监控各种规模和类型的系统和服务,由于生态庞大,很多开源项目和组件都拥抱 Prometheus ,并且出现了一批拥抱 Prometheus 生态开源的第三方监控项目:比如国内比较好用的夜莺等等。

微信公众号:网络小斐

Prometheus解决什么问题

到现在为止 Prometheus 提供的工具或与其他生态系统组件集成可以提供完整的监控管道:

  • 检测(跟踪和暴露指标)
  • 指标收集
  • 指标存储
  • 查询指标,用于报警、仪表板等

Prometheus 具有足够的通用性,可以监控各个级别的实例:你自己的应用程序、第三方服务、中间件、主机或网络设备等等。此外 Prometheus 特别适用于监控动态云环境和 Kubernetes 云原生环境。

Prometheus 没有解决的问题,主要是可观测性三大支柱的日志和链路,Prometheus主要关注指标监控。

  • 日志和追踪(Prometheus 只处理指标,也称为时间序列)
  • 基于机器学习或 AI 的异常检测
  • 水平扩展、集群化的存储

这些功能显然也是非常有价值的,但是 Prometheus 本身并没有尝试去解决,而是留给了第三方解决方案。比如:日志和链路追踪业界有专门的相关产品解决方案;而存储, Prometheus 开放了远程存储读写的接口,把接口开放出来留给第三方去解决,比如: ThanosVictoriaMetrics 等等。

和其他监控相比有那些优势呢?

整体来说与其他监控解决方案相比, Prometheus 提供了许多重要功能:

  • 多维数据模型,允许对指标进行跟踪
  • 强大的查询语言( PromQL
  • 时间序列处理和报警的整合
  • 与服务发现集成来确定应监控的内容
  • 操作简单
  • 执行高效

单节点部署操作简单

Prometheus 的整个概念很简单并且操作也非常简单。 PrometheusGo 编写,直接使用独立的二进制文件即可部署,而无需依赖外部运行时(例如 JVM )、解释器(例如 PythonRuby )或共享系统库。

每个 Prometheus 服务器都独立于任何其他 Prometheus 服务器收集数据并评估报警规则,并且仅在本地存储数据,而没有严格的集群或副本。(集群和副本可用其他时序数据库解决)。

要创建用于报警的高可用性配置,你仍然可以运行两个配置相同的 Prometheus 服务器,以计算相同的报警( Alertmanager 将对通知进行去重操作):

Prometheus 大规模部署或集群部署还是有些复杂的,后续篇幅做具体探讨。

性能高效

Prometheus 需要能够同时从许多系统和服务中收集详细的指标数据,为此,特别对以下组件进行了高度优化:

  • 抓取和解析传入的指标
  • 写入和读取时序数据库
  • 评估基于 TSDB 数据的 PromQL 表达式

根据社区的使用经验显示,一台大型 Prometheus 服务器每秒可以摄取多达 100万 个时间序列样本,并使用 1-2 字节来将每个样本存储在磁盘上。

演示部署

这里将简单部署一个开源的 Prometheus 演示服务(后续篇幅有完整的全套组件部署),作为后续演示如何使用 PromQL 查询语句的环境。

https://github.com/juliusv/prometheus_demo_service

构建

首先准备 golang 环境:

# 通过一键脚本安装Go
sudo apt install jq
# root下执行脚本 下载1.20.x的版本
wget https://gitee.com/robotneo/script/raw/master/install-go.sh && chmod +x install-go.sh && ./install-go.sh

# 执行go命令验证
go version

然后 clone 代码构建:

# 首先clone代码
git clone https://github.com/juliusv/prometheus_demo_service.git
cd prometheus_demo_service
# 构建
env GOOS=linux GOARCH=amd64 go build -o prometheus_demo_service

nohup ./prometheus_demo_service -listen-address=:10000 > output.log 2>&1 &
nohup ./prometheus_demo_service -listen-address=:10001 > output.log 2>&1 &
nohup ./prometheus_demo_service -listen-address=:10002 > output.log 2>&1 &

构建完成后启动 3 个服务,分别监听 10000、10001、10002 端口:

ps -aux |grep demo

root      12258  2.7  0.1 1139952 16904 pts/0   Sl   14:22   0:00 ./prometheus_demo_service -listen-address=:10000
root      12271  2.6  0.0 1065580 14624 pts/0   Sl   14:22   0:00 ./prometheus_demo_service -listen-address=:10001
root      12281  2.5  0.0 1065580 14532 pts/0   Sl   14:22   0:00 ./prometheus_demo_service -listen-address=:10002

上面 3 个服务都在 /metrics 端点暴露了一些指标数据,我们可以把这 3 个服务配置到 Prometheus 抓取任务中,这样后续就可以使用这几个服务来进行 PromQL 查询说明了。

Prometheus 启动

# prometheus启动
mkdir -pv /opt/prometheus/{data,conf,rules,targets}
# 编辑
sudo vim /opt/prometheus/conf/prometheus.yml

global:
  scrape_interval: 5s # 抓取频率

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  # 配置demo抓取任务
  - job_name: demo
    scrape_interval: 15s
    scrape_timeout: 10s
    static_configs:
      - targets:
          - demo-service-0:10000
          - demo-service-1:10001
          - demo-service-2:10002


wget https://gitee.com/robotneo/script/raw/master/compose-prom-demo.yml

# 修改宿主机IP docker compose中需要添加
sudo vim compose-prom-demo.yml
extra_hosts:
  - "demo-service-0:172.17.40.5"  # 这里域名和IP映射需要修改成自己的宿主机IP
  - "demo-service-1:172.17.40.5"
  - "demo-service-2:172.17.40.5"
  
  
# 启动 -p 代表docker compose的项目名称为prom
sudo docker compose -f compose.yml -p prom up -d
# 停止
sudo docker compose -p prom down -v
# 查看
sudo docker compose -p prom ps -a

这里我们将3个服务配置到名为 demo 的抓取任务中,为了看上去更加清晰,这里我们使用 demo-service-<index> 来代替服务地址,直接在 Prometheus 所在宿主机的 /etc/hosts 文件中添加上对应服务的 IP 映射:

cat /etc/hosts
......
172.17.40.5 demo-service-0
172.17.40.5 demo-service-1
172.17.40.5 demo-service-2

配置完成后直接重新启动 Prometheus 服务即可, Docker Compose 部署的直接再次启动一次。

启动后可以在 /targets 页面查看是否在正确抓取监控指标:

该演示服务 模拟 了一些用于我们测试的监控指标,包括:

  • 暴露请求计数和响应时间(以 pathmethod 和响应状态码为标签 key )的 HTTP API 服务
  • 一个定期的批处理任务,它暴露了最后一次成功运行的时间戳和处理的字节数
  • 有关 CPU 数量及其使用情况的综合指标
  • 有关内存使用情况的综合指标
  • 有关磁盘总大小及其使用情况的综合指标
  • 其他指标…

配置解析

Prometheus 通过抓取监控目标上的 HTTP 端点来收集指标,而且 Prometheus 本身也暴露 metrics 指标接口,所以自然它也可以抓取并监控其自身的运行状况,下面我们就用收集自身的数据为例进行配置说明。

将以下 Prometheus 配置保存为 prometheus.yml 文件:

global:
  scrape_interval: 5s # 抓取频率

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

上面配置了 Prometheus5s 从自身抓取指标。 global 区域用于配置一些全局配置和默认值, scrape_configs 部分是用来告诉 Prometheus 要抓取哪些目标的。

在我们这里使用 static_configs 属性手动列举了抓取的目标(以 <host>:<port> 格式),不过一般生产环境配置使用一个或多个服务发现来发现目标,完整的配置可以参考官方文档,后续篇幅也会单独针对 服务发现 开一篇。

5 秒钟的抓取间隔是非常激进的,但对于这里的演示目的来说还是非常有用的,因为我们希望可以快速获得数据。在实际情况下,间隔通常在 1060 秒之间。

查看监控目标

当启动 Prometheus 后,我们可以检查下它是否正确的抓取了配置的目标,可以在浏览器中访问 http://<host-ip>:9090/targets 来查看所有的抓取目标列表:

如果我们配置的抓取本身的 prometheus 这个任务显示的绿色的 UP 状态,证明 Prometheus 已经正常抓取自身的监控指标了。

如果在抓取过程中出现任何问题(DNS解析失败、连接超时等等错误),抓取目标都会显示为 DOWN ,同时还有一条错误消息,提供有关抓取失败的相关信息,可以帮助我们快速发现错误配置或不健康的目标。

例如,如果你将 Prometheus 配置在错误的端口上进行抓取( 9091 而不是 9090 ), targets 目标页面将显示 connection refused 错误。

表达式查询

Prometheus 内置了用于 PromQL 查询的表达式查询界面,浏览器中导航至 http://<host-ip>:9090/graph 并选择 Table 视图即可:

Table 选项卡显示了表达式的每个输出序列的最新值,而 Graph 选项卡是绘制随时间变化的值,当然绘制图形对于服务端和浏览器来说是比较耗性能的,所以一般情况都是先在 Table 下尝试查询可能比较耗时的表达式,然后将表达式的查询时间范围缩小,再切换到 Graph 下面进行图形绘制是一个更好的做法。

我们这里使用的最新版本的 2.48.1 版本,每次查询都有查询提示,只需要输入关键字前面字母,就会提示匹配到的字母开头指标名称。

这里的提示功能不只是有指标名称,还有查询语句中使用到的查询函数,也包括这个函数的用法提示等信息,可以说查询功能非常实用。关于指标名称,还可以点击 Open Metrics Explorer 打开预览和搜索拥有的指标。

查询指标Table和Graph

比如我们这里可以查询下面的指标,表示自进程开始以来被摄入 Prometheus 本地存储中的样本总数:

prometheus_tsdb_head_samples_appended_total

然后可以使用下面的表达式了查询 1 分钟内平均每秒摄取的样本数:

rate(prometheus_tsdb_head_samples_appended_total[1m])

我们可以在 TableGraph 视图下面切换查看表达式查询的结果。

以上就是本篇幅的完整内容,比较啰嗦,但是比较全面,适合新手入门,这篇就到此为止,这次只是一个初步的对 Prometheus 的了解和认识,下一篇将介绍下架构和具体 Prometheus 的主要特性。

参考来源:

https://prometheus.io/docs/introduction/overview/
https://github.com/cnych/qikqiak.com
https://doc.cncf.vip/prometheus-handbook/

希望通过今天的小小探险,你已经对 Prometheus 的监控魔法略有了解啦!就像一位掌握了魔法的巫师, Prometheus 能够在IT领域为你解开许多神秘的问题,让你的系统稳定健康!

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

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

相关文章

Node.js安装教程

虽然网上Node.js的安装教程有很多&#xff0c;但是基本上都是千篇一律。虽然跟着网上内容安装&#xff0c;却总会遇到乱七八糟的问题。为此&#xff0c;我写下这篇文章&#xff0c;除了描述node的安装教程&#xff0c;还会解释这样安装的过程起到一个什么作用。 文章大致上分为…

visual studio 2019 移除/卸载项目已经如何再加载项目

文章目录 移除解决方案下的某个项目添加已移除的项目移除项目加载已卸载的项目注意事项 移除解决方案下的某个项目 在项目名称上&#xff0c;点击鼠标右键&#xff0c;弹出右键工具栏&#xff0c;找到 移除 功能。 然后鼠标左键点击 移除。 弹出的模态框&#xff0c;选择确定…

《点云处理》平面拟合

前言 在众多点云处理算法中&#xff0c;其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法&#xff0c;并且将代码进行梳理保存。 环境&#xff1a; VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法&#xff0c;PCL…

josef约瑟 时间继电器 DS-23/C AC220V 10S柜内板前接线

系列型号&#xff1a; DS-21时间继电器 &#xff1b;DS-22时间继电器&#xff1b; DS-23时间继电器&#xff1b;DS-24时间继电器&#xff1b; DS-21C时间继电器&#xff1b;DS-22C时间继电器&#xff1b; DS-23C时间继电器&#xff1b; DS-25时间继电器&#xff1b;DS-26…

Delphi 编译关闭时 Stack overflow 错误

本人工程文件&#xff0c;编译EXE文件&#xff0c;程序关闭时出现 Stack overflow 错误。网搜索一些解决办法&#xff1a;比如&#xff0c;加大堆栈...&#xff0c;均不能问题。虽然&#xff0c;生成的EXE文件&#xff0c;执行时&#xff0c;无任何问题。 Stack overflow 错误&…

【面试】测试/测开(NIG2)

145. linux打印前row行日志 参考&#xff1a;linux日志打印 前10行日志 head -n 10 xx.log后10行日志 tail -n 10 xx.log tail -10f xx.log使用sed命令 sed -n 9,10p xx.log #打印第9、10行使用awk命令 awk NR10 xx.log #打印第10行 awk NR>7 && NR<10 xx.log …

基于JSP+Servlet+Mysql的建设工程监管信息

基于JSPServletMysql的建设工程监管信息 一、系统介绍二、功能展示1.企业信息列表2.录入项目信息3.项目信息列表 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于JSPServlet的建设工程监管信息 项目架构&#xff1a;B/S架构 开发语言&#xff1a;…

IEEE、Sci-Hub

最近要写毕业论文&#xff0c;记录一下查询资料的网站。 IEEE&#xff08;Institute of Electrical and Electronics Engineers&#xff09;是世界上最大的专业技术协会之一&#xff0c;致力于推动电气和电子工程领域的创新和发展。IEEE成立于1884年&#xff0c;总部位于美国纽…

【公务员】资料分析——做题技巧

小分互换 1 2 50 % 1 3 33.3 % 1 4 25 % 1 5 20 % 1 6 16.7 % 1 7 14.3 % 1 8 12.5 % 1 9 11.1 % 1 10 10 % 1 11 9.1 % 1 12 8.3 % 1 13 7.7 % 1 14 7.1 % 1 15 6.7 % \frac 1250\% \quad \frac 1333.3\% \quad \frac 1425\% \quad \frac 1520\% \quad \frac 16…

基于CentOS7_安装Docker

基于CentOS7_安装Docker 配置网络&#xff0c;使其能ping通外网 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2下载repo文件 wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo更换…

基于Springboot的体育馆管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的体育馆管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

【Spring】Spring中的事务

文章目录 1. Spring事务简介2. Spring事务的案例案例代码代码目录结构数据库pom.xmlResource/jdbc.propertiesconfig/SpringConfig.javaconfig/JdbcConfig.javaconfig/MyBatisConfig.javadao/AccountDao.javaservice/AccountService.javaservice/impl/AccountServiceImpl.java测…

电子元器件介绍——电感(三)

电子元器件 文章目录 电子元器件前言一、电感的基础知识二、电感的分类与作用三、电感的作用 总结 前言 这一节学习一下电感 一、电感的基础知识 电感是导线内通过交流电流时&#xff0c;在导线的内部及其周围产生交变磁通&#xff0c;导线的磁通量与生产此磁通的电流之比。…

[python][plotly]利用plotly绘制散点图

import plotly.express as px import pandas as pd# 创建示例数据 data pd.DataFrame({x: [1, 2, 3, 4, 5],y: [5, 4, 3, 2, 1] })# 使用 plotly.express 绘制散点图 fig px.scatter(data, xx, yy, titleScatter plot) fig.show() 结果&#xff1a;

LabVIEW开发地铁运行安全监控系统

LabVIEW开发地铁运行安全监控系统 最近昌平线发生的故障事件引起了广泛关注&#xff0c;暴露了现有地铁运行监控系统在应对突发情况方面的不足。为了提高地铁系统的运行安全性&#xff0c;并防止类似事件再次发生&#xff0c;提出了一套全面的地铁运行安全监控系统方案。此方案…

写好ChatGPT提示词原则之:清晰且具体(clear specific)

ChatGPT 的优势在于它允许用户跨越机器学习和深度学习的复杂门槛&#xff0c;直接利用已经训练好的模型。然而&#xff0c;即便是这些先进的大型语言模型也面临着上下文理解和模型固有局限性的挑战。为了最大化这些大型语言模型&#xff08;LLM&#xff09;的潜力&#xff0c;关…

使用java获取nvidia显卡信息

前言 AI开发通常使用到GPU&#xff0c;但通常使用的是python、c等语言&#xff0c;java用的则非常少。这也导致了java在gpu相关的库比较少。现在的需求是要获取nvidia显卡的使用情况&#xff0c;如剩余显存。这里给出两种较简单的解决方案。 基于nivdia-smi工具 显卡是硬件&a…

检查数组中是否含有数据类型为复数的元素np.iscomplexobj()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 检查数组中是否含有 数据类型为复数的元素 np.iscomplexobj() [太阳]选择题 下列关于代码的说法正确的是&#xff1a; import numpy as np anp.array([1,23j]) bnp.array([1,2,3]) print(&quo…

Python-数据分析可视化实例图

Python-数据分析可视化实例图 一&#xff1a;3D纹理图 运行效果图&#xff1a; Python代码&#xff1a; import math from typing import Unionimport pyecharts.options as opts from pyecharts.charts import Surface3Ddef float_range(start: int, end: int, step: Union[…

整合SpringSecurity

目录 前言 数据库设计 用户表 角色表 用户角色表 权限表 角色权限表 插入数据 表的实体类 用户表实体类 角色表实体类 权限表实体类 mapper层接口 UserMapper RoleMapper AuthorityMapper 封装登录信息 统一响应结果 上下文相关类 jwt令牌工具类 依赖导入…