golang系统事件告警插件库golarm的使用

golang系统事件告警插件库golarm的使用

简介

golarm是一个用于监控系统事件并触发告警的Go语言库。它可以监控系统负载、内存使用、进程状态等多种系统指标,并在达到预设阈值时执行自定义操作。

使用示例

基本用法

// 监控系统1分钟负载超过0.8时触发告警
golarm.AddAlarm(golarm.SystemLoad(golarm.OneMinPeriod).Above(0.8).Run(func() {
    fmt.Println("System load >0.8 !!")
    smtp.SendMail(smtpHost, emailConf.Port, "System load >0.8 !!")
}))

系统负载监控

// 检查系统负载是否大于等于0.5
golarm.AddAlarm(golarm.SystemLoad(golarm.OneMinPeriod).AboveEqual(0.5).Run(func() {
    fmt.Println("System load >=0.5 !!")
}))

系统运行时间监控

// 检查系统运行时间是否少于1分钟
golarm.AddAlarm(golarm.SystemUptime().Below(1).Run(func() {
    fmt.Println("System just started !!")
}))

内存使用监控

// 检查已用内存是否超过90%
golarm.AddAlarm(golarm.SystemMemory().Used().Above(90).Percent().Run(func() {
    fmt.Println("Used system memory > 90% !!")
}))

// 检查空闲内存是否低于500MB
golarm.AddAlarm(golarm.SystemMemory().Free().BelowEqual(500).Run(func() {
    fmt.Println("Free memory <= 500MB !!")
}))

进程监控

// 检查进程72332是否变为僵尸状态
golarm.AddAlarm(golarm.SystemProc(72332).Status(golarm.Zombie).Run(func() {
    fmt.Println("Our process with PID 72332 became Zombie !!")
}))

// 检查进程72332是否运行超过20分钟
golarm.AddAlarm(golarm.SystemProc(72332).RunningTime().Above(20).Run(func() {
    fmt.Println("Our process with PID 72332 exceeded 20 minutes running !!")
}))

完整示例

下面是一个完整的示例程序,展示了如何使用golarm监控多个系统指标:

package main

import (
    "fmt"
    "github.com/msempere/golarm"
)

func main() {
    // 监控系统负载
    golarm.AddAlarm(golarm.SystemLoad(golarm.OneMinPeriod).Above(0.8).Run(func() {
        fmt.Println("警告: 系统1分钟负载超过0.8!")
    }))

    // 监控内存使用
    golarm.AddAlarm(golarm.SystemMemory().Used().Above(90).Percent().Run(func() {
        fmt.Println("警告: 内存使用超过90%!")
    }))

    // 监控特定进程
    golarm.AddAlarm(golarm.SystemProc(12345).Status(golarm.Zombie).Run(func() {
        fmt.Println("警告: 进程12345变为僵尸状态!")
    }))

    // 保持程序运行
    select {}
}

待实现功能

  • 支持千字节/兆字节/千兆字节单位(当前默认使用兆字节)
  • 支持分钟/小时/天时间单位(当前默认使用分钟)

许可证

golarm使用MIT许可证发布。


更多关于golang系统事件告警插件库golarm的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang系统事件告警插件库golarm的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


golarm - Golang系统事件告警插件库使用指南

golarm是一个轻量级的Golang系统事件告警库,可以方便地监控系统指标并在异常时触发告警。下面我将详细介绍如何使用golarm。

安装

go get github.com/yourusername/golarm

基本使用

1. 创建告警器

package main

import (
	"github.com/yourusername/golarm"
	"time"
)

func main() {
	// 创建一个新的告警器
	alarm := golarm.NewAlarm()
	
	// 添加监控项
	alarm.AddMonitor("cpu", golarm.NewCPUMonitor(80)) // CPU使用率超过80%告警
	alarm.AddMonitor("mem", golarm.NewMemoryMonitor(90)) // 内存使用率超过90%告警
	
	// 设置告警间隔(防止频繁告警)
	alarm.SetCheckInterval(30 * time.Second)
	
	// 启动监控
	alarm.Start()
	
	// 程序运行中...
	select {}
}

2. 自定义告警处理器

package main

