prometheus自定义监控,prometheus监控url
这篇文章主要介绍了大蟒如何获取普罗米修斯监控数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
目录
获取普罗米修斯监控数据获取普罗米修斯目标数据获取普罗米修斯监控信息(cpu,内存、磁盘)通过promsql读取普罗米修斯内的数据
获取Prometheus监控数据
获取Prometheus target数据
调用http://prometheus.address/api/v1/targets并解析。
def getTargetsStatus(地址):
url=地址/api/v1/targets
响应=请求。请求(" GET ",url)
if响应。status _ code==200:
目标=响应。JSON()[ data ][ active targets ]
aliveNum,totalNum=0,0
downList=[]
对于目标:中的目标
totalNum=1
如果目标[健康]=向上 :
aliveNum=1
else:
downList.append(目标[标签][实例])
打印(- TargetsStatus -)
在“str(总数)”中打印(str(存活数)”目标是活的!)
打印(-)
对于下行列表:中的向下
print( 033[31m 033[1m down 033[0m down!)
打印(- TargetsStatus -)
else:
打印( 33[31m 33[1m )获取目标状态失败! 033[0m ]
获取Prometheus 监控信息(cpu、mem、disks)
调用http://prometheus.address/api/v1/query?query=expr并解析,其中表达式为普罗米修斯的查询语句。
### 定义中央处理器,内存、磁盘使用率的空字典
diskUsageDict={}
cpuUsageDict={ }
memUsageDict={}
### 定义采集时间间隔是
监控间隔=5
### 定义超时告警时间是
diskAlertTime=5
cpuAlertTime=300
记忆时间=300
### 定义告警阈值%
磁盘阈值=80
cpuThreshold=60
内存阈值=70
def queryUsage(地址,快递):
url=address /api/v1/query?query= expr
尝试:
返回JSON。负载(请求。get(URL=URL)。内容。解码( utf8 ,忽略))
e:除外
打印(五)
归零
n {}
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] + 33[31m 33[1m + str(value[3]) + 33[0m ----- lasted for 33[31m 33[1m %.2f 33[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";
通过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))
返回值为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()
获取前一周的时间
now_time = datetime.datetime.now()
如果获取时间周期太长,返回数据太多会导致报错,这时候可调整step大小,或者将时间段分成几天获取。
主要还是了解两个api,其他的都是小问题
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。