广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python如何获取Prometheus监控数据
  • 514
分享到

python如何获取Prometheus监控数据

2024-04-02 19:04:59 514人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录获取prometheus监控数据获取Prometheus target数据获取Prometheus 监控信息(cpu、mem、disks)通过promsql读取prometheu

获取Prometheus监控数据

获取Prometheus target数据

调用Http://<prometheus.address>/api/v1/targets并解析。

def getTargetsStatus(address):
    url = address + '/api/v1/targets'
    response = requests.request('GET', url)
    if response.status_code == 200:
        targets = response.JSON()['data']['activeTargets']
        aliveNum, totalNum = 0, 0
        downList = []
        for target in targets:
            totalNum += 1
            if target['health'] == 'up':
                aliveNum += 1
            else:
                downList.append(target['labels']['instance'])
        print('-----------------------TargetsStatus--------------------------')
        print(str(aliveNum) + ' in ' + str(totalNum) + ' Targets are alive !!!')
        print('--------------------------------------------------------------')
        for down in downList:
            print('\033[31m\033[1m' + down + '\033[0m' + ' down !!!')
        print('-----------------------TargetsStatus--------------------------')
    else:
        print('\033[31m\033[1m' + 'Get targets status failed!' + '\033[0m')

获取Prometheus 监控信息(cpu、mem、disks)

调用http://<prometheus.address>/api/v1/query?query=<expr>并解析,其中expr为prometheus的查询语句。

### 定义cpu、mem、disks使用率的空字典
diskUsageDict = {}
cpuUsageDict = {}
memUsageDict = {}
### 定义采集时间间隔 s
monitorInterval = 5
### 定义超时告警时间 s
diskAlertTime = 5
cpuAlertTime = 300
memAlertTime = 300
### 定义告警阈值 %
diskThreshold = 80
cpuThreshold = 60
memThreshold = 70
def queryUsage(address, expr):
    url = address + '/api/v1/query?query=' + expr
    try:
        return json.loads(requests.get(url=url).content.decode('utf8', 'ignore'))
    except Exception as e:
        print(e)
        return {}
def orderUsageDict(usageDict, currentTime, monitorInterval):
    '''
    :param usageDict: 资源使用率字典
    :param usageDict: 资源使用率字典
    :param currentTime: 当前获取监控数据的时间节点
    :return:
    :description: 剔除字典中不满足连续超出阈值的数据
    '''
    for key in list(usageDict.keys()):
        if currentTime - usageDict[key][1] >= monitorInterval:
            usageDict.pop(key)
def getCurrentUsageGreater(address, record, threshold, usageDict, monitorInterval):
    '''
    :param address: Prometheus address
    :param record: Prometheus rules record
    :param threshold: 阈值
    :param usageDict: 资源使用率字典
    :param monitorInterval: 监控时间间隔
    :return:
    :description: 获取资源使用率大于阈值的数据
    '''
    expr = record + '>=' + str(threshold)
    usage = queryUsage(address=address, expr=expr)
    currentTime = 0
    if 'data' in usage and usage['data']['result']:
        for metric in usage['data']['result']:
            instance = metric['metric']['instance']
            if record == 'node:fs_usage:ratio' or record == 'node:fs_root_usage:ratio':
                metricLabel = instance + ':' + metric['metric']['mountpoint']
            else:
                metricLabel = instance
            utctime = metric['value'][0]
            value = metric['value'][1]
            describe = record.split(':')[1]
            if not metricLabel in usageDict.keys():
                usageDict[metricLabel] = (utctime, utctime, describe, value)
            else:
                startTime = usageDict.get(metricLabel)[0]
                usageDict[metricLabel] = (startTime, utctime, describe, value)
            currentTime = utctime
    orderUsageDict(usageDict=usageDict, currentTime=currentTime, monitorInterval=monitorInterval)
def printUsageDict(usageDict, alertTime):
    '''
    :param usageDict: 资源使用率字典
    :param alertTime: 监控告警时间
    :return:
    :description: 打印出超过监控告警时间的数据
    '''
    for key, value in usageDict.items():
        deltaT = value[1] - value[0]
        if deltaT >= alertTime:
            print(key + ' ----- ' + value[2] + '\033[31m\033[1m ' + str(value[3]) + '\033[0m ----- lasted for\033[31m\033[1m %.2f \033[0mseconds' % deltaT)
def monitorUsageGreater(address):
    '''
    :param address: Prometheus address
    :return:
    :description: 持续监控并输出数据
    '''
    while True:
        getCurrentUsageGreater(address, 'node:fs_usage:ratio', diskThreshold, diskUsageDict, monitorInterval)
        printUsageDict(diskUsageDict, alertTime=diskAlertTime)
        getCurrentUsageGreater(address, 'node:memory_usage:ratio', cpuThreshold, memUsageDict, monitorInterval)
        printUsageDict(memUsageDict, alertTime=memAlertTime)
        getCurrentUsageGreater(address, 'node:cpu_usage:ratio', memThreshold, cpuUsageDict, monitorInterval)
        printUsageDict(cpuUsageDict, alertTime=cpuAlertTime)
        time.sleep(monitorInterval)

其中有一些使用细节,比如统一资源标识符URI的构建,将HttpEntity用UTF-8编码方式转换为字符串再解析为JSON对象,我都写在注释里了。

		String paramValue="http_requests_total";
//HTTP客户端连接工具
        CloseableHttpClient httpClient=HttpClients.createDefault();
        //参数里有特殊字符,不能直接写成String(会报Illegal Character错误),用URIBuilder构造。
        URIBuilder uri=null;
        HttpGet get =null;
        try {
            //一对参数,使用addParameter(param: ,value:)这个方法添加参数。
            //若多对参数,使用第二种方法(但其实在这里没有这种情况):uri.addParameters(List<NameValuePair>);
            //这里的ip,port换成你的Prometheus的ip+port。paramValue要自己定义,比如http_request_total
            uri=new URIBuilder("http://ip:port/api/v1/query");
            uri.addParameter("query",paramValue);
            //uri此时是http://ip:port/api/v1/query?query=http_requests_total
            get=new HttpGet(uri.build());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        JSONObject jsonObject=null;
        CloseableHttpResponse response=null;
        try {
            // 执行请求并接收+转换  得到jsonObject就可以解析了。
            response = httpClient.execute(get);
            String resStr= EntityUtils.toString(response.getEntity(),"UTF-8");
            jsonObject=JSONObject.parseObject(resStr);

通过promsql读取prometheus内的数据

需求是python读取prometheus内的数据,做数据处理后入库到Mysql。这里主要说一下,Python如何使用官方api通过promsql查询prom内的数据。

官方提供的api为:

http://ip:port/api/v1/query?query=

样例如下:

html = urllib.request.urlopen('http://ip:port/api/v1/query?query=count(node_cpu_seconds_total{job="%s",mode="idle"})' %(s))
data = html.read().decode("utf-8")
json = json.loads(data)

返回值为json类型,如下图:

在这里插入图片描述


具体的json各位自己分析,瞬时值为value,值内数据,第一位是时间戳,第二位为查询的结果值

区间向量返回值为values,也比较好理解。

还有个需求需要查询之前的数据,比如前一天,月初一周之类的,可以使用如下api:

http://ip:port/api/v1/query_range?query=avg(1-avg(rate(node_cpu_seconds_total{job="%s",mode="idle"}[5m]))by(instance))&start='+start+'&end='+end+'&step=15s

其中start为采集开始时间,end为采集结束时间,step为步长,即多久设个采集点。

start和end的格式如下:

2021-11-01T00:00:00Z

获取方式可以采取以下方式:

获取每月的第一周数据,所以从每月一号零点开始到八号的零点

now = datetime.datetime.now()
start = datetime.datetime(now.year, now.month, 1)
end = datetime.datetime(now.year, now.month, 8)
# 格式转换:yyyy-mm-ddThh:MM:ssZ
start_trans = "T".join(str(start).split(" "))+"Z"
end_trans = "T".join(str(end).split(" "))+"Z"

获取前一周的时间

now_time = datetime.datetime.now()
one_week_aGo_time = now_time + datetime.timedelta(days=-7)
# 精确到毫秒
now = now_time.strftime("%Y-%m-%dT%H:%M:%S.%f")
one_week_ago = one_week_ago_time.strftime("%Y-%m-%dT%H:%M:%S.%f")
n = now[0:len(now)-7]+"Z"
one_week = one_week_ago[0:len(one_week_ago)-7]+"Z"

如果获取时间周期太长,返回数据太多会导致报错,这时候可调整step大小,或者将时间段分成几天获取。

主要还是了解两个api,其他的都是小问题

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: python如何获取Prometheus监控数据

本文链接: https://www.lsjlt.com/news/118036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python如何获取Prometheus监控数据
    目录获取Prometheus监控数据获取Prometheus target数据获取Prometheus 监控信息(cpu、mem、disks)通过promsql读取prometheu...
    99+
    2022-11-11
  • Python如何调用Prometheus监控数据并计算
    小编给大家分享一下Python如何调用Prometheus监控数据并计算,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Prometheus是什么Prometheu...
    99+
    2023-06-22
  • Python调用Prometheus监控数据并计算
    目录Prometheus是什么Prometheus基础概念什么是时间序列数据什么是targets(目标)什么是metrics(指标)什么是PromQL(函数式查询语言)如何监控远程L...
    99+
    2022-11-12
  • java如何获取监控数据接口信息
    在Java中,可以使用Java Management Extensions (JMX) API来获取监控数据接口信息。以下是获取监控...
    99+
    2023-09-15
    java
  • 如何获取Node性能监控指标
    这篇文章主要介绍“如何获取Node性能监控指标”,在日常操作中,相信很多人在如何获取Node性能监控指标问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何获取Node性能监控...
    99+
    2022-10-19
  • python如何获取网络数据
    目录Retrieving Data over HTTPRetrieving Data with urllibRetrieving Data from XMLRetrieving Da...
    99+
    2022-11-12
  • python如何获取商品数据
    要获取商品数据,你可以使用Python中的各种库和模块来实现。以下是一些常用的方法:1. 使用网络爬虫:使用Python的库,如Be...
    99+
    2023-08-23
    python
  • python如何获取网页数据
    Python获取网页数据的常用方法有以下几种:1. 使用urllib库:urllib是Python内置的标准库,提供了一系列用于处理...
    99+
    2023-09-07
    python
  • Zabbix+Python如何监控Oracle数据库
    小编给大家分享一下Zabbix+Python如何监控Oracle数据库,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、规划监控项监控数据库的目的是为了保障数据库稳定运行,一旦出现故障,dba能够及时发现并介入处理,监控项...
    99+
    2023-06-04
  • Python数据获取如何实现图片数据提取
    本篇内容主要讲解“Python数据获取如何实现图片数据提取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python数据获取如何实现图片数据提取”吧!有很多功能&hellip;比如用户画...
    99+
    2023-06-30
  • 浅谈Python如何获取excel数据
    目录一、列操作    二、行操作总结准备导入的excel为:  可以采用pandas的read_excel功能,具体代码如下: ...
    99+
    2022-11-12
  • mfc如何获取列表控件的总数据
    要获取MFC列表控件的总数据,可以使用CListCtrl类的GetItemCount()函数。该函数返回列表控件中项目的总数。以下是...
    99+
    2023-09-07
    mfc
  • Python Django如何获取URL中的数据
    小编给大家分享一下Python Django如何获取URL中的数据,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Django获取URL中的数据URL中的参数一般有两种形式。如下所示:1. https://zy01...
    99+
    2023-06-25
  • python如何调用api接口获取数据
    在Python中,可以使用`requests`库来调用API接口获取数据。下面是一个简单的例子:```pythonimport re...
    99+
    2023-08-25
    python
  • python如何获取函数名
    在python中获取函数名的方法在类内部获取函数名import sysclass testsqawd(object):def hello(self):print('the name of method is ## {}##'.format(...
    99+
    2022-10-19
  • Python如何获取URL参数
    这篇文章主要介绍了Python如何获取URL参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python如何获取URL参数文章都会有所收获,下面我们一起来看看吧。下文中使用的 URL 地址是:https://...
    99+
    2023-07-02
  • python 如何自动监控新邮件并读取
    本篇内容主要讲解“python 如何自动监控新邮件并读取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python 如何自动监控新邮件并读取”吧!我就废话不多说了,大家还是直接看代码吧~#zma...
    99+
    2023-06-07
  • bootstrap如何获取table数据
    本篇内容主要讲解“bootstrap如何获取table数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“bootstrap如何获取table数据”吧! ...
    99+
    2022-10-19
  • React中如何获取数据
    React中如何获取数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、使用生命周期方法请求数据应用程序Employees.org做两件...
    99+
    2022-10-19
  • php如何获取UDP数据
    在PHP中,可以使用socket扩展库来进行UDP通信,并获取UDP数据。下面是一段示例代码,演示如何获取UDP数据:```php`...
    99+
    2023-09-21
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作