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

前言

当我们构建一个 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"`          // 请求 HOSTPath         string  `json:"path"`          // 请求 PathMethod       string  `json:"method"`        // 请求 MethodHTTPCode     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.mzph.cn/news/593775.shtml

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

相关文章

使用Matplotlib绘制模拟上海城市气温变化图

模拟上海气温变化折线图 实现步骤 准备数据创建画布绘制图像显示图像 基本实现 示例代码: import matplotlib.pyplot as plt import random# 准备数据 x range(60) y_shanghai [random.uniform(15,18) for _ in x]# 创建画布 plt.figure(figure(20,8), dpi10…

Java 基础学习(十九)网络编程、反射

1 Socket编程 1.1 Socket编程概述 1.1.1 Socket简介 在网络编程中,Socket(套接字)是一种抽象概念,它用于在不同计算机之间进行通信。Socket可以看作是一种通信的端点,可以通过Socket与其他计算机上的程序进行数据传…

盛最多水的容器(力扣11题)

例题: 分析: 这道题给出了一个数组,数组里的元素可以看成每一个挡板,要找到哪两个挡板之间盛的水最多,返回盛水量的最大值。这其实是一个双指针问题。 我们可以先固定第一个挡板( i )和最后一个挡板( j )&#xff0c…

gitee创建仓库

描述 本文章记录了怎么在gitee上创建项目,以及使用vscode提代码到远程呢个仓库,如何创建一个新分支,并将新分支提交到远程仓库。 1、创建远程仓库 在创建远程仓库之前要先进行ssh密钥的设置 (1)打开黑窗口&#xff…

计算机丢失mfc110.dll的5种常用解决方法分享

丢失动态链接库文件(DLL)是比较常见的一种情况,其中之一就是“计算机丢失mfc110.dll”。这个问题通常是由于系统文件损坏或缺失引起的,给计算机的正常运行带来了困扰。为了解决这个问题,我总结了以下五种方法&#xff…

顶帽运算在OpenCv中的应用

项目背景 假如我们拍了一张自拍,想为自己的照片添加一个酷炫的火星飞舞的效果,素材库中正好有一张火焰的照片,如果想去除图中的火焰,只保留火星效果,可以使用顶帽子算法 图片中的火星部分正好属于比周围亮一些的斑块…

LabVIEW开发滚筒洗衣机动态监测系统

LabVIEW软件在滚筒洗衣机的动态监测和分析中扮演着关键角色。本案例展示了如何利用LabVIEW开发的系统来优化洗衣机的性能和可靠性。 首先,在建立洗衣机的动力学模型基础上,利用LabVIEW进行了关键零部件的动态优化设计。通过LabVIEW的高级计算和模拟功能…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重、写入json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

112. 雷达设备(贪心/逆向思考)

题目&#xff1a; 112. 雷达设备 - AcWing题库 输入样例&#xff1a; 3 2 1 2 -3 1 2 1输出样例&#xff1a; 2 思路&#xff1a; 代码&#xff1a; #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include<…

BMS、AFE、菊花链技术

一、BMS的分布式架构和集中式架构 AFE在从板中&#xff0c;用来采集电池电压和温度&#xff0c;以及均衡管理 BMS通常以分布式架构为主&#xff0c;即分为主板和从板。原来主从板上都有微处控制器。从板采集单体电池电压和温度&#xff0c;通过CAN总线传给主板。 而现在的趋势…

Oracle-数据库迁移之后性能变慢问题分析

问题背景&#xff1a; ​一套Oracle11.2.0.4的RAC集群&#xff0c;通过Dataguard switchover方式迁移到新机器之后&#xff0c;运行第一天应用报障说应用性能慢&#xff0c;需要进行性能问题排查 问题分析&#xff1a; 首先&#xff0c;登陆到服务器&#xff0c;用TOP看一眼两个…

虾皮马来站点选品:在虾皮(Shopee)5个热门品类和市场特点

在虾皮&#xff08;Shopee&#xff09;马来西亚站点选择商品时&#xff0c;卖家应该考虑一些热门品类和市场特点&#xff0c;以确保他们的产品能够满足当地消费者的需求并取得良好的销售业绩。以下是在虾皮&#xff08;Shopee&#xff09;马来西亚站点销售商品时需要考虑的五个…

裂变新模式:分销市场的翘楚

在当今的商业世界&#xff0c;推荐机制已经成为一种重要的营销策略。通过用户推荐&#xff0c;企业不仅能够扩大品牌影响力&#xff0c;还能有效降低获客成本。然而&#xff0c;如何设计一个合理的推荐机制&#xff0c;使得用户有足够的动力去推荐新人&#xff0c;同时保持团队…

【Java】接口和抽象类有什么共同点和区别?

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 【Java】接口和抽象类有什么共同点和区别&…

SQL Server注入之攻防技战法

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 1.Mssql报错注入 0.判断数据库类型 1.爆当前用户名 2.爆版本 3.爆服务器名 4.判断数据库个数 5.获取全部数据库 语句只适合>2005 爆当前数据…

DDD落地实践-架构师眼中的餐厅(转)

本文以餐厅场景为叙事主线&#xff0c;以领域驱动为核心思想&#xff0c;结合架构设计与功能设计方法论。是从领域分析到落地的全过程案例&#xff0c;内容偏重于落地&#xff0c;因此不乏一些探讨&#xff0c;欢迎指正。 文章较长、全程干货、耐心读完、必有收获。 本文不针…

【docker】如何编写dockerfile文件,构建docker镜像

如何编写dockerfile文件&#xff0c;构建docker镜像 一、docker 镜像与 dockerfile1.1 什么是Docker镜像1.2 Docker 镜像的结构 二、dockerfile 中常用的构建指令三、dockerfile 内容示例四、构建 docker 镜像 一、docker 镜像与 dockerfile 1.1 什么是Docker镜像 Docker镜像…

虾皮跨境电商物流:为卖家提供高效灵活的物流解决方案

虾皮&#xff08;Shopee&#xff09;作为一家知名的跨境电商平台&#xff0c;其物流服务是其成功的关键因素之一。虾皮跨境电商物流服务为卖家提供了一站式的物流解决方案&#xff0c;从订单处理到最终交付&#xff0c;为卖家提供高效、灵活、成本效益高的物流服务&#xff0c;…

【教学类-43-13】 20240103 (4宫格数独:错误版:768套) 不重复的基础模板数量:768套

作品展示&#xff1a;——4宫格 768套不重复模板&#xff08;64页*12套题&#xff09; 有错误&#xff0c;实际数量小于768套 背景需求&#xff1a; 测试4宫格数独基础模板有几种。 写个程序&#xff0c;验算是不是真的是乘阶法的288种。 代码展示&#xff1a; 768套4宫格题…

Python for与while循环的介绍和对应练习题的巩固

for循环 重复执行同一段代码就是循环 循环列表 for val in list_name: list_num [1,2,3,4,5,6,7,8,9] for i in list_num:print(i)代码执行顺序 从上往下依次执行 遍历 通过某种顺序把某种集合所有元素都访问一遍 list_food{"火锅","烧烤","张…