go语言开发Prometheus Exporter(DM数据库)

一、介绍

  • 源码步骤基于dameng_exporter源码讲解,看完本篇文章可以直接进行二次开发。

  • dameng exporter的开源地址:https://github.com/gy297879328/dameng_exporter(可直接对接prometheus+grafana 提供表盘)

  • 开发一个exporter 其实就是写一个 Metric格式的接口页面,等待prometheus访问就可以了。

  • Metric(指标)是用于描述和记录系统、应用程序或服务状态的量化数据。Metric提供了对系统运行状态和性能的可量化度量,帮助监控系统的健康状况、性能表现和行为模式。

1. Metric 的主要特征包括

  1. 名称(Name): 指标的唯一标识符,用于在监控系统中识别和区分不同的指标。
  2. 标签(Labels): 用于附加到指标的键值对元数据,可以提供更详细的上下文信息。标签使得指标能够根据不同维度进行分组和过滤。
  3. 值(Value): 指标的具体数值或测量结果,反映了被度量对象的某种状态、计数或度量。
  4. 时间戳(Timestamp): 记录指标值的时间点或时间范围,用于分析指标变化的趋势和时间相关性。

2. Metric 的分类

Metrics 可以按照不同的维度进行分类,主要包括以下几类:

  1. 计数器(Counter): 计数器用于累计某个事件发生的次数或增量。它通常只能递增,不能减少。例如,HTTP请求数、任务完成数等。
  2. 计量器(Gauge): 计量器表示一个可变的数值,它可以增加或减少。通常用于表示系统状态或资源利用率,如内存使用量、CPU利用率等。
  3. 直方图(Histogram): 直方图用于统计和分析观察值的分布情况。它将观察值按照预定义的桶(Bucket)范围进行分组统计,并记录每个桶中的观察值数量。
  4. 摘要(Summary): 摘要类似于直方图,但是它除了统计桶中的观察值数量外,还会记录观察值的总和、计数和其他分位数(如中位数、95th百分位数等)。
    在这里插入图片描述

二、简化版的Metric

  • 最简易版的Counter类型指标方式,只有这么几行代码。
  • 主要是三个函数也就是三步骤

1) prometheus.NewCounter()声明一个自己的指标
2) prometheus.MustRegister() 将自定义的指标注册到prometheus
3) http.Handle(“/metrics”, promhttp.Handler()) 把prometheus的handler交给接口即可

var (requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{Name: "http_requests_total",Help: "Total number of HTTP requests processed",},)
)func main() {// 注册指标prometheus.MustRegister(requestsTotal)// 模拟请求处理http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {requestsTotal.Inc() // 每次请求增加计数器fmt.Fprintf(w, "Hello, World!")})// 启动 HTTP 服务,暴露指标http.Handle("/metrics", promhttp.Handler())log.Fatal(http.ListenAndServe(":8080", nil))
}

三、标准版的Metric

1. 目录结构

collector//注册类collector.godb_sessions_collector.go
//启动类
dameng_exporter.go

2. main函数(dameng_exporter.go)

注:这里使用的是自己的Registry,特别重要。并且注册指标方式不同

