Gin 集成 prometheus 客户端实现注册和暴露指标

news2024/11/26 9:51:13

前言

当我们构建一个 Web 应用程序时,了解应用程序的性能和行为是非常重要的。Prometheus 是一个流行的开源监控系统,它提供了强大的指标收集和查询功能,可以帮助我们监控应用程序的各个方面。

在 Gin 中集成 Prometheus 可以让我们更方便地监控和收集应用程序的性能指标,从而帮助我们更好地理解应用程序的运行状态。

Prometheus 是什么?

Prometheus 是一套开源的监控和警报系统。它旨在帮助开发人员和系统管理员对大规模分布式系统进行监控,并能够及时发现和解决问题。

以下是 Prometheus 的一些主要特点和功能:

  1. 多维度数据模型:Prometheus 使用多维度数据模型来存储时间序列数据,每个时间序列都由一个唯一的标识符(称为指标名称)和一组键值对(称为标签)来表示。这种灵活的数据模型使得Prometheus能够高效地处理和查询大量的度量数据。

  2. 灵活的查询语言:Prometheus 提供了一种强大的查询语言,称为PromQL(Prometheus Query Language),用于对指标数据进行查询、聚合和分析。PromQL 支持各种常见的操作,如过滤、排序、计算等,使用户能够轻松地提取有用的信息并生成自定义的监控指标。

  3. 规则引擎和警报机制:Prometheus 内置了一个规则引擎,可以根据用户定义的规则对指标数据进行处理和计算,并生成警报。用户可以配置警报规则,当指标数据达到或超过某个阈值时,Prometheus 将触发相应的警报动作,如发送通知、执行脚本等。

  4. 可视化和报表:Prometheus 提供了一个简单易用的 Web 界面,可以用于实时监控和可视化指标数据。该界面支持图表展示、仪表盘配置和数据导出等功能,使用户能够直观地了解系统的运行情况。

  5. 服务发现和自动化:Prometheus 支持多种服务发现机制,如静态配置、目录服务、Kubernetes 集成等。它可以自动发现和监控新加入的目标,并根据配置自动调整监控策略,从而实现对动态环境的自动化监控。

  6. 可扩展性和集成性:Prometheus 具有高度可扩展的架构,可以处理数千个节点和百万级别的时间序列数据。它还提供了丰富的API和插件机制,可与其他工具和服务(如 Grafana、Alertmanager 等)进行集成,实现更全面的监控和警报功能。

总结:Prometheus 是一套功能强大、灵活可扩展的监控和警报系统,适用于各种规模和类型的分布式系统。它通过多维度数据模型、灵活的查询语言和强大的警报机制,帮助用户实时监控系统的性能和状态,并及时采取行动来解决潜在问题。

为什么集成 Prometheus?

  1. 实时监控:集成 Prometheus 可以实时监控你的 Gin 应用程序的性能指标。通过收集和记录请求次数、持续时间、错误率等指标,你可以快速了解应用程序的运行情况,并及时发现潜在的性能问题。

  2. 警报和自动化:Prometheus 还提供了警报功能,可以根据预设的阈值条件,自动触发警报通知。通过集成 Prometheus,你可以在应用程序出现异常或达到预定的性能指标时,及时获得通知,以便快速采取行动。

  3. 数据可视化:Prometheus 提供了 Grafana 等工具,可以将收集到的指标数据进行可视化展示。你可以创建仪表盘,实时地监控应用程序的性能指标,并轻松地进行趋势分析和故障排除。

集成 Prometheus 的好处

  1. 性能优化:通过 Prometheus 记录的指标数据,你可以深入了解应用程序的性能瓶颈和热点,进而进行有针对性的性能优化。你可以分析请求次数、持续时间、错误率等指标,并找出影响性能的关键路径,从而改进应用程序的效率。

  2. 容量规划:借助 Prometheus 收集的指标数据,你可以更好地了解应用程序的负载情况和资源利用率。通过对请求次数、并发连接数、内存使用量等指标的观察,你可以准确评估应用程序的容量需求,规划服务器资源,以支持应用程序的高可用性和扩展性。

  3. 故障排除:当应用程序出现异常或性能下降时,Prometheus 可以帮助你快速定位问题的根源。通过查看相关的指标数据和日志信息,你可以迅速发现故障原因,并进行及时修复,以减少长时间的服务中断和用户投诉。

