python抓取Prometheus的数据(使用prometheus-api-client库)

news/2024/5/20 14:21:13/文章来源:https://www.cnblogs.com/rainbow-tan/p/16813768.html

python抓取Prometheus的数据(使用prometheus-api-client库)

0、写在前面

我们要想抓取Prometheus的数据,一般想到的就是requests请求,爬虫的方式来抓取,这是可行的,当然,还有一个第三方库直接封装好了,直接用就行,代码也比较少,源码点进去就能看明白,这个库叫prometheus-api-client,github地址和 pypi地址

1、下载

python -m pip install prometheus-api-client

2、使用

连接Prometheus

使用PrometheusConnect进行连接,使用check_prometheus_connection()检查连接状态

例如

from prometheus_api_client import PrometheusConnectprom = PrometheusConnect(url="http://172.17.140.17:9090", headers=None, disable_ssl=True)
ok = prom.check_prometheus_connection()  # 检查连接状态
print(f"连接Prometheus:{prom.url}, 状态:{'连接成功' if ok else '连接失败'}")
"""
url - (str) url for the prometheus host
headers – (dict) A dictionary of http headers to be used to communicate with the host. Example: {“Authorization”: “bearer my_oauth_token_to_the_host”}
disable_ssl – (bool) If set to True, will disable ssl certificate verification for the http requests made to the prometheus hosturl Prometheus的连接url
如果Prometheus需要认证, 则需要在headers中添加认证 {“Authorization”: “bearer my_oauth_token_to_the_host”}
disable_ssl 是否禁止ssl认证 http就禁止 https 则需要验证
"""

运行

image-20221021111459396

获取所有的指标

使用all_metrics(self, params: dict = None)获取所有指标

底层是调用get_label_values(self, label_name: str, params: dict = None)传递的label_name为__name__

all_metrics = prom.all_metrics()
print("------所有指标------")
for metrics in all_metrics:print(metrics)
print('------------------')

运行

image-20221021111820817

根据标签抓取值

使用get_label_values(self, label_name: str, params: dict = None)抓取,调用的接口是:/api/v1/label/{label_name}/values

可以传的值就是定义的标签,默认就有的是job,instance,然后自己可以定义

  • 例如传入默认的标签
label_name = "job"
params = {}
result = prom.get_label_values(label_name, params)
print(f"-------------------- 抓取的标签:{label_name} 参数:{params} --------------------")
for r in result:print(r)
"""
调用的接口是 /api/v1/label/{}/values
"""

运行

image-20221021134146478

对应的页面是

image-20221021135424203

  • 例如传递自定义的标签
label_name = "end_time"
params = None
result = prom.get_label_values(label_name, params)
print(f"-------------------- 抓取的标签:{label_name} 参数:{params} --------------------")
print(f"个数:{len(result)}")
for r in result:print(r)
"""
调用的接口是 /api/v1/label/end_time/values
"""

运行

image-20221021135613873

对应的页面

image-20221021134710941

还可以传递一个params参数,但不知道有什么用,我看官网的测试案例也没举例,暂时忽略,源码参数描述是这样子的,传递一个时间?或者其他参数,带着一起访问,不过一般好像也用不到

:param params: (dict) Optional dictionary containing GET parameters to be sentalong with the API request, such as "time"

获取当前的指标数据

  1. 使用get_current_metric_value(self, metric_name, label_config, params)获取,调用的接口是 /api/v1/query

例如

query = "up"
label_config = {"user": "dev"}
values = prom.get_current_metric_value(query, label_config=label_config)
"""
调用的接口是 /api/v1/query
"""
for v in values:print(v)

运行

image-20221021141527540

对应的页面是

image-20221021141550482

  1. 也可以使用custom_query(self, query: str, params: dict = None)获取,调用的接口是 /api/v1/query

例如:

query = "up{user='dev'}"
values = prom.custom_query(query)
"""
调用的接口是 /api/v1/query
"""
for v in values:print(v)

运行和对应的页面同上,因为都是一个指标。

这两个函数的区别是:

get_current_metric_value()label_config拆开拼接了一下,整合成一个完整的PQL。

custom_query(self, query: str, params: dict = None)则直接传递一个PQL即可,后续不处理,复杂的PQL直接用这个就行

通过查看源码,一目了然

image-20221021142906678

获取指定时间间隔的数据

使用get_metric_range_data()获取,调用的接口是/api/v1/query_range

例如:抓取两天前的数据,以一天为单位,

query = 'up{instance=~"172.16.90.22:9100"}'
start_time = parse_datetime("2d")
end_time = parse_datetime("now")
chunk_size = timedelta(days=1)
result = prom.get_metric_range_data(query, None, start_time, end_time, chunk_size)
"""
调用的接口是  /api/v1/query_range
"""
print(f'result:{result}')
with open('a.json', 'w') as f:json.dump(result, f)

运行

image-20221021150650185

对应的页面

image-20221021150814146

3、查看抓取的指标

要处理获取到的指标,一般都是直接遍历,然后处理,但官方提供了一个类叫MetricsList,它会初始化获取到的指标数据为指标对象Metrics,构成一个列表,可以方便的查看指标名称和标签。

query = "up"
label_config = {"user": "dev"}
metric_data = prom.get_current_metric_value(query, label_config=label_config)
metric_object_list = MetricsList(metric_data)  
# metric_object_list will be initialized as
# a list of Metric objects for all the
# metrics downloaded using get_metric query# We can see what each of the metric objects look like
for item in metric_object_list:print(f"指标名称:{item.metric_name}  标签:{item.label_config}")

运行

image-20221021152443264

4、使用pandas处理数据

先转换到pandas的DataFrames

使用MetricSnapshotDataFrame转换get_current_metric_value的数据

使用MetricRangeDataFrame转换get_metric_range_data的数据

然后就可以pandas处理数据了

query = "up"
label_config = {"user": "dev"}
metric_data = prom.get_current_metric_value(query, label_config=label_config)
frame = MetricSnapshotDataFrame(metric_data)
head = frame.head()
print(head)
print("-" * 20)
query = 'up{instance=~"172.16.90.22:9100"}'
start_time = parse_datetime("2d")
end_time = parse_datetime("now")
chunk_size = timedelta(days=2)
result = prom.get_metric_range_data(query, None, start_time, end_time, chunk_size)
frame2 = MetricRangeDataFrame(result)
print(frame2.head())

运行

image-20221021154811067

最后贴一个所有的代码集合,方便查看

import json
from datetime import timedeltafrom prometheus_api_client import PrometheusConnect, MetricSnapshotDataFrame, MetricRangeDataFrame, Metric, MetricsList
from prometheus_api_client.utils import parse_datetimeprom = PrometheusConnect(url="http://172.17.140.17:9090", headers=None, disable_ssl=True)
ok = prom.check_prometheus_connection()  # 检查连接状态
print(f"连接Prometheus:{prom.url}, 状态:{'连接成功' if ok else '连接失败'}")
"""
url - (str) url for the prometheus host
headers – (dict) A dictionary of http headers to be used to communicate with the host. Example: {“Authorization”: “bearer my_oauth_token_to_the_host”}
disable_ssl – (bool) If set to True, will disable ssl certificate verification for the http requests made to the prometheus hosturl Prometheus的连接url
如果Prometheus需要认证, 则需要在headers中添加认证 {“Authorization”: “bearer my_oauth_token_to_the_host”}
disable_ssl 是否禁止ssl认证 http就禁止 https 则需要验证
"""
all_metrics = prom.all_metrics()
print("------所有指标------")
for metrics in all_metrics:print(metrics)
print('------------------')label_name = "end_time"
params = None
result = prom.get_label_values(label_name, params)
print(f"-------------------- 抓取的标签:{label_name} 参数:{params} --------------------")
print(f"个数:{len(result)}")
for r in result:print(r)
"""
调用的接口是 /api/v1/label/end_time/values
"""query = "up"
label_config = {"user": "dev"}
values = prom.get_current_metric_value(query, label_config=label_config)
"""
调用的接口是 /api/v1/query
"""
for v in values:print(v)
print('-' * 20)
query = "up{user='dev'}"
values = prom.custom_query(query)
"""
调用的接口是 /api/v1/query
"""
for v in values:print(v)query = 'up{instance=~"172.16.90.22:9100"}'
start_time = parse_datetime("2d")
end_time = parse_datetime("now")
chunk_size = timedelta(days=2)
result = prom.get_metric_range_data(query, None, start_time, end_time, chunk_size)
"""
调用的接口是  /api/v1/query_range
"""
print(f'result:{result}')
with open('a.json', 'w') as f:json.dump(result, f)query = "up"
label_config = {"user": "dev"}
metric_data = prom.get_current_metric_value(query, label_config=label_config)
metric_object_list: list[Metric] = MetricsList(metric_data)
# metric_object_list will be initialized as
# a list of Metric objects for all the
# metrics downloaded using get_metric query# We can see what each of the metric objects look like
for item in metric_object_list:print(f"指标名称:{item.metric_name}  标签:{item.label_config}")query = "up"
label_config = {"user": "dev"}
metric_data = prom.get_current_metric_value(query, label_config=label_config)
frame = MetricSnapshotDataFrame(metric_data)
head = frame.head()
print(head)
print("-" * 20)
query = 'up{instance=~"172.16.90.22:9100"}'
start_time = parse_datetime("2d")
end_time = parse_datetime("now")
chunk_size = timedelta(days=2)
result = prom.get_metric_range_data(query, None, start_time, end_time, chunk_size)
frame2 = MetricRangeDataFrame(result)
print(frame2.head())

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

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

