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 生成对应的数据表struct定义操作
Apr 28 Golang
golang slice元素去重操作
Apr 30 Golang
go xorm框架的使用
May 22 Golang
Go 语言结构实例分析
Jul 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 实现WebSockets
Apr 24 Golang
Golang 入门 之url 包
May 04 Golang
Go语言入门exec的基本使用
May 20 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实现ODBC数据分页显示一例
2006/10/09 PHP
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
理解JS绑定事件
2016/01/19 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
python使用smtplib模块发送邮件
2020/12/17 Python
python基于openpyxl生成excel文件
2020/12/23 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
.NET初级开发工程师面试题
2014/04/18 面试题
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
《燕子》教学反思
2014/02/18 职场文书
安全目标管理责任书
2014/07/25 职场文书
商业门面租房协议书
2014/11/25 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
活动费用申请报告
2015/05/15 职场文书
开学第一天的感想
2015/08/10 职场文书
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL