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"`          // 请求 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.mfbz.cn/a/285366.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue中的内置指令v-model的作用和常见使用方法以及自定义组件上的用法

一、v-model是什么 v-model是Vue框架的一种内置的API指令,本质是一种语法糖写法,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。在Vue中,v-model是用于在表单元素和组件之间创建双向数据绑定的指令。它…

0基础学习VR全景平台篇第134篇:720VR全景,云台调整节点

相机、云台和脚架全套设备组装完成后需要进行调校才能开始拍摄。这一节,我们将主要介绍云台调整的两个内容:对中心靶、调三点一线。(后附调校原理) 云台部件名称 一、调节准备 (一)对于安装好的云台 1.检…

NAO.99b海潮模型的详解教程

NAO.99b模型是由日本国家天文台开发的全球潮汐模式,基于二维非线性浅水方程。该模型具有较高的分辨率,网格间距为0.50.5,网格数为720360,覆盖的经度范围为0.25~359.75E,纬度范围为89.75S~89.75N…

web前端导航条练习(包含弹性盒)

<!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><!--设置最佳适配窗口--><meta name"viewpoint" content"widthdevice-width,initial-scale1.0"><meta http-equiv"X-UA-&qu…

Maya-UE xgen-UE 毛发导入UE流程整理

首先声明&#xff1a;maya建议用2022版本及一下&#xff0c;因为要用到Python 2 ,Maya2023以后默认是Python3不再支持Python2; 第一步&#xff1a;Xgen做好的毛发转成交互式Groom 第二步&#xff1a;导出刚生成的交互式Groom缓存&#xff0c;需要设置一下当前帧&#xff0c;和…

Vue3复习笔记

目录 挂载全局属性和方法 v-bind一次绑定多个值 v-bind用在样式中 Vue指令绑定值 Vue指令绑定属性 动态属性的约束 Dom更新时机 ”可写的“计算属性 v-if与v-for不建议同时使用 v-for遍历对象 数组变化检测 事件修饰符 v-model用在表单类标签上 v-model还可以绑定…

钱数加s还是不加s?

语法 看有没有数字 有数字&#xff1a;无s 没数字&#xff1a;有s 案例

迅为龙芯2K1000开发板虚拟机 ubuntu 更换下载源

Ubuntu 系统软件的下载安装我们通常使用命令“apt-get” &#xff0c; 该命令可以实现软件自动下载&#xff0c; 安装&#xff0c; 配置。 该命令采用客户端/服务器的模式&#xff0c; 我们的 Ubuntu 系统作为客户端&#xff0c; 当需要下载软件的时候就向服务器发起请求&#…

(十)上市企业实施IPD成功案例分享之——IBM

集成产品开发&#xff08;Integrated Product Development&#xff0c;简称IPD&#xff09;是一套产品开发的模式、理念与方法。IPD的思想来源于美国PRTM公司出版的《产品及生命周期优化法》。IPD强调以市场和客户需求作为产品开发的驱动力&#xff0c;IPD将产品开发作为一项投…

SCT2601,可替代LMR16006X/MP2459/MP2456;4.5V-60V Vin,0.6A,高效降压DCDC转换器

•宽输入范围&#xff1a;4.5V-60V •高达0.6A的连续输出电流 •0.765V2.5%反馈参考电压 •集成500mΩ高压侧MOSFET •低静态电流为80uA •轻负载下的脉冲跳过模式&#xff08;PSM&#xff09; •最小接通时间80ns •内置6ms软启动时间 •开关频率为700KHz •可编程输入电压欠压…

pendulum,一个超酷的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - pendulum。 Github地址&#xff1a;https://github.com/sdispater/pendulum 日期和时间处理在许多应用程序中都是常见的任务&#xff0c;然而&#xff0c;Python标准库中的…

2024年Mac专用投屏工具AirServer 7 .27 for Mac中文版

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具&#xff0c;能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App&#xff0c;从 iOS 设备无线传送到 Mac 电脑的屏幕上&#xff0c;把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…

.net8 AOT编绎-跨平台调用C#类库的新方法-函数导出

VB.NET AOT无法编绎DLL,微软的无能&#xff0c;正是你的机会 .net8 AOT编绎-跨平台调用C#类库的新方法-函数导出 1&#xff0c;C#命令行创建工程&#xff1a;dotnet new classlib -o CSharpDllExport 2&#xff0c;编写一个静态方法&#xff0c;并且为它打上UnmanagedCallersO…

Ubuntu开机自启动文件

开机自启动文件 Ubuntu 系统启动时运行的文件 /etc/rc.local 创建/etc/rc.local文件 sudo touch /etc/rc.local给rc.local添加可执行权限 sudo chmod 777 /etc/rc.local编辑/etc/rc.local文件&#xff0c;将start.py脚本的运行写入 sudo vim /etc/rc.local#!/bin/bash # d…

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

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

基于图论的图像分割 python + PyQt5

数据结构大作业&#xff0c;基于图论中的最小生成树的图像分割。一个很古老的算法&#xff0c;精度远远不如深度学习算法&#xff0c;但是对于代码能力是一个很好的锻炼。 课设要求&#xff1a; &#xff08; 1 &#xff09;输入&#xff1a;图像&#xff08;例如教室场景图&a…

LeetCode74二分搜索优化:二维矩阵中的高效查找策略

题目描述 力扣地址 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&…

rime中州韵 help lua Translator

lua 是 Rime中州韵/小狼毫输入法强大的武器&#xff0c;掌握如何在Rime中州韵/小狼毫中使用lua&#xff0c;你将体验到什么叫 随心所欲。 先看效果 在 rime中州韵 输入效果一览 中的 &#x1f447; help效果 一节中&#xff0c; 我们看到了在Rime中州韵/小狼毫输入法中输入 h…

【LMM 005】LLaVA-Interactive:集图像聊天,分割,生成和编辑三种多模态技能于一体的Demo

论文标题&#xff1a;LLaVA-Interactive: An All-in-One Demo for Image Chat, Segmentation, Generation and Editing 论文作者&#xff1a;Wei-Ge Chen, Irina Spiridonova, Jianwei Yang, Jianfeng Gao, Chunyuan Li 作者单位&#xff1a;Microsoft Research, Redmond 论文原…

职场小白培养项目管理能力的6个小技巧

有很多职场新人会碰到这样一个场景&#xff1a;入职一段时间&#xff0c;领导突然将一个重要项目的其中一个模块分配给你负责&#xff0c;但你之前并没有接触过任何项目。 这时你可能会焦躁无措&#xff0c;不知如何往下规划和开展工作&#xff0c;在推进一段时间后领导开始时…
最新文章