一:簡介
隨着prometheus的使用人羣逐漸擴大,官方定義的client exporter雖然能知足咱們的大部分需求,可是不少監控仍是須要咱們自定義開發,如下內容就是基於騰訊雲SDK,對騰訊雲CLB的流量進行監控(吐槽一下:騰訊雲自身的監控項真是少,並且鏈接數還拿不到數據)。
二:腳本
# coding:utf-8
import argparse
import json
import time
import prometheus_client
from flask import Response, Flask
from ping3 import ping
from prometheus_client import Gauge
from prometheus_client.core import CollectorRegistry
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.monitor.v20180724 import monitor_client, models
app = Flask(__name__)
# 定義一個倉庫
REGISTRY = CollectorRegistry(auto_describe=False)
class STATUS():
# 進流量
Intraffic = Gauge('clb_intraffic', 'clb in traffic(Mbps)', ['project', 'vip'], registry=REGISTRY)
# 出流量
Outtraffic = Gauge('clb_outtraffic', 'clb out traffic(Mbps)', ['project', 'vip'], registry=REGISTRY)
# 鏈接數
# Connum = Gauge('clb_Connum', 'Current number of clb connections', ['project'], registry=REGISTRY)
# clb 存活性
ClbStatus = Gauge('clb_status', 'check if clb is available', ['project', 'vip'], registry=REGISTRY)
def __init__(self):
self.project = args.project
self.city = args.city
self.vip = args.vip
self.now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time() - 300))
self.cred = credential.Credential("騰訊雲ID", "騰訊雲Key")
self.httpProfile = HttpProfile()
self.httpProfile.endpoint = "monitor.tencentcloudapi.com"
self.clientProfile = ClientProfile()
self.clientProfile.httpProfile = self.httpProfile
self.client = monitor_client.MonitorClient(self.cred, self.city, self.clientProfile)
self.req = models.GetMonitorDataRequest()
def get_info(self, metric):
params = {"Namespace": "QCE/LB_PUBLIC",
"MetricName": metric,
"Period": 60,
"StartTime": self.now_time,
"EndTime": self.now_time,
"Instances": [
{"Dimensions": [
{"Name": "vip", "Value": self.vip}
]
}
]
}
self.req.from_json_string(jsonStr=json.dumps(params))
resp = self.client.GetMonitorData(self.req)
return resp.to_json_string()
def filter(self):
self.Intraffic.labels(self.project, self.vip).set_function(
lambda: json.loads(self.get_info("Intraffic"))['DataPoints'][0]['Values'][0])
self.Outtraffic.labels(self.project, self.vip).set_function(
lambda: json.loads(self.get_info("Outtraffic"))['DataPoints'][0]['Values'][0])
# self.Outtraffic.labels(self.project).set_function(
# lambda: json.loads(self.get_info("Connum"))['DataPoints'][0]['Values'][0])
self.ClbStatus.labels(self.project, self.vip).set_function(
lambda: 0 if ping(self.vip, timeout=3) else 10)
@app.route("/metrics")
def Status():
STATUS().filter()
return Response(prometheus_client.generate_latest(registry=REGISTRY), mimetype="text/plain")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.description = 'Get CLB traffic information'
parser.add_argument("--project", help="web event name", required=True, type=str)
parser.add_argument("--city", help="clb region", required=True, type=str)
parser.add_argument("--vip", help="clb public ip", required=True, type=str)
parser.add_argument("--port", help="flask port", required=True, type=int)
args = parser.parse_args()
app.run(host="0.0.0.0", port=args.port)
三:運行
/usr/bin/python36 /data/script/clb-exporter.py --project "項目名" --city "CLB所在地區" --vip "clb的VIP" --port 19992