为Gin应用添加 一双眼睛:Prometheus

在微服务和Web应用开发中,监控是保障系统稳定运行的"眼睛"------它能实时反映接口响应耗时、请求成功率、资源使用率等核心指标,帮助我们快速定位性能瓶颈、排查线上问题。Gin作为Go语言生态中最热门的Web框架,以轻量、高性能著称;而Prometheus作为云原生时代的主流监控工具,凭借强大的指标采集、存储和查询能力,成为监控领域的事实标准。

本文将从"零基础入门"到"实战落地",手把手教你为Gin应用集成Prometheus监控:先讲解核心概念,再通过完整示例代码实现基础指标采集,接着拓展自定义业务指标,最后结合Grafana实现可视化监控,并分享生产环境的最佳实践。全程代码可直接复制运行,语言通俗易懂,即使是Go新手也能轻松掌握。

一、核心概念:为什么选Prometheus+Gin?

在动手之前,先理清两个核心工具的关键特性,理解"为什么这么做"比"怎么做"更重要。

1. Prometheus核心特性

Prometheus是由SoundCloud开源的时序数据库监控系统,核心优势:

  • Pull模式采集 :Prometheus主动从应用暴露的/metrics接口拉取指标数据,无需应用推送,适配分布式场景;
  • 丰富的指标类型:支持4种核心指标(Counter/Gauge/Histogram/Summary),覆盖绝大多数监控场景;
  • 强大的查询语言PromQL:可灵活筛选、聚合指标,比如"查询近5分钟/api/order接口的平均响应耗时";
  • 本地存储+可扩展:默认本地存储指标,也可对接远程存储(如Thanos),支持集群部署;
  • 告警集成:搭配AlertManager可实现告警规则配置、多渠道通知(邮件/钉钉/企业微信)。

2. Prometheus核心指标类型(必懂)

指标类型 作用 典型场景
Counter(计数器) 只增不减的数值,记录累计次数 总请求数、错误数、接口调用次数
Gauge(仪表盘) 可增可减的数值,反映当前状态 内存使用率、当前在线用户数、队列长度
Histogram(直方图) 统计数值分布(如耗时),可计算分位数 请求耗时分布、响应大小分布
Summary(摘要) 直接计算分位数,无需手动聚合 95%/99%请求耗时、接口响应延迟

3. Gin集成Prometheus的核心依赖

Gin本身不内置监控能力,需借助以下Go包实现集成:

  • github.com/gin-gonic/gin:Gin核心包;
  • github.com/prometheus/client_golang/prometheus:Prometheus Go客户端,定义和注册指标;
  • github.com/prometheus/client_golang/prometheus/promhttp:暴露/metrics接口,供Prometheus采集;
  • github.com/gin-contrib/pprof(可选):辅助排查性能问题,与监控搭配使用。

二、环境准备:三步搞定基础环境

1. Go环境要求

确保本地安装Go 1.18及以上版本(Gin v1.9+要求),验证方式:

bash 复制代码
go version  # 输出如:go1.21.0 darwin/amd64

2. Prometheus安装(两种方式)

方式1:二进制安装(推荐新手)
  • 下载对应系统版本:https://prometheus.io/download/

  • 解压后进入目录,修改配置文件prometheus.yml(后续会用到);

  • 启动Prometheus:

    bash 复制代码
    # Linux/macOS
    ./prometheus --config.file=prometheus.yml
    # Windows
    prometheus.exe --config.file=prometheus.yml
方式2:Docker安装(推荐开发者)
bash 复制代码
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus:v2.47.0

启动后访问http://localhost:9090,能看到Prometheus UI即表示安装成功。

3. 初始化Gin项目

新建项目目录,初始化模块并安装依赖:

bash 复制代码
# 创建项目目录
mkdir gin-prometheus-demo && cd gin-prometheus-demo
# 初始化Go模块
go mod init gin-prometheus-demo
# 安装核心依赖
go get github.com/gin-gonic/gin@v1.9.1
go get github.com/prometheus/client_golang/prometheus@v1.16.0
go get github.com/prometheus/client_golang/prometheus/promhttp@v1.16.0
go get github.com/gin-contrib/pprof@v1.4.0

三、实战第一步:集成基础监控指标

首先实现"最小可用版本":为Gin应用添加默认的HTTP监控指标(请求数、状态码、耗时),并暴露/metrics接口供Prometheus采集。

1. 完整示例代码(基础版)

新建main.go文件,粘贴以下代码(含详细注释):

go 复制代码
package main

import (
	"net/http"
	"strconv"
	"time"

	"github.com/gin-contrib/pprof"
	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

// 定义全局的Prometheus指标注册表
var (
	// 1. 总HTTP请求数(Counter):标签包含method(请求方法)、path(请求路径)、status(状态码)
	httpRequestsTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "gin_http_requests_total", // 指标名(规范:小写+下划线)
			Help: "Total number of HTTP requests handled by Gin", // 指标说明
		},
		[]string{"method", "path", "status"}, // 标签(维度)
	)

	// 2. HTTP请求耗时(Histogram):统计耗时分布,标签包含method、path
	httpRequestDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Name:    "gin_http_request_duration_seconds", // 指标名(秒为单位)
			Help:    "Duration of HTTP requests handled by Gin",
			Buckets: prometheus.DefBuckets, // 默认分桶:[0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]
		},
		[]string{"method", "path"},
	)
)

// 初始化Prometheus指标:将自定义指标注册到默认注册表
func init() {
	prometheus.MustRegister(httpRequestsTotal)
	prometheus.MustRegister(httpRequestDuration)
}

// GinPrometheusMiddleware:自定义监控中间件,采集请求指标
func GinPrometheusMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 1. 记录请求开始时间
		startTime := time.Now()

		// 2. 执行后续中间件/处理函数(核心:c.Next())
		c.Next()

		// 3. 请求完成后,采集指标(c.Next()执行完表示请求已处理)
		duration := time.Since(startTime).Seconds() // 计算耗时(秒)
		status := strconv.Itoa(c.Writer.Status())  // 获取响应状态码
		method := c.Request.Method                 // 获取请求方法
		path := c.FullPath()                       // 获取请求路径(如/api/user)

		// 4. 更新Counter指标:请求数+1
		httpRequestsTotal.WithLabelValues(method, path, status).Inc()

		// 5. 更新Histogram指标:记录耗时
		httpRequestDuration.WithLabelValues(method, path).Observe(duration)
	}
}

func main() {
	// 1. 创建Gin引擎(生产环境建议用gin.ReleaseMode)
	gin.SetMode(gin.DebugMode)
	r := gin.Default()

	// 2. 注册pprof(可选,用于性能分析)
	pprof.Register(r)

	// 3. 注册Prometheus监控中间件(全局生效,所有接口都会被监控)
	r.Use(GinPrometheusMiddleware())

	// 4. 暴露/metrics接口,供Prometheus采集
	r.GET("/metrics", gin.WrapH(promhttp.Handler()))

	// 5. 定义业务接口示例
	// 示例1:健康检查接口
	r.GET("/health", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"status":  "ok",
			"message": "Gin application is running",
		})
	})

	// 示例2:模拟用户列表接口(带延迟,测试耗时监控)
	r.GET("/api/users", func(c *gin.Context) {
		// 模拟业务处理延迟(0-200ms)
		time.Sleep(time.Duration(time.Now().UnixNano()%200) * time.Millisecond)
		c.JSON(http.StatusOK, gin.H{
			"code": 0,
			"data": []gin.H{
				{"id": 1, "name": "张三"},
				{"id": 2, "name": "李四"},
			},
		})
	})

	// 示例3:模拟错误接口(测试状态码监控)
	r.POST("/api/order", func(c *gin.Context) {
		// 模拟参数错误
		c.JSON(http.StatusBadRequest, gin.H{
			"code":  400,
			"error": "参数缺失:order_id",
		})
	})

	// 6. 启动Gin服务(默认端口8080)
	_ = r.Run(":8080")
}

2. 代码核心解释

(1)指标定义
  • httpRequestsTotal:Counter类型,统计所有HTTP请求数,通过method/path/status标签区分不同维度(比如GET/health/200、POST/api/order/400);
  • httpRequestDuration:Histogram类型,统计请求耗时,使用默认分桶(覆盖绝大多数Web请求耗时场景)。
(2)监控中间件

GinPrometheusMiddleware是核心:

  • c.Next():先执行后续的业务处理函数,保证请求完成后再采集指标;
  • time.Since(startTime).Seconds():计算请求耗时(转成秒,符合Prometheus规范);
  • WithLabelValues():为指标添加标签值,便于后续按维度查询;
  • Inc():Counter指标自增;Observe():Histogram指标记录数值。
(3)暴露/metrics接口

通过gin.WrapH(promhttp.Handler())将Prometheus的HTTP处理器适配为Gin的处理器,暴露/metrics接口。

3. 运行并验证基础监控

(1)启动Gin应用
bash 复制代码
go run main.go
(2)访问业务接口,生成监控数据
bash 复制代码
# 访问健康检查接口
curl http://localhost:8080/health
# 访问用户列表接口
curl http://localhost:8080/api/users
# 访问错误接口
curl -X POST http://localhost:8080/api/order
(3)查看/metrics接口

访问http://localhost:8080/metrics,能看到以下指标(说明采集成功):

复制代码
# HELP gin_http_requests_total Total number of HTTP requests handled by Gin
# TYPE gin_http_requests_total counter
gin_http_requests_total{method="GET",path="/health",status="200"} 1
gin_http_requests_total{method="GET",path="/api/users",status="200"} 1
gin_http_requests_total{method="POST",path="/api/order",status="400"} 1

# HELP gin_http_request_duration_seconds Duration of HTTP requests handled by Gin
# TYPE gin_http_request_duration_seconds histogram
gin_http_request_duration_seconds_bucket{method="GET",path="/api/users",le="0.005"} 0
gin_http_request_duration_seconds_bucket{method="GET",path="/api/users",le="0.01"} 0
...
gin_http_request_duration_seconds_sum{method="GET",path="/api/users"} 0.123
gin_http_request_duration_seconds_count{method="GET",path="/api/users"} 1
(4)配置Prometheus采集Gin指标

修改Prometheus配置文件prometheus.yml,添加Gin应用的采集目标:

yaml 复制代码
global:
  scrape_interval: 15s  # 采集间隔(默认15秒)

scrape_configs:
  # 采集Prometheus自身指标(默认)
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  # 采集Gin应用指标(新增)
  - job_name: "gin-app"
    static_configs:
      - targets: ["localhost:8080"]  # Gin应用地址
    metrics_path: "/metrics"  # 指标接口路径
    scrape_interval: 5s  # 缩短采集间隔(测试用)

重启Prometheus后,访问http://localhost:9090/targets,能看到gin-app目标状态为UP,表示采集成功。

四、实战第二步:自定义业务指标

基础的HTTP指标只能反映接口层面的状态,实际业务中还需要监控"业务核心指标"(比如订单创建数、支付成功率、库存余量)。下面以"订单系统"为例,实现自定义指标的采集。

1. 新增自定义指标

main.go中添加以下指标定义(放在原有指标下方):

go 复制代码
// 自定义业务指标
var (
	// 1. 订单创建数(Counter):标签包含order_type(订单类型:普通/秒杀)
	orderCreatedTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "gin_biz_order_created_total",
			Help: "Total number of created orders",
		},
		[]string{"order_type"},
	)

	// 2. 库存余量(Gauge):标签包含product_id(商品ID)
	stockRemaining = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "gin_biz_stock_remaining",
			Help: "Remaining stock of products",
		},
		[]string{"product_id"},
	)

	// 3. 订单支付耗时(Summary):直接统计分位数,标签包含pay_type(支付方式)
	orderPayDuration = prometheus.NewSummaryVec(
		prometheus.SummaryOpts{
			Name:       "gin_biz_order_pay_duration_seconds",
			Help:       "Duration of order payment process",
			Objectives: map[float64]float64{0.95: 0.01, 0.99: 0.001}, // 95%分位数误差±1%,99%分位数误差±0.1%
		},
		[]string{"pay_type"},
	)
)

并在init()函数中注册这些指标:

go 复制代码
func init() {
	prometheus.MustRegister(httpRequestsTotal)
	prometheus.MustRegister(httpRequestDuration)
	// 注册自定义业务指标
	prometheus.MustRegister(orderCreatedTotal)
	prometheus.MustRegister(stockRemaining)
	prometheus.MustRegister(orderPayDuration)
}

2. 业务接口中使用自定义指标

新增订单相关接口,在业务逻辑中更新指标:

go 复制代码
// 在main函数的业务接口定义后添加:
// 示例4:创建订单接口(自定义Counter指标)
r.POST("/api/order/create", func(c *gin.Context) {
	// 模拟获取订单类型(普通/秒杀)
	orderType := c.PostForm("order_type")
	if orderType == "" {
		orderType = "normal"
	}

	// 模拟创建订单(业务逻辑)
	// ...

	// 更新订单创建数指标
	orderCreatedTotal.WithLabelValues(orderType).Inc()

	// 模拟扣减库存(更新Gauge指标)
	productID := c.PostForm("product_id")
	if productID == "" {
		productID = "1001" // 默认商品ID
	}
	// 初始库存设为100,每次创建订单扣减1
	stockRemaining.WithLabelValues(productID).Dec()

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "订单创建成功",
		"data": gin.H{"order_id": time.Now().Unix()},
	})
})

// 示例5:订单支付接口(自定义Summary指标)
r.POST("/api/order/pay", func(c *gin.Context) {
	// 模拟支付开始时间
	startTime := time.Now()

	// 模拟获取支付方式
	payType := c.PostForm("pay_type")
	if payType == "" {
		payType = "wechat"
	}

	// 模拟支付处理延迟(50-500ms)
	time.Sleep(time.Duration(50+time.Now().UnixNano()%450) * time.Millisecond)

	// 更新支付耗时指标
	duration := time.Since(startTime).Seconds()
	orderPayDuration.WithLabelValues(payType).Observe(duration)

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "支付成功",
	})
})

// 示例6:初始化库存接口(设置Gauge初始值)
r.POST("/api/stock/init", func(c *gin.Context) {
	productID := c.PostForm("product_id")
	stockStr := c.PostForm("stock")
	stock, _ := strconv.Atoi(stockStr)
	if stock <= 0 {
		stock = 100
	}

	// 设置库存初始值
	stockRemaining.WithLabelValues(productID).Set(float64(stock))

	c.JSON(http.StatusOK, gin.H{
		"code": 0,
		"msg":  "库存初始化成功",
	})
})

3. 验证自定义指标

(1)重新启动Gin应用
bash 复制代码
go run main.go
(2)调用业务接口,触发指标更新
bash 复制代码
# 初始化库存(商品1001库存100)
curl -X POST -d "product_id=1001&stock=100" http://localhost:8080/api/stock/init

# 创建普通订单(扣减库存,订单数+1)
curl -X POST -d "order_type=normal&product_id=1001" http://localhost:8080/api/order/create

# 创建秒杀订单
curl -X POST -d "order_type=seckill&product_id=1001" http://localhost:8080/api/order/create

# 微信支付
curl -X POST -d "pay_type=wechat" http://localhost:8080/api/order/pay

# 支付宝支付
curl -X POST -d "pay_type=alipay" http://localhost:8080/api/order/pay
(3)查看/metrics中的自定义指标

访问http://localhost:8080/metrics,能看到:

复制代码
# HELP gin_biz_order_created_total Total number of created orders
# TYPE gin_biz_order_created_total counter
gin_biz_order_created_total{order_type="normal"} 1
gin_biz_order_created_total{order_type="seckill"} 1

# HELP gin_biz_stock_remaining Remaining stock of products
# TYPE gin_biz_stock_remaining gauge
gin_biz_stock_remaining{product_id="1001"} 98

# HELP gin_biz_order_pay_duration_seconds Duration of order payment process
# TYPE gin_biz_order_pay_duration_seconds summary
gin_biz_order_pay_duration_seconds{pay_type="wechat",quantile="0.95"} 0.321
gin_biz_order_pay_duration_seconds{pay_type="alipay",quantile="0.99"} 0.489
(4)PromQL查询自定义指标