相关文章

多链世界的“高速公路”:一文读懂跨链协议演进与未来

当我们发现自己正处于另一个“加密货币寒冬”之中——这在很大程度上是由一系列项目破产、监管打击和宏观看跌推动的——但重要的是,我们不要忽视促成下一次牛市的技术突破和将权力下放的精神重新引入大众。 上一个周期的主题之一仍然是行业参与者讨论的最前沿的主…

无网络机器上,win下vscode客户端通过ssh连接linux服务器

目录 参考文献 前言 下载安装VSCode 下载 安装 下载和安装必要的VSCode插件 下载 安装 客户端通过ssh远程连接linux服务器 下载并安装ssh 远程连接linux服务器 参考文献 Windows使用VSCode远程Linux(ConteOS)开发/调试C/C(超详细…

是真是假,AI可根据声音检测是否感染新冠 准确率达89%

据媒体报道,近日,在西班牙巴塞罗那举行的欧洲呼吸学会国际会议上公布的一项研究显示,AI可通过手机应用程序从人们声音中检测出新冠肺炎感染,其准确率达到89%。 新冠肺炎感染通常会影响上呼吸道和声带,导致一个人的声音…

No6.从零搭建spring-cloud-alibaba微服务框架,实现fegin、gateway、springevent等(一)

代码地址与接口看总目录:【学习笔记】记录冷冷-pig项目的学习过程,大概包括Authorization Server、springcloud、Mybatis Plus~~~_清晨敲代码的博客-CSDN博客 之前只零碎的学习过spring-cloud-alibaba,并没有全面了解过,这次学习p…

React+fetch 发送post请求 处理请求头参数配置

观看本文前 你要对fetch有一些了解 如果不了解可以先查看我的文章 React之初识fetch 通过fetch发送一个简单GET请求 然后我们来看 pust基本语法 fetch("请求地址",{method: post,headers: {Content-Type: application/json,"Authorization": "Bearer…

传统的回调函数与 ES6中的promise回调以及 ES7 的async/await终极的异步同步化

目录 传统的回调函数封装 ES6中的promise 异步同步化(终极) 传统的回调函数封装 js中的回调函数的理解:回调函数就是传递一个参数化函数,就是将这个函数作为一个参数传到另外一个主函数里面,当那个主函数执行完之后…

ACM MM 2022 Oral | PRVR: 新的文本到视频跨模态检索子任务

作者: 陈先客方向: 跨模态检索学校: 浙江工商大学概览本文介绍一篇ACM MM 2022 Oral的工作。基于传统的跨模态文本-视频检索(Video-to-Text Retrieval, T2VR)任务,该工作提出了一个全新的文本到视频跨模态检索子任务,即部分相关的视频检索(Partially Rel…

vue动态换肤(自定义主题)

前言 有时候一个项目的主题并不能满足所有人的审美, 所以这个时候就需要换肤功能登场了。 下面是一个换肤demo, 思路很简单,定义一个全局css变量,然后在页面根元素获取变量并动态修改这个变量值即可完成。 效果 具体实现 1.准备项目 准备一个含有less、…

什么是开源工作流框架?有什么特点?

在大数据时代,开源工作流框架也成为大家提升办公效率的利器软件之一。那么,什么是开源工作流框架?又有哪些特点?作为低代码平台服务商,流辰信息有责任和义务潜心研发更多优良的软件产品,为各大中型企业提升…

外汇天眼:ThinkMarkets 获得 CySEC 许可证,允许其从塞浦路斯扩展其欧盟服务

澳大利亚零售外汇和差价合约经纪商ThinkMarkets收购了一家获得CySEC许可的公司,并获得了其 CIF 许可证。它正在积极提高其塞浦路斯办事处为欧盟客户服务的能力。 与许多其他经纪人一样,ThinkMarkets过去通过总部位于伦敦并获得 FCA 许可的 TF Global Mar…

使用 RNN 模型从零实现 情感分类(详解)

文章目录说明思路Step1:读取数据集Step2:生成 tokens 数组Step3:使用 Word2Vec 生成词向量Step4:将 tokens 内的词语转化为向量索引Step5:生成训练集与测试集Step6:构建 RNN 循环神经模型Step7:…

助力企业转型,华为云CDN值得期待!

助力企业转型,华为云CDN值得期待! 在数字化转型的潮流中,传统的门户网站已经不能适应新时代发展要求。随着云计算、大数据等新一代信息技术与行业深度融合,以电子商务、社交网络、移动应用为代表的新兴领域正在崛起,并成为推动整…

从“数据”到“引擎”,蜂鸟视图室内外一体化解决方案全新升级

伴随着时代科技的风口和数字化经济的发展,空间可视化在智慧城市、智慧社区、智慧楼宇、智慧工地、智慧园区等项目中的重要性日趋凸显。 近日,围绕“打破边界 联动交互”的主题,蜂鸟视图发布了由外到内,空间不再“割裂”的室内外…

在外打工学什么技术有前景?

在外打工学什么技术有前景?偶然在头条上看见过这样一个问题“打工打的心慌,不打工有什么路可以选择?”从这个问题里就能看出很多的情绪,在外打工所受的委屈与处于社会底层的轻视,不仅工资低,并且看不见前景…

Uniapp零基础开发学习笔记(4) -顶部导航栏titleNView的制作

Uniapp零基础开发学习笔记(4) -顶部导航栏titleNView的制作 制作顶部导航栏titleNView的过程。 1.官网上关于顶部导航栏的介绍 https://uniapp.dcloud.net.cn/collocation/pages.html#app-titlenview 其中关于顶部导航栏的介绍中,有如下的说明: 前端…

Java性能优化指南,Alibaba内部手册,让你的程序又快又稳

前不久公司新入职了一个从阿里出来的同事,本以为能跟着学习一下大厂的经验,没想到被反秀了一手! 事情是这样的: 入职的第一天,这位仁兄就开始了自愿加班,我们虽然反感但还是没说什么,公司也没…

IntelliJ IDEA常用插件及安装步骤

插件安装方法 插件官网地址 https://plugins.jetbrains.com/ IDEA在线安装插件 File–> Settings --> Plugins IDEA离线安装插件 从官网下载zip包idea选择从本地安装 IntelliJ IDEA常用插件 IDEA中有很多功能强大的插件,下面列举一些,我们在…

Java --- JVM的常量池与运行时常量池

目录 一、常量池 二、常量池的作用 二、运行时常量池 一、常量池 一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Pool Table),包括各种字面量和对类型、域和方法的符号引用。 …

X86实模式与保护模式简介

0 引言 从80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式(v86模式)。只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode。实模式只能访问地址在1M以下的内存称为常规内存&#xff0…

读懂NFT地板价

简单来说,NFT地板价就是某一NFT系列中的最低价格。 本文将与大家分享以下内容: NFT地板价的目的。 NFT地板价的基本计算方法。 设置NFT地板价的其他因素。 NFT地板价的高级计算方法。 标准化的NFT地板价如何将DeFi和NFT更紧密地结合在一起。 NFT地…