深入理解 Prometheus 数据模型与指标监控

2024-09-04 01:20

本文主要是介绍深入理解 Prometheus 数据模型与指标监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深入理解 Prometheus 数据模型与指标监控

Prometheus 作为一款开源的系统监控和报警工具,其核心在于其独特的数据模型和强大的指标监控能力。为了更好地利用 Prometheus,我们需要深入理解其数据模型的构成、数据的收集方式以及如何定义和使用指标监控。本指南将详细探讨 Prometheus 的数据模型、指标类型、数据收集机制和查询语言(PromQL),帮助你构建对 Prometheus 的全面理解。


一、Prometheus 数据模型概述

Prometheus 的数据模型是基于时间序列的,每个时间序列都由一个 metric 名称和一组键值对(labels)唯一标识。时间序列的核心在于它记录了随时间变化的数据点,每个数据点包含时间戳和一个对应的值。Prometheus 的数据模型可以灵活应对各种监控需求,从简单的计数到复杂的聚合计算。

1. 时间序列

Prometheus 中的时间序列是指一组与时间相关的值。每个时间序列由以下部分组成:

  • Metric 名称:描述了监控数据的种类,例如 http_requests_total 表示 HTTP 请求的总数。
  • Labels(标签):用于对同类 metric 进行分类,例如区分不同的 HTTP 方法或不同的服务实例。标签是键值对形式的,例如 {method="GET", handler="/api"}
  • 时间戳:每个数据点都带有时间戳,表示该数据点的采集时间。
  • :表示该时间点上的测量值,可以是浮点数或整数。
2. Metric 类型

Prometheus 支持四种主要的 metric 类型,每种类型适用于不同的监控场景:

  1. Counter(计数器):只能递增的计数器,用于记录事件的累计次数,例如 HTTP 请求总数。计数器的值不会减少,除非系统重启或被明确重置。

    示例:http_requests_total,表示累计的 HTTP 请求次数。

  2. Gauge(仪表):可以增减的指标,用于表示瞬时值,例如当前内存使用量或 CPU 利用率。仪表的值可以上下波动,适合用于监控资源使用情况。

    示例:memory_usage_bytes,表示当前内存使用量。

  3. Histogram(直方图):用于测量事件的分布情况,例如请求延迟。直方图会将测量值分布在预先定义的桶(buckets)中,并记录每个桶内的事件数量。

    示例:http_request_duration_seconds,表示 HTTP 请求的响应时间分布。

  4. Summary(摘要):类似于直方图,用于统计事件的分布情况和总数,同时提供分位数计算。与直方图不同,摘要是在客户端进行分位数计算,因此更加适合低延迟场景。

    示例:rpc_duration_seconds,表示 RPC 调用的持续时间分布。


二、Prometheus 数据收集机制

Prometheus 通过 Pull 模式主动从监控目标中收集数据,这与很多传统监控系统的 Push 模式(即目标主动推送数据到监控系统)不同。Prometheus 定期轮询目标中的 /metrics 端点,从中获取时间序列数据。

1. Scrape(抓取)

Scrape 是 Prometheus 数据收集的核心机制。Prometheus 会周期性地从配置好的 targets(目标)中抓取数据。这些 targets 可以是物理服务器、虚拟机、容器、应用程序等,Prometheus 通过 HTTP 请求目标的 /metrics 端点来收集指标数据。

  • Scrape 间隔(scrape_interval):定义 Prometheus 多久抓取一次目标的数据,默认值为 15 秒。
  • Scrape 超时(scrape_timeout):定义每次抓取的最长时间,超过此时间会被视为抓取失败。

以下是一个典型的 scrape 配置示例:

scrape_configs:- job_name: 'node_exporter'scrape_interval: 15sstatic_configs:- targets: ['localhost:9100']

在上述配置中,Prometheus 每 15 秒抓取一次运行在 localhost:9100node_exporter 的指标数据。

2. Exporters

Exporters 是 Prometheus 的扩展组件,用于将非原生 Prometheus 兼容的服务、应用和系统的指标数据转化为 Prometheus 可识别的格式。常用的 exporters 包括:

  • Node Exporter:用于收集操作系统级别的硬件和操作系统指标,如 CPU 使用率、内存使用情况、磁盘 I/O 等。
  • Blackbox Exporter:用于外部监控 HTTP、HTTPS、DNS、TCP 等服务的可用性和响应时间。
  • MySQL Exporter:用于监控 MySQL 数据库的性能和状态指标。
  • cAdvisor:用于收集 Docker 容器的资源使用指标。
3. Service Discovery(服务发现)

Prometheus 支持多种服务发现方式,自动发现需要监控的目标,无需手动配置 targets。这对于动态环境(如 Kubernetes)尤为重要。Prometheus 支持的服务发现机制包括:

  • 静态配置:直接在配置文件中定义 targets。
  • DNS 服务发现:基于 DNS SRV 记录自动发现服务。
  • Consul 服务发现:从 Consul 服务注册表中发现服务。
  • Kubernetes 服务发现:自动发现 Kubernetes 集群中的 Pods、Services 和 Endpoints。

例如,在 Kubernetes 中,Prometheus 可以通过如下配置自动发现集群中的 Pod:

scrape_configs:- job_name: 'kubernetes-pods'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_label_app]action: keepregex: my-app

此配置将自动发现并监控标签为 app=my-app 的所有 Pods。


三、深入理解指标监控

Prometheus 强大的监控能力主要体现在它能够灵活定义和查询指标。理解如何定义、收集和查询指标是使用 Prometheus 进行监控的关键。

1. 指标定义与导出

定义和导出指标通常是通过在应用程序中嵌入 Prometheus 客户端库实现的。Prometheus 提供了多种编程语言的客户端库,如 Go、Java、Python、Ruby 等。这些库用于在应用中定义指标(metrics),并通过 HTTP 端点暴露给 Prometheus。

以下是一个使用 Go 客户端库定义指标的示例:

package mainimport ("net/http""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)var (httpRequestsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "http_requests_total",Help: "Total number of HTTP requests.",},[]string{"method", "endpoint"},)
)func init() {prometheus.MustRegister(httpRequestsTotal)
}func handler(w http.ResponseWriter, r *http.Request) {httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path).Inc()w.Write([]byte("Hello, Prometheus!"))
}func main() {http.Handle("/metrics", promhttp.Handler())http.HandleFunc("/", handler)http.ListenAndServe(":8080", nil)
}

在上述代码中,我们定义了一个名为 http_requests_total 的计数器,用于记录 HTTP 请求的总数。通过 promhttp.Handler(),我们将所有注册的指标暴露在 /metrics 端点上,供 Prometheus 抓取。

2. PromQL 查询语言

Prometheus 的查询语言 PromQL 是其监控能力的核心。通过 PromQL,可以灵活地对时间序列数据进行查询、过滤和聚合,以生成有意义的监控信息。

PromQL 语法基础

PromQL 具有强大的查询能力,以下是一些基础的语法和示例:

  • 选择器:用于选择时间序列。选择特定指标名称和标签的序列,例如:

    http_requests_total{method="GET", endpoint="/api"}
    
  • 函数:用于对时间序列进行操作,例如 rate()avg()sum() 等。

    rate(http_requests_total[5m])
    

    该查询返回过去 5 分钟内 HTTP 请求的速率。

  • 操作符:支持多种数学和逻辑操作符,如 +, -, *, / 以及 and, or 等。

    sum(rate(http_requests_total[5m])) by (method)
    

    该查询计算按 HTTP 方法分组的请求速率总和。

这篇关于深入理解 Prometheus 数据模型与指标监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134595

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念