import (
	"fmt"
	"github.com/yourusername/golarm"
	"time"
)

// 自定义告警处理器
type MyAlertHandler struct{}

func (h *MyAlertHandler) Handle(alert *golarm.Alert) {
	fmt.Printf("[ALERT] %s - %s: %.2f%% (Threshold: %.2f%%)\n",
		time.Now().Format("2006-01-02 15:04:05"),
		alert.Name,
		alert.CurrentValue,
		alert.Threshold,
	)
	// 这里可以添加邮件、短信、webhook等告警逻辑
}

func main() {
	alarm := golarm.NewAlarm()
	alarm.SetAlertHandler(&MyAlertHandler{})
	
	alarm.AddMonitor("cpu", golarm.NewCPUMonitor(80))
	alarm.AddMonitor("mem", golarm.NewMemoryMonitor(90))
	
	alarm.Start()
	
	select {}
}

3. 支持的监控类型

golarm目前支持以下监控类型:

// CPU监控
cpuMonitor := golarm.NewCPUMonitor(threshold float64)

// 内存监控
memMonitor := golarm.NewMemoryMonitor(threshold float64)

// 磁盘监控
diskMonitor := golarm.NewDiskMonitor(mountPoint string, threshold float64)

// 自定义监控
customMonitor := golarm.NewCustomMonitor(
	name string,
	checkFunc func() (float64, error),
	threshold float64,
)

4. 使用自定义监控示例

package main

import (
	"github.com/yourusername/golarm"
	"time"
)

func getCustomMetric() (float64, error) {
	// 这里实现你的自定义指标获取逻辑
	// 例如: 数据库连接数、队列长度等
	return 42.0, nil
}

func main() {
	alarm := golarm.NewAlarm()
	
	// 添加自定义监控
	alarm.AddMonitor("custom", golarm.NewCustomMonitor(
		"custom_metric",
		getCustomMetric,
		50.0, // 阈值
	))
	
	alarm.Start()
	
	select {}
}

5. 多告警渠道支持

golarm可以轻松扩展支持多种告警渠道:

package main

import (
	"github.com/yourusername/golarm"
)

// 邮件告警处理器
type EmailAlertHandler struct {
	recipient string
}

func (h *EmailAlertHandler) Handle(alert *golarm.Alert) {
	// 实现邮件发送逻辑
}

// Slack告警处理器
type SlackAlertHandler struct {
	webhookURL string
}

func (h *SlackAlertHandler) Handle(alert *golarm.Alert) {
	// 实现Slack消息发送
}

func main() {
	alarm := golarm.NewAlarm()
	
	// 可以设置多个告警处理器
	alarm.SetAlertHandler(golarm.NewMultiHandler(
		&EmailAlertHandler{recipient: "admin@example.com"},
		&SlackAlertHandler{webhookURL: "https://hooks.slack.com/..."},
	))
	
	// 添加监控项...
	alarm.Start()
	
	select {}
}

高级功能

1. 条件组合监控

// 创建组合条件监控
compositeMonitor := golarm.NewCompositeMonitor(
	"composite",
	golarm.And( // 可以替换为 Or
		golarm.NewCPUMonitor(90),
		golarm.NewMemoryMonitor(95),
	),
)

alarm.AddMonitor("composite", compositeMonitor)

2. 恢复通知

type MyAlertHandler struct {
	lastAlertState map[string]bool
}

func (h *MyAlertHandler) Handle(alert *golarm.Alert) {
	if alert.Recovered {
		fmt.Printf("[RECOVERED] %s has returned to normal\n", alert.Name)
	} else {
		fmt.Printf("[ALERT] %s is abnormal!\n", alert.Name)
	}
}

最佳实践

  1. 在生产环境中,建议将告警间隔设置为至少30秒,避免过于频繁的告警
  2. 对于关键业务指标,建议使用组合条件减少误报
  3. 实现告警去重逻辑,避免短时间内重复告警
  4. 考虑实现告警升级机制,对于持续未恢复的告警提高告警级别

golarm设计简洁,易于扩展,你可以根据需要添加更多的监控类型和告警处理器。希望这个库能帮助你更好地监控系统状态!

回到顶部