背景概述
上篇我們講解了一下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來自定義通知。