暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Prometheus监控自研组件之数据库TeleDB

IT那活儿 2023-04-12
818

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!




背 景



TeleDB的活动连接数可以用于反应当前set的繁忙程度,但只能通过telemonitor界面查看。

本文通过Prometheus+grafana+flask框架实现teledb活动连接数监控、展示、告警。此框架可用于任何有数据源的监控项

涉及组件:

  • Prometheus:用于采集监控数据;
  • grafana:展示;
  • flask:用于Prometheus得自定义exporter编写,配合Prometheus采集监控数据;
  • python3:脚本语言粘合剂,使用python得flask库实现flask得功能。




框架思路



1. 数据源(teledb活动连接数)从telemonitor数据库中获取

2. 通过flask将获取到的数据源采集到轻量级web端,实现自定义exporter功能。这里用exporter-telemonitor表示
3. 配置Prometheus,通过http协议从exporter-telemonitor获取数据

4. 通过grafana展示




代码实现



#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session, sessionmaker
from sqlalchemy import create_engine, MetaData
from urllib import parse
import prometheus_client
from flask import Flask
from prometheus_client import make_wsgi_app
from prometheus_client import Gauge, start_http_server, Counter
from flask import Response, Flask
from prometheus_client.core import InfoMetricFamily, GaugeMetricFamily, REGISTRY,CollectorRegistry

#这个模块用于获取数据,mysql的连接信息过滤勒敏感信息:
def get_data():
  URL="mysql+pymysql://teledb:%s@135.x.x.x:9014/teledb?charset=utf8" % parse.quote_plus('xxxxxxx')
  print (URL)
  metadata = MetaData()
  engine = create_engine(URL)
  session_factory = sessionmaker(bind=engine)
  session = session_factory()
  metadata.reflect(engine, only=['mysql_status'])
  Base = automap_base(metadata=metadata)
  Base.prepare()
  status_gz = Base.classes.mysql_status
  query = session.query(status_gz)
  list = []
  for row in query:
    dict = {"host":row.host,"port":row.port,"tags":row.tags,"threads":row.threads_running}
    list.append(dict)
  print (list)

  return list   #此处返回一个带有监控数据的列表

#这部分是flask框架,用于启一个轻量级的web服务器,因为Prometheus需要通过http协议从exporter获取指标。
app = Flask(__name__)
@app.route("/metrics")
def requests_count():
  data_list
=get_data()

  REGISTRY = CollectorRegistry(auto_describe=False)
  status = Gauge("CRM_teledb_runing_threads", "monitor running status.",["host","port","tags"], registry=REGISTRY)#定义Prometheus的自定义指标,打标签,这里给这个指标起名
                                                                                                                                                                    #JF_teledb_runing_threads。
  for data in data_list:
    host ="".join( data.get("host"))
    port = "".join( data.get("port"))
    tags = "".join( data.get("tags"))
    threads = data.get("threads")
    status.labels(host, port,tags).set(threads)
  return Response(prometheus_client.generate_latest(REGISTRY),
                    mimetype="text/plain")
if __name__ == '__main__':
 app.run(host="0.0.0.0",port=8181,debug=True)#把这个web服务器跑在8181端口


END


本文作者:李 震(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论