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.mzph.cn/bicheng/50482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的三类读写函数

文件IO和标准IO的区别 遵循标准&#xff1a; 文件IO遵循POSIX标准&#xff0c;主要在类UNIX环境下使用。标准IO遵循ANSI标准&#xff0c;具有更好的可移植性&#xff0c;可以在不同的操作系统上重新编译后运行。可移植性&#xff1a; 文件IO的可移植性相对较差&#xff0c;因为…

基于大模型零代码1小时完成国标数据分级分类近义词库构建及思考

1. 任务背景及困难分析 因项目要求&#xff0c;需要对国家标准国民经济行业分类-GB/T 4754-2017【1】进行近义词库的构建&#xff0c;时间非常紧&#xff0c;只给了很短时间进行处理&#xff0c;目标是构建一份中等粒度的行业近义词库。 搁在以前&#xff0c;可能需要点时…

Linux 安装mysql-client-core-8.0

在Linux上安装mysql-client-core-8.0 安装流程 下面是安装mysql-client-core-8.0的步骤和相应的命令&#xff1a; 步骤1&#xff1a;更新系统软件源 我们首先需要更新系统的软件源&#xff0c;以确保我们能够获取到最新的软件包列表。使用以下命令更新软件源&#xff1a; …

Ansible——inventory 主机清单

1、inventory 含义 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 如果是名称类似的主机&#xff0c;可以使用列表的方式标识各个主机。 vim /etc/ansible/hosts [webservers] 192.168.20.11:222…

平凯星辰亮相 2024 中国国际金融展,发布银行交易明细查询白皮书

7 月 19 日至 21 日&#xff0c;备受瞩目的 2024 中国国际金融展&#xff08;以下简称金融展&#xff09;在北京国家会议中心隆重举办。作为中国乃至亚洲最大的金融科技展会&#xff0c;本届金融展以“数字金融引领未来&#xff0c;守正创新共筑金融新生态”为主题&#xff0c;…

C++_单例模式

目录 1、饿汉方式实现单例 2、懒汉方式实现单例 3、单例模式的总结 结语 前言&#xff1a; 在C中有许多设计模式&#xff0c;单例模式就是其中的一种&#xff0c;该模式主要针对类而设计&#xff0c;确保在一个进程下该类只能实例化出一个对象&#xff0c;因此名为单例。而…

temu数据分析怎么做,temu选品数据分析怎么做

在竞争激烈的电商市场中&#xff0c;数据分析已成为商家提升销售业绩、优化经营策略的重要工具。特别是对于Temu平台的卖家而言&#xff0c;掌握数据分析技巧&#xff0c;特别是选品数据分析&#xff0c;更是至关重要。本文将为您详细解析如何在Temu平台上进行数据分析&#xf…

Docker 安全及日志管理(包含SSL证书)

目录 一、Docker 存在的安全问题 二、Docker 架构缺陷与安全机制 三、Docker 安全基线标准 四、容器相关的常用安全配置方法 五、限制流量流向 六、镜像安全 七、DockerClient 端与 DockerDaemon 的通信安全 https的单向认证流程 https的双向认证流程 八、DockerClie…

Ubuntu 22.04.4 LTS (linux) GoAccess 分析 Nginx 日志

1 安装goaccess sudo apt-get update sudo apt-get install goaccess 2 控制台运行 goaccess -a -d -f /usr/local/openresty/nginx/logs/access.log -p /etc/goaccess/goaccess.conf #sudo vim /etc/goaccess/goaccess.conf time-format %H:%M:%S date-format %d/%b…

iOS ------ Block的相关问题

Block的定义 Block可以截获局部变量的匿名函数&#xff0c; 是将函数及其执行上下文封装起来的对象。 Block的实现 通过Clang将以下的OC代码转化为C代码 // Clang xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m//main.m #import <Foundation/Foundation.…

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式&#xff08;一行一行的数据&#xff09;或者列向量形式&#xff08;一…

Nginx 怎样处理请求的故障转移?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的故障转移&#xff1f;一、理解故障转移的重要性二、Nginx 中的故障检测机制三、Nginx 中的请求分配策略四、Nginx 中的故障转移实现方式五、…

Shell脚本编程(一)

目录 一、Shell命令行的书写规则 二、编写/修改权限及执行shell程序的步骤 1、编写简单Shell程序 2、建立可执行程序 3、执行Shell程序 4、实例 三、Shell程序中使用参数 1、位置参数 2、内部参数 3、实例一 4、实例二 一、Shell命令行的书写规则 在执行Shell命令时…

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …

便携式气象仪:科技赋能,让气象观测更智能

随着科技的快速发展&#xff0c;越来越多的领域受益于技术的进步。其中&#xff0c;气象观测领域也不例外。传统的气象观测设备虽然精确可靠&#xff0c;但往往体积庞大、携带不便&#xff0c;且需要专业人员进行操作和维护。而便携式气象仪的出现&#xff0c;则打破了这一局限…

在WPF中使用WebView2详解

Microsoft Edge WebView2 Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎&#xff0c;以在本机应用中显示 web 内容。 使用 WebView2 可以在本机应用的不同部分嵌入 Web 代码&…

Golang | Leetcode Golang题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; type PeekingIterator struct {iter *Iterator_hasNext bool_next int }func Constructor(iter *Iterator) *PeekingIterator {return &PeekingIterator{iter, iter.hasNext(), iter.next()} }func (it *PeekingIterator) hasNe…

学习记录day19——数据结构 查找算法

概念 在给定数据元素的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素的操作&#xff0c;叫做查找 查找的分类 顺序查找:将待查找数据&#xff0c;进行全部遍历一遍&#xff0c;直到找到要查找的元素 折半查找:每次都去除一半的查找范围的查找方式&#x…

vue3响应式用法(高阶性能优化)

文章目录 前言&#xff1a;一、 shallowRef()二、 triggerRef()三、 customRef()四、 shallowReactive()五、 toRaw()六、 markRaw()七、 shallowReadonly()小结&#xff1a; 前言&#xff1a; 翻别人代码时&#xff0c;总结发现极大部分使用vue3的人只会用ref和reactive处理响…

mysql-bin 恢复数据库

能看到这里的同学估计肯定摊上大事了吧&#xff01;不要慌&#xff0c;一定要冷静&#xff0c;记录一下作者的大事件吧&#xff0c;黑客通过SQL注入的方式执行了一段SQL &#xff1a; DROP DATABASE ****** 后果就是导致整个数据库被删了&#xff0c;当时心是拔凉拔凉的&#x…