架构调整 去除elasticsearch改为ck
This commit is contained in:
		
							parent
							
								
									611fab28e7
								
							
						
					
					
						commit
						d26f484b58
					
				@ -93,28 +93,6 @@ func InitClickHouse() (fn func(), err error) {
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 初始化mysql连接
 | 
			
		||||
func InitEsClient() (fn func(), err error) {
 | 
			
		||||
	config := model.GlobConfig.Comm.ElasticSearch
 | 
			
		||||
 | 
			
		||||
	db.EsClient, err = db.NewEsClient(
 | 
			
		||||
		config.Addresses,
 | 
			
		||||
		config.Username,
 | 
			
		||||
		config.Password,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	log.Println(fmt.Sprintf("ES组件初始化成功!连接:%v,用户名:%v,密码:%v",
 | 
			
		||||
		config.Addresses,
 | 
			
		||||
		config.Username,
 | 
			
		||||
		config.Password,
 | 
			
		||||
	))
 | 
			
		||||
	fn = func() {}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 初始化redis
 | 
			
		||||
func InitRedisPool() (fn func(), err error) {
 | 
			
		||||
	config := model.GlobConfig.Comm.Redis
 | 
			
		||||
 | 
			
		||||
@ -61,7 +61,7 @@ func Init() {
 | 
			
		||||
		 error_handling,
 | 
			
		||||
		 report_type,
 | 
			
		||||
		 status)
 | 
			
		||||
		TTL part_date + toIntervalMonth(1)
 | 
			
		||||
		TTL part_date + toIntervalMonth(3)
 | 
			
		||||
		SETTINGS index_granularity = 8192;
 | 
			
		||||
`)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -69,5 +69,38 @@ func Init() {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = db.ClickHouseSqlx.Exec(`DROP TABLE IF EXISTS xwl_real_time_warehousing` + sinker.GetClusterSql() + `;`)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(fmt.Sprintf("clickhouse 删除表 xwl_real_time_warehousing 失败:%s", err.Error()))
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = db.ClickHouseSqlx.Exec(`
 | 
			
		||||
		
 | 
			
		||||
		CREATE TABLE xwl_real_time_warehousing ` + sinker.GetClusterSql() + `
 | 
			
		||||
		(
 | 
			
		||||
		
 | 
			
		||||
			table_id Int64,
 | 
			
		||||
		
 | 
			
		||||
			create_time DateTime DEFAULT now(),
 | 
			
		||||
		
 | 
			
		||||
			event_name String,
 | 
			
		||||
		
 | 
			
		||||
			report_data String
 | 
			
		||||
		)
 | 
			
		||||
		ENGINE = ` + sinker.GetMergeTree("xwl_real_time_warehousing") + ` 
 | 
			
		||||
		PARTITION BY (toYYYYMMDD(create_time))
 | 
			
		||||
		ORDER BY (toYYYYMMDD(create_time),
 | 
			
		||||
		 table_id,
 | 
			
		||||
		 event_name)
 | 
			
		||||
		TTL create_time + toIntervalMonth(3)
 | 
			
		||||
		SETTINGS index_granularity = 8192;
 | 
			
		||||
`)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(fmt.Sprintf("clickhouse 建表 xwl_real_time_warehousing 失败:%s", err.Error()))
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Println("初始化CK数据完成!")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,6 @@ func main() {
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitRbac),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitOpenWinBrowser),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitClickHouse),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitEsClient),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitRedisPool),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitDebugSarama),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,6 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/db"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/logs"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/model"
 | 
			
		||||
@ -14,6 +12,7 @@ import (
 | 
			
		||||
	parser "github.com/1340691923/xwl_bi/platform-basic-libs/sinker/parse"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/util"
 | 
			
		||||
	"github.com/valyala/fastjson"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
@ -56,19 +55,9 @@ func MysqlConsumer() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func AddRealTimeData(kafkaData model.KafkaData, data string, realTimeWarehousing *consumer_data.RealTimeWarehousing) (err error) {
 | 
			
		||||
func AddRealTimeData(realTimeWarehousingData *consumer_data.RealTimeWarehousingData, realTimeWarehousing *consumer_data.RealTimeWarehousing) (err error) {
 | 
			
		||||
 | 
			
		||||
	clientReportData := consumer_data.ClientReportData{
 | 
			
		||||
		Data:    data,
 | 
			
		||||
		TableId: kafkaData.TableId,
 | 
			
		||||
		Date:    util.Str2Time(kafkaData.ReportTime, util.TimeFormat).Format(util.TimeFormatDay4),
 | 
			
		||||
	}
 | 
			
		||||
	err = clientReportData.CreateIndex()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Logger.Error(" clientReportData.CreateIndex", zap.Error(err))
 | 
			
		||||
	}
 | 
			
		||||
	bulkIndexRequest := clientReportData.GetReportData()
 | 
			
		||||
	err = realTimeWarehousing.Add(bulkIndexRequest)
 | 
			
		||||
	err = realTimeWarehousing.Add(realTimeWarehousingData)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/application"
 | 
			
		||||
@ -69,7 +68,6 @@ func main() {
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitLogs),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitMysql),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitClickHouse),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitEsClient),
 | 
			
		||||
		application.RegisterInitFnObserver(application.InitRedisPool),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
@ -109,11 +107,9 @@ func main() {
 | 
			
		||||
	realTimeDataSarama := sinker.NewKafkaSarama()
 | 
			
		||||
	reportData2CKSarama := realTimeDataSarama.Clone()
 | 
			
		||||
	go action.MysqlConsumer()
 | 
			
		||||
 | 
			
		||||
	var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
			
		||||
	err = realTimeDataSarama.Init(model.GlobConfig.Comm.Kafka, model.GlobConfig.Comm.Kafka.ReportTopicName, model.GlobConfig.Comm.Kafka.RealTimeDataGroup, func(msg model.InputMessage, markFn func()) {
 | 
			
		||||
 | 
			
		||||
		//ETL
 | 
			
		||||
		var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
			
		||||
		var kafkaData model.KafkaData
 | 
			
		||||
		err = json.Unmarshal(msg.Value, &kafkaData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@ -121,34 +117,20 @@ func main() {
 | 
			
		||||
			markFn()
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		reportDataTmp := kafkaData.ReqData
 | 
			
		||||
		reqData, err := json.Marshal(util.Bytes2str(reportDataTmp))
 | 
			
		||||
		appid,err := strconv.Atoi(kafkaData.TableId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Logger.Error("json.Marshal Err", zap.Error(err))
 | 
			
		||||
			logs.Logger.Error("strconv.Atoi(kafkaData.TableId) Err", zap.Error(err))
 | 
			
		||||
			markFn()
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		xwlDistinctId := gjson.GetBytes(kafkaData.ReqData, "xwl_distinct_id")
 | 
			
		||||
 | 
			
		||||
		if xwlDistinctId.String() == "" {
 | 
			
		||||
			logs.Logger.Sugar().Errorf("xwl_distinct_id 为空", util.Bytes2str(kafkaData.ReqData))
 | 
			
		||||
			markFn()
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		kafkaData.Offset = msg.Offset
 | 
			
		||||
 | 
			
		||||
		buff := bytes.Buffer{}
 | 
			
		||||
		buff.WriteString(`{"event_name":"`)
 | 
			
		||||
		buff.WriteString(kafkaData.EventName)
 | 
			
		||||
		buff.WriteString(`","create_time":"`)
 | 
			
		||||
		buff.WriteString(kafkaData.ReportTime)
 | 
			
		||||
		buff.WriteString(`","data":`)
 | 
			
		||||
		buff.WriteString(util.Bytes2str(reqData))
 | 
			
		||||
		buff.WriteString(`}`)
 | 
			
		||||
		addRealTimeData := buff.String()
 | 
			
		||||
 | 
			
		||||
		//添加实时数据
 | 
			
		||||
		err = action.AddRealTimeData(kafkaData, addRealTimeData, realTimeWarehousing)
 | 
			
		||||
		err = realTimeWarehousing.Add(&consumer_data.RealTimeWarehousingData{
 | 
			
		||||
			Appid:      int64(appid),
 | 
			
		||||
			EventName:  kafkaData.EventName,
 | 
			
		||||
			CreateTime: kafkaData.ReportTime,
 | 
			
		||||
			Data:       kafkaData.ReqData,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Logger.Error("AddRealTimeData err", zap.Error(err))
 | 
			
		||||
		}
 | 
			
		||||
@ -162,7 +144,6 @@ func main() {
 | 
			
		||||
 | 
			
		||||
	err = reportData2CKSarama.Init(model.GlobConfig.Comm.Kafka, model.GlobConfig.Comm.Kafka.ReportTopicName, model.GlobConfig.Comm.Kafka.ReportData2CKGroup, func(msg model.InputMessage, markFn func()) {
 | 
			
		||||
 | 
			
		||||
		var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
			
		||||
		var kafkaData model.KafkaData
 | 
			
		||||
		err = json.Unmarshal(msg.Value, &kafkaData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@ -198,7 +179,7 @@ func main() {
 | 
			
		||||
			case model.EventReportType:
 | 
			
		||||
				eventType = "事件属性类型不合法"
 | 
			
		||||
			}
 | 
			
		||||
			reportAcceptStatus.Add(consumer_data.ReportAcceptStatusData{
 | 
			
		||||
			reportAcceptStatus.Add(&consumer_data.ReportAcceptStatusData{
 | 
			
		||||
				PartDate:       kafkaData.ReportTime,
 | 
			
		||||
				TableId:        tableId,
 | 
			
		||||
				ReportType:     eventType,
 | 
			
		||||
@ -230,7 +211,7 @@ func main() {
 | 
			
		||||
		serverT := util.Str2Time(kafkaData.ReportTime, util.TimeFormat)
 | 
			
		||||
 | 
			
		||||
		if math.Abs(serverT.Sub(clinetT).Minutes()) > 10 {
 | 
			
		||||
			reportAcceptStatus.Add(consumer_data.ReportAcceptStatusData{
 | 
			
		||||
			reportAcceptStatus.Add(&consumer_data.ReportAcceptStatusData{
 | 
			
		||||
				PartDate:       kafkaData.ReportTime,
 | 
			
		||||
				TableId:        tableId,
 | 
			
		||||
				ReportType:     kafkaData.GetReportTypeErr(),
 | 
			
		||||
@ -266,7 +247,7 @@ func main() {
 | 
			
		||||
		//新增表结构
 | 
			
		||||
		if err := action.AddTableColumn(
 | 
			
		||||
			kafkaData,
 | 
			
		||||
			func(data consumer_data.ReportAcceptStatusData) { reportAcceptStatus.Add(data) },
 | 
			
		||||
			func(data consumer_data.ReportAcceptStatusData) { reportAcceptStatus.Add(&data) },
 | 
			
		||||
			tableName,
 | 
			
		||||
			metric,
 | 
			
		||||
		); err != nil {
 | 
			
		||||
@ -281,7 +262,7 @@ func main() {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//入库成功
 | 
			
		||||
		if err := reportAcceptStatus.Add(consumer_data.ReportAcceptStatusData{
 | 
			
		||||
		if err := reportAcceptStatus.Add(&consumer_data.ReportAcceptStatusData{
 | 
			
		||||
			PartDate:       kafkaData.ReportTime,
 | 
			
		||||
			TableId:        tableId,
 | 
			
		||||
			DataName:       kafkaData.EventName,
 | 
			
		||||
 | 
			
		||||
@ -65,11 +65,6 @@
 | 
			
		||||
      "reportData2CKGroup": "reportData2CKGroup2",
 | 
			
		||||
      "realTimeDataGroup": "realTimeDataGroup2"
 | 
			
		||||
    },
 | 
			
		||||
    "elasticSearch": {
 | 
			
		||||
      "Addresses":["http://192.168.1.236:9200"],
 | 
			
		||||
      "Username":"",
 | 
			
		||||
      "Password":""
 | 
			
		||||
    },
 | 
			
		||||
    "redis": {
 | 
			
		||||
      "addr":"192.168.1.236:6379",
 | 
			
		||||
      "passwd":"",
 | 
			
		||||
 | 
			
		||||
@ -2,14 +2,18 @@ package controller
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/db"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/logs"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/jwt"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/request"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/response"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/service/consumer_data"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/service/debug_data"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/service/realdata"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/util"
 | 
			
		||||
	"github.com/gofiber/fiber/v2"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type RealDataController struct {
 | 
			
		||||
@ -21,7 +25,7 @@ func (this RealDataController) List(ctx *fiber.Ctx) error {
 | 
			
		||||
 | 
			
		||||
	type ReqData struct {
 | 
			
		||||
		Appid    int    `json:"appid"`
 | 
			
		||||
		SearchKw string `json:"search_kw"`
 | 
			
		||||
		SearchKw string `json:"searchKw"`
 | 
			
		||||
		Date     string `json:"date"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -32,18 +36,42 @@ func (this RealDataController) List(ctx *fiber.Ctx) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	appid := strconv.Itoa(reqData.Appid)
 | 
			
		||||
	searchKw := reqData.SearchKw
 | 
			
		||||
	date := reqData.Date
 | 
			
		||||
 | 
			
		||||
	clientReportData := consumer_data.ClientReportData{
 | 
			
		||||
		TableId: appid,
 | 
			
		||||
	type Res struct {
 | 
			
		||||
		CreateTime string `json:"create_time" db:"-"`
 | 
			
		||||
		CreateTimeDb time.Time `json:"-" db:"create_time"`
 | 
			
		||||
		EventName string `json:"event_name" db:"event_name"`
 | 
			
		||||
		ReportData string `json:"report_data" db:"report_data"`
 | 
			
		||||
	}
 | 
			
		||||
	res, err := clientReportData.GetList(ctx.Context(), searchKw, date)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 | 
			
		||||
	filterSql := ""
 | 
			
		||||
 | 
			
		||||
	date := strings.Split(reqData.Date,",")
 | 
			
		||||
 | 
			
		||||
	args := []interface{}{appid}
 | 
			
		||||
 | 
			
		||||
	if len(date) == 2{
 | 
			
		||||
		filterSql = filterSql+  ` and create_time >= toDateTime(?) and create_time <=toDateTime(?) `
 | 
			
		||||
		args = append(args, date[0],date[1])
 | 
			
		||||
	}
 | 
			
		||||
	logs.Logger.Sugar().Infof("reqData.SearchKw",reqData.SearchKw)
 | 
			
		||||
	if strings.TrimSpace(reqData.SearchKw)!="" {
 | 
			
		||||
		filterSql =  filterSql+ ` and event_name like '%`+reqData.SearchKw+`%' `
 | 
			
		||||
	}
 | 
			
		||||
	sql := `select report_data,event_name,create_time as create_time from xwl_real_time_warehousing where   table_id = ?    `+filterSql+` order by create_time desc limit 0,1000;`
 | 
			
		||||
	logs.Logger.Sugar().Infof("sql",sql,args)
 | 
			
		||||
	var res []Res
 | 
			
		||||
	err := db.ClickHouseSqlx.Select(&res,sql,
 | 
			
		||||
		args...,
 | 
			
		||||
	)
 | 
			
		||||
	if  err != nil {
 | 
			
		||||
		return this.Error(ctx, err)
 | 
			
		||||
	}
 | 
			
		||||
	for index:= range res{
 | 
			
		||||
		res[index].CreateTime = res[index].CreateTimeDb.Format(util.TimeFormat)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.Success(ctx, response.SearchSuccess, map[string]interface{}{"list": res.Hits.Hits})
 | 
			
		||||
	return this.Success(ctx, response.SearchSuccess, map[string]interface{}{"list": res})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//错误数据列表
 | 
			
		||||
 | 
			
		||||
@ -1,19 +0,0 @@
 | 
			
		||||
package db
 | 
			
		||||
 | 
			
		||||
import "github.com/olivere/elastic"
 | 
			
		||||
 | 
			
		||||
var EsClient *elastic.Client
 | 
			
		||||
 | 
			
		||||
func NewEsClient(address []string, username, password string) (esClient *elastic.Client, err error) {
 | 
			
		||||
	optList := []elastic.ClientOptionFunc{elastic.SetSniff(false)}
 | 
			
		||||
 | 
			
		||||
	optList = append(optList, elastic.SetURL(address...))
 | 
			
		||||
 | 
			
		||||
	if username != "" || password != "" {
 | 
			
		||||
		optList = append(optList, elastic.SetBasicAuth(username, password))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	esClient, err = elastic.NewSimpleClient(optList...)
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@ -22,7 +22,6 @@ type Config struct {
 | 
			
		||||
		Mysql MysqlConfig `json:"mysql"`
 | 
			
		||||
		ClickHouse ClickHouseConfig `json:"clickhouse"`
 | 
			
		||||
		Kafka     KafkaCfg `json:"kafka"`
 | 
			
		||||
		ElasticSearch  EsConfig `json:"elasticSearch"`
 | 
			
		||||
		Redis RedisConfig `json:"redis"`
 | 
			
		||||
	} `json:"comm"`
 | 
			
		||||
}
 | 
			
		||||
@ -50,12 +49,6 @@ type RedisConfig struct {
 | 
			
		||||
	MaxActive int    `json:"maxActive"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type EsConfig struct {
 | 
			
		||||
	Addresses []string `json:"addresses"`
 | 
			
		||||
	Username  string   `json:"username"`
 | 
			
		||||
	Password  string   `json:"password"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ClickHouseConfig struct {
 | 
			
		||||
	Username             string `json:"username"`
 | 
			
		||||
	Pwd                  string `json:"pwd"`
 | 
			
		||||
 | 
			
		||||
@ -1,118 +0,0 @@
 | 
			
		||||
package consumer_data
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/db"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/logs"
 | 
			
		||||
	"github.com/olivere/elastic"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ClientReportData struct {
 | 
			
		||||
	Data    string
 | 
			
		||||
	TableId string
 | 
			
		||||
	Date    string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ClientReportData) Name() string {
 | 
			
		||||
	return "client_report_data" + this.TableId
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ClientReportData) GetReportData() *elastic.BulkIndexRequest {
 | 
			
		||||
	return elastic.NewBulkIndexRequest().Index(this.CreateReportName()).Type(this.getTyp()).Doc(this.Data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ClientReportData) CreateIndex() (err error) {
 | 
			
		||||
 | 
			
		||||
	indexName := this.CreateReportName()
 | 
			
		||||
	indexExists, err := db.EsClient.IndexExists(indexName).Do(context.Background())
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if !indexExists {
 | 
			
		||||
		db.EsClient.CreateIndex(indexName).Body(this.createIndexStr()).Do(context.Background())
 | 
			
		||||
 | 
			
		||||
		_, err = db.EsClient.Alias().Add(indexName, this.GetAliasName()).Do(context.Background())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Logger.Error("别名创建失败", zap.Error(err))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//type
 | 
			
		||||
func (this *ClientReportData) getTyp() string {
 | 
			
		||||
	return "_doc"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//index
 | 
			
		||||
func (this *ClientReportData) GetAliasName() string {
 | 
			
		||||
	return fmt.Sprintf("%s%s", this.Name(), "_index")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ClientReportData) CreateReportName() string {
 | 
			
		||||
	return fmt.Sprintf("%v_%v", this.Name(), this.Date)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ClientReportData) GetList(ctx context.Context, searchKw, date string) (*elastic.SearchResult, error) {
 | 
			
		||||
 | 
			
		||||
	search := db.EsClient.Search(this.GetAliasName())
 | 
			
		||||
 | 
			
		||||
	dateArr := strings.Split(date, ",")
 | 
			
		||||
 | 
			
		||||
	q := elastic.NewBoolQuery()
 | 
			
		||||
 | 
			
		||||
	if len(dateArr) == 2 {
 | 
			
		||||
		q = q.Must(elastic.NewRangeQuery("create_time").
 | 
			
		||||
			Gte(dateArr[0]).
 | 
			
		||||
			Lte(dateArr[1]).IncludeLower(false).IncludeUpper(false))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if searchKw != "" {
 | 
			
		||||
		q = q.Must(elastic.NewMatchQuery("data", searchKw))
 | 
			
		||||
		highlight := elastic.NewHighlight().Field("data").PreTags("<b style='color:red'>").PostTags("</b>").NumOfFragments(0)
 | 
			
		||||
		search = search.Highlight(highlight)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return search.Query(q).Sort("create_time", false).From(0).Size(1000).Do(ctx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//创建索引字符串
 | 
			
		||||
func (this *ClientReportData) createIndexStr() string {
 | 
			
		||||
	s := `
 | 
			
		||||
		{
 | 
			
		||||
		  "settings": {
 | 
			
		||||
			"number_of_replicas": 0,
 | 
			
		||||
			"number_of_shards": 1
 | 
			
		||||
		  },
 | 
			
		||||
		  "mappings" : {
 | 
			
		||||
			  "_doc" : {
 | 
			
		||||
				"dynamic" : "false",
 | 
			
		||||
				"properties": {
 | 
			
		||||
				"event_name": {
 | 
			
		||||
					"type": "keyword"
 | 
			
		||||
				},
 | 
			
		||||
				"create_time": {
 | 
			
		||||
					"format": "yyyy-MM-dd HH:mm:ss",
 | 
			
		||||
					"type": "date"
 | 
			
		||||
				},
 | 
			
		||||
				"data": {
 | 
			
		||||
					"type": "text",
 | 
			
		||||
					"analyzer":"english",
 | 
			
		||||
					"fields": {
 | 
			
		||||
							"keyword": {
 | 
			
		||||
							  "type": "keyword"
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			  }
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	`
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
@ -1,18 +1,23 @@
 | 
			
		||||
package consumer_data
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/db"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/logs"
 | 
			
		||||
	jsoniter "github.com/json-iterator/go"
 | 
			
		||||
	"github.com/olivere/elastic"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/platform-basic-libs/util"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type RealTimeWarehousingData struct {
 | 
			
		||||
	Appid           int64
 | 
			
		||||
	EventName       string
 | 
			
		||||
	CreateTime     string
 | 
			
		||||
	Data       []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type RealTimeWarehousing struct {
 | 
			
		||||
	buffer        []*elastic.BulkIndexRequest
 | 
			
		||||
	buffer        []*RealTimeWarehousingData
 | 
			
		||||
	bufferMutex   *sync.RWMutex
 | 
			
		||||
	batchSize     int
 | 
			
		||||
	flushInterval int
 | 
			
		||||
@ -20,7 +25,7 @@ type RealTimeWarehousing struct {
 | 
			
		||||
 | 
			
		||||
func NewRealTimeWarehousing(batchSize, flushInterval int) *RealTimeWarehousing {
 | 
			
		||||
	realTimeWarehousing := &RealTimeWarehousing{
 | 
			
		||||
		buffer:        make([]*elastic.BulkIndexRequest, 0, batchSize),
 | 
			
		||||
		buffer:        make([]*RealTimeWarehousingData, 0, batchSize),
 | 
			
		||||
		bufferMutex:   new(sync.RWMutex),
 | 
			
		||||
		batchSize:     batchSize,
 | 
			
		||||
		flushInterval: flushInterval,
 | 
			
		||||
@ -37,39 +42,47 @@ func (this *RealTimeWarehousing) Flush() (err error) {
 | 
			
		||||
	this.bufferMutex.Lock()
 | 
			
		||||
	if len(this.buffer) > 0 {
 | 
			
		||||
		startNow := time.Now()
 | 
			
		||||
		var json = jsoniter.ConfigCompatibleWithStandardLibrary
 | 
			
		||||
		bulkRequest := db.EsClient.Bulk()
 | 
			
		||||
 | 
			
		||||
		tx, err := db.ClickHouseSqlx.Begin()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		stmt, err := tx.Prepare("INSERT INTO xwl_real_time_warehousing (table_id,event_name,create_time, report_data) VALUES (?,?,?)")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, buffer := range this.buffer {
 | 
			
		||||
			bulkRequest.Add(buffer)
 | 
			
		||||
		}
 | 
			
		||||
		res, err := bulkRequest.Do(context.Background())
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Logger.Error("ES出现错误,休息10秒钟继续", zap.Error(err))
 | 
			
		||||
			time.Sleep(time.Second * 10)
 | 
			
		||||
			this.Flush()
 | 
			
		||||
		} else {
 | 
			
		||||
			if res.Errors {
 | 
			
		||||
				resStr, _ := json.MarshalToString(res)
 | 
			
		||||
				logs.Logger.Error("ES出现错误", zap.String("res", resStr))
 | 
			
		||||
			} else {
 | 
			
		||||
				lostTime := time.Now().Sub(startNow).String()
 | 
			
		||||
				len := len(this.buffer)
 | 
			
		||||
				if len > 0 {
 | 
			
		||||
					logs.Logger.Info("ES入库成功", zap.String("所花时间", lostTime), zap.Int("数据长度为", len))
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			if _, err := stmt.Exec(
 | 
			
		||||
				buffer.Appid,
 | 
			
		||||
				buffer.EventName,
 | 
			
		||||
				buffer.CreateTime,
 | 
			
		||||
				util.Bytes2str(buffer.Data),
 | 
			
		||||
			); err != nil {
 | 
			
		||||
				stmt.Close()
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		this.buffer = make([]*elastic.BulkIndexRequest, 0, this.batchSize)
 | 
			
		||||
		if err := tx.Commit(); err != nil {
 | 
			
		||||
			logs.Logger.Error("入库数据状态出现错误", zap.Error(err))
 | 
			
		||||
		} else {
 | 
			
		||||
			lostTime := time.Now().Sub(startNow).String()
 | 
			
		||||
			len := len(this.buffer)
 | 
			
		||||
			if len > 0 {
 | 
			
		||||
				logs.Logger.Info("入库数据状态成功", zap.String("所花时间", lostTime), zap.Int("数据长度为", len))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		stmt.Close()
 | 
			
		||||
 | 
			
		||||
		this.buffer = make([]*RealTimeWarehousingData, 0, this.batchSize)
 | 
			
		||||
	}
 | 
			
		||||
	this.bufferMutex.Unlock()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *RealTimeWarehousing) Add(data *elastic.BulkIndexRequest) (err error) {
 | 
			
		||||
func (this *RealTimeWarehousing) Add(data *RealTimeWarehousingData) (err error) {
 | 
			
		||||
	this.bufferMutex.Lock()
 | 
			
		||||
	this.buffer = append(this.buffer, data)
 | 
			
		||||
	this.bufferMutex.Unlock()
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,6 @@ import (
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/db"
 | 
			
		||||
	"github.com/1340691923/xwl_bi/engine/logs"
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
	"log"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
@ -22,7 +21,7 @@ type ReportAcceptStatusData struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ReportAcceptStatus struct {
 | 
			
		||||
	buffer        []ReportAcceptStatusData
 | 
			
		||||
	buffer        []*ReportAcceptStatusData
 | 
			
		||||
	bufferMutex   *sync.RWMutex
 | 
			
		||||
	batchSize     int
 | 
			
		||||
	flushInterval int
 | 
			
		||||
@ -33,7 +32,7 @@ const SuccessStatus = 1
 | 
			
		||||
 | 
			
		||||
func NewReportAcceptStatus(batchSize int, flushInterval int) *ReportAcceptStatus {
 | 
			
		||||
	reportAcceptStatus := &ReportAcceptStatus{
 | 
			
		||||
		buffer:        make([]ReportAcceptStatusData, 0, batchSize),
 | 
			
		||||
		buffer:        make([]*ReportAcceptStatusData, 0, batchSize),
 | 
			
		||||
		bufferMutex:   new(sync.RWMutex),
 | 
			
		||||
		batchSize:     batchSize,
 | 
			
		||||
		flushInterval: flushInterval,
 | 
			
		||||
@ -58,16 +57,14 @@ func (this *ReportAcceptStatus) Flush() (err error) {
 | 
			
		||||
 | 
			
		||||
	tx, err := db.ClickHouseSqlx.Begin()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	stmt, err := tx.Prepare("INSERT INTO xwl_acceptance_status (status,part_date, table_id,report_type, data_name, error_reason, error_handling, report_data, xwl_kafka_offset) VALUES (?,?,?, ?, ?, ?, ?, ?, ?, ?, ?)")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer stmt.Close()
 | 
			
		||||
 | 
			
		||||
	for _, buffer := range this.buffer {
 | 
			
		||||
		if _, err := stmt.Exec(
 | 
			
		||||
			buffer.Status,
 | 
			
		||||
@ -80,27 +77,27 @@ func (this *ReportAcceptStatus) Flush() (err error) {
 | 
			
		||||
			buffer.ReportData,
 | 
			
		||||
			buffer.XwlKafkaOffset,
 | 
			
		||||
		); err != nil {
 | 
			
		||||
			log.Fatal(err)
 | 
			
		||||
			stmt.Close()
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := tx.Commit(); err != nil {
 | 
			
		||||
		logs.Logger.Error("入库数据状态出现错误", zap.Error(err))
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
		lostTime := time.Now().Sub(startNow).String()
 | 
			
		||||
		len := len(this.buffer)
 | 
			
		||||
		if len > 0 {
 | 
			
		||||
			logs.Logger.Info("入库数据状态成功", zap.String("所花时间", lostTime), zap.Int("数据长度为", len))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.buffer = make([]ReportAcceptStatusData, 0, this.batchSize)
 | 
			
		||||
	stmt.Close()
 | 
			
		||||
	this.buffer = make([]*ReportAcceptStatusData, 0, this.batchSize)
 | 
			
		||||
	this.bufferMutex.Unlock()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ReportAcceptStatus) Add(data ReportAcceptStatusData) (err error) {
 | 
			
		||||
func (this *ReportAcceptStatus) Add(data *ReportAcceptStatusData) (err error) {
 | 
			
		||||
	this.bufferMutex.Lock()
 | 
			
		||||
	this.buffer = append(this.buffer, data)
 | 
			
		||||
	this.bufferMutex.Unlock()
 | 
			
		||||
 | 
			
		||||
@ -59,8 +59,6 @@ func (this *UserReport) InflowOfKakfa() (err error) {
 | 
			
		||||
	msg.Timestamp = time.Now()
 | 
			
		||||
 | 
			
		||||
	return sendMsg(msg)
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UserReport) Put() {
 | 
			
		||||
 | 
			
		||||
@ -238,22 +238,19 @@ export default {
 | 
			
		||||
        let list = []
 | 
			
		||||
        let index = 0
 | 
			
		||||
        for (const v of res.data.list) {
 | 
			
		||||
          const _source = v['_source']
 | 
			
		||||
          _source['dataFormat'] = JSON.stringify(JSON.parse(v['_source']['data']), null, '\t')
 | 
			
		||||
          const _source = {}
 | 
			
		||||
 | 
			
		||||
          if (v.hasOwnProperty('highlight')) {
 | 
			
		||||
            _source['data'] = v['highlight']['data'][0]
 | 
			
		||||
          } else {
 | 
			
		||||
            _source['data'] = v['_source']['data']
 | 
			
		||||
          }
 | 
			
		||||
          _source['dataFormat'] = JSON.stringify(JSON.parse(v["report_data"]), null, '\t')
 | 
			
		||||
          _source['event_name'] = v["event_name"]
 | 
			
		||||
          _source['create_time'] = v["create_time"]
 | 
			
		||||
          _source['data'] = v["report_data"]
 | 
			
		||||
          _source['isFormatData'] = false
 | 
			
		||||
          _source['index'] = index
 | 
			
		||||
 | 
			
		||||
          list.push(_source)
 | 
			
		||||
          index++
 | 
			
		||||
        }
 | 
			
		||||
        list = filterData(list, this.input.trim())
 | 
			
		||||
 | 
			
		||||
        console.log("list",list)
 | 
			
		||||
        this.total = list.length
 | 
			
		||||
        this.list = list
 | 
			
		||||
        this.trueList = list
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user