前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Prometheus-Operator:告警自动创建钉钉群

Prometheus-Operator:告警自动创建钉钉群

作者头像
用户1107783
发布2023-09-11 11:21:57
2910
发布2023-09-11 11:21:57
举报
文章被收录于专栏:云原生运维社区
案例介绍

使用gingorm实现钉钉群的crud,钉钉outgoing机制触发建群接口。当第一次点击创建群时会自动创建群,当其他人再次点击创建群时,会自动拉其进入已经创建的群并更新告警认领,当我们解决完问题后,可以触发机器人对群内人员进行移除操作,当然该群目前还是会被保留。

环境概述

代码语言:javascript
复制
# kubectl get nodes 
NAME               STATUS   ROLES                  AGE   VERSION
k8s-master-50.57   Ready    control-plane,master   96d   v1.20.5
k8s-node-50.58     Ready    <none>                 96d   v1.20.5
k8s-node-50.59     Ready    <none>                 96d   v1.20.5

# kubectl get pod -n monitoring 
NAME                                  READY   STATUS    RESTARTS   AGE
alertmanager-main-0                   2/2     Running   0          8d
alertmanager-main-1                   2/2     Running   0          8d
alertmanager-main-2                   2/2     Running   0          8d
blackbox-exporter-55c457d5fb-5m7ql    3/3     Running   0          8d
grafana-9df57cdc4-gpzsq               1/1     Running   0          8d
kube-state-metrics-56dbb74497-gpkn9   3/3     Running   0          8d
node-exporter-4wl6d                   2/2     Running   0          8d
node-exporter-b4595                   2/2     Running   0          8d
node-exporter-g4l99                   2/2     Running   0          8d
prometheus-adapter-59df95d9f5-tnt4w   1/1     Running   0          8d
prometheus-adapter-59df95d9f5-xhz5v   1/1     Running   0          8d
prometheus-k8s-0                      2/2     Running   1          8d
prometheus-k8s-1                      2/2     Running   1          10m
prometheus-operator-c46b8b7c9-mg9cv   2/2     Running   0          8d
  • golang版本:1.17.10
  • gin版本:1.9.0
  • gorm版本:1.25.1

快速开始

  1. 创建钉钉应用
  1. 创建钉钉场景群模板
  1. 场景群中添加机器人
  1. 添加群插件

群插件需要自己自行创建,当然也可以不使用插件

  1. 发布灰度进行测试 这里就不截图了,当然你也可以直接进行模板审核,只是审核时间比较长,大概需要一天左右

核心代码

  1. 数据库字段设计
代码语言:javascript
复制
type DingGroup struct {
 ID                 uint           `gorm:"primarykey" json:"id" form:"id"`
 CreatedAt          time.Time      `gorm:"column:creation_time" json:"created_at" form:"created_at"`
 UpdatedAt          time.Time      `gorm:"column:update_time" json:"updated_at" form:"updated_at"`
 DeletedAt          gorm.DeletedAt `gorm:"column:delete_time;index" json:"deleted_at" form:"deleted_at"`
 Title              string         `gorm:"comment: '群组名称';size:500;not null" json:"title" form:"title"`
 ChatID             string         `gorm:"comment: '群组ID';size:500;not null" json:"chat_id" form:"chat_id"`
 OpenConversationID string         `gorm:"comment: '群组唯一标识';size:500;not null;unique" json:"open_conversation_id" form:"open_conversation_id"`
 UserIds            string         `gorm:"comment: '群成员';type:text;not null" json:"user_ids" form:"user_ids"`
 UUID               string         `gorm:"comment: '告警UUID';size:500;not null;unique" json:"uuid" form:"uuid"`
}
  1. 创建群聊接口
代码语言:javascript
复制
func (dg *dingGroup) AddDingGroup(userid, text string) (err error) {
 alertUUID := strings.TrimSpace(text)
 // 查询该告警数据
 alertData, _ := db.PrometheusAlert.SelectPrometheusAlert(alertUUID)
 var groupMsg = model.DingGroupRequestBody{
  Title:                      alertData.AlertName,
  TemplateID:                 viper.GetString("dingGroup.templateID"),
  OwnerUserID:                viper.GetString("dingGroup.ownerUserID"),
  UserIds:                    alertData.ClaimUsers,
  UUID:                       alertData.UUID,
  ShowHistoryType:            viper.GetInt("dingGroup.ShowHistoryType"),
  ChatBannedType:             viper.GetInt("dingGroup.ChatBannedType"),
  ManagementType:             viper.GetInt("dingGroup.ManagementType"),
  OnlyAdminCanDing:           viper.GetInt("dingGroup.OnlyAdminCanDing"),
  AllMembersCanCreateMcsConf: viper.GetInt("dingGroup.AllMembersCanCreateMcsConf"),
  AddFriendForbidden:         viper.GetInt("dingGroup.AddFriendForbidden"),
  GroupLiveSwitch:            viper.GetInt("dingGroup.GroupLiveSwitch"),
  MembersToAdminChat:         viper.GetInt("dingGroup.MembersToAdminChat"),
 }
 var (
  groupInfo     model.DingGroup
  groupResInfo  model.DingGroupResponseBody
  groupUserInfo model.AddUserDingGroup
 )
 groupInfo.Title = groupMsg.Title
 groupInfo.UUID = groupMsg.UUID
 groupInfo.UserIds = groupMsg.UserIds
 err, group := db.DingGroup.AddDingGroup(groupInfo)
 common.TPLogger.Info("该群已经创建过了哦", err, group)
 if err != nil && err.Error() != "isExit" {
  common.TPLogger.Error("创建钉钉群失败了哦兄弟", err)
  return errors.New("创建钉钉群失败了哦兄弟")
 } else if err == errors.New("isExit") {
  common.TPLogger.Info("该群已经存在了")
  // 该群已经存在,直接邀请入群,并更新群成员信息
  // 邀请入群
  groupUserInfo.OpenConversationID = group.OpenConversationID
  groupUserInfo.UserIds = userid
  // 将数据库中用户列表转为切片
  _, _ = DingSend.AddUserDingGroup(&groupUserInfo)
  return nil
 }
 // 调用钉钉接口创建群
 common.TPLogger.Info("调用钉钉接口创建群")
 err, data := DingSend.CreateDingGroup(&groupMsg)
 if err != nil {
  common.TPLogger.Error("创建群失败了:", err)
  return err
 }
 common.TPLogger.Info("创建钉钉群成功了哥哥")
 _ = json.Unmarshal([]byte(data), &groupResInfo)
 // 更新群,添加管理员 chat_id  open_conversation_id
 groupInfo.ChatID = groupResInfo.Result.ChatID
 groupInfo.OpenConversationID = groupResInfo.Result.OpenConversationID
 err = db.DingGroup.UpdateDingGroup(groupInfo)
 if err != nil {
  common.TPLogger.Error("更新钉钉群失败了")
  return err
 }
 common.TPLogger.Info("更新钉钉群成功了哥哥")
 return nil
}
  1. 创建群所使用body
代码语言:javascript
复制
{
        "title":"测试群", # 群名称。
        "template_id":"c354***-***-***-b4ea-6f1ab***65", # 群模板ID
        "owner_user_id":"022*****", # 群主的userid。 
        "user_ids":"072*****,013*****", # 群成员userid列表。
        "subadmin_ids":"072*****,013*****", # 群管理员userid列表。
        "uuid":"axcf*-*****-*****-23da*", # 建群去重的业务ID,由接口调用方指定。
        "icon":"@lADOADma*****QKA", # 群头像,
        "mention_all_authority":0, # @all 权限: 0(默认):所有人都可以@all 1:仅群主可@all
        "show_history_type":0, # 新成员是否可查看聊天历史消息:0(默认):不可以查看历史记录  1:可以查看历史记录
        "validation_type":0, # 入群是否需要验证  0(默认):不验证入群   1:入群验证
        "searchable":0, # 群是否可搜索  0(默认):不可搜索  1:可搜索
        "chat_banned_type":0, # 是否开启群禁言  0(默认):不禁言   1:全员禁言
        "management_type":0,     # 管理类型 0(默认):所有人可管理  1:仅群主可管理
        "only_admin_can_ding":0, # 群内发DING权限  0(默认):所有人可发DING  1:仅群主和管理员可发DING
        "all_members_can_create_mcs_conf":1, # 群会议权限 0:仅群主和管理员可发起视频和语音会议  1(默认):所有人可发起视频和语音会议
        "all_members_can_create_calendar":0, # 群日历设置项,群内非好友/同事的成员是否可相互发起钉钉日程:  0(默认):非好友/同事的成员不可发起钉钉日程  1:非好友/同事的成员可以发起钉钉日程
        "group_email_disabled":0,  # 是否禁止发送群邮件: 0(默认):群内成员可以对本群发送群邮件  1:群内成员不可对本群发送群邮件
        "only_admin_can_set_msg_top":0,  # 置顶群消息权限  0(默认):所有人可置顶群消息  1:仅群主和管理员可置顶群消息
        "add_friend_forbidden":0, # 群成员私聊权限  0(默认):所有人可私聊  1:普通群成员之间不能够加好友、单聊,且部分功能使用受限(管理员与非管理员之间不受影响)
        "group_live_switch":1,  #  群直播权限  0:仅群主与管理员可发起直播 1(默认):群内任意成员可发起群直播
        "members_to_admin_chat":0  # 是否禁止非管理员向管理员发起单聊: 0(默认):非管理员可以向管理员发起单聊  1:禁止非管理员向管理员发起单聊
}

触发告警

点击自动创建/加入群聊

查看当前群

当前群中有自动添加的一个机器人prometheus,这是我们场景群模板中加入的,我们可以使用该群进行解散该群(只是移除除群主外的所有用于),所以我们可以重新申请一个单独的钉钉用户,仅作为创建群使用

总结

自动创建群聊功能到此已经添加完成了,大佬云集期待与你的相遇。下期内容:告警排班

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生运维圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境概述
  • 快速开始
    • 核心代码
      • 触发告警
        • 点击自动创建/加入群聊
          • 查看当前群
          • 总结
          相关产品与服务
          云直播
          云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档