在Prometheus UI(http://localhost:9090/graph)中输入以下PromQL,验证指标查询:

  • 查看普通订单创建总数:gin_biz_order_created_total{order_type="normal"}
  • 查看商品1001的库存余量:gin_biz_stock_remaining{product_id="1001"}
  • 查看微信支付95%耗时:gin_biz_order_pay_duration_seconds{pay_type="wechat",quantile="0.95"}

五、进阶拓展:Grafana可视化监控面板

Prometheus擅长采集和存储指标,但可视化能力较弱。Grafana是专业的监控可视化工具,能将Prometheus指标转化为直观的图表(折线图、柱状图、仪表盘)。

1. Grafana安装(Docker方式)

bash 复制代码
docker run -d \
  --name grafana \
  -p 3000:3000 \
  grafana/grafana:9.5.2

启动后访问http://localhost:3000,默认账号/密码:admin/admin(首次登录需修改密码)。

2. 配置Prometheus数据源

  1. 点击左侧菜单栏「Connections」→「Data sources」→「Add data source」;
  2. 选择「Prometheus」;
  3. 填写Prometheus地址:http://host.docker.internal:9090(Docker内访问宿主机的Prometheus);
  4. 点击「Save & test」,提示"Data source is working"即配置成功。

3. 导入/自定义监控面板

方式1:导入现成的Gin监控模板

Grafana官网有大量现成的模板,搜索"Gin Prometheus"即可找到,步骤:

  1. 点击左侧菜单栏「Dashboards」→「New」→「Import」;
  2. 输入模板ID(比如11741,适配Go应用监控);
  3. 选择已配置的Prometheus数据源,点击「Import」。
方式2:自定义业务监控面板

以"订单创建数"为例,创建折线图:

  1. 点击「Add panel」→「Visualization」→「Time series」;
  2. 在「Query」标签页,输入PromQL:sum(rate(gin_biz_order_created_total[5m])) by (order_type)
  3. 调整图表标题为"订单创建数(5分钟速率)",设置Y轴单位为"count";
  4. 点击「Apply」,即可看到不同订单类型的创建速率折线图。

4. 常用监控图表的PromQL示例

图表类型 监控目标 PromQL
折线图 接口请求QPS sum(rate(gin_http_requests_total[1m])) by (path)
柱状图 接口响应耗时(95%) histogram_quantile(0.95, sum(rate(gin_http_request_duration_seconds_bucket[5m])) by (le, path))
仪表盘 库存余量 gin_biz_stock_remaining{product_id="1001"}
饼图 状态码分布 sum(gin_http_requests_total) by (status)

六、生产环境最佳实践与拓展

1. 指标命名与标签设计规范

  • 指标名:小写+下划线,前缀区分业务(如gin_http_表示HTTP层,gin_biz_表示业务层);
  • 标签设计:
    • 避免高基数标签(如用户ID、订单ID),否则会导致Prometheus内存飙升;
    • 核心标签:method/path(HTTP层)、order_type/product_id(业务层);
    • 标签值:统一格式(如status用字符串,避免数字/字符串混用)。

2. 性能优化

  • 中间件优化:监控中间件尽量放在全局中间件的最后(避免采集无关中间件的耗时);
  • 指标采样:高并发场景下,可对Histogram指标做采样(如每10个请求记录1次);
  • 分桶优化:根据业务耗时调整Histogram的Buckets(比如接口耗时大多在100ms内,可设置Buckets: []float64{0.01, 0.05, 0.1, 0.2, 0.5})。

3. 告警配置(AlertManager)

  1. 配置Prometheus的告警规则(alert_rules.yml):
yaml 复制代码
groups:
- name: gin_app_alerts
  rules:
  # 告警规则1:接口错误率超过5%
  - alert: GinHighErrorRate
    expr: sum(rate(gin_http_requests_total{status=~"5..|4.."}[5m])) / sum(rate(gin_http_requests_total[5m])) > 0.05
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Gin应用错误率过高"
      description: "5分钟内错误率{{ $value | humanizePercentage }},超过阈值5%"

  # 告警规则2:库存低于10
  - alert: GinLowStock
    expr: gin_biz_stock_remaining{product_id="1001"} < 10
    for: 30s
    labels:
      severity: critical
    annotations:
      summary: "商品1001库存不足"
      description: "当前库存{{ $value }},低于阈值10"
  1. prometheus.yml中引入告警规则,并配置AlertManager地址:
yaml 复制代码
rule_files:
  - "alert_rules.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["localhost:9093"]  # AlertManager地址
  1. 启动AlertManager,配置告警通知渠道(邮件/钉钉),即可实现异常自动告警。

4. 分布式场景下的监控

  • 服务发现:使用K8s ServiceDiscovery、Consul等,替代静态配置的targets;
  • 联邦集群:Prometheus联邦集群,实现多集群指标聚合;
  • 远程存储:对接Thanos、VictoriaMetrics,解决Prometheus本地存储容量限制。

5. 与其他工具的对比

监控方案 优势 劣势 适用场景
Prometheus+Grafana 开源免费、自定义强、生态完善 学习成本稍高、需自行维护 中小团队、云原生场景
InfluxDB+Telegraf 写入性能高、适合高频指标 查询能力弱于PromQL 物联网、高频采集场景
Datadog 全托管、开箱即用 付费、自定义灵活性低 大型企业、不想维护基础设施

七、常见问题与解决方案

1. /metrics接口采集不到数据

  • 检查中间件是否全局注册(r.Use(GinPrometheusMiddleware()));
  • 检查指标是否通过prometheus.MustRegister()注册;
  • 检查Gin应用是否启动在正确端口(8080)。

2. Prometheus目标状态为Down

  • 检查Gin应用是否可访问(curl http://localhost:8080/metrics);
  • 检查Prometheus配置的targets是否正确(避免IP/端口错误);
  • Docker部署时,确保Prometheus能访问Gin应用(使用宿主机IP而非localhost)。

3. 高基数标签导致Prometheus内存飙升

  • 移除不必要的高基数标签(如用户ID);
  • 对标签值做聚合(如按用户等级而非用户ID);
  • 调整Prometheus的内存配置(--storage.tsdb.retention.time缩短保留时间)。

4. 监控中间件影响接口性能

  • 异步采集指标(将指标更新逻辑放入goroutine);
  • 减少标签数量(标签越多,指标维度越多,性能开销越大);
  • 生产环境使用gin.ReleaseMode(关闭Debug模式,减少日志开销)。

八、总结

为Gin应用集成Prometheus监控,是保障系统稳定性的关键一步------从基础的HTTP指标采集,到自定义业务指标落地,再到Grafana可视化和AlertManager告警,形成了"采集-存储-可视化-告警"的完整监控闭环。

本文的示例代码可直接应用于生产环境,核心要点:

  1. 监控中间件是核心:通过Gin中间件无感采集HTTP指标;
  2. 指标设计要合理:区分HTTP层和业务层,避免高基数标签;
  3. 可视化+告警是刚需:Grafana让指标直观,AlertManager让问题早发现。

无论是小型Gin应用,还是分布式微服务,这套监控方案都能适配。建议先从基础指标入手,再逐步扩展业务指标,最终构建符合自身业务特点的监控体系。如果在实践中遇到问题,可结合Prometheus官方文档和Gin社区资源,进一步优化监控策略。

相关推荐
风生u6 小时前
Go: Gin的用法
golang·xcode·gin
java_logo1 天前
MILVUS Docker 容器化部署指南
运维·人工智能·docker·容器·prometheus·milvus
juma90022 天前
西门子S7-200SMART_PLC基于RS485通讯恒压供水一拖二程序样例,采样PLC+sm...
prometheus
古城小栈2 天前
Golang Gin+Gorm :SQL注入 防护
sql·安全·go·gin
比奥利奥还傲.3 天前
无需复杂操作!Prometheus+cpolar+实现跨网监控自由
prometheus
听风吟丶3 天前
云原生 APM 实战:Prometheus Operator+K8s 构建容器化微服务监控体系
云原生·kubernetes·prometheus
听风吟丶3 天前
Java 微服务 APM 实战:Prometheus+Grafana 构建全维度性能监控与资源预警体系
java·微服务·prometheus
路边草随风3 天前
go实现接口接收数据写入kafka
golang·kafka·gin
递归尽头是星辰3 天前
架构实战:1 小时搭建Java微服务指标监控体系(Prometheus+Grafana 落地指南)
grafana·prometheus·可观测性·micrometer·指标监控·java 微服务监控