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 相关文章推荐
golang在GRPC中设置client的超时时间
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go归并排序算法的实现方法
Apr 06 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
python中判断文件结束符的具体方法
2020/08/04 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
幼儿园教师演讲稿
2014/05/06 职场文书
群众路线个人整改方案
2014/10/25 职场文书
大学生自荐材料范文
2014/12/30 职场文书
教师求职信怎么写
2015/03/20 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2016党校学习心得体会
2016/01/07 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书