背景概述
上篇我们讲解了一下Yearning如何使用飞书发送工单通知,但是我最初的想法不仅仅是飞书、钉钉这些媒介,更多的是希望可以自定义集成渠道,因此想到了PrometheusAlert,这样我们就不用重新造轮子了。
大致配置
image-20240606110115965我们拿到Yearning发送的数据,当然这个数据需要我们修改一下代码哦,当我们有源数据了,那么我们就可以自定义通知渠道了,如果还不会可以扫描下方二维码一起学习交流。
环境准备
Go版本:1.20
开发工具:Goland
数据库:mysql
源代码:
https://github.com/cookieY/gemini-next.git
https://github.com/cookieY/Yearning.git
大致实现
修改代码
src/lib/ding.go
func dingMsgTplHandler(state string, generic interface{}) string {
var order imCryGeneric
// 新增
type SendOrder struct {
Order imCryGeneric
Status string `json:"status"`
}
switch v := generic.(type) {
case model.CoreSqlOrder:
order = imCryGeneric{
Assigned: v.Assigned,
WorkId: v.WorkId,
Source: v.Source,
Username: v.Username,
Text: v.Text,
}
case model.CoreQueryOrder:
order = imCryGeneric{
Assigned: v.Assigned,
WorkId: v.WorkId + i18n.DefaultLang.Load(i18n.INFO_QUERY),
Source: i18n.DefaultLang.Load(i18n.ER_QUERY_NO_DATA_SOURCE),
Username: v.Username,
Text: v.Text,
}
}
if !stateHandler(state) {
order.Assigned = "无"
}
msg := SendOrder{
Order: order,
Status: state,
}
jsonData, _ := json.Marshal(msg)
return string(jsonData)
}
src/handler/order/audit/impl.go
func ExecuteOrder(u *Confirm, user string) common.Resp {
var order model.CoreSqlOrder
var source model.CoreDataSource
model.DB().Where("work_id =?", u.WorkId).First(&order)
if order.Status != 2 && order.Status != 5 {
return common.ERR_COMMON_TEXT_MESSAGE(i18n.DefaultLang.Load(i18n.ORDER_NOT_SEARCH))
}
order.Assigned = user
model.DB().Model(model.CoreDataSource{}).Where("source_id =?", order.SourceId).First(&source)
rule, err := lib.CheckDataSourceRule(source.RuleId)
if err != nil {
logger.DefaultLogger.Error(err)
}
var isCall bool
if client := lib.NewRpc(); client != nil {
if err := client.Call("Engine.Exec", &ExecArgs{
Order: &order,
Rules: *rule,
IP: source.IP,
Port: source.Port,
Username: source.Username,
Password: lib.Decrypt(model.JWT, source.Password),
CA: source.CAFile,
Cert: source.Cert,
Key: source.KeyFile,
//Message: model.GloMessage,
}, &isCall); err != nil {
return common.ERR_RPC
}
model.DB().Create(&model.CoreWorkflowDetail{
WorkId: u.WorkId,
Username: user,
Time: time.Now().Format("2006-01-02 15:04"),
Action: i18n.DefaultLang.Load(i18n.ORDER_EXECUTE_STATE),
})
// 新增
lib.MessagePush(u.WorkId, 1, "")
return common.SuccessPayLoadToMessage(i18n.DefaultLang.Load(i18n.ORDER_EXECUTE_STATE))
}
return common.ERR_RPC
}
验证
-
提交工单
image-20240606111001505image-20240606111021035 -
审核工单
image-20240606111137782image-20240606111146046 -
执行工单
-
驳回工单
image-20240606111802580
PrometheusAlert配置
模板内容
### Yearning工单通知
**工单编号:** {{.Order.WorkId}}
**提交人员:** {{.Order.Username}}
**数据源:** {{.Order.Source}}
**下一步操作人:** {{.Order.Assigned}}
{{ if eq .Order.Assigned "执行成功" }}
**状态:** <font color="#1abefa"> {{.status}} </font>
{{ else }}
**状态:** {{.status}}
{{ end }}
**工单说明:**
> {{.Order.Text}}
消息协议JSON内容
{
"Order": {
"Assigned": "无",
"WorkId": "1f452500-2e7f-445e-96a8-648205f20876",
"Source": "test",
"Username": "zxl",
"Text": "123456"
},
"status": "执行成功"
}
我们可以根据消息JSON来自定义通知渠道,例如:钉钉、企业微信、飞书等等。
总结
承诺以上内容仅供学习。这样依赖我们就可以实现大部分渠道的通知了,即便prometheusAlert不涉及的渠道我们也可以自己写一个webhook来自定义通知。
标签:i18n,source,外置,Yearning,WorkId,工单,model,order From: https://www.cnblogs.com/cheyunhua/p/18236547