go开发alertmanger实现钉钉报警


Posted in Golang onJuly 16, 2021

通过自己的url实现alertmanager的钉钉报警

webhook在alertmanger的配置

- name: 'dingding'
      webhook_configs:
      - send_resolved: true
        url: 'http://xxxx:8080/Alert'

go实现钉钉报警的程序

package main

import (
 "bytes"
 "encoding/json"
 "fmt"
 "net/http"
 "strings"
 "time"
 "log"
 "github.com/gin-gonic/gin"
)

const (
 webHook_Alert = "https://oapi.dingtalk.com/robot/send?access_token=xxxx"
)
type Message struct {
 MsgType string `json:"msgtype"`
 Text struct {
  Content string `json:"content"`
  Mentioned_list string `json:"mentioned_list"`
  Mentioned_mobile_list string `json:"mentioned_mobile_list"`
 } `json:"text"`

}
type Alert struct {
 Labels      map[string]string `json:"labels"`
 Annotations map[string]string `json:annotations`
 StartsAt    time.Time         `json:"startsAt"`
 EndsAt      time.Time         `json:"endsAt"`
}
//通知消息结构体
type Notification struct {
 Version           string            `json:"version"`
 GroupKey          string            `json:"groupKey"`
 Status            string            `json:"status"`
 Receiver          string            `json:receiver`
 GroupLabels       map[string]string `json:groupLabels`
 CommonLabels      map[string]string `json:commonLabels`
 CommonAnnotations map[string]string `json:commonAnnotations`
 ExternalURL       string            `json:externalURL`
 Alerts            []Alert           `json:alerts`
}
//获取报警信息
func getAlertInfo(notification Notification) string {
 var m Message
 m.MsgType = "text"
 msg,err := json.Marshal(notification.GroupLabels)
 if err != nil {
  log.Println("notification.GroupLabels Marshal failed",err)
 }
 msg1,err := json.Marshal(notification.CommonAnnotations["summary"])
 if err != nil {
  log.Println("notification.CommonAnnotations Marshal failed",err)
 }
 //告警消息
 var buffer bytes.Buffer
 buffer.WriteString(fmt.Sprintf("告警: %v\n",string(msg)))
 buffer.WriteString(fmt.Sprintf("Endpoint: %v\n",string(msg1)))
 buffer.WriteString(fmt.Sprintf("告警描述: \"我挂了,快来救我^OO^\"\n"))
 buffer.WriteString(fmt.Sprintf("Status:%v\n",notification.Status))
 //恢复消息
 var buffer2 bytes.Buffer
 buffer2.WriteString(fmt.Sprintf("告警: %v\n",string(msg)))
 buffer2.WriteString(fmt.Sprintf("Endpoint: %v\n",string(msg1)))
 buffer2.WriteString(fmt.Sprintf("告警描述: \"哈哈哈,我又回来了!!!\"\n"))
 //buffer2.WriteString(fmt.Sprintf("mentioned_mobile_list: %v\n",msgres["mentioned_mobile_list"]))
 buffer2.WriteString(fmt.Sprintf("Status:%v\n",notification.Status))
 if notification.Status == "resolved"{
  m.Text.Content = buffer2.String()
 }else {
  m.Text.Content = buffer.String()
 }
 jsons, err := json.Marshal(m)
 resp := string(jsons)
 return resp
}
//钉钉报警
func SendAlertDingMsg(msg string) {
 defer func() {
  if err := recover(); err != nil {
   fmt.Println("err")
  }
 }()
 content := `{"msgtype": "text",
  "text": {"content": "` + msg + `"}
 }`
 //创建一个请求
 req, err := http.NewRequest("POST", webHook_Alert, strings.NewReader(content))
 if err != nil {
  fmt.Println(err)
  fmt.Println("钉钉报警请求异常")
 }
 client := &http.Client{}
 //设置请求头
 req.Header.Set("Content-Type", "application/json; charset=utf-8")
 //发送请求
 resp, err := client.Do(req)
 if err != nil {
  // handle error
  fmt.Println(err)
  fmt.Println("顶顶报发送异常!!!")
 }
 defer resp.Body.Close()
}
func alert( c *gin.Context)  {
 var notification Notification
 err := c.BindJSON(&notification)
 if err != nil {
  c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  return
 }
 msg := getAlertInfo(notification)
 SendAlertDingMsg(msg)

}
func main()  {
 t := gin.Default()
        t.GET("/",func(c *gin.Context){
            c.String(http.StatusOK,"关于alertmanager实现钉钉报警的方法!!!!")
        })
 t.POST("/Alert",alert)
 t.Run(":8080")
}

可以通过编译二进制打包部署在k8s环境(可以参考下篇文章,如果在k8s环境中部署gin程序)

到此这篇关于go开发alertmanger实现钉钉报警的文章就介绍到这了,更多相关go 钉钉报警内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
Golang 正则匹配效率详解
Apr 25 Golang
golang slice元素去重操作
Apr 30 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang日志包的使用
Apr 20 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 #Golang
入门学习Go的基本语法
Jul 07 #Golang
golang中字符串MD5生成方式总结
Jul 04 #Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 #Golang
Go语言空白表示符_的实例用法
Jul 04 #Golang
Go 语言结构实例分析
Jul 04 #Golang
Go语言基础知识点介绍
Jul 04 #Golang
You might like
PHP+MySQL插入操作实例
2015/01/21 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
jQuery toggle()设置CSS样式
2009/11/05 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
jquery map方法使用示例
2014/04/23 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
巴西女装购物网站:Eclectic
2018/04/24 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
车间组长岗位职责
2013/12/20 职场文书
工商管理毕业生推荐信
2013/12/24 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
安全生产专项整治方案
2014/05/06 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技