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 自定义package包设置与导入操作
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Go timer如何调度
Jun 09 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Golang jwt身份认证
Apr 20 Golang
Golang并发工具Singleflight
May 06 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python中cPickle用法例子分享
2014/01/03 Python
python验证码识别的实例详解
2016/09/09 Python
python中的global关键字的使用方法
2019/08/20 Python
Python使用Matlab命令过程解析
2020/06/04 Python
用python发送微信消息
2020/12/21 Python
护理毕业生自我鉴定
2014/02/11 职场文书
内勤主管岗位职责
2014/04/03 职场文书
财务整改报告范文
2014/11/05 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
Python基础之条件语句详解
2021/06/16 Python
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript