ToB企服应用市场:ToB评测及商务社交产业平台

标题: go语言开发Prometheus Exporter(DM数据库) [打印本页]

作者: 灌篮少年    时间: 2024-8-15 04:40
标题: go语言开发Prometheus Exporter(DM数据库)
一、先容


1. Metric 的主要特征包罗

2. Metric 的分类

Metrics 可以按照不同的维度举行分类,主要包罗以下几类:
二、简化版的Metric


1) prometheus.NewCounter()声明一个自己的指标
2) prometheus.MustRegister() 将自定义的指标注册到prometheus
3) http.Handle(“/metrics”, promhttp.Handler()) 把prometheus的handler交给接口即可
  1. var (
  2.     requestsTotal = prometheus.NewCounter(
  3.         prometheus.CounterOpts{
  4.             Name: "http_requests_total",
  5.             Help: "Total number of HTTP requests processed",
  6.         },
  7.     )
  8. )
  9. func main() {
  10.     // 注册指标
  11.     prometheus.MustRegister(requestsTotal)
  12.     // 模拟请求处理
  13.     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  14.         requestsTotal.Inc() // 每次请求增加计数器
  15.         fmt.Fprintf(w, "Hello, World!")
  16.     })
  17.     // 启动 HTTP 服务,暴露指标
  18.     http.Handle("/metrics", promhttp.Handler())
  19.     log.Fatal(http.ListenAndServe(":8080", nil))
  20. }
复制代码
三、标准版的Metric

1. 目录结构

  1. collector
  2.     //注册类
  3.     collector.go
  4.     db_sessions_collector.go
  5. //启动类
  6. dameng_exporter.go
复制代码
2. main函数(dameng_exporter.go)

注:这里利用的是自己的Registry,特殊重要。并且注册指标方式不同
  1. func main() {
  2.         // 创建一个新的注册器,如果使用系统自带的Registry,会多余出很多默认的go指标
  3.         reg := prometheus.NewRegistry()
  4.     //注册指标,这里的collector是我的项目目录
  5.         collector.RegisterCollectors(reg)
  6.     //设置metric路径
  7.         http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
  8. }
复制代码
3. 注册指标(collector.go)


  1. // MetricCollector 接口
  2. type MetricCollector interface {
  3.         Describe(ch chan<- *prometheus.Desc)
  4.         Collect(ch chan<- prometheus.Metric)
  5. }
  6. var (
  7.         collectors  []prometheus.Collector
  8.         registerMux sync.Mutex
  9. )
  10. //注册指标
  11. func RegisterCollectors(reg *prometheus.Registry) {
  12.     //加锁
  13.         registerMux.Lock()
  14.         defer registerMux.Unlock()
  15.    
  16.     //连接DM数据库
  17.     db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=true")
  18.    
  19.     //将指标存放到collectors数组中
  20.     collectors = append(collectors, NewDBSessionsCollector(db))
  21.    
  22.     //把collectors数组中指标注册
  23.     for _, collector := range collectors {
  24.                 reg.MustRegister(collector)
  25.         }
  26.    
  27. }
复制代码
4.指标采集器(db_sessions_collector.go)


  1. package collector
  2. import (
  3.         "context"
  4.         "dameng_exporter/config"
  5.         "dameng_exporter/logger"
  6.         "database/sql"
  7.         "github.com/prometheus/client_golang/prometheus"
  8. )
  9. type DBSessionsCollector struct {
  10.         db         *sql.DB
  11.         metricDesc *prometheus.Desc
  12. }
  13. func NewDBSessionsCollector(db *sql.DB) MetricCollector {
  14.         return &DBSessionsCollector{
  15.                 db: db,
  16.                 metricDesc: prometheus.NewDesc(
  17.                         "db_sessions", //key便签值
  18.                         "Number of database sessions",//辅助信息
  19.                         []string{"host_name"}, // 添加标签
  20.                         nil,
  21.                 ),
  22.         }
  23. }
  24. func (c *DBSessionsCollector) Describe(ch chan<- *prometheus.Desc) {
  25.         ch <- c.metricDesc
  26. }
  27. func (c *DBSessionsCollector) Collect(ch chan<- prometheus.Metric) {
  28.         // ping 一下判断连接是否有问题
  29.         if err := checkDBConnection(c.db); err != nil {
  30.                 return
  31.         }
  32.         //设置超时时间的ctx对象
  33.         ctx, cancel := context.WithTimeout(context.Background(), timeout)
  34.         defer cancel()
  35.         var value float64
  36.         err := c.db.QueryRowContext(ctx, "SELECT COUNT(*) FROM v$sessions").Scan(&value)
  37.         if err != nil {
  38.                 handleDbQueryError(err)
  39.                 return
  40.         }
  41.         logger.Logger.Debugf("DBSessionsCollector: %v", value)
  42.         ch <- prometheus.MustNewConstMetric(c.metricDesc, prometheus.GaugeValue, value, config.GetHostName())
  43. }
复制代码
四、附录

为什么声明MetricCollector接口?



如何连接DM数据库

大概如下,详细的参考DM官网:https://eco.dameng.com/document/dm/zh-cn/app-dev/go_dm.html
  1. // 引用Go标准库sql和dm驱动包,后面的示例不再赘述
  2. import (
  3. "database/sql"
  4. _ "dm"
  5. )
  6. db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=true")
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4