Prometheus监控自定义程序指标

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.定义自定义指标案例

1.定义自定义指标的初衷

我们使用Prometheus-adapter可以监控自定义指标,为了实现自定义指标的HPA,我们还需要一个Pod提供指标。

为了方便测试,我们可以使用Golang编写一个登录接口"/login",一旦访问该接口就进行计数统计。

2.编写代码

	1.安装Golang环境
[root@master241 ~]# go version
go version go1.25.0 linux/amd64
[root@master241 ~]# 
	
参考链接:
	https://www.cnblogs.com/yinzhengjie/p/18148540


	2.初始化项目
[root@master241 ~]# mkdir /yinzhengjie-devops
[root@master241 ~]# cd /yinzhengjie-devops
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# go mod init k8s-devops
go: creating new go.mod: module k8s-devops
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# ll
total 12
drwxr-xr-x  2 root root 4096 Sep 26 15:30 ./
drwxr-xr-x 22 root root 4096 Sep 26 15:30 ../
-rw-r--r--  1 root root   27 Sep 26 15:30 go.mod
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# cat go.mod 
module k8s-devops

go 1.18
[root@master241 yinzhengjie-devops]# 

	
	3.编写代码
[root@master241 yinzhengjie-devops]# cat main.go 
package main

import (
	"fmt"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"net/http"
)


var (
	// 定义一个myMetrics指标,其类型为"Counter"
	myMetrics = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "yinzhengjie_application_login_api",
		Help: "Count the number of visits to the /login interface",
	})
)

func init() {
	// 注册我们自定义的metrics指标
	prometheus.DefaultRegisterer.MustRegister(myMetrics)
}

func BlogHandler(w http.ResponseWriter, r *http.Request) {
	// 每当访问我们的接口后,都会让Counter计数器加1.
	myMetrics.Inc()
	fmt.Fprintf(w, "https://www.cnblogs.com/yinzhengjie\n")
}

func main() {
	http.Handle("/metrics", promhttp.Handler())
    http.HandleFunc("/login", BlogHandler)
    fmt.Println("欢迎使用尹正杰测试的系统,可访问接口: /login和/metrics")
	http.ListenAndServe(":8080", nil)
}
[root@master241 yinzhengjie-devops]# 

3.运行测试

	1.导入依赖包
[root@master241 yinzhengjie-devops]# go mod tidy

	2.编译代码
[root@master241 yinzhengjie-devops]# go build -o yinzhengjie-app main.go 
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# ll 
total 12044
drwxr-xr-x  2 root root     4096 Sep 26 15:58 ./
drwxr-xr-x 22 root root     4096 Sep 26 15:30 ../
-rw-r--r--  1 root root      584 Sep 26 15:55 go.mod
-rw-r--r--  1 root root     4034 Sep 26 15:55 go.sum
-rw-r--r--  1 root root      856 Sep 26 15:58 main.go
-rwxr-xr-x  1 root root 12310014 Sep 26 15:58 yinzhengjie-app*
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# ./yinzhengjie-app 
欢迎使用尹正杰测试的系统,可访问接口: /login和/metrics

	
	3.运行测试
[root@master241 ~]# for i in `seq 10`; do curl 10.0.0.241:8080/login;done  # 客户端访问10次
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
[root@master241 ~]# 
[root@master241 ~]# curl -s 10.0.0.241:8080/metrics | grep yinzhengjie  # 查看我们的监控指标是否正确。
# HELP yinzhengjie_application_login_api Count the number of visits to the /login interface
# TYPE yinzhengjie_application_login_api counter
yinzhengjie_application_login_api 10
[root@master241 ~]# 
 

4.编写Dockerfile构建Golang程序

	1.编写Dockerfile
[root@docker101 yinzhengjie-devops]# ll
total 24
drwxr-xr-x 2 root root 4096 Sep 26 17:49 ./
drwx------ 7 root root 4096 Sep 26 17:49 ../
-rw-r--r-- 1 root root  756 Sep 26 17:49 Dockerfile
-rw-r--r-- 1 root root  584 Sep 26 16:53 go.mod
-rw-r--r-- 1 root root 4034 Sep 26 16:53 go.sum
-rw-r--r-- 1 root root  939 Sep 26 16:53 main.go
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# cat Dockerfile 
FROM golang:1.25-alpine AS base

WORKDIR /yinzhengjie

LABEL auther=YinZhengJie \
      wechat=JasonYin2020 \
      email=y1053419035@qq.com

ENV GOPROXY=https://goproxy.cn,direct

ADD . .

RUN sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories && \
    apk update && \
    apk add --no-cache upx ca-certificates tzdata && \
    CGO_ENABLE=0 go build -o yinzhengjie-app main.go 


FROM registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1

COPY --from=base /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=base /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs
COPY --from=base /yinzhengjie/yinzhengjie-app /yinzhengjie-app

EXPOSE 8080

ENTRYPOINT ["/yinzhengjie-app"]

[root@docker101 yinzhengjie-devops]# 


	2.编译镜像
[root@docker101 yinzhengjie-devops]# docker  build -t registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login .
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# docker  image ls registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login 
REPOSITORY                                               TAG       IMAGE ID       CREATED          SIZE
registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps   login     fd91204b5e30   15 seconds ago   35.4MB
[root@docker101 yinzhengjie-devops]# 


	3.将镜像推送到阿里云仓库
[root@docker101 yinzhengjie-devops]# docker login --username=yinzhengjie registry.cn-hangzhou.aliyuncs.com
Password: 

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# docker  image push registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login 
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps]
18cfcc1a97fc: Pushed 
6a8530530e94: Pushed 
662bc90503ca: Pushed 
8e2be8913e57: Layer already exists 
9d5b000ce7c7: Layer already exists 
b8dbe22b95f7: Layer already exists 
c39c1c35e3e8: Layer already exists 
5f66747c8a72: Layer already exists 
15d7cdc64789: Layer already exists 
7fcb75871b21: Layer already exists 
login: digest: sha256:f930057909b65971f4a4762a09b4f6f7fb2def21ec7062de793e1898ef13dd55 size: 2407
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# docker  logout registry.cn-hangzhou.aliyuncs.com
Removing login credentials for registry.cn-hangzhou.aliyuncs.com
[root@docker101 yinzhengjie-devops]# 

5.K8S部署服务

	1.编写资源清单
[root@master241 case-demo]# cat 03-deploy-login.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-login
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: login
  template:
    metadata:
      labels:
        apps: login
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '8080'
        prometheus.io/path: 'metrics'
    spec:
      containers:
      - name: c1
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login
        resources:
          requests:
            memory: 100Mi
            cpu: 100m
          limits:
            cpu: 200m
            memory: 200Mi
        ports:
        - containerPort: 8080
          name: login-api

---

apiVersion: v1
kind: Service
metadata:
  name: svc-login
  labels:
    apps: login
spec:
  ports:
  - port: 8080
    targetPort: login-api
    name: login
  selector:
    apps: login
  type: ClusterIP
[root@master241 case-demo]# 


	2.测试验证
[root@master241 case-demo]# kubectl apply -f 03-deploy-login.yaml 
deployment.apps/deploy-login created
service/svc-login created
[root@master241 case-demo]# 
[root@master241 case-demo]# kubectl get svc,po -o wide -l apps=login
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE   SELECTOR
service/svc-login   ClusterIP   10.198.9.62   <none>        8080/TCP   5s    apps=login

NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
pod/deploy-login-69dddf6db-9vjsq   1/1     Running   0          5s    10.100.207.33   worker243   <none>           <none>
[root@master241 case-demo]# 
[root@master241 case-demo]# curl 10.198.9.62:8080/login
https://www.cnblogs.com/yinzhengjie
[root@master241 case-demo]# 
[root@master241 case-demo]# curl -s 10.198.9.62:8080/metrics | grep yinzhengjie
# HELP yinzhengjie_application_login_api Count the number of visits to the /login interface
# TYPE yinzhengjie_application_login_api counter
yinzhengjie_application_login_api 1
[root@master241 case-demo]# 

二.Prometheus-operator监控自定义程序

1.部署Prometheus-operator

参考链接:
	https://www.cnblogs.com/yinzhengjie

2.编写smon资源监控自定义程序

QQ_1758969453083

	1.编写资源清单
[root@master241 case-demo]# cat 04-smon-login-app.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: yinzhengjie-smon-login
spec:
  endpoints:
  - interval: 3s
    port: "login"
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      apps: login

[root@master241 case-demo]# 


	2.创建资源
[root@master241 case-demo]# kubectl apply -f  04-smon-login-app.yaml
servicemonitor.monitoring.coreos.com/yinzhengjie-smon-login created
[root@master241 case-demo]# 


	3.访问Prometheus的WebUI查看taget是否监控
如上图所示,我们成功监控到咱们的目标程序啦~

3.Prometheus验证数据是否采集

QQ_1758969734025

	1.客户端访问测试
[root@master241 case-demo]# kubectl get svc,pods -l apps=login -o wide
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE    SELECTOR
service/svc-login   ClusterIP   10.205.204.241   <none>        8080/TCP   4m4s   apps=login

NAME                               READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
pod/deploy-login-f5d5d7695-jc2dj   1/1     Running   0          4m4s   10.100.207.46   worker243   <none>           <none>
[root@master241 case-demo]# 
[root@master241 case-demo]# for i in `seq 10`; do curl 10.205.204.241:8080/login;done
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
[root@master241 case-demo]# 

	
	2.Prometheus的webui验证
如上图所示,我们可以在命令行直接搜索关键字"yinzhengjie_application_login_api"就能监控到程序啦。
posted @ 2025-09-29 23:19  尹正杰  阅读(42)  评论(0)    收藏  举报