func main() {// 创建一个新的注册器,如果使用系统自带的Registry,会多余出很多默认的go指标reg := prometheus.NewRegistry()//注册指标,这里的collector是我的项目目录collector.RegisterCollectors(reg)//设置metric路径http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))}

3. 注册指标(collector.go)

  • 这里为什么声明MetricCollector接口,附录章节写原因
// MetricCollector 接口
type MetricCollector interface {Describe(ch chan<- *prometheus.Desc)Collect(ch chan<- prometheus.Metric)
}var (collectors  []prometheus.CollectorregisterMux sync.Mutex
)//注册指标
func RegisterCollectors(reg *prometheus.Registry) {//加锁registerMux.Lock()defer registerMux.Unlock()//连接DM数据库db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=true")//将指标存放到collectors数组中collectors = append(collectors, NewDBSessionsCollector(db))//把collectors数组中指标注册for _, collector := range collectors {reg.MustRegister(collector)}}

4.指标采集器(db_sessions_collector.go)

  • 实现MetricCollector的两个接口 Describe 和 Collect, Describe传的channel,Collect是采集逻辑
  • Collect函数我是直接连接DM数据库执行SQL采集指标
  • NewDBSessionsCollector中的返回值 就是我们的metric指标的格式。四个参数已经在代码中标明了,这里只是声明lable的标签并不赋值
  • Collect函数的prometheus.MustNewConstMetric()函数,这步是给事先定义的标签赋值,需要一一对应才行。
  • Collect函数的prometheus.MustNewConstMetric()函数的prometheus.GaugeValue这个参数指定就是Metric的分类
package collectorimport ("context""dameng_exporter/config""dameng_exporter/logger""database/sql""github.com/prometheus/client_golang/prometheus"
)type DBSessionsCollector struct {db         *sql.DBmetricDesc *prometheus.Desc
}func NewDBSessionsCollector(db *sql.DB) MetricCollector {return &DBSessionsCollector{db: db,metricDesc: prometheus.NewDesc("db_sessions", //key便签值"Number of database sessions",//辅助信息[]string{"host_name"}, // 添加标签nil,),}
}func (c *DBSessionsCollector) Describe(ch chan<- *prometheus.Desc) {ch <- c.metricDesc
}func (c *DBSessionsCollector) Collect(ch chan<- prometheus.Metric) {// ping 一下判断连接是否有问题if err := checkDBConnection(c.db); err != nil {return}//设置超时时间的ctx对象ctx, cancel := context.WithTimeout(context.Background(), timeout)defer cancel()var value float64err := c.db.QueryRowContext(ctx, "SELECT COUNT(*) FROM v$sessions").Scan(&value)if err != nil {handleDbQueryError(err)return}logger.Logger.Debugf("DBSessionsCollector: %v", value)ch <- prometheus.MustNewConstMetric(c.metricDesc, prometheus.GaugeValue, value, config.GetHostName())
}

四、附录

为什么声明MetricCollector接口?

  • prometheus注册需要reg.MustRegister函数需要传Collector类型
  • Collector有两个接口Describe(chan<- *Desc)以及Collect(chan<- Metric)
  • 因为要传这个所以先定义同接口的MetricCollector类型
  • 写的每一个指标都需要实现这两个接口

在这里插入图片描述

如何连接DM数据库

大概如下,具体的参考DM官网:https://eco.dameng.com/document/dm/zh-cn/app-dev/go_dm.html

// 引用Go标准库sql和dm驱动包,后面的示例不再赘述
import (
"database/sql"
_ "dm"
)
db, err := sql.Open("dm", "dm://SYSDBA:SYSDBA@localhost:5236?autoCommit=true")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1488463.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序+SpringBoot+Vue的自习室选座与门禁系统(带1w+文档)

基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 本课题研究的研学自习室选座与门禁系统让用户在小程序端查看座位&#xff0c;预定座位&#xff0c;支付座位价格&#xff0c;该系统让用户预定座位…

Discourse 如何通过终端工具访问 PGSQL

PGSQL 在 Discourse 中是通过容器方式运行的&#xff0c;要访问 PGSQL 中的数据那么首先需要进入到容器后才可以。 进入容器的命令为&#xff1a; cd /var/discourse/./launcher enter appsu discoursepsql discourse最后的命令是登录到运行在容器中的 pgsql。 查看 pgsql 上…

学习笔记之Java篇(0725)

p this 普通方法中&#xff0c;this总是指向调用该方法的对象。 构造方法中&#xff0c;this总是指向正要初始化的对象。 this&#xff08;&#xff09;调用必须重载的构造方法&#xff0c;避免相同地址初始化代码&#xff0c;但只能在构造方法中用&#xff0c;比企鹅必须位…

USB传输类型,常用类型:控制传输和中断传输

一般包含&#xff1a;控制传输&#xff0c;同步传输&#xff0c;批传输&#xff0c;中断传输&#xff0c;但常见到的控制传输的setup包以及中断传输的IN和OUT包 参考 控制传输 中断传输 usb主机发送的命令功能 hid类命令

AI有关的学习和python

一、基本概念 AIGC&#xff08;AI Generated content AI 生成内容&#xff09; AI生成的文本、代码、图片、音频、视频。都可以成为AIGC。 Generative AI&#xff08;生成式AI&#xff09;所生成的内容就是AIGC AI指代计算机人工智能&#xff0c;模仿人类的智能从而解决问题…

网站打包封装成app,提高用户体验和商业价值

网站打包封装成app的优势 随着移动互联网的普及&#xff0c;用户对移动应用的需求越来越高。网站打包封装成app可以满足用户的需求&#xff0c;提高用户体验和商业价值。 我的朋友是一名电商平台的运营负责人&#xff0c;他曾经告诉我&#xff0c;他们的网站流量主要来自移动…

切换数据失败0x1671分析

1、问题背景 切换双卡数据开关&#xff0c;无法切换成功&#xff0c;且单机必现该问题 2、问题分析 搜索Log发现相关拨号无法建立成功&#xff0c;返回0x1671&#xff0c;无法建立PDN连接。 相关拨号上层未下发相关AT命令&#xff0c;属于上层报错&#xff0c;并非网络问题&…

Hadoop学习笔记1

hadoop节点规划 服务器集群规划&#xff0c;6台服务器&#xff1a; 一个主节点 两个从节点 三个工作节点 集群服务器用的都是centos7.9.2009的镜像 一、基础环境 1.1配置阿里云yum源 1.下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 2.备份并替换系…

【企业级开发模型】企业级开发流程 | 系统环境开发

目录 1.企业级开发流程 2.系统环境开发 1.企业级开发流程 想要交付一个软件项目&#xff0c;至少需要经过以下三个流程。软件代码的开发-------->软件代码的测试------->软件发布上线。只有将软件发布上线之后&#xff0c;用户才可以访问到我们的一个软件。 软件代码的…

C语言 | Leetcode C语言题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; bool flag;struct PeekingIterator {struct Iterator *iterator;int nextElement; };struct PeekingIterator* Constructor(struct Iterator* iter) {struct PeekingIterator* piter malloc(sizeof(struct PeekingIterator));piter->it…

[Vulnhub] Raven WordPress+SUDO-Python权限提升+MSQP自动化Mysql权限提升

信息收集 IP AddressOpening Ports192.168.101.159TCP: $ nmap -p- 192.168.101.159 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u4 (protocol 2.0) | ssh-hostkey: | 1024 26:81:c1:f3:5e:01:ef:93:4…

UDP/TCP协议解析

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

android settings提示音开关状态与修改(二)

android系统&#xff0c;settings提示音类型&#xff1a; 充电提示音开关&#xff0c;文件路径&#xff1a; packages/apps/Settings/src/com/android/settings/notification/ChargingSoundPreferenceController.java 创建并设置开关状态&#xff1a; public ChargingSoundPre…

git sendemail使用

教程参考&#xff1a; git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…

设计模式笔记(一)

目录 设计模式共有23种&#xff0c;也可称为GOF23 单例模式&#xff08;重点&#xff0c;常用&#xff09; 工厂模式 代理模式&#xff1a;&#xff08;SpringAOP的底层原理&#xff09; 静态代理模式&#xff1a;&#xff08;写死一个代理类Proxy&#xff09; 动态代理模…

ansible基础讲解和加密文件讲解

ansible最重要的三个文件 /etc/ansible/ansible.cfg #####ansible的配置文件 /etc/ansible/host ##清单文件inventory ansible-navigator.yml ####以yml结尾的文件可以理解为conf结尾的文件&#xff0c;是配置文件&#xff0c;用于设置剧本playbook playbook讲解 以.yml结…

Superset二次开发之筛选器native Filters 水平布局

引言 Apache Superset作为一个功能强大的开源数据探索和可视化平台&#xff0c;提供了丰富的配置选项来定制化用户体验。其中&#xff0c;HORIZONTAL_FILTER_BAR 是一个重要的配置项&#xff0c;专注于优化和改进Superset中的筛选器条布局与交互。 什么是HORIZONTAL_FILTER_B…

IEC104转MQTT网关支持MQTT对接Ignition、阿里云、华为云、亚马逊AWS、ThingsBoard、Zabbix平台助力远程管理

钡铼推出了一款专为电力系统设计的数据采集网关——IEC104转MQTT网关BE113&#xff0c;感兴趣的朋友接着往下看&#xff1a; 一、网关概述 IEC104转MQTT(Ignition)网关BE113是一款专为电力系统设计的数据采集网关&#xff0c;支持DL/T645和IEC104等协议的设备。上行支持MQTT协…

LLama 405B 技术报告解读

LLama 405B 技术报告解读 果然传的消息都是真的&#xff0c;meta在24号凌晨发布了llama 3的405B版本&#xff0c;这次还是做一个技术报告解读。 值得一提的是&#xff0c;在技术报告的开头&#xff0c;meta特意强调了一个 Managing complexity&#xff0c;大意是管控复杂度。…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的&#xff0c;因此你可以根据需要测量的距离&#xff0c;自定义深度相机安装基线&#xff0c;并根据你的项目要求&#xff08;分辨率、快门类型、FPS、光学元件&#xff…