探测数据有1min延迟,自定义metrics新增timestamp还未想到解决方案
#!/usr/bin/python
# -*- coding: utf-8 -*-
# author:wtc
# Created on 2021/10/12
# Use: Prometheus monitor url
import os
import yaml
import urllib2
import threading
import Queue as queue
import prometheus_client
from prometheus_client import *
from flask import Response, Flask
from prometheus_client.core import CollectorRegistry
task_queue = queue.Queue()
res_queue = queue.Queue()
app = Flask(__name__)
def Getconfigdict():
"""
将 yaml 配置文件中数据格式化为字典
"""
proPath = os.path.dirname(os.path.realpath(__file__))
yamlPath = os.path.join(proPath, "config.yaml")
f = open(yamlPath, "r")
config_data = yaml.load(f)
f.close()
return config_data
def RequestUrl(service,url):
"""
@param service: 探测服务
@param url: 探测url
@return: dict,端口检测结果
"""
try:
response_code = urllib2.urlopen(url,timeout=1).getcode()
result_dict = {"service": service, "url": url, "status": response_code}
except Exception as e:
result_dict = {"service": service, "url": url, "status": 0}
res_queue.put(result_dict)
def thread_work():
url_threads = []
check_url = Getconfigdict()
for service,urls in check_url.items():
for url in urls:
task_queue.put([RequestUrl,[service,url]])
for check_tasks in range(task_queue.qsize()):
queue_element = task_queue.get()
do_job = threading.Thread(target=queue_element[0],args=queue_element[1])
do_job.start()
url_threads.append(do_job)
for one_task in url_threads:
one_task.join()
@app.route("/metrics")
def PromResponse():
thread_work()
REGISTRY = CollectorRegistry(auto_describe=False)
prometheus_metrics = Gauge("check_server_url", "result", ["service","url"], registry=REGISTRY)
for round_times in range(res_queue.qsize()):
element_data = res_queue.get()
prometheus_metrics.labels(element_data['service'], element_data['url']).set(element_data['status'])
return Response(prometheus_client.generate_latest(REGISTRY),
mimetype="text/plain")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8006, debug=True)