فهرست منبع

wip:告警机制

wangshan 1 سال پیش
والد
کامیت
93874fdd01

+ 6 - 5
rpc/partnerlib/crontab/service/service.go

@@ -6,6 +6,7 @@ import (
 	. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/config"
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/service"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/warn"
 	"app.yhyue.com/moapp/jy_docs/services/partner"
 	"app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/date"
@@ -43,7 +44,7 @@ func SyncDocinInfo(cron config.Cron) {
 			entity.SyncExpectTotal = entity.SyncExpectTotal + et
 			entity.SyncActualTotal = entity.SyncActualTotal + at
 			if err != nil {
-				log.Println("保存docin 文档失败:", err.Error()) //todo 发送异常信号
+				go warn.SendMsgByWXURL(fmt.Sprintf("同步豆丁数据到tidb失败:%s,当前任务执行参数:%v", err.Error(), cron))
 			} else if lastId > 0 {
 				//周期内数据未同步完成
 				cron.StartId = lastId
@@ -56,7 +57,7 @@ func SyncDocinInfo(cron config.Cron) {
 			}
 		}
 	} else {
-		log.Println("获取doc文库列表失败:", err.Error()) //todo 发送异常信号
+		go warn.SendMsgByWXURL(fmt.Sprintf("获取豆丁数据列表失败:%s,当前任务执行参数:%v", err.Error(), cron))
 	}
 	//缓存 保存最后一次更新id
 	if b := partner.SetDocsStartId(entity.RedisCode, cron.StartIdKey, cron.StartId, -1); !b {
@@ -85,7 +86,7 @@ func UpdateDocinInfo(cron config.Cron) {
 		endDate = date.NowFormat(date.Date_yyyyMMdd)
 	}
 	if startDate == "" || endDate == "" || count == 0 || gconv.Int64(startDate) >= gconv.Int64(endDate) {
-		log.Println("timetask 保存 docin 文档失败--参数异常:startId:", startId, "--startDate:", startDate, "--endDate:", endDate, "--count:", count) //todo 发送异常信号
+		go warn.SendMsgByWXURL(fmt.Sprintf("timetask 保存 docin 文档失败--参数异常:startId:%d --startDate:%s --endDate:%s--count:%d", startId, startDate, endDate, count))
 		return
 	}
 	h := service.NewHH(I.Docin.Name, I.Docin.Host, I.Docin.UpdateList.Name, I.Docin.UpdateList.Pathname, I.Docin.UpdateList.Method, map[string]interface{}{
@@ -106,7 +107,7 @@ func UpdateDocinInfo(cron config.Cron) {
 			entity.UpdateExpectTotal = entity.UpdateExpectTotal + et
 			entity.UpdateActualTotal = entity.UpdateActualTotal + at
 			if err != nil {
-				log.Println("更新 docin 文档失败:", err.Error()) //todo 发送异常信号
+				go warn.SendMsgByWXURL(fmt.Sprintf("更新豆丁数据到tidb失败:%s,当前任务执行参数:%v", err.Error(), cron))
 			} else if lastId > 0 {
 				cron.StartId = lastId
 				//周期内数据未同步完成
@@ -119,7 +120,7 @@ func UpdateDocinInfo(cron config.Cron) {
 			}
 		}
 	} else {
-		log.Println("更新 doc文库列表失败:", err.Error()) //todo 发送异常信号
+		go warn.SendMsgByWXURL(fmt.Sprintf("获取豆丁更新数据失败:%s,当前任务执行参数:%v", err.Error(), cron))
 	}
 	//缓存数据处理
 	partner.SetUpdateTaskInfo(entity.RedisCode, cron.StartDateKey, endDate, -1)

+ 2 - 2
rpc/partnerlib/etc/interface.yaml

@@ -1,8 +1,8 @@
 Docin:
   Name: 豆丁
   Host: https://t.docin.com
-  AppId: 1000
-  AppSecret: jianyu
+  AppId: QHXKW0Z4JPM0GZXK
+  AppSecret: tYLwu4fk7BQsS8WgP2g3o1BZv5Mxm2Ta
   DocList:
     Name: 文档列表接口
     Pathname: /api/jianyu/getProducts.do

+ 2 - 0
rpc/partnerlib/etc/warn.yaml

@@ -0,0 +1,2 @@
+WebhookURL:
+  - https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=78864582-d770-452f-a55d-e8d17c647f31

+ 3 - 0
rpc/partnerlib/init/init.go

@@ -12,15 +12,18 @@ var (
 	configFile    = flag.String("c", "etc/partner.yaml", "the partner file")
 	interfaceFile = flag.String("i", "etc/interface.yaml", "the interface file")
 	crontabFile   = flag.String("cron", "etc/crontab.yaml", "the crontab file")
+	warnFile      = flag.String("warn", "etc/warn.yaml", "the warn file")
 	C             config.Config
 	I             config.InterfaceInfo
 	Cron          config.CrontabInfo
+	Warn          config.Warn
 )
 
 func init() {
 	conf.MustLoad(*configFile, &C)
 	conf.MustLoad(*interfaceFile, &I)
 	conf.MustLoad(*crontabFile, &Cron)
+	conf.MustLoad(*warnFile, &Warn)
 	if C.JyDocsMysqlDB.DataSourceName != "" && C.EsConfig.Addr != "" {
 		jyDocsRpcUtil.InitDB(C.JyDocsMysqlDB.DataSourceName, C.JyDocsMysqlDB.DriverName, C.JyDocsMysqlDB.MaxOpenConn, C.JyDocsMysqlDB.MaxIdleConn)
 		jyDocsRpcUtil.InitEs(C.EsConfig.Addr, C.EsConfig.Pool, C.EsConfig.UserName, C.EsConfig.Password)

+ 5 - 0
rpc/partnerlib/internal/config/warn.go

@@ -0,0 +1,5 @@
+package config
+
+type Warn struct {
+	WebhookURL []string
+}

+ 7 - 1
rpc/partnerlib/internal/logic/docdownloadlogic.go

@@ -2,7 +2,9 @@ package logic
 
 import (
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/service"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/warn"
 	"context"
+	"fmt"
 
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/svc"
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
@@ -25,5 +27,9 @@ func NewDocDownloadLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DocDo
 }
 
 func (l *DocDownloadLogic) DocDownload(in *partnerlib.UserDownloadRequest) (*partnerlib.CommonResponse, error) {
-	return service.DocDownload(in)
+	res, err := service.DocDownload(in)
+	if err != nil {
+		go warn.SendMsgByWXURL(fmt.Sprintf("文档下载异常:%s,下载参数:%v", err.Error(), in))
+	}
+	return res, err
 }

+ 7 - 1
rpc/partnerlib/internal/logic/userbuylogic.go

@@ -2,7 +2,9 @@ package logic
 
 import (
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/service"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/warn"
 	"context"
+	"fmt"
 
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/svc"
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
@@ -25,5 +27,9 @@ func NewUserBuyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserBuyLo
 }
 
 func (l *UserBuyLogic) UserBuy(in *partnerlib.UserBuyVipRequest) (*partnerlib.CommonResponse, error) {
-	return service.UBHandle(in)
+	res, err := service.UBHandle(in)
+	if err != nil {
+		go warn.SendMsgByWXURL(fmt.Sprintf("精品文档购买异常:%s,下载参数:%v", err.Error(), in))
+	}
+	return res, err
 }

+ 2 - 4
rpc/partnerlib/service/service.go

@@ -66,8 +66,7 @@ func (h *HH) HttpFunc() (body []byte, err error) {
 	// 创建 请求并添加查询参数
 	req, _err := http.NewRequest(h.Method, href, bb)
 	if _err != nil {
-		fmt.Println("Error creating GET request:", _err)
-		err = _err
+		err = fmt.Errorf("error creating GET request:%v", _err)
 		return
 	}
 	// 添加请求头
@@ -82,8 +81,7 @@ func (h *HH) HttpFunc() (body []byte, err error) {
 	// 使用 Do 方法处理请求
 	resp, _err := client.Do(req)
 	if _err != nil {
-		log.Println("Failed to create client", http.StatusInternalServerError)
-		err = _err
+		err = fmt.Errorf("failed to create client:%v", http.StatusInternalServerError)
 		return
 	}
 	defer resp.Body.Close()

+ 44 - 1
rpc/partnerlib/warn/warn.go

@@ -1,3 +1,46 @@
 package warn
 
-//TODO docin 更新保存异常告警
+import (
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"bytes"
+	"encoding/json"
+	"log"
+	"net/http"
+)
+
+// TODO docin 更新保存异常告警
+func SendMsgByWXURL(msg string) {
+	log.Println("warn msg:", msg)
+	if len(IC.Warn.WebhookURL) > 0 {
+		for _, url := range IC.Warn.WebhookURL {
+			if ok := SendBot(url, msg); !ok {
+				log.Println("数据加载异常 企业微信机器人提醒失败--:", url, msg)
+			}
+		}
+	}
+}
+
+func SendBot(webhookURL, msg string) (b bool) {
+	// 构造请求体
+	payload := map[string]interface{}{
+		"msgtype": "text",
+		"text": map[string]string{
+			"content": msg,
+		},
+	}
+	// 转换为 JSON 字符串
+	payloadBytes, err := json.Marshal(payload)
+	if err != nil {
+		log.Println("Error :", err.Error())
+		return
+	}
+	// 发送 POST 请求
+	resp, err := http.Post(webhookURL, "application/json", bytes.NewReader(payloadBytes))
+	if err != nil {
+		log.Println("Error :", err.Error())
+		return
+	}
+	defer resp.Body.Close()
+	b = true
+	return
+}

+ 6 - 0
services/partner/elastic.go

@@ -0,0 +1,6 @@
+package partner
+
+// 同步豆丁文档到es
+func SyncDocsToES() (err error) {
+	return
+}