系统监控服务示例
1 简介
本文实例构建一个系统资源监控程序,并使用go提供数据上报的服务实例
Prometheus + Grafana, Zabbix, Nagios
可以使用 Go 提供数据上报的服务实例,用于配合以下监控系统进行系统资源监控。但实现方式在不同系统中有区别:
2 exporter 上报数据
-
- Prometheus + Grafana
非常适合用 Go 编写 exporter 上报数据。
推荐方式:使用 Go 实现一个 HTTP 服务,提供 /metrics 端点,Prometheus 定期抓取这个端点。
常用库:prometheus/client_golang
示例:
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var cpuUsage = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "custom_cpu_usage_percent",
Help: "CPU usage in percent",
})
func init() {
prometheus.MustRegister(cpuUsage)
}
func main() {
go func() {
for {
// 模拟收集 CPU 使用率
cpuUsage.Set(20.5) // 示例值,需替换为真实采集
time.Sleep(10 * time.Second)
}
}()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", nil)
}
Grafana:通过 Prometheus 查询数据进行可视化。
-
- Zabbix
Zabbix 不原生支持 Go,但是你可以:
方式一:Zabbix sender
使用 Go 调用 zabbix_sender 或实现 TCP 协议向 Zabbix Server 主动发送数据。
或者写一个 Go 程序调用外部命令 zabbix_sender:
zabbix_sender -z <server> -s "<host>" -k "<key>" -o "<value>"
方式二:Zabbix Agent 自定义项
在 Zabbix Agent 配置中添加自定义 key,例如通过调用 Go 程序收集的数据。
-
- Nagios
Nagios 基于插件运行脚本并解析其输出(返回码 + 文本):
方式:
编写 Go 脚本作为 Nagios 插件,输出结果和返回码:
package main
import (
"fmt"
"os"
)
func main() {
usage := 75 // 假设采集得来
if usage > 90 {
fmt.Println("CPU CRITICAL - 95%")
os.Exit(2)
} else if usage > 70 {
fmt.Println("CPU WARNING - 75%")
os.Exit(1)
} else {
fmt.Println("CPU OK - 50%")
os.Exit(0)
}
}
放入 Nagios 插件目录,注册为 command。
完整的 Go + Prometheus Exporter 示例,它将模拟系统资源(如 CPU 使用率和内存)并暴露在 /metrics 接口,供 Prometheus 抓取。
3 示例结构
项目结构
go-prometheus-exporter/
├── main.go
├── go.mod
module github.com/yourusername/go-prometheus-exporter
go 1.20
require (
github.com/prometheus/client_golang v1.17.0
)
运行 go mod tidy 下载依赖
main.go
package main
import (
"math/rand"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
cpuUsage = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "custom_cpu_usage_percent",
Help: "Simulated CPU usage in percent",
})
memoryUsage = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "custom_memory_usage_mb",
Help: "Simulated Memory usage in MB",
})
)
func init() {
prometheus.MustRegister(cpuUsage)
prometheus.MustRegister(memoryUsage)
}
func simulateMetrics() {
for {
cpuUsage.Set(rand.Float64() * 100) // 0~100%
memoryUsage.Set(rand.Float64() * 8192) // 0~8GB
time.Sleep(10 * time.Second)
}
}
func main() {
go simulateMetrics()
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":2112", nil)
}
- 运行方法
启动 exporter:
go run main.go
打开浏览器访问:
http://localhost:2112/metrics
Prometheus 配置中添加目标:
scrape_configs:
- job_name: 'custom_exporter'
static_configs:
- targets: ['localhost:2112']
- Grafana 可视化
在 Grafana 中配置数据源为 Prometheus,使用以下查询构建面板:
CPU 使用率:custom_cpu_usage_percent
内存使用量:custom_memory_usage_mb
4 小结
监控系统 是否支持 Go 上报 推荐方式
Prometheus ✅ 强烈推荐 Go Exporter 提供 /metrics
Zabbix ✅ 间接支持 zabbix_sender / 自定义项
Nagios ✅ 间接支持 编写符合返回规范的 Go 插件
- 点赞
- 收藏
- 关注作者
评论(0)