Go Prometheus Client 介绍

组件:https://github.com/prometheus/client_golang

client_golang 是 Prometheus 社区提供的一个 Go 语言客户端库,用于在 Go 应用程序中集成和使用 Prometheus 监控系统。它提供了一系列功能丰富的 API,使开发人员能够方便地暴露指标数据、收集指标数据并与 Prometheus 进行交互。

以下是 client_golang 的一些主要特性和功能:

  1. 指标类型:client_golang 提供了多种常用的指标类型,包括 Counter、Gauge、Histogram、Summary 等。开发人员可以根据需求选择合适的指标类型,并使用简单的方法来收集和更新指标数据。

  2. 标签支持:client_golang 支持为指标数据添加标签,以便更灵活地对指标数据进行分类和分析。标签可以用于细分指标数据,例如按照不同的维度、服务或实例进行区分,从而更准确地了解系统的运行情况。

  3. 注册和暴露指标:client_golang 提供了 Register() 函数用于注册指标对象,并使用promhttp.Handler() 函数创建一个 HTTP 处理程序,用于暴露指标数据给Prometheus 服务器。这样,Prometheus 就可以通过 HTTP 协议获取指标数据并进行监控和分析。

  4. 指标收集和更新:client_golang 提供了一系列方法来收集和更新指标数据,例如使用 Inc() 和 Dec() 方法增加或减少计数器的值,使用 Set() 方法更新 Gauge 的值等。开发人员可以根据自己的需求选择合适的方法来操作指标数据。

  5. 兼容性和扩展性:client_golang 与 Prometheus 的数据模型和查询语言完全兼容,能够无缝地集成到 Prometheus 生态系统中。它还提供了丰富的扩展机制,例如Pushgateway、Exporter、Collector 等,使开发人员能够更灵活地管理和处理指标数据。

  6. 文档和示例:client_golang 提供了详细的文档和丰富的示例代码,帮助开发人员快速上手并理解如何使用该库。文档中包含了 API 参考、最佳实践、常见问题解答等内容,使开发人员能够更好地利用 client_golang 进行监控和警报。

总结:client_golang 是 Prometheus 社区提供的一个功能强大、易于使用的 Go 语言客户端库,用于在 Go 应用程序中集成和使用 Prometheus 监控系统。它提供了多种指标类型、标签支持、注册和暴露指标、指标收集和更新等功能,帮助开发人员方便地暴露和收集指标数据,并与 Prometheus 进行交互,实现全面的监控和警报功能。

项目中如何使用?

1. 开启指标记录

文件地址:./internal/router/router.go

mux, err := core.New(logger,
 core.WithEnableCors(),
 core.WithEnableSwagger(),
 core.WithEnablePProf(),
 core.WithEnablePrometheus(metrics.RecordHandler()),
)

启用时,增加参数:core.WithEnablePrometheus(metrics.RecordHandler()) 即可。

2. 定义指标所需信息

文件地址:./internal/proposal/metrics.go

// MetricsMessage 指标信息
type MetricsMessage struct {
 HOST         string  `json:"host"`          // 请求 HOST
 Path         string  `json:"path"`          // 请求 Path
 Method       string  `json:"method"`        // 请求 Method
 HTTPCode     int     `json:"http_code"`     // HTTP 状态码
 BusinessCode int     `json:"business_code"` // 业务码
 CostSeconds  float64 `json:"cost_seconds"`  // 耗时,单位:秒
 IsSuccess    bool    `json:"is_success"`    // 状态,是否成功
}

3. 指标注册

文件地址:./internal/metrics/prometheus.go

// metricsRequestsTotal metrics for request total 计数器(Counter)
var metricsRequestsTotal = prometheus.NewCounterVec(
 prometheus.CounterOpts{
  Namespace: namespace,
  Subsystem: subsystem,
  Name:      "requests_total",
  Help:      "request(ms) total",
 },
 []string{"method", "path"},
)

// metricsRequestsCost metrics for requests cost 累积直方图(Histogram)
var metricsRequestsCost = prometheus.NewHistogramVec(
 prometheus.HistogramOpts{
  Namespace: namespace,
  Subsystem: subsystem,
  Name:      "requests_cost",
  Help:      "request(ms) cost milliseconds",
 },
 []string{"method", "path", "success", "http_code", "business_code", "cost_milliseconds"},
)

// 根据需要,可定制其他指标,操作如下:
// 1. 定义需要的指标
// 2. init() 中注册
// 3. RecordMetrics() 中传值

4. 指标收集

文件地址:./internal/metrics/metrics.go

// RecordHandler 指标处理
func RecordHandler() func(msg *proposal.MetricsMessage) {
 return func(msg *proposal.MetricsMessage) {
  RecordMetrics(
   msg.Method,
   msg.Path,
   msg.IsSuccess,
   msg.HTTPCode,
   msg.BusinessCode,
   msg.CostSeconds,
  )
 }
}

5. 指标暴露

路由地址:http://127.0.0.1:9999/metrics

if opt.enablePrometheus {
 mux.engine.GET("/metrics", gin.WrapH(promhttp.Handler())) // register prometheus
}

项目代码

  • GitHub: https://github.com/xinliangnote/go-gin-api

  • 中文文档:https://www.yuque.com/xinliangnote/go-gin-api/ngc3x5

cec232b1c0b450f338b54abbefbd71db.jpeg

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

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

相关文章

Golang http包实战:构建RESTful API

Golang http包实战:构建RESTful API 引言简介目的 Go语言http包简介功能概述基本组件 搭建基础Web服务器步骤指导代码示例创建简单的HTTP文件服务器步骤说明代码示例 设计RESTful API结构设计原则路由设计 实现RESTful API处理请求代码示例 中间件应用代码示例 错误…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑用户禀赋效应和环保意识不确定性的微电网鲁棒优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到微电网系统的优化调度方法,特别考虑了两个重要方面:用户禀赋效应和环保意识的不确定性。以下是对标题中关键术语的解…

在升序的列表a中插入数值x插入后的列表仍然是升序的返回插入x后的整个列表插入操作使用二分查找方法bisect.insort_left(a, x)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 在升序的列表a中插入数值x 插入后的列表仍然是升序的 返回插入x后的整个列表 插入操作使用二分查找方法 bisect.insort_left(a, x) [太阳]选择题 请问以下代码输出的结果是? import…

Android ImageView的Bitmap在scaleType情况下Bitmap顶部与底部RectF坐标,Kotlin

Android ImageView的Bitmap在scaleType情况下&#xff0c;Bitmap顶部与底部RectF坐标&#xff0c;Kotlin 通常&#xff0c;在ImageView设置scaleType后&#xff0c;Android会把原始图片通过缩放放在ImageView里面&#xff0c;例如&#xff1a; <ImageViewandroid:id"id…

python多环境管理工具——pyenv-win安装与使用教程

目录 pyenv-win简介 pyenv-win安装 配置环境变量 pyenv的基本命令 pyenv安装py环境 pyenv安装遇到问题 pycharm测试 pyenv-win简介 什么是pyenv-win&#xff1a; 是一个在windows系统上管理python版本的工具。它是pyenv的windows版本&#xff0c;旨在提供类似于unix/li…

54.网游逆向分析与插件开发-游戏增加自动化助手接口-项目需求与需求拆解

内容来源于&#xff1a;易道云信息技术研究院VIP课 项目需求&#xff1a; 为游戏增加VIP功能-自动化助手。自动化助手做的是首先要说一下背景&#xff0c;对于授权游戏来讲它往往年限都比较老&#xff0c;老游戏和新游戏设计理念是不同的&#xff0c;比如说老游戏基本上在10年…

OpenCV-12绘制图像

OpenCV提供了许多绘制图像的API&#xff0c;可以在图像上绘制各种图形&#xff0c;例如直线&#xff0c;矩形&#xff0c;圆&#xff0c;椭圆等图形。 一、画直线 利用API line&#xff08;img, pt1, pt2, color, thickness, lineType, shift&#xff09;可以绘制直线。 其中…

ROS TF坐标变换 - 静态坐标变换

目录 一、静态坐标变换&#xff08;C实现&#xff09;二、静态坐标变换&#xff08;Python实现&#xff09; 如前文所属&#xff0c;ROS通过广播的形式告知各模块的位姿关系&#xff0c;接下来详述这一机制的代码实现。 模块间的位置关系有两种类型&#xff0c;一种是相对固定…

MODIS ET 蒸散发数据

MODIS ET 即 MOD16 系列产品&#xff0c;属于MODIS Level4 的产品。 在 LP DAAC - MODIS 上搜索了现存的 ET&#xff08;Evapotranspiration&#xff09; 数据&#xff1a; 建议使用最新版本Collection 6.1&#xff0c;也就是结尾是.061的数据集。 在 Collection 6.1 中&…

Vue:Vue与VueComponent的关系图

1.一个重要的内置关系&#xff1a;VueComponent.prototype.proto Vue.prototype 2.为什么要有这个关系&#xff1a;让组件实例对象&#xff08;vc&#xff09;可以访问到 Vue原型上的属性、方法。 案例证明&#xff1a; <!DOCTYPE html> <html lang"en"&…

TDD-LTE 附着流程和去附着流程

目录 1. 附着流程 1.1. 正常附着流程 2. 异常附着流程 2.1 RRC建立失败 2.2 核心网拒绝 2.3 eNodeB未收到初始化上下文建立请求 2.4 RRC重配置请求丢失 2. 去附着流程 2.1 非关机去附着流程 2.1.1 连接态非关机去附着 2.1.2 空闲态非关机去附着 2.2 关机去附着流程 …

小肥柴慢慢手写数据结构(C篇)(5-2 AVL树)

小肥柴慢慢学习数据结构笔记&#xff08;C篇&#xff09;&#xff08;5-2 AVL树 目录5-5 AVL出现的原因5-5-1 平衡树5-5-2 平衡二叉树的具体案例 5-6 AVL平衡策略的讨论5-7 不使用平衡因子的实现&#xff08;黑皮书&#xff0c;训练思维&#xff09;5-8 使用平衡因子的实现&…

Matplotlib_4.文字图例尽眉目

文章目录 一、Figure和Axes上的文本1.text2.title和set_title3.figtext和text4.suptitle5.xlabel和ylabel6.annotate7.字体的属性设置 二、Tick上的文本1.简单模式2.Tick Locators and Formatters 三、legend&#xff08;图例&#xff09; 一、Figure和Axes上的文本 Matplotli…

linux 的直接direct io

目录 什么是 Direct IO java 支持 使用场景 数据库 反思 在之前的文章零拷贝基础上&#xff0c;有一个针对那些不需要在操作系统的 page cache 里保存的情况&#xff0c;即绕过 page cache&#xff0c;对于 linux 提供了 direct io 的功能。 https://blog.csdn.net/zlpzl…

2024年第一天,先送一波福利!

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《LLM在电商搜索系统的应用案例实战》 —1— 2024 AIGC 技术体系领取福利 2023年是当之无愧的生成式 AI 元年&#xff0c;AIGC 的崛起深刻改变了我们的工作和生活&#xff0c;让我们看到了未来无限的可能性&am…

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…

【漏洞复现】冰峰VPN存在敏感信息泄露漏洞

漏洞描述 冰峰VPN log/system.log模块日志信息泄露漏洞 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利…

大数据背景下基于联邦学习的小微企业信用风险评估研究

摘要&#xff1a; 小微企业信用风险评估难是制约其融资和发展的一个主要障碍。基于大数据的小微企业信用风险评估依然面临着单机构数据片面、跨机构数据共享难、模型不稳定等诸多挑战。针对相关问题和挑战&#xff0c;本项目拟在多主体所有权数据隐私保护与安全共享的背景下&am…

RainBond 构建组件 rbd-chaos 故障解决 【真实案例】

文章目录 背景分析官方排查说明尝试进一步分析解决参考背景 在 RainBond 中把所有组件都部署了至少 2 个实例后,开始出现构建/滚动更新直接报错,且没有日志(查看日志按钮点击后,里面啥也没有)。 然后再平台管理主界面,可以看到提示 rbd-chaos 组件故障: 分析 官方排…

【HarmonyOS开发】分布式应用的开发实践(元旦快乐)

元旦快乐&#xff0c;再见2023&#xff0c;加油2024&#xff0c;未来可期&#xff0c;愿新的一年带来健康、幸福和成功&#xff01;&#x1f4aa; &#x1f4aa;&#x1f4aa; 多种设备之间能够实现硬件互助、资源共享&#xff0c;依赖的关键技术包括分布式软总线、分布式设备虚…