news 2026/5/30 2:30:22

每日一Go-70、Prometheus + Grafana 从采集到告警的完整实战(Go + Kind)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
每日一Go-70、Prometheus + Grafana 从采集到告警的完整实战(Go + Kind)

Prometheus 是一个以时间序列为核心、通过 Pull 模型采集指标、用 PromQL 做聚合分析、最终通过告警驱动运维决策的监控系统。

Grafana 是一个:把 Prometheus 里的“冰冷指标”,变成你一眼能看懂、能做决策的可视化与告警平台。

一、在Kind 集群里装 Prometheus + Grafana

1. 安装Helm:打开Windows终端

>winget install Helm.Helm 已找到 Helm[Helm.Helm]版本4.0.4此应用程序由其所有者授权给你。 Microsoft 对第三方程序包概不负责,也不向第三方程序包授予任何许可证。 正在下载 https://get.helm.sh/helm-v4.0.4-windows-amd64.zip ██████████████████████████████19.5MB/19.5MB已成功验证安装程序哈希 正在提取存档...已成功提取存档 正在启动程序包安装...已修改路径环境变量;重启 shell 以使用新值。 添加了命令行别名:"helm"已成功安装

2. 添加Helm仓库

helm repoaddprometheus-communityhttps://prometheus-community.github.io/helm-charts//国内用这个helm repoaddaliyunhttps://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo update

3. 创建 namespace

kubectl createnamespacemonitoring

4. 安装 kube-prometheus-stack

helm install monitoring prometheus-community/kube-prometheus-stack \ -n monitoring

等待几分钟

kubectlgetpods-n monitoring

5. 本地访问 Grafana

kubectl port-forward svc/monitoring-grafana 3000:80 -n monitoring
// PowerShell中输入命令以获取grafana的密码kubectl get secret monitoring-grafana-n monitoring-o jsonpath="{.data.admin-password}"|ForEach-Object{[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_))}

  1. 浏览器访问 http://localhost:3000,输入用户名和密码 admin / vy6GVpIgUvmzslR57JDJViyP5x7SLpt1ydlP0upK

二、让 Go 服务暴露 Prometheus 指标

1. Go 服务代码

// 包声明,定义包名为 mainpackagemain// 导入依赖包import("fmt""strconv""github.com/gin-gonic/gin""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp")var(httpTotal=prometheus.NewCounterVec(prometheus.CounterOpts{Name:"http_requests_total",Help:"Total HTTP requests",},[]string{"method","path","status"},))// Prometheus中间件funcprometheusMiddleware()gin.HandlerFunc{returnfunc(c*gin.Context){c.Next()// 先执行后续逻辑// 请求完成后记录指标status:=strconv.Itoa(c.Writer.Status())httpTotal.WithLabelValues(c.Request.Method,c.FullPath(),status).Inc()}}// 主函数,程序入口funcmain(){fmt.Println("Hello, Codee君!")// 注册指标prometheus.MustRegister(httpTotal)// 创建默认的 Gin 路由引擎r:=gin.Default()// 使用中间件,所有路由都会被监控r.Use(prometheusMiddleware())// 定义 GET 路由 /ping,处理函数返回 JSON 格式的响应r.GET("/ping",func(c*gin.Context){c.JSON(200,gin.H{"message":"pong",})})// 暴露 metrics 接口r.GET("/metrics",func(c*gin.Context){promhttp.Handler().ServeHTTP(c.Writer,c.Request)})// 启动 HTTP 服务器,监听 8080 端口r.Run(":8080")}

2. Dockerfile

# 第一阶段:编译阶段 FROM golang:1.25.5-alpine AS builder # 设置环境变量(国内环境建议开启代理加快下载速度) ENV GO111MODULE=on \ GOPROXY=https://goproxy.cn,direct # 设置工作目录 WORKDIR /app # 复制依赖文件并下载(利用 Docker 缓存) COPY go.mod go.sum ./ RUN go mod download # 复制源代码并编译 COPY . . # CGO_ENABLED=0 确保静态链接,能在 alpine 下运行 RUN CGO_ENABLED=0 GOOS=linux go build -o main . # 第二阶段:运行阶段 FROM alpine:latest # 安装基础工具(可选) RUN apk --no-cache add ca-certificates WORKDIR /root/ # 从编译阶段复制二进制文件 COPY --from=builder /app/main . # 暴露 Gin 和 Prometheus 监听的端口 EXPOSE 8080 # 运行应用 CMD ["./main"]

4. 容器和 & 部署到 Kind

kubectl createnamespacecodee-jun
apiVersion: apps/v1 kind: Deployment metadata: name: go-metrics-demo namespace: codee-jun spec: replicas: 1 selector: matchLabels: app: go-metrics-demo template: metadata: labels: app: go-metrics-demo spec: containers: - name: app image: imoowi/golang_per_day:day70 ports: - containerPort: 8080
apiVersion: v1 kind: Service metadata: name: go-metrics-demo namespace: codee-jun labels: app: go-metrics-demo # ✅ 给 Service 打 label(必须) spec: selector: app: go-metrics-demo ports: - name: http port: 8080 targetPort: 8080
kubectl apply-f deployment.yaml kubectl apply-f service.yaml
$ kubectl.exe get pods-n codee-jun NAME READYSTATUSRESTARTS AGE go-metrics-demo-7c5cfffb4d-nrmlj1/1Running069s
$ kubectl.exe get svc-n codee-jun NAMETYPECLUSTER-IP EXTERNAL-IP PORT(S)AGE go-metrics-demo ClusterIP10.96.138.1388080/TCP11s

三、让 Prometheus 抓到你的Go服务

1. 创建 ServiceMonitor

apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: go-metrics-demo namespace: monitoring labels: release: monitoring spec: namespaceSelector: matchNames: - codee-jun selector: matchLabels: app: go-metrics-demo endpoints: - port: http path: /metrics interval: 15s

2. 给 Service 加上 port name

ports:-name:httpport:8080targetPort:8080

3. 验证 Prometheus 是否抓到

kubectl port-forward svc/monitoring-kube-prometheus-prometheus 9090 -n monitoring

访问 http://localhost:9090

搜索指标:

http_requests_total

看到数据,说明链路通了。

四、Grafana Dashboard 实战

1. 添加 Prometheus 数据源

kube-prometheus-stack 已自动配置好,不需要手动加。

2. 创建核心面板

在Grafana里添加新Dashboard,然后添加以下三个面板

2.1 QPS

sum(rate(http_requests_total[1m]))

2.2 错误率(Error Rate)

sum(rate(http_requests_total{status=~"5.."}[5m]))/ sum(rate(http_requests_total[5m]))

2.3 P99 延迟

histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m]))by(le))

五、添加告警

1. 配置文件

apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: go-service-alerts labels: release: monitoring spec: groups: - name: go-service.rules rules: - alert: HighErrorRate expr:|sum(rate(http_requests_total{status=~"5.."}[5m]))/ sum(rate(http_requests_total[5m]))>0.05for: 2m labels: severity: critical annotations: summary:"Go 服务错误率过高"

2. 发布配置

kubectl apply -f prometheusrule.alert.yaml

3. 在Prometheus里查看结果

4. 制造500错误

$ kubectl.exe get pods-n codee-jun-o wide NAME READYSTATUSRESTARTS AGE IP NODE NOMINATED NODE READINESS GATES go-metrics-demo-66698549d7-ggfwx1/1Running018m10.244.1.7golang-per-day-worker
kubectl.exe exec-it go-metrics-demo-66698549d7-ggfwx-n codee-jun--sh~# apkaddcurl(1/10)Installing brotli-libs(1.2.0-r0)(2/10)Installing c-ares(1.34.6-r0)(3/10)Installinglibunistring(1.4.1-r0)(4/10)Installinglibidn2(2.3.8-r0)(5/10)Installing nghttp2-libs(1.68.0-r0)(6/10)Installingnghttp3(1.13.1-r0)(7/10)Installinglibpsl(0.21.5-r3)(8/10)Installing zstd-libs(1.5.7-r2)(9/10)Installinglibcurl(8.17.0-r1)(10/10)Installingcurl(8.17.0-r1)Executing busybox-1.37.0-r30.triggerOK:13.4MiBin27packages~#whiletrue;docurlhttp://localhost:8080/error;done

2分钟后,就可以在Prometheus Alert页面看见


友情链接:加班费计算器(vx小程序搜索“加班计”)


*源码地址*
评论区要


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 2:30:19

Node.js技术周刊 2026年第18周

阅读原文: https://mp.weixin.qq.com/s/LADEQnByKRvN2QZuzM-l3g 本周 Node.js 26.0 正式发布,默认启用 Temporal API;TypeScript 7.0 Beta 以 Go 原生实现带来 10 倍性能提升;Rolldown 1.0、pnpm 11.0、PM2 7.0 等重要工具相继发布&#xff1…

作者头像 李华
网站建设 2026/5/30 2:29:41

MindSpore Transformers 断点续训功能原理

MindSpore Transformers(MindFormers)断点续训是大模型长周期训练的核心保障能力,基于Checkpoint 2.0 全状态保存机制,可完整留存训练过程的模型参数、优化器状态、学习率调度、数据迭代位置与训练步数,中断后精准恢复…

作者头像 李华
网站建设 2026/5/30 2:27:39

RK3588极速成功部署YOLO26完整全链条:从pt导出、ONNX转换到rknn-toolkit-lite2落地与CMA内存优化

1. 前言:当高性能边缘算力遇见新一代 YOLO26 在边缘计算与智能物联网(AIoT)领域,瑞芯微 RK3588 凭借其内置的 6 TOPS NPU、强大的多路视频处理能力以及极高的性价比,已经成为工业检测、智能安防等场景的骨干硬件。 随着 Ultralytics 发布新一代轻量化端到端检测器 YOLO2…

作者头像 李华
网站建设 2026/5/30 2:26:40

cmd操作手机命令行

查询链接设备 adb devices 多台设备指定 adb -s 192.168.5.250:5555 截图 adb -s 192.168.5.250:5555 exec-out screencap -p > screenshot.png

作者头像 李华