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判断key是否在map中的代码
Apr 24 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
对Golang中的FORM相关字段理解
May 02 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
golang为什么要统一错误处理
Apr 03 Golang
golang语言指针操作
Apr 14 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下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
javascript几个易错点记录
2014/11/26 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
python的urllib模块显示下载进度示例
2014/01/17 Python
python服务器与android客户端socket通信实例
2014/11/12 Python
python实现的文件夹清理程序分享
2014/11/22 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
更换Django默认的模板引擎为jinja2的实现方法
2018/05/28 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Python中实现输入一个整数的案例
2020/05/03 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
护士求职自荐信范文
2014/03/19 职场文书
毕业寄语大全
2014/04/09 职场文书
企业宣传口号
2014/06/12 职场文书
实习班主任自我评价
2015/03/11 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis