Files
2026-07-13 12:31:34 +08:00

118 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
"""
@File : prometheus_api.py
@Date : 2023-06-30
"""
from __future__ import print_function, unicode_literals, absolute_import, division
import re
import prometheus_client
from flask import Response, request
from flask import current_app
from playhouse.shortcuts import model_to_dict
from prometheus_client import Gauge
from prometheus_client.core import CollectorRegistry
from domain_admin.config import PROMETHEUS_KEY
from domain_admin.enums.config_key_enum import ConfigKeyEnum
from domain_admin.log import logger
from domain_admin.model.domain_info_model import DomainInfoModel
from domain_admin.model.domain_model import DomainModel
from domain_admin.service import group_service
def metrics():
"""
prometheus metrics接口
:return:
"""
# 鉴权
logger.info('metrics')
authorization = request.headers.get('Authorization')
ret = re.match('Bearer (?P<token>.*)', authorization)
token = ret.groupdict().get('token')
prometheus_key = current_app.config[ConfigKeyEnum.PROMETHEUS_KEY]
if token != prometheus_key:
return Response("Unauthorized", status=401)
registry = CollectorRegistry(auto_describe=False)
# 证书数据
gauge = Gauge(
"domain_admin",
"this is a domain admin data",
["domain", "root_domain", "group_name"],
registry=registry)
rows = DomainModel.select()
lst = [model_to_dict(row, extra_attrs=['real_time_expire_days']) for row in rows]
# 分组名
group_service.load_group_name(lst)
logger.info('group_service a')
for row in lst:
gauge.labels(
row['domain'],
row['root_domain'],
row['group_name']
).set(row['real_time_expire_days'])
logger.info('success')
# 域名数据 @since v1.5.27
domain_info_fields = [
"id",
"user_id",
"domain",
"group_id",
"group_name",
"comment",
"domain_registrar",
"domain_registrar_url",
"domain_start_time",
"domain_expire_time",
"is_auto_update",
"is_expire_monitor",
"icp_company",
"icp_licence",
'tags',
'real_domain_expire_days',
'update_time_label',
'domain_start_date',
'domain_expire_date',
"create_time",
"update_time",
]
domain_info_gauge = Gauge(
name="domain_info",
documentation="this is a domain info data",
labelnames=domain_info_fields,
registry=registry)
domain_info_rows = DomainInfoModel.select()
domain_info_lst = [model_to_dict(
row,
extra_attrs=[
'tags',
'real_domain_expire_days',
'update_time_label',
'domain_start_date',
'domain_expire_date',
]
) for row in domain_info_rows]
# 分组名
group_service.load_group_name(domain_info_lst)
for row in domain_info_lst:
domain_info_gauge.labels(
*[row[field] for field in domain_info_fields]
).set(row['real_domain_expire_days'])
return Response(prometheus_client.generate_latest(registry), mimetype='text/plain')