|
@@ -1,6 +1,8 @@
|
|
|
package binlog
|
|
|
|
|
|
import (
|
|
|
+ edbmonitor "eta/eta_api/models/edb_monitor"
|
|
|
+ edbmonitorSvr "eta/eta_api/services/edb_monitor"
|
|
|
"eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
"reflect"
|
|
@@ -9,9 +11,30 @@ import (
|
|
|
"github.com/go-mysql-org/go-mysql/canal"
|
|
|
"github.com/go-mysql-org/go-mysql/mysql"
|
|
|
"github.com/go-mysql-org/go-mysql/replication"
|
|
|
- "github.com/pingcap/errors"
|
|
|
+ "github.com/go-mysql-org/go-mysql/schema"
|
|
|
)
|
|
|
|
|
|
+type EdbInfoBingLog struct {
|
|
|
+ EdbInfoId int `orm:"column(edb_info_id);pk"`
|
|
|
+ EdbInfoType int `description:"指标类型,0:普通指标,1:预测指标"`
|
|
|
+ Source int `description:"来源id"`
|
|
|
+ EdbCode string `description:"指标编码"`
|
|
|
+ StartDate string `description:"起始日期"`
|
|
|
+ EndDate string `description:"终止日期"`
|
|
|
+ UniqueCode string `description:"指标唯一编码"`
|
|
|
+ CreateTime string
|
|
|
+ ModifyTime string
|
|
|
+ BaseModifyTime string
|
|
|
+ MinValue float64 `description:"指标最小值"`
|
|
|
+ MaxValue float64 `description:"指标最大值"`
|
|
|
+ LatestDate string `description:"数据最新日期(实际日期)"`
|
|
|
+ LatestValue float64 `description:"数据最新值(实际值)"`
|
|
|
+ EndValue float64 `description:"数据的最新值(预测日期的最新值)"`
|
|
|
+ DataUpdateTime string `description:"最近一次数据发生变化的时间"`
|
|
|
+ ErDataUpdateDate string `description:"本次更新,数据发生变化的最早日期"`
|
|
|
+ SubSource int `description:"子数据来源:0:经济数据库,1:日期序列"`
|
|
|
+}
|
|
|
+
|
|
|
type EdbEventHandler struct {
|
|
|
canal.DummyEventHandler
|
|
|
fileName string
|
|
@@ -24,12 +47,16 @@ func (h *EdbEventHandler) OnRow(e *canal.RowsEvent) (err error) {
|
|
|
switch e.Action {
|
|
|
case canal.InsertAction:
|
|
|
err = h.Insert(e)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("binlog insert error:", err)
|
|
|
+ }
|
|
|
case canal.UpdateAction:
|
|
|
err = h.Update(e)
|
|
|
- case canal.DeleteAction:
|
|
|
- err = h.Delete(e)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("binlog update error:", err)
|
|
|
+ }
|
|
|
default:
|
|
|
- return errors.New("操作异常")
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
fmt.Println("fileName:", h.fileName, ";position:", h.position)
|
|
@@ -53,28 +80,35 @@ func (h *EdbEventHandler) OnPosSynced(header *replication.EventHeader, p mysql.P
|
|
|
}
|
|
|
|
|
|
func (h *EdbEventHandler) String() string {
|
|
|
- return "MyEventHandler"
|
|
|
+ return "EdbEventHandler"
|
|
|
}
|
|
|
|
|
|
func (h *EdbEventHandler) Insert(e *canal.RowsEvent) error {
|
|
|
// 批量插入的时候,e.Rows的长度会大于0
|
|
|
fmt.Println(e.Header.ServerID, ";", e.Table.Schema, ".", e.Table.Name)
|
|
|
+ edbMonitorList, err := edbmonitor.GetEdbMonitorEdbInfoList()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ edbMonitorMap := make(map[int][]*edbmonitor.EdbMonitorInfo)
|
|
|
+ for _, v := range edbMonitorList {
|
|
|
+ if _, ok := edbMonitorMap[v.EdbInfoId]; !ok {
|
|
|
+ edbMonitorMap[v.EdbInfoId] = make([]*edbmonitor.EdbMonitorInfo, 0)
|
|
|
+ }
|
|
|
+ edbMonitorMap[v.EdbInfoId] = append(edbMonitorMap[v.EdbInfoId], v)
|
|
|
+ }
|
|
|
|
|
|
for _, row := range e.Rows { // 遍历当前插入的数据列表(存在批量插入的情况,所以是list)
|
|
|
- logData := make(map[string]interface{})
|
|
|
- dataLen := len(row)
|
|
|
- for i, v := range e.Table.Columns {
|
|
|
- if i < dataLen {
|
|
|
- tmpData := row[i]
|
|
|
- if tmpData != nil && reflect.TypeOf(tmpData).Kind() == reflect.Slice {
|
|
|
- tmpOld := tmpData.([]byte)
|
|
|
- tmpData = string(tmpOld)
|
|
|
+ edbInfo := h.MapRowToStruct(e.Table.Columns, row)
|
|
|
+ if monitors, ok := edbMonitorMap[edbInfo.EdbInfoId]; ok {
|
|
|
+ for _, monitor := range monitors {
|
|
|
+ err = edbmonitorSvr.ModifyEdbMonitorState(monitor, edbInfo.EdbCode, edbInfo.Source, edbInfo.SubSource)
|
|
|
+ if err != nil {
|
|
|
+ continue
|
|
|
}
|
|
|
- logData[v.Name] = tmpData
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
return nil
|
|
|
}
|
|
|
|
|
@@ -84,78 +118,78 @@ func (h *EdbEventHandler) Update(e *canal.RowsEvent) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
- logOldData := make(map[string]interface{})
|
|
|
- logNewData := make(map[string]interface{})
|
|
|
-
|
|
|
- oldDataLen := len(e.Rows[0])
|
|
|
- newDataLen := len(e.Rows[0])
|
|
|
- for i, v := range e.Table.Columns {
|
|
|
-
|
|
|
- if i < oldDataLen {
|
|
|
- oldData := e.Rows[0][i]
|
|
|
- if oldData != nil && reflect.TypeOf(oldData).Kind() == reflect.Slice {
|
|
|
- tmpOld := oldData.([]byte)
|
|
|
- oldData = string(tmpOld)
|
|
|
- }
|
|
|
- logOldData[v.Name] = oldData
|
|
|
- }
|
|
|
- if i < newDataLen {
|
|
|
- newData := e.Rows[1][i]
|
|
|
- if newData != nil && reflect.TypeOf(newData).Kind() == reflect.Slice {
|
|
|
- tmpNew := newData.([]byte)
|
|
|
- newData = string(tmpNew)
|
|
|
- }
|
|
|
- logNewData[v.Name] = newData
|
|
|
+ edbMonitorList, err := edbmonitor.GetEdbMonitorEdbInfoList()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ edbMonitorMap := make(map[int][]*edbmonitor.EdbMonitorInfo)
|
|
|
+ for _, v := range edbMonitorList {
|
|
|
+ if _, ok := edbMonitorMap[v.EdbInfoId]; !ok {
|
|
|
+ edbMonitorMap[v.EdbInfoId] = make([]*edbmonitor.EdbMonitorInfo, 0)
|
|
|
}
|
|
|
-
|
|
|
+ edbMonitorMap[v.EdbInfoId] = append(edbMonitorMap[v.EdbInfoId], v)
|
|
|
}
|
|
|
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (h *EdbEventHandler) Delete(e *canal.RowsEvent) error {
|
|
|
- // 批量删除的时候,e.Rows的长度会大于0
|
|
|
- fmt.Println(e.Header.ServerID, ";", e.Table.Schema, ".", e.Table.Name)
|
|
|
-
|
|
|
- for _, row := range e.Rows { // 遍历当前插入的数据列表(存在批量插入的情况,所以是list)
|
|
|
- logData := make(map[string]interface{})
|
|
|
- dataLen := len(row)
|
|
|
- for i, v := range e.Table.Columns {
|
|
|
- if i < dataLen {
|
|
|
- tmpData := row[i]
|
|
|
- if tmpData != nil && reflect.TypeOf(tmpData).Kind() == reflect.Slice {
|
|
|
- tmpOld := tmpData.([]byte)
|
|
|
- tmpData = string(tmpOld)
|
|
|
- }
|
|
|
- logData[v.Name] = tmpData
|
|
|
+ edbInfo := h.MapRowToStruct(e.Table.Columns, e.Rows[1])
|
|
|
+ if monitors, ok := edbMonitorMap[edbInfo.EdbInfoId]; ok {
|
|
|
+ for _, monitor := range monitors {
|
|
|
+ err = edbmonitorSvr.ModifyEdbMonitorState(monitor, edbInfo.EdbCode, edbInfo.Source, edbInfo.SubSource)
|
|
|
+ if err != nil {
|
|
|
+ continue
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (h *EdbEventHandler) Delete3(e *canal.RowsEvent) error {
|
|
|
- if len(e.Rows) != 1 {
|
|
|
- fmt.Println("删除数据异常,没有原始数据:", e.Rows)
|
|
|
- return nil
|
|
|
- }
|
|
|
- fmt.Println(e.Header.ServerID, ";", e.Table.Schema, ".", e.Table.Name)
|
|
|
-
|
|
|
- dataLen := len(e.Rows[0])
|
|
|
- logData := make(map[string]interface{})
|
|
|
- for i, v := range e.Table.Columns {
|
|
|
- if i < dataLen {
|
|
|
- tmpData := e.Rows[0][i]
|
|
|
- if tmpData != nil && reflect.TypeOf(tmpData).Kind() == reflect.Slice {
|
|
|
- tmpOld := tmpData.([]byte)
|
|
|
- tmpData = string(tmpOld)
|
|
|
+func (h *EdbEventHandler) MapRowToStruct(columns []schema.TableColumn, row []interface{}) EdbInfoBingLog {
|
|
|
+ edbInfo := EdbInfoBingLog{}
|
|
|
+ for i, column := range columns {
|
|
|
+ value := reflect.ValueOf(row[i])
|
|
|
+ switch column.Name {
|
|
|
+ case "edb_info_id":
|
|
|
+ edbInfo.EdbInfoId = int(value.Int())
|
|
|
+ case "edb_info_type":
|
|
|
+ edbInfo.EdbInfoType = int(value.Uint())
|
|
|
+ case "source":
|
|
|
+ edbInfo.Source = int(value.Int())
|
|
|
+ case "edb_code":
|
|
|
+ edbInfo.EdbCode = value.String()
|
|
|
+ case "start_date":
|
|
|
+ edbInfo.StartDate = value.String()
|
|
|
+ case "end_date":
|
|
|
+ edbInfo.EndDate = value.String()
|
|
|
+ case "unique_code":
|
|
|
+ edbInfo.UniqueCode = value.String()
|
|
|
+ case "create_time":
|
|
|
+ edbInfo.CreateTime = value.String()
|
|
|
+ case "modify_time":
|
|
|
+ edbInfo.ModifyTime = value.String()
|
|
|
+ case "base_modify_time":
|
|
|
+ if value.IsValid() {
|
|
|
+ edbInfo.BaseModifyTime = value.String()
|
|
|
}
|
|
|
- logData[v.Name] = tmpData
|
|
|
+ case "min_value":
|
|
|
+ edbInfo.MinValue = value.Float()
|
|
|
+ case "max_value":
|
|
|
+ edbInfo.MaxValue = value.Float()
|
|
|
+ case "latest_date":
|
|
|
+ edbInfo.LatestDate = value.String()
|
|
|
+ case "latest_value":
|
|
|
+ edbInfo.LatestValue = value.Float()
|
|
|
+ case "end_value":
|
|
|
+ edbInfo.EndValue = value.Float()
|
|
|
+ case "data_update_time":
|
|
|
+ edbInfo.DataUpdateTime = value.String()
|
|
|
+ case "er_data_update_date":
|
|
|
+ edbInfo.ErDataUpdateDate = value.String()
|
|
|
+ case "sub_source":
|
|
|
+ edbInfo.SubSource = int(value.Int())
|
|
|
+ default:
|
|
|
+ continue
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return nil
|
|
|
+ return edbInfo
|
|
|
}
|
|
|
|
|
|
// SetBinlogFileName
|