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)
}
}
最佳实践
- 在生产环境中,建议将告警间隔设置为至少30秒,避免过于频繁的告警
- 对于关键业务指标,建议使用组合条件减少误报
- 实现告警去重逻辑,避免短时间内重复告警
- 考虑实现告警升级机制,对于持续未恢复的告警提高告警级别
golarm设计简洁,易于扩展,你可以根据需要添加更多的监控类型和告警处理器。希望这个库能帮助你更好地监控系统状态!