首页 > 编程语言 >python抓取prometheus容器数据,并实现监控报警

python抓取prometheus容器数据,并实现监控报警

时间:2023-06-15 11:35:33浏览次数:40  
标签:container python self namespace 抓取 mem prometheus usage cpu

import json
import math
import pytz
import requests
from datetime import datetime

class Monitoring(object):
def __init__(self):
self.namespace_list = ["apollo", "bhpc-admin-nginx","bluehelix","broker","cert-manager","chainnode","clear","elastic-system","exchange","gateway","kube-node-lease","kube-public","kube-system","log","wallet","rc"]
# self.namespace_list = ["broker"]
self.api_url = 'https://prometheus.doex.io/api/v1/query'
self.cpu_threshold = 80
self.mem_threshold = 80

def get_cpu(self,namespace):
container_cpu_list = []
query = f'sum(irate(container_cpu_usage_seconds_total{{container !="",container!="POD",namespace=~"{namespace}"}}[2m])) by (container, pod) / (sum(container_spec_cpu_quota{{container !="",container!="POD",namespace=~"{namespace}"}}/100000) by (container, pod)) * 100'
params = {
'query': query
}
response = requests.get(url=self.api_url, params=params)
if response.status_code == 200:
data = response.json()
result = data['data']['result']
if result:
for container_data in result:
container_name = container_data['metric']['pod']
cpu_usage = float(container_data['value'][1])
if cpu_usage > self.cpu_threshold and not math.isinf(cpu_usage):
container_cpu_list.append({"container":container_name, "cpu_usage":cpu_usage})
else:
print('找不到指定的容器或者没有配置资源limit')
else:
print('请求失败:', response.status_code)
return container_cpu_list
def get_mem(self,namespace):
container_mem_list = []
query = f'sum (container_memory_working_set_bytes{{container !="",container!="POD",namespace=~"{namespace}"}}) by (container, pod)/ sum(container_spec_memory_limit_bytes{{container !="",container!="POD",namespace=~"{namespace}"}}) by (container, pod) * 100'
#query = r'sum (container_memory_working_set_bytes{container !="",container!="POD",namespace=~"broker"}) by (container, pod)/ sum(container_spec_memory_limit_bytes{container !="",container!="POD",namespace=~"broker"}) by (container, pod) * 100'
#query = r'sum (container_memory_working_set_bytes{container !="",container!="POD",namespace=~"broker"}) by (container, pod)/ sum(container_spec_memory_limit_bytes{container !="",container!="POD",namespace=~"broker"}) by (container, pod) * 100'
params = {
'query': query
}
response = requests.get(url=self.api_url, params=params)
if response.status_code == 200:
data = response.json()
result = data['data']['result']
if result:
for container_data in result:
container_name = container_data['metric']['pod']
mem_usage = float(container_data['value'][1])
if mem_usage > self.mem_threshold and not math.isinf(mem_usage):
container_mem_list.append({"container": container_name, "mem_usage": mem_usage})
else:
print('找不到指定的容器或者没有配置资源limit')
else:
print('请求失败:', response.status_code)
return container_mem_list
def send_alert(self,container):
current_time = datetime.now()
target_timezone = pytz.timezone('Asia/Shanghai')
current_time = current_time.astimezone(target_timezone)
markdown_cpu = f'''
# io环境报警通知:
**容器名称:** {container.get("container")}
**当前cpu:** {container.get("cpu_usage")}%
**报警级别:** 警告
**报警阈值:** {self.cpu_threshold}%
**报警时间:** {current_time.strftime('%Y-%m-%d %H:%M:%S')}
**问题描述:**
{container.get("container")} CPU 使用率超过阈值。
'''

markdown_mem = f'''
# io环境报警通知:
**容器名称:** {container.get("container")}
**当前内存:** {container.get("mem_usage")}%
**报警级别:** 警告
**报警阈值:** {self.mem_threshold}%
**报警时间:** {current_time.strftime('%Y-%m-%d %H:%M:%S')}
**问题描述:**
{container.get("container")} 内存 使用率超过阈值。
'''
markdown_text = None
if container.get("cpu_usage"):
markdown_text = markdown_cpu
else:
markdown_text = markdown_mem

url = r"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3e74a7b2-5c2d-4f17-89c5-64689af216f7"
headers = {
'Content-Type': 'application/json'
}
data = {
'msgtype': 'markdown',
'markdown': {
'content': markdown_text
}
}
if markdown_text:
res = requests.post(url=url, headers=headers,json=data)
if res.json().get("errcode") == 0:
print("发功成功")
else:
print(res.text)
else:
print("发送内容为空")


if __name__ == '__main__':
monitoring = Monitoring()
for namespace in monitoring.namespace_list:
container_cpu_list = monitoring.get_cpu(namespace)
container_mem_list = monitoring.get_mem(namespace)
#cpu监控
for container_cpu in container_cpu_list:
print(container_cpu)
monitoring.send_alert(container_cpu)
#内存监控
for container_mem in container_mem_list:
print(container_mem)
monitoring.send_alert(container_mem)


报警示例图

 

标签:container,python,self,namespace,抓取,mem,prometheus,usage,cpu
From: https://www.cnblogs.com/fengzi7314/p/17482431.html

相关文章

  • Python函数笔记随笔
    做题时碰到的一些函数,我准备着没事就拿着看看,温故而知新咯PythonListreverse()reverse()函数用于反向列表中元素。aList=[123,'xyz','zara','abc','xyz']aList.reverse()print输出结果↓List:['xyz','abc','zara','......
  • #yyds干货盘点#python关键字参数
    关键字参数kwarg=value 形式的 关键字参数 也可以用于调用函数。函数示例如下:defparrot(voltage,state='astiff',action='voom',type='NorwegianBlue'):print("--Thisparrotwouldn't",action,end='')print("ifyouput......
  • python list 从列表A删除列表B的几种方法
    问题描述:a=['a','b','c','d','e','f']b=['a','c','d']想要得到一个列表C=a-b的元素即c=['b','e','f']转换成集合删除c=list(set(a).difference......
  • django 更改了modules.py 数据库模型,但是 python3 manage.py makemigrations 提示无
    现象:明明改了modules.py文件。删了appname/migrations/下所有内容。而且也删除了django模型变更记录表django_migrations中appname项目的记录 原因:删多了: appname/migrations/下所有内容。__init__.py不能删,需要重新创建一个,否则识别不了包了  ......
  • python第一课 -python基本语法
    python关键字导入关键字,并打印出来importkeyword#查看python关键字print(keyword.kwlist)'''将python关键字每行5个打印出来'''key=keyword.kwlistj=0foriinkey:print(i,end='\t')j+=1ifj==5:j=0print('\......
  • python 项目打包成exe文件-使用pyinstaller
    1.首先安装pyinstaller2.复制一份项目到桌面3.命令行进入桌面的项目地址4.使用pyinstaller打包,几种打包方法见上图。截图方框依次为虚拟环境,项目地址,打包方式以及内容(打包的是main.py文件)打包后结果:在文件件内多处两个文件夹,打开dist文件夹就可以看到可执行程序跟着老师一起做的......
  • python GUI+爬虫——12306抢票软件(1)
    使用python的GUI和爬虫等功能自己构造一个12306的抢票软件。该课程来自网易云课堂的撩课学院,付费课程。地址:网易云课堂搜索以下内容就可找到我跟着学,不一定最后能成功。先试试,想要成功的同学请看我该系列有没有真正实现,如果我没有实现,你可以直接放弃,不用再浪费时间了。简单描述一......
  • Node抓取有道精品课视频
    最近想把有道精品课快过期的课程视频弄下来,刚开始想着录屏,但是那个太麻烦了,长一点的视频要一直在那里录制,影响其他工作,刚开始想着获取视频连接,看能不能下载,结果发开发现403,应该是加密处理了,不让直接下载头疼了一会儿,然后想着用迅雷下载一下试试看,结果真的能下载(后面发现,下载多了可......
  • python-小试牛刀
    这篇博客对你可能意义不大,对于我而言相对重要一些!!!! 因为某人的需求,喊我写一个计算图片灰度值,标准差的代码,计划用js来写,查了一下两种写法,一种用canvas获取img的属性,根据像素的灰度值进行计算;另一种是node+opencv来写,但是Windows在node环境下配置opencv好像优点麻烦,果断放弃。想着某......
  • Ubuntu安装Python 3.10
    更新系统的软件包列表和软件包:sudoaptupdatesudoaptupgrade安装构建Python3.10所需的依赖项:sudoaptinstallbuild-essentialzlib1g-devlibncurses5-devlibgdbm-devlibnss3-devlibssl-devlibsqlite3-devlibreadline-devlibffi-devcurllibbz2-dev下载Python3.10......