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语言map与string的相互转换的实现
Apr 07 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
golang import自定义包方式
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang 结构体数据集合
Apr 22 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Go语言编译原理之源码调试
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小程序自动提交到自助友情连接
2009/11/24 PHP
10个简化PHP开发的工具
2014/12/25 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
CCPry JS类库 代码
2009/10/30 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
Python基础学习之常见的内建函数整理
2017/09/06 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
Python语言快速上手学习方法
2018/12/14 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
PyTorch中的C++扩展实现
2020/04/02 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
Java程序员综合测试题
2014/04/25 面试题
JPA的优势都有哪些
2013/07/04 面试题
幼儿园运动会加油词
2014/02/14 职场文书
品质口号大全
2014/06/17 职场文书
考察邀请函范文
2015/01/31 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
培训感想范文
2015/08/07 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
德劲DE1108畅想
2021/04/22 无线电