golang 自定义exporter - 服务连接数 portConnCount_exporter 导出器

需求:

1、计算当前6379 、3306 服务的连接数

2、可prometheus 语法查询

下面代码可直接使用:

注:

1、windows 与linux的区分 第38行代码
localAddr := fields[1] //windows为fields[1] , linux为fields[3]

2、如需求 增加/修改/删除 端口,可参考第70 71行即可

cpp 复制代码
 70         NewPrometheusGauge(3306)
 71         NewPrometheusGauge(6379)

代码

cpp 复制代码
package main

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

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

func PortConnCounts(port int) float64 {
        // 执行netstat命令
        out, err := exec.Command("netstat", "-an").Output()
        if err != nil {
                fmt.Println("执行netstat命令失败:", err)
                return -1
        }

        // 解析netstat命令输出
        result := string(out)
        lines := strings.Split(result, "\n")
        // fmt.Printf("lines: %v\n", lines)

        var count float64 = 0
        for _, line := range lines {
                // 忽略空行和表头
                if line == "" || strings.Contains(line, "Active Internet connections") || strings.Contains(line, "Proto") {
                        continue
                }

                fields := strings.Fields(line)
                if len(fields) >= 4 {
                        // 获取本地地址和端口
                        localAddr := fields[3] //windows为fields[1]  linux为fields[3]
                        addrParts := strings.Split(localAddr, ":")
                        if len(addrParts) >= 2 {
                                localPort := addrParts[len(addrParts)-1]
                                if localPort == fmt.Sprint(port) {
                                        count++
                                }
                        }
                }
        }
        log.Printf("  port: %v count: %v\n", port, count)
        return count
}

func NewPrometheusGauge(port int) {
        t1 := prometheus.NewGauge(prometheus.GaugeOpts{
                Name: fmt.Sprint("portconnscount", port),
                Help: fmt.Sprint("portconnscount", port, "每10秒执行一次,端口链接数,误差1个左右, 误差在于:::ipv6的显示"),
        })
        // 注册指标
        prometheus.MustRegister(t1)

        // 每秒钟增加指标值
        go func() {
                for {
                        t1.Set(PortConnCounts(port))
                        time.Sleep(time.Second * 10)
                }
        }()
}

func main() {
        NewPrometheusGauge(3306)
        NewPrometheusGauge(6379)

        // 创建一个 Gauge 指标

        // 处理 "/metrics" 路径,暴露指标
        http.Handle("/metrics", promhttp.Handler())
        log.Fatal(http.ListenAndServe(":9101", nil))
}

生成 二进制文件

cpp 复制代码
//get 一下包
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

go build -o portConnCount_exporter main.go

执行

cpp 复制代码
nohup ./portConnCount_exporter &

[root@www netstat.go]# tail -f nohup.out 
2023/08/09 15:56:39   port: 6379 count: 2272
2023/08/09 15:56:39   port: 3306 count: 100
2023/08/09 15:56:49   port: 3306 count: 100
2023/08/09 15:56:49   port: 6379 count: 2272
2023/08/09 15:56:59   port: 6379 count: 2272
2023/08/09 15:56:59   port: 3306 count: 100
2023/08/09 15:57:09   port: 6379 count: 2272
2023/08/09 15:57:09   port: 3306 count: 100
2023/08/09 15:57:20   port: 6379 count: 2272

网页访问

http://ip:9101/metrics

prometheus语法查询

Grafana

------------end

相关推荐
SRETalk6 天前
Zabbix、Prometheus、Grafana、Nightingale,四个监控如何选型?
zabbix·grafana·prometheus·nightingale
虚无境13 天前
如何编写一个SpringBoot项目告警推送的Starter
java·prometheus·webhook
何以解忧,唯有..14 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
踏着七彩祥云的小丑14 天前
Go学习第9天:并发编程 + 文件操作 + 正则表达式
学习·golang·正则表达式·go
JCGKS14 天前
Go `init` 函数:包初始化顺序到底是怎样的
golang·init·init执行顺序
何以解忧,唯有..14 天前
Go语言中的const:常量声明与iota枚举详解
java·开发语言·golang
睡不醒男孩03082314 天前
云原生运维实战:高并发架构下的云原生可观测性、韧性降级与自动化干预体系
数据库·kubernetes·高并发·prometheus·devops·sre·缓存调优
geovindu14 天前
go: Reactor Pattern
开发语言·后端·设计模式·golang·反应器模式
記億揺晃着的那天14 天前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
jingling55515 天前
go | 环境安装和快速入门
开发语言·后端·golang