golang自建prometheus采集器(supervisord)

文章介绍了如何使用Go语言自建Prometheus采集器,监控Supervisord管理的服务状态,当程序挂起时及时发送告警至企业微信,确保服务运行状况的实时监控。
摘要由CSDN通过智能技术生成
背景

基于supervisord服务管理进程

使用supervisord对进程进行托管、默认重启三次后就会取消启动,当程序挂了后不能及时了解程序情况

方案:

自建prometheus采集器,当程序挂了时及时了解并发出告警信息到企业微信

package main

import (
	"fmt"
	"net/http"
	"os"
	"os/exec"
	"strings"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
	monitorSvc  = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "supervisor_service",
			Help: "This is supervisor_service",
		},
		[]string{"service"},
	)
	monitorTime = prometheus.NewGaugeVec(
		prometheus.GaugeOpts{
			Name: "supervisor_run_time",
			Help: "This is supervisor_run_time",
		},
		[]string{"service"},
	)
)

func init() {
	prometheus.MustRegister(monitorSvc, monitorTime)
}

func kll() {
	cmd := exec.Command("supervisorctl", "status")
	output, err := cmd.Output()

	if err != nil {
		fmt.Println("Error executing command:", err)
		return
	}
	lines := strings.TrimSuffix(string(output), "\n")

	lineSlice := strings.Split(lines, "\n")

	for _, line := range lineSlice {
		axf := strings.Fields(line)
		buildMetrics(axf)
	}
}

func buildMetrics(lines []string) {
	var metricValue float64
	serviceName := lines[0]
	if lines[1] == "RUNNING" {
		metricValue = 1
		pid := strings.Replace(lines[3], ",", "", -1)
		stat, err := os.Lstat(fmt.Sprintf("/proc/%s", pid))
		if err != nil {
			fmt.Println("Error getting process start time:", err)
			return
		}
		startTime := stat.ModTime().Unix()
		runTime := time.Now().Unix() - startTime
		monitorTime.WithLabelValues(serviceName).Set(float64(runTime))
	} else {
		metricValue = 0
	}
	monitorSvc.WithLabelValues(serviceName).Set(metricValue)
}

func main() {
	http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
		fmt.Printf("Received request from %s for %s\n", r.RemoteAddr, r.URL.Path)
		kll()
		promhttp.Handler().ServeHTTP(w, r) // 使用Prometheus的处理器直接服务于监控指标
	})

	http.ListenAndServe(":9077", nil)
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值