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 Gin实现文件上传下载的示例代码
Apr 02 Golang
彻底理解golang中什么是nil
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang map映射的用法
Apr 22 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Python测试框架pytest核心库pluggy详解
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
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
JsDom 编程小结
2011/08/09 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
JS编程小常识很有用
2012/11/26 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
在Python中使用成员运算符的示例
2015/05/13 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
2015年安全生产责任书
2015/01/30 职场文书
红楼梦读书笔记
2015/06/25 职场文书
结婚主持人致辞
2015/07/28 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis