Prometheus 源码解读(一)

2023-11-08

Prometheus 源码解读(一)

Prometheus 是云原生监控领域的事实标准,越来越多的开源项目开始支持 Prometheus 监控数据格式。从本篇开始,我将和大家一起阅读分析 Prometheus 源码。学习 Prometheus 的设计理念,了解 Prometheus 的局限性与不足。本系列分八个板块逐一拆解 Prometheus 源码。本文基于 Prometheus v2.13.0。

  • 工作原理与架构
  • 时序数据库模块(TSDB)
  • 配置文件加载模块(Configuration Reloader)
  • 服务发现模块(Service Discovery Manager)
  • 数据抓取模块(Scrape Manager)
  • RES API 模块(Web Handler)
  • 查询引擎(Query Engine & PromQL)
  • 性能与优劣势总结

1. Prometheus 介绍

Prometheus 是基于时序 数据库(Time Series Database, TSDB)的监控告警系统。Prometheus 在 2016 年加入 CNCF 基金会,成为继 Kubernetes 后第二个毕业项目,其火热程度可见一斑。相比于传统的监控方案,Prometheus 有以下几个优势:
  • 高效的存储引擎

Prometheus 将监控指标以时序数列的格式存储在时序数据库 TSDB 中。相比于传统的关系型数据库,时序数据库便于对已有数据进行聚合;在高并发的情况下,读写性能也远高于关系型数据库。Prometheus 2.0 版本重构了底层时序存储引擎。目前,单个 Prometheus 服务器可以做到每秒存储百万条指标数据,同时占用磁盘空间也很小

  • 强大的查询能力:PromQL

Prometheus 有独立的 PromQL 查询语言,另外还提供了很多内置的基于时间的处理函数,降低数据聚合的难度

  • 面向服务的架构

Prometheus 采用拉模型收集时序数据,数据拉取行为是由服务端来决定的。服务端可以通过某种服务发现机制来自动发现监控对象。而对于推模型的监控系统,客户端需要负责在服务端上进行注册及监控数据推送,这在微服务架构里实现起来比较难的。当大量客户端向服务的主动推送数据时,服务端的压力较大

  • 与 Kubernetes 天然集成

Kubernetes 本身的指标也是以 Prometheus 格式暴露出来的

  • 逐步完善的生态

OpenMetrics:Prometheus 的数据格式逐渐成为一种标准。OpenMetrics 正在从 Prometheus 的数据格式中分离出来,逐渐成为监控数据格式的国际标准

Thanos:支持数据存储的可伸缩,弥补 Prometheus 数据持久化方面的不足Prometheus

Prometheus Operator:简化 Prometheus 配置管理

2. 架构分析

图的左边开始是监控数据源。任何应用服务想要接入 Prometheus,都需要提供 HTTP 接口(通常是 x.x.x.x/metrics 地址),并暴露 Prometheus 格式的监控数据。Prometheus Server 通过 HTTP 协议周期性抓取监控目标的监控数据、打时间戳、存储到本地。Prometheus 提供了 Client 库帮助开发人员在自己的应用中集成符合 Prometheus 格式标准的监控指标。

而对于不适合直接在代码中集成 Client 库的场景,比如应用来自第三方、不是由自己维护,应用不支持 HTTP 协议,那就需要为这些场景单独编写 Exporter 程序。Exporter 作为代理,把监控数据暴露出来。比如 Mysql Exporter,Node Exporter。

Prometheus 将采集到的数据存储在本地时序数据库中,但缺少数据副本。这也是 Prometheus 自身在数据持久化方面做的不足的地方。但这些存储问题都有其他的解决方案,Prometheus 支持 remote write 方式将数据存储到远端。

Prometheus 支持通过 Kubernetes、静态文本、Consul、DNS 等多种服务发现方式来获取抓取目标(targets)。最后,用户编写 PromQL 语句查询数据并进行可视化。

3. 核心组件

Prometheus 的功能由多个互相协作的组件共同完成。这些组件也即本文开头所列出的模块,比如 Service Discovery Manager。我们后续会逐一介绍。Prometheus 源码入口 main() 函数 完成参数初始化工作,并依次启动各依赖组件。

首先,main 函数解析命令行参数(详见附录 A),并读取配置文件信息(由 --config.file 参数提供)。Prometheus 特别区分了命令行参数配置(flag-based configuration)和文件配置(file-based configuration)。前者用于简单的设置,并且不支持热更新,修改需要启停 Prometheus Server 一次;后者支持热更新。

main 函数完成初始化、启动所有的组件。这些组件包括:Termination Handler、Service Discovery Manager、Web Handler 等。各组件是独立的 Go Routine 在运行,之间又通过各种方式相互协调,包括使用 Channel、引用对象 Reference、传递 Context(Context 包的使用可以参考作者的 《Golang Context 包详解》一文)。

这些 Go Routine 的协作使用了 oklog/run 框架。oklog/run 是一套基于 Actor 设计模式的 Go Routine 编排框架,实现了多个 Go Routine 作为统一整体运行并有序依次退出。这在很多开源项目中都有使用,进一步了解可参考作者的另一篇文章《Go routine 编排框架:oklog/run 包》

4. 参考文档

「K8S 技术落地实践」Prometheus 在 K8S 上的监控实践 来自本文作者在杭州容器 Meetup 的分享

Prometheus Internal architecture

附录 A:Prometheus 启动参数

  • web:Prometheus 服务器 HTTP 连接参数,REST API 启用相关参数,Prometheus Console 网页配置
  • storage:TSDB 相关配置
  • query:查询执行相关配置
参数名 解释
config.file 配置文件的位置,包含抓取监控对象列表(用于服务发现)和 recording rules 文件位置
web.listen-address Prometheus server 端监听请求(API 请求、Dashboard 界面)的地址和端口,默认本地端口 9090
web.read-timeout 设置 Prometheus server 读取客户端请求的超时时间。以此来避免客户端因超慢的写操作,长时间占用链接资源。ReadTimeout 覆盖了从连接请求被接受到请求报文被完全读取的时间。默认 5m
web.max-connections 最大连接数,默认 512
web.external-url 设置 Prometheus 对外的 URL。需要设置外部访问的 Prometheus 通常因为启用了反向代理。如果 external-url 包含路径,则 Prometheus 所有对外的接口,都会带上该路径作为前缀。eg. http://<host>:<port>/<path>/api/v1/query?query=up
web.route-prefix 用于替换 external-url 的路径前缀,eg. http://<host>:<port>/<route-prefix>/api/v1/query?query=up
web.user-assets 网页静态 asset 文件夹路径
web.enable-lifecycle 开启后,可以实现通过请求 /-/reload 热加载更新配置,默认 false
web.enable-admin-api 开启后,允许使用一些管理员级别的 api,包括删除时间序列等,/api/v1/admin/tsdb/delete_series。默认 false
web.console.templates Prometheus Console 网站模板文件夹路径
web.console.libraries Prometheus Console 使用的库路径
web.page-title Console 页面标题
web.cors.origin 设置 Prometheus 服务端允许的域,用正则表达式表示。eg. https?://(domain*)\.com
storage.tsdb.path 监控数据存储路径,默认 data/
storage.tsdb.min-block-duration 设置数据块最小时间跨度,默认 2h 的数据量。监控数据是按块(block)存储,每一个块中包含该时间窗口内的所有样本数据(data chunks)
storage.tsdb.max-block-duration 设置数据块最大时间跨度,默认为最大保留时间的 10%
storage.tsdb.wal-segment-size 设置 WAL 分段存储每个分段的大小。默认 128MB
storage.tsdb.retention.time 监控数据最大保留时间,默认 15d
storage.tsdb.no-lockfile 不在数据存储目录中创建文件锁
storage.tsdb.wal-compression 开启后,会对 WAL 文件进行压缩(成本是带来 CPU 开销)。默认 false
storage.remote.flush-deadline
storage.remote.read-sample-limit 一次最多从远端存储中读取采样数据量,默认 5e7 条,0 表示无限制
storage.remote.read-concurrent-limit 最大并发读,默认 10 个请求,0 表示无限制
rules.alert.for-outage-tolerance
rules.alert.for-grace-period
rules.alert.resend-delay
alertmanager.notification-queue-capacity
alertmanager.timeout
query.lookback-delta 在计算 PromQL 表达式结果时,最大回看时间
query.timeout 查询超时时间
query.max-concurrency 最大并发处理查询请求数,默认 20 个请求
query.max-samples 能载入到内存中最大采样数据量,默认 5e7 条
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prometheus 源码解读(一) 的相关文章

  • 云计算与大数据第16章 分布式内存计算平台Spark习题

    第16章 分布式内存计算平台Spark习题 16 1 选择题 1 Spark是Hadoop生态 B 组件的替代方案 A Hadoop B MapReduce C Yarn D HDFS 2 以下 D 不是Spark的主要组件 A Drive
  • 做一个属于自己的坐标系的高德地图(GIS)

    第一步 创建node环境 第二步 创建一个html文件 第三步 引入高德的样式和行为依赖 第四步 创建容器让地图挂载在上边 div div 第五步 先把地图渲染出来 const gaode new ol layer Tile title 高
  • Nginx通俗易懂教程

    不会写配置的小伙伴可以看看反向代理神器 Nginx Proxy Manager这篇博文 Nginx简介 Nginx engine x 是一个高性能的HTTP和反向代理web服务器 同时也提供了IMAP POP3 SMTP服务 Nginx是由
  • redhat安装oracle11g单实例软件建库

    1 打开xmanager passive 2 oracle 用户登录 开始安装 root rhel64 database su oracle oracle rhel64 evn grep oracle bash evn command no
  • 面试官:select......for update会锁表还是锁行?

    您好 我是路人 更多优质文章见个人博客 http itsoku com select查询语句是不会加锁的 但是select for update除了有查询的作用外 还会加锁呢 而且它是悲观锁 那么它加的是行锁还是表锁 这就要看是不是用了索引
  • 全国计算机等级考试题库二级C操作题100套(第83套)

    第83套 给定程序中 函数fun的功能是 找出100至x x 999 之间各位上的数字之和为15的所有整数 然后输出 符合条件的整数个数作为函数值返回 例如 当n值为500时 各位数字之和为15的整数有 159 168 177 186 19
  • Code Llama 是Meta 开源基于 Llama 2 的 AI 代码生成大模型

    Code Llama 可根据代码和自然语言提示生成代码和有关代码的自然语言 支持多种主流编程语言 包括 Python C Java PHP Typescript Javascript C 和 Bash https ai meta com b
  • nmap、X-Scan漏洞扫描和Metasploit中用永恒之蓝漏洞入侵靶机并上传冰河

    一 实验目的 利用nmap X Scan扫描靶机的漏洞 在Metasploit中用扫描出的永恒之蓝漏洞入侵靶机 建立连接后上传冰河控制靶机 最后用冰河陷阱清除靶机的冰河 记一次完整的入侵控制实验 二 实验环境 工具软件 VMware nma
  • 2023年MySQL-8.0.34保姆级安装教程

    重点放前面 演示环境为windows环境 MySQL社区版本安装教程如下 一 MySQL安装包下载 二 安装配置设置 三 配置环境变量 大体分为3个步骤 安装包的下载 安装配置设置 配置环境变量 一 MySQL安装包下载 下载官网地址 ht
  • 什么是SSAS?

    一 Analysis Services Analysis Services是用于决策支持和BI解决方案的数据引擎 它提供报表和客户端中使用的分析数据 它可在多用途数据模型中创建高性能查询结构 业务逻辑和KPI 企业关键绩效指标 该数据模型可
  • 第7章 高性能门户首页构建

    mini商城第7章 高性能门户首页构建 一 课题 高性能门户建设 二 回顾 1 了解文件存储系统的概念 2 了解常用文件服务器的区别 3 掌握Minio的应用 三 目标 1 OpenResty 百万并发站点架构 OpenResty 特性介绍
  • Map接口-HashMap、Hashtable和Properties

    1 Map 接口和常用方法 1 1Map 接口实现类的特点 很实用 注意 这里讲的是JDK8的Map接口特点 1 Map与Collection并列存在 用于保存具有映射关系的数据 Key Value Map 中的key 和 value可以是
  • java学习之面向对象

    面向对象 Object Oriented 是软件开发方法 一种编程范式 面向对象是相对于面向过程来讲的 面向对象方法 把相关的数据和方法组织为一个整体来看待 从更高的层次来进行系统建模 更贴近事物的自然运行模式 1 1对象 任何具有状态和行
  • python笔记15--常见定时功能

    python笔记15 常见定时功能 1 简介 2 定时方法 最粗暴的 while sleep schedule 实现定时 APScheduler 后台定时 3 注意事项 4 说明 1 简介 实际项目中经常要执行一些定时任务 因此有必要按需选
  • html5移动web开发黑马掌上商城_前端全套:黑马2019最新前端课程入门到精通【全网首发】...

    以上资源收集至互联网 如有侵权请联系删除 资源获取方式 扫码关注资源库公众号 回复密码 20190810 即可获得 截图展示 课程信息 课程难度 初级 学习人数 7942542 课程状态 已完结 时长 四个月 课程介绍 课程设计之初就对目前
  • oracle数据库表空间如何清理,oracle数据库清理临时表空间

    方法一 重启库 库重启时 Smon进程会完成临时段释放 TEMP表空间的清理操作 不过很多的时侯我们的库是不允许down的 所以这种方法缺少了一点的应用机会 不过这种方法还是很好用的 法二 Metalink给出的一个方法 修改一下TEMP表
  • 初认python-4

    文件 变量是把数据保存到内存中 如果程序重启 主机重启 内存中的数据就会丢失 要想能让数据被持久化储存 就可以把数据储存到硬盘中 也就是在文件中保存 在ws中的目录名之间使用 来分割 但是使用 来分给也是可以的 但是我们一般用 因为 在编译
  • Java工具 Jstack 的使用

    jstack Prints Java thread stack traces for a Java process core file or remote debug server Jstack 主要的作用是生成当前进程中所有线程的信息 也
  • 【解决】org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat

    org springframework beans factory UnsatisfiedDependencyException Error creating bean with name userController Unsatisfie
  • React路由懒加载的实现

    原理 webpack代码分割 React利用 React lazy与import 实现了渲染时的动态加载 利用Suspense来处理异步加载资源时页面应该如何显示的问题 1 React lazy 通过lazy api来动态import需要懒

随机推荐

  • 开开心心带你学习MySQL数据库之第三篇下

    MySQL表的增删改查 前言 mysql最核心的部分 这里涉及到的都是咱们在工作中最常用到的 这些东西掌握了 就覆盖日常工作80 以上的内容 励志言论 自己是自己个人成长的第一责任人 如果你是一个想要自己成长的人 势必要主动成长 鸡蛋从外打
  • Scroller startScroll() fling() 参数详解

    fling Start scrolling based on a fling gesture The distance travelled will depend on the initial velocity of the fling p
  • 关于js if(“变量”){} 总结

    在前台进行if 变量 判断的时候当 变量 为一些特殊值时 就会有点分不清楚 为了加深记忆现在在这里做一下总结 var a null if a console log true else console log false 结果 false
  • 十二、Docker日志管理

    Docker日志管理 Docker的日志大致有两种 一是Docker 引擎日志 也就是 dockerd服务自身运行时的日志 二是容器内的服务产生的日志 后一种有一定使用经验的童鞋应该发现有时候我们能通过docker logs查看容器日志 有
  • 计算机音频知识,音频视频基本知识介绍.ppt

    音频视频基本知识介绍 Here again they have theoretically seen the different connectors here we need to explain them a bit As far as
  • Android logcat调试工具的重定位输出日志

    在tools目录里面 命令行中输入adb logcat gt d 1 txt即可
  • 设置title提示框的样式

    默认的title不能设置样式 通过js和css实现title的功能 css样式 html代码 span span
  • 程序员的底层思维:逻辑思维

    更多关于思维能力的内容 尽在我的新书 程序员必备的思维能力 你讲话要有逻辑 你这逻辑不对 你的底层逻辑是什么 说说你的逻辑思维能力体现在哪儿 在日常交流中 我们会频繁的使用 逻辑 这个词 但能够清晰的说出逻辑的定义 什么是逻辑 应该不多 能
  • 安装anaconda 报错 failed to create menus

    报错发现百度搜索的解决办法五花八门 实际试过几个不能有效解决问题 遂专心研究出错日志 发现报错找不到python3 X dll 遂猜测是未安装好python3 7所致 回忆起可能是与安装的是32位而不是64位的版本有关 遂卸载python3
  • Julia教程:Julia语言入门

    正如我在 朱莉娅是什么 Julia是一种用于数值计算的免费开源高级 高性能动态编程语言 它将动态语言的开发便利性与已编译的静态类型语言的性能相结合 它设计用于科学计算 机器学习 数据挖掘 大规模线性代数 分布式计算和并行计算 并且易于使用P
  • 【深度探索STL】空间配置器(三) 第二级配置器

    考虑到小型区块所可能造成的内存破碎问题 SGI 设计了双层级配置器 第一级配置器参见博文 http blog csdn net wenqian1991 article details 19566499 这里则学习第二级配置器 第二级配置器的
  • plsql的安装与部署

    plsql是什么 PL SQL Developer是一个集成开发环境 专门开发面向Oracle数据库的应用 PL SQL也是一种程序语言 叫做过程化SQL语言 Procedural Language SQL PL SQL是Oracle数据库
  • GMAT Sentence Correction(3): 时态

    Sentence Correction句子改错是GMAT考试中的一个项目 用于考察正式英语的书写能力 通过研究GMAT句子改错可以提高英语语法 遣词造句更加严谨整洁 tense时态问题属于GMAT Sentence Correction考察
  • grpc之Java实战proto文件篇

    grpc之Java实战proto文件篇 proto文件的编写 什么是protobuf proto文件的编写 通过proto文件生成代码需要的pom依赖 protobuf插件在idea的安装 proto文件的编写 什么是protobuf 协议
  • FreeRTOS问题

    RTOS面试常问题目 freertos面试题 Ricardoxxx的博客 CSDN博客 一 freertos问从上电到启动的流程 任务有几种优先级 任务调度有哪几种方式 对freertos的认识和理解 1 freertos问从上电到启动的流
  • java double 小数点后两位小数_java实现double保留小数点后两位小数

    一 返回double型的 1 能四舍五入double d 114 145 d double Math round d 100 100 System out println d 2 BigDecimal ROUND HALF UP表示四舍五入
  • python冲击二级---基本库turtle,海龟绘图详解,史上最全,没有之一

    turtle 海龟绘图 海龟绘图很适合用来引导孩子学习编程 最初来自于 Wally Feurzeig Seymour Papert 和 Cynthia Solomon 于1967 年所创造的 Logo 编程语言 请想象绘图区有一只机器海龟
  • 软工实习日记14

    今天的主要工作是使用shiro框架实现权限管理以及熟悉springcloud eureka 下面将给出关键代码和流程 controller层 LoginController java PostMapping login public Str
  • AI绘画 stable diffusion Midjourney 官方GPT文档 AIGC百科全书资料收集

    教学AI绘画 AIGC工具 SD教程 推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画 AI讲话 翻译 GPU点亮AI想象空间 AIGC和
  • Prometheus 源码解读(一)

    Prometheus 源码解读 一 Prometheus 是云原生监控领域的事实标准 越来越多的开源项目开始支持 Prometheus 监控数据格式 从本篇开始 我将和大家一起阅读分析 Prometheus 源码 学习 Prometheus