likes
comments
collection
share

一行代码让你的 gin 项目完美接入 Prometheus

作者站长头像
站长
· 阅读数 63

大家好,我是韩数,本身自己是做 Devops 开发的,之前也研究过一段时间的 Influxdb , 也算是接触过一点点可观测相关的技术,这几年 Opentelemetry 很流行,于是自己就想能不能能不能写一个小工具快速集成 gin上报一些基础的 http 性能指标到 Prometheus 去呢,去 Github 上找了一圈, 发现很多库都已经不更新了, 而且也都是基于 Prometheus Client 去实现的,而 Opentelemetry 的文档, 懂得都懂, 网上很难找到比较细致的教程和 demo。一切都得自己慢慢踩坑, 所以刚好趁着折腾 Opentelemetry 的契机,何不基于 Opentelemetry 的 golang sdk 实现一个 gin-prometheus 项目呢, 说干就干。

一行代码让你的 gin 项目完美接入 Prometheus

gin-prometheus 介绍

仓库地址: github.com/hanshuaikan…

gin-prometheus 是一个基于 Opentelemetry 实现的工具,用于简化开发者的配置,gin 项目只需要一行代码,便可以集成常见的Http性能指标。同时 gin-prometheus 提供了丰富的可选的配置,开发者可以选择关闭或者开启某些指标的采集。

🚀 Features:

  • 基于 Opentelemetry 实现, 可以作为学习 Opentelemetry 的 案例
  • 集成常用的 http 延时,请求数,请求大小等指标。
  • 集成 cpu 使用率 & 内存使用率 系统指标。
  • 支持自定义的 Recorder, 替换原有的 otel Recorder 实现。
  • 丰富的自定义配置: 可以选择只保留部分指标&支持自定义指标前缀&全局 label &prometheus端口...

🚀 后续计划:

  • 支持 prometheus push & console log 的方式暴露 metrics。
  • 支持 更多的 http 指标暴露

🎉 Metrics

Details about exposed Prometheus metrics.

NameTypeExposed Information
http_server_active_requestsCounterNumber of requests inflight.
http_server_durationHistogramTime Taken by request
http_server_request_totalCounterNumber of Requests.
http_server_request_content_lengthHistogramHTTP request sizes in bytes.
http_server_response_content_lengthHistogramHTTP response sizes in bytes.
system_cpu_usageCounterCPU Usage
system_memory_usageCounterMemory Usage

Usage

接入 gin-prometheus 非常简单,只需要 安装 gin-prometheus 并且注册 gin-prometheus 提供的中间件即可。

go get -u github.com/hanshuaikang/gin-prometheus@v0.0.1

在 gin 的 engine 中注入 gin-prometheus 中间件:

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	ginprometheus "github.com/hanshuaikang/gin-prometheus"
	semconv "go.opentelemetry.io/otel/semconv/v1.25.0"
	"net/http"
)

const serviceName = "gin-prometheus-demo"

func main() {
	fmt.Println("initializing")
	r := gin.New()
	r.Use(ginprometheus.Middleware())
	r.GET("/ping", func(ctx *gin.Context) {
		ctx.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}

自定义更多的配置:

gin-prometheus 提供了不算丰富的可选配置, 如果想要自定义更多的配置,可以参考如下:


func main() {
	fmt.Println("initializing")

	r := gin.New()
	globalAttributes := []attribute.KeyValue{
		semconv.K8SPodName("pod-1"),
		semconv.K8SNamespaceName("test"),
		semconv.ServiceName(serviceName),
	}
	r.Use(ginprometheus.Middleware(
		## 自定义指标属性配置,你可以选择注入某些自定义的 label 到 metric
		ginprometheus.WithAttributes(func(route string, request *http.Request) []attribute.KeyValue {
			attrs := []attribute.KeyValue{
				semconv.HTTPMethodKey.String(request.Method),
			}
			if route != "" {
				attrs = append(attrs, semconv.HTTPRouteKey.String(route))
			}
			return attrs
		}),
           ## 注册全局 label, 所有的 metric 都会携带这些 label
		ginprometheus.WithGlobalAttributes(globalAttributes),
           ## 自定义服务信息      
		ginprometheus.WithService(serviceName, "v0.0.1"),
           ## infra 自定义指标前缀
		ginprometheus.WithMetricPrefix("infra"),
           ## 自定义 Prometheus 端口
		ginprometheus.WithPrometheusPort(4433),
           ## 关闭 cpu 和 内存使用率的 采集
		ginprometheus.WithSystemMetricDisabled(),
           ## ....
	))
	r.GET("/ping", func(ctx *gin.Context) {
		ctx.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}

万水千山总是情,给个star行不行

全部笔记已经开源至GitHub

欢迎点赞,关注我,有你好果子吃(滑稽)

转载自:https://juejin.cn/post/7390934048259637259
评论
请登录