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语言中json数据的读取和写出操作
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
golang语言指针操作
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Go获取两个时区的时间差
Apr 20 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
PHP反射基础知识回顾
2020/09/10 PHP
jQuery getJSON 处理json数据的代码
2010/07/26 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
checkbox在vue中的用法小结
2018/11/13 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
Python检测网站链接是否已存在
2016/04/07 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
《Python学习手册》学习总结
2018/01/17 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
python Pillow图像处理方法汇总
2019/10/16 Python
python 的topk算法实例
2020/04/02 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
学生学习总结的自我评价
2013/10/22 职场文书
市场调查策划方案
2014/06/10 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
2014年采购部工作总结
2014/11/20 职场文书
教师研修随笔感言
2015/11/18 职场文书
学生会部长竞选稿
2015/11/19 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS