系统监控服务示例

举报
码乐 发表于 2025/07/05 07:13:06 2025/07/05
【摘要】 1 简介本文实例构建一个系统资源监控程序,并使用go提供数据上报的服务实例 Prometheus + Grafana, Zabbix, Nagios可以使用 Go 提供数据上报的服务实例,用于配合以下监控系统进行系统资源监控。但实现方式在不同系统中有区别: 2 exporter 上报数据Prometheus + Grafana非常适合用 Go 编写 exporter 上报数据。推荐方式:...

1 简介

本文实例构建一个系统资源监控程序,并使用go提供数据上报的服务实例

		Prometheus + Grafana, Zabbix, Nagios

可以使用 Go 提供数据上报的服务实例,用于配合以下监控系统进行系统资源监控。但实现方式在不同系统中有区别:

2 exporter 上报数据

    1. 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 查询数据进行可视化。

    1. 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 程序收集的数据。

    1. 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 插件
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。