Bläddra i källkod

工程初始化

#Suyghur 3 år sedan
förälder
incheckning
10f8b8d6cd
88 ändrade filer med 9281 tillägg och 0 borttagningar
  1. 8 0
      .idea/.gitignore
  2. 8 0
      .idea/modules.xml
  3. 6 0
      .idea/vcs.xml
  4. 9 0
      .idea/ylink_server.iml
  5. 30 0
      call/rpc/Dockerfile
  6. 56 0
      call/rpc/call.go
  7. 57 0
      call/rpc/call/call.go
  8. 17 0
      call/rpc/etc/call.yaml
  9. 12 0
      call/rpc/internal/config/config.go
  10. 168 0
      call/rpc/internal/core/communication.go
  11. 201 0
      call/rpc/internal/core/condition.go
  12. 7 0
      call/rpc/internal/core/config.go
  13. 281 0
      call/rpc/internal/core/server.go
  14. 43 0
      call/rpc/internal/handler/handler_from_player_msg.go
  15. 53 0
      call/rpc/internal/handler/handler_from_service_msg.go
  16. 42 0
      call/rpc/internal/handler/handler_get_player_chat_log.go
  17. 13 0
      call/rpc/internal/handler/handler_player_logout.go
  18. 47 0
      call/rpc/internal/handler/handler_service_reply.go
  19. 230 0
      call/rpc/internal/interaction/inter_db.go
  20. 82 0
      call/rpc/internal/logic/client_call_logic.go
  21. 117 0
      call/rpc/internal/logic/client_login_logic.go
  22. 77 0
      call/rpc/internal/logic/service_call_logic.go
  23. 90 0
      call/rpc/internal/logic/service_login_logic.go
  24. 57 0
      call/rpc/internal/role/base_role.go
  25. 23 0
      call/rpc/internal/role/player.go
  26. 30 0
      call/rpc/internal/role/service.go
  27. 42 0
      call/rpc/internal/server/call_server.go
  28. 22 0
      call/rpc/internal/svc/service_context.go
  29. 469 0
      call/rpc/pb/call.pb.go
  30. 422 0
      call/rpc/pb/commands.pb.go
  31. 629 0
      call/rpc/pb/message.pb.go
  32. 41 0
      call/rpc/proto/call.proto
  33. 80 0
      call/rpc/proto/commands.proto
  34. 56 0
      call/rpc/proto/message.proto
  35. 31 0
      db/api/db_api.go
  36. 12 0
      db/api/db_req.api
  37. 9 0
      db/api/etc/db_api.yaml
  38. 11 0
      db/api/internal/config/config.go
  39. 28 0
      db/api/internal/handler/api_test_handler.go
  40. 22 0
      db/api/internal/handler/routes.go
  41. 54 0
      db/api/internal/logic/api_test_logic.go
  42. 19 0
      db/api/internal/svc/service_context.go
  43. 10 0
      db/api/internal/types/types.go
  44. 109 0
      db/model/chat_configs_model.go
  45. 7 0
      db/model/chat_sensitive_words.sql
  46. 107 0
      db/model/chat_sensitive_words_model.go
  47. 8 0
      db/model/configs.sql
  48. 147 0
      db/model/configs_model.go
  49. 5 0
      db/model/vars.go
  50. 30 0
      db/rpc/Dockerfile
  51. 51 0
      db/rpc/db.go
  52. 55 0
      db/rpc/db/db.go
  53. 28 0
      db/rpc/etc/db.yaml
  54. 14 0
      db/rpc/internal/config/config.go
  55. 40 0
      db/rpc/internal/handler/handler_get_chat_log.go
  56. 39 0
      db/rpc/internal/handler/handler_get_chat_record.go
  57. 27 0
      db/rpc/internal/handler/handler_get_config.go
  58. 30 0
      db/rpc/internal/handler/handler_push_chat_log.go
  59. 28 0
      db/rpc/internal/handler/handler_push_chat_record.go
  60. 53 0
      db/rpc/internal/logic/db_call_logic.go
  61. 65 0
      db/rpc/internal/logic/db_login_logic.go
  62. 50 0
      db/rpc/internal/logic/get_sensitive_words_logic.go
  63. 39 0
      db/rpc/internal/server/db_server.go
  64. 25 0
      db/rpc/internal/svc/service_context.go
  65. 94 0
      db/rpc/logs/db/Suyghurs-MacBook-Pro.local/access.log
  66. 10 0
      db/rpc/logs/db/Suyghurs-MacBook-Pro.local/error.log
  67. 0 0
      db/rpc/logs/db/Suyghurs-MacBook-Pro.local/severe.log
  68. 0 0
      db/rpc/logs/db/Suyghurs-MacBook-Pro.local/slow.log
  69. 993 0
      db/rpc/logs/db/Suyghurs-MacBook-Pro.local/stat.log
  70. 547 0
      db/rpc/pb/db.pb.go
  71. 252 0
      db/rpc/pb/db_cmds.pb.go
  72. 818 0
      db/rpc/pb/db_msg.pb.go
  73. 39 0
      db/rpc/proto/db.proto
  74. 25 0
      db/rpc/proto/db_cmds.proto
  75. 66 0
      db/rpc/proto/db_msg.proto
  76. 18 0
      demo/data/data.go
  77. 112 0
      demo/player/player.go
  78. 160 0
      demo/service/service.go
  79. 79 0
      go.mod
  80. 778 0
      go.sum
  81. 98 0
      public/common/common.go
  82. 37 0
      public/common/obj_mgr.go
  83. 83 0
      public/common/queue.go
  84. 34 0
      public/common/single_class_mgr.go
  85. 100 0
      public/doc/cmd.md
  86. 10 0
      public/es/config.go
  87. 173 0
      public/es/es_mgr.go
  88. 77 0
      public/exception/exception.go

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/ylink_server.iml" filepath="$PROJECT_DIR$/.idea/ylink_server.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 9 - 0
.idea/ylink_server.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="Go" enabled="true" />
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 30 - 0
call/rpc/Dockerfile

@@ -0,0 +1,30 @@
+# image-name: call
+
+FROM golang:alpine AS builder
+
+LABEL stage=gobuilder
+
+ENV CGO_ENABLED 0
+ENV GOOS linux
+ENV GOPROXY https://goproxy.cn,direct
+
+WORKDIR /build/zero
+
+ADD go.mod .
+ADD go.sum .
+RUN go mod download
+COPY . .
+COPY call/rpc/etc /app/etc
+RUN go build -ldflags="-s -w" -o /app/call call/rpc/call.go
+
+
+FROM alpine
+
+RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
+ENV TZ Asia/Shanghai
+
+WORKDIR /app
+COPY --from=builder /app/call /app/call
+COPY --from=builder /app/etc /app/etc
+
+CMD ["./call", "-f", "etc/call.yaml"]

+ 56 - 0
call/rpc/call.go

@@ -0,0 +1,56 @@
+package main
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/pb"
+	logic "call_center/public/common"
+	"flag"
+	"fmt"
+
+	"call_center/call/rpc/internal/config"
+	"call_center/call/rpc/internal/server"
+	"call_center/call/rpc/internal/svc"
+
+	"github.com/tal-tech/go-zero/core/conf"
+	"github.com/tal-tech/go-zero/core/service"
+	"github.com/tal-tech/go-zero/zrpc"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+)
+
+var configFile = flag.String("f", "etc/call.yaml", "the config file")
+
+func main() {
+
+	flag.Parse()
+
+	logic.PreCheckConfig(*configFile)
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+	ctx := svc.NewServiceContext(c)
+	srv := server.NewCallServer(ctx)
+
+	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
+		pb.RegisterCallServer(grpcServer, srv)
+
+		switch c.Mode {
+		case service.DevMode, service.TestMode:
+			reflection.Register(grpcServer)
+		default:
+		}
+
+	})
+	defer s.Stop()
+
+	// core server init
+	core.ServerInit(c.CoreConf)
+
+	// start db
+	if ctx.Db != nil {
+		go ctx.Db.Start()
+	}
+
+	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
+	s.Start()
+}

+ 57 - 0
call/rpc/call/call.go

@@ -0,0 +1,57 @@
+// Code generated by goctl. DO NOT EDIT!
+// Source: call.proto
+
+package call
+
+import (
+	"context"
+
+	"call_center/call/rpc/pb"
+
+	"github.com/tal-tech/go-zero/zrpc"
+	"google.golang.org/grpc"
+)
+
+type (
+	ClientMsgReq  = pb.ClientMsgReq
+	ClientMsgRes  = pb.ClientMsgRes
+	ServiceMsgReq = pb.ServiceMsgReq
+	ServiceMsgRes = pb.ServiceMsgRes
+
+	Call interface {
+		ClientLogin(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (pb.Call_ClientLoginClient, error)
+		ClientCall(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (*ClientMsgRes, error)
+		ServiceLogin(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (pb.Call_ServiceLoginClient, error)
+		ServiceCall(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (*ServiceMsgRes, error)
+	}
+
+	defaultCall struct {
+		cli zrpc.Client
+	}
+)
+
+func NewCall(cli zrpc.Client) Call {
+	return &defaultCall{
+		cli: cli,
+	}
+}
+
+func (m *defaultCall) ClientLogin(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (pb.Call_ClientLoginClient, error) {
+	client := pb.NewCallClient(m.cli.Conn())
+	return client.ClientLogin(ctx, in, opts...)
+}
+
+func (m *defaultCall) ClientCall(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (*ClientMsgRes, error) {
+	client := pb.NewCallClient(m.cli.Conn())
+	return client.ClientCall(ctx, in, opts...)
+}
+
+func (m *defaultCall) ServiceLogin(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (pb.Call_ServiceLoginClient, error) {
+	client := pb.NewCallClient(m.cli.Conn())
+	return client.ServiceLogin(ctx, in, opts...)
+}
+
+func (m *defaultCall) ServiceCall(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (*ServiceMsgRes, error) {
+	client := pb.NewCallClient(m.cli.Conn())
+	return client.ServiceCall(ctx, in, opts...)
+}

+ 17 - 0
call/rpc/etc/call.yaml

@@ -0,0 +1,17 @@
+Name: call.rpc
+ListenOn: 0.0.0.0:3000
+Etcd:
+  Hosts:
+  - 101.33.209.36:2379
+  Key: call.rpc
+
+DbRpc:
+  Etcd:
+    Hosts:
+      - 101.33.209.36:2379
+    Key: db.rpc
+
+CoreConf:
+  HeartBeatInterval: 3
+  WaitConnServiceLimit: 300
+  LastTalkIntervalLimit: 600

+ 12 - 0
call/rpc/internal/config/config.go

@@ -0,0 +1,12 @@
+package config
+
+import (
+	"call_center/call/rpc/internal/core"
+	"github.com/tal-tech/go-zero/zrpc"
+)
+
+type Config struct {
+	zrpc.RpcServerConf
+	DbRpc    zrpc.RpcClientConf
+	CoreConf core.Config
+}

+ 168 - 0
call/rpc/internal/core/communication.go

@@ -0,0 +1,168 @@
+package core
+
+import (
+	"call_center/call/rpc/internal/role"
+	"call_center/call/rpc/pb"
+	"log"
+)
+
+type Communication struct {
+}
+
+func (sel *Communication) _protoToClient(stream interface{}, proto *pb.ClientMsgRes) error {
+	var err error
+	ss := stream.(pb.Call_ClientLoginServer)
+	err = ss.Send(proto)
+
+	if err != nil {
+		log.Println("<_protoToClient> error: ", err)
+		return err
+	}
+
+	return nil
+}
+
+func (sel *Communication) _protoToService(stream interface{}, proto *pb.ServiceMsgRes) error {
+	var err error
+	ss := stream.(pb.Call_ServiceLoginServer)
+	err = ss.Send(proto)
+
+	if err != nil {
+		log.Println("<_protoToService> error: ", err)
+		return err
+	}
+
+	return nil
+}
+
+func (sel *Communication) QuickBuildCmdMsg(cmdType interface{}, val int32, str string) *pb.CommandMsg {
+	var cmd = new(pb.CommandMsg)
+	cmd.CmdType = cmdType.(pb.ECommand)
+	cmd.CmdVal = val
+	cmd.CmdStr = str
+	return cmd
+}
+
+func (sel *Communication) CmdToService(stream interface{}, cmd *pb.CommandMsg) error {
+	var res = new(pb.ServiceMsgRes)
+	res.Cmd = append(res.Cmd, cmd)
+	if cmd.CmdType != pb.ECommand_MSG_HEART_BEAT {
+		log.Println("[DEBUG]<CmdToService> type:", cmd.CmdType, " cmd:", cmd)
+	}
+	return sel._protoToService(stream, res)
+}
+
+func (sel *Communication) CmdToClient(stream interface{}, cmd *pb.CommandMsg) error {
+	var res = new(pb.ClientMsgRes)
+	res.Cmd = append(res.Cmd, cmd)
+	if cmd.CmdType != pb.ECommand_MSG_HEART_BEAT {
+		log.Println("[DEBUG]<CmdToClient> type:", cmd)
+	}
+	return sel._protoToClient(stream, res)
+}
+
+func (sel *Communication) CmdBroadcastService(arrayService []interface{}, cmd *pb.CommandMsg) {
+	for _, pInst := range arrayService {
+		service := pInst.(*role.Service)
+		stream := service.Stream
+		err := sel.CmdToService(stream, cmd)
+		if err != nil {
+			log.Println("<Communication.CmdBroadcastService> send failed, id:", service.Id, "error:", err)
+			continue
+		}
+	}
+}
+
+func (sel *Communication) CmdBroadcastClient(arrayPlayer []interface{}, cmd *pb.CommandMsg) {
+	for _, pInst := range arrayPlayer {
+		player := pInst.(*role.Player)
+		stream := player.Stream
+		err := sel.CmdToClient(stream, cmd)
+		if err != nil {
+			log.Println("<Communication.MsgBroadcastClient> send failed, id:", player.Id, "error:", err)
+			continue
+		}
+	}
+}
+
+func (sel *Communication) MsgToClient(stream interface{}, content string, sendId string) error {
+	var proto = new(pb.ClientMsgRes)
+
+	var cmd = new(pb.CommandMsg)
+	cmd.CmdType = pb.ECommand_SEND_MSG
+	cmd.Buff = &pb.CommandMsg_ChatMsg{ChatMsg: &pb.ChatMsg{Input: content, ClientId: sendId}}
+	proto.Cmd = append(proto.Cmd, cmd)
+
+	return sel._protoToClient(stream, proto)
+}
+
+func (sel *Communication) MsgToService(stream interface{}, content string, sendId string) error {
+	var proto = new(pb.ServiceMsgRes)
+
+	var cmd = new(pb.CommandMsg)
+	cmd.CmdType = pb.ECommand_SEND_MSG
+	cmd.Buff = &pb.CommandMsg_ChatMsg{ChatMsg: &pb.ChatMsg{Input: content, ClientId: sendId}}
+	proto.Cmd = append(proto.Cmd, cmd)
+	return sel._protoToService(stream, proto)
+}
+
+func (sel *Communication) ServiceHeartBeat(stream interface{}) error {
+	cmd := sel.QuickBuildCmdMsg(pb.ECommand_MSG_HEART_BEAT, 0, "")
+	return sel.CmdToService(stream, cmd)
+}
+
+func (sel *Communication) PlayerHeartBeat(player *role.Player) error {
+	var err error
+	stream := player.Stream
+	cmd := sel.QuickBuildCmdMsg(pb.ECommand_MSG_HEART_BEAT, 0, "")
+	err = sel.CmdToClient(stream, cmd)
+	if err != nil {
+		return err
+	}
+	return err
+}
+
+func (sel *Communication) WaitQueueInfoUpdate(waitPlayers, noticedService []interface{}) {
+	if len(noticedService) == 0 {
+		return
+	}
+	cmdMsg := new(pb.CommandMsg)
+	arrayIdInfo := pb.CommandMsg_ArrayIdInfo{ArrayIdInfo: &pb.ArrayIdInfo{}}
+	for _, pInst := range waitPlayers {
+		player := pInst.(*role.Player)
+		arrayIdInfo.ArrayIdInfo.IdInfos = append(arrayIdInfo.ArrayIdInfo.IdInfos, &pb.IdInfo{Id: player.Id, GameId: player.GameId})
+	}
+	cmdMsg.Buff = &arrayIdInfo
+	cmdMsg.CmdType = pb.ECommand_ON_PLAYER_WAIT_QUEUE_INFO
+	sel.CmdBroadcastService(noticedService, cmdMsg)
+}
+
+func (sel *Communication) WaitQueueLenUpdate(waitPlayers []interface{}) {
+	if len(waitPlayers) == 0 {
+		return
+	}
+	cmdMsg := new(pb.CommandMsg)
+	cmdMsg.CmdType = pb.ECommand_ON_PLAYER_WAIT_QUEUE_LEN
+
+	for idx, pInst := range waitPlayers {
+		cmdMsg.CmdVal = int32(idx)
+		player := pInst.(*role.Player)
+		stream := player.Stream
+		err := sel.CmdToClient(stream, cmdMsg)
+		if err != nil {
+			log.Println("<Communication.WaitQueueLenUpdate> error: ", err)
+			continue
+		}
+	}
+}
+
+func (sel *Communication) PushHangUpList(service *role.Service) {
+	hangUpCmd := sel.QuickBuildCmdMsg(pb.ECommand_ON_SERVICE_HANG_UP_LIST, 0, "")
+	arrayIdInfo := pb.CommandMsg_ArrayIdInfo{ArrayIdInfo: &pb.ArrayIdInfo{}}
+	arrayIdInfo.ArrayIdInfo.IdInfos = service.HangUpList
+	hangUpCmd.Buff = &arrayIdInfo
+	err := sel.CmdToService(service.Stream, hangUpCmd)
+	if err != nil {
+		log.Println("<Communication.PushHangUpList>, err:", err, " serviceId:", service.Id)
+	}
+}

+ 201 - 0
call/rpc/internal/core/condition.go

@@ -0,0 +1,201 @@
+package core
+
+import (
+	"call_center/call/rpc/internal/interaction"
+	"call_center/call/rpc/internal/role"
+	"call_center/call/rpc/pb"
+	"errors"
+	"log"
+)
+
+type Condition struct {
+}
+
+func (sel *Condition) OnPlayerConnect(server *Server, stream interface{}) (*role.Player, error) {
+	/*
+		玩家连接
+	*/
+	id := server.MakeId(&stream)
+
+	cmd := server.QuickBuildCmdMsg(pb.ECommand_ON_PLAYER_CONNECT, 0, id)
+	err := server.CmdToClient(stream, cmd)
+	if err != nil {
+		return nil, err
+	}
+
+	// record
+	player := server.ConnPlayer(id, stream)
+
+	// 推送当前排队信息
+	server.WaitQueueLenUpdate([]interface{}{player})
+	log.Println("<Condition.OnPlayerConnect> stream id:", id)
+	return player, err
+}
+
+func (sel *Condition) OnPlayerDisConnect(server *Server, id string, reason pb.ErrorReason) {
+	/*
+		玩家断开
+	*/
+
+	/*
+		通知相关
+	*/
+	cmd := server.QuickBuildCmdMsg(pb.ECommand_ON_PLAYER_DISCONNECT, int32(reason), id)
+
+	// 通知玩家离线
+	player := server.GetPlayer(id)
+	pStream := player.Stream
+	if pStream != nil {
+		err := server.CmdToClient(pStream, cmd)
+		if err != nil {
+			log.Printf("<Condition.OnPlayerDisConnect> server.CmdToClient err:%s, id:%s", err, id)
+		}
+	}
+
+	//如果有对应客服,通知客服玩家离线
+	service := server.GetServiceByPlayerId(id)
+	if service != nil && reason != pb.ErrorReason_SERVICE_HEART_BEAT_FAILED {
+		err := server.CmdToService(service.Stream, cmd)
+		if err != nil {
+			log.Printf("<Condition.OnPlayerDisConnect> server.GetService err:%s, id:%s", err, id)
+		}
+
+		// 推送玩家挂断列表
+		idInfo := pb.IdInfo{GameId: player.GameId, Id: player.Id}
+		service.HangUpList = append(service.HangUpList, &idInfo)
+		server.PushHangUpList(service)
+	}
+
+	// 清除玩家记录
+	server.DisConnPlayer(id)
+	log.Printf("<Condition.OnPlayerDisConnect> End, id: %s, reason:%d", id, reason)
+}
+
+func (sel *Condition) OnServiceConnect(serviceId string, server *Server, stream interface{}, db interaction.InterDb) (*role.Service, error) {
+	/*
+		客服连接
+	*/
+	id := server.MakeId(&stream)
+	if serviceId != "" {
+		id = serviceId
+	}
+
+	cmd := server.QuickBuildCmdMsg(pb.ECommand_ON_SERVICE_CONNECT, 0, id)
+	err := server.CmdToService(stream, cmd)
+	if err != nil {
+		return nil, err
+	}
+
+	// 日志record
+	service := server.ConnService(id, stream)
+
+	// 玩家等待队列通知
+	server.WaitQueueInfoUpdate(server.waitQueue.GetAll(), []interface{}{service})
+
+	// 挂断列表历史记录
+	recordList := db.GetChatRecord(id)
+	if recordList != nil {
+		service.InitHandUpList(recordList)
+		server.PushHangUpList(service)
+	}
+
+	log.Println("<Condition.OnServiceConnect> id:", id)
+	return service, nil
+}
+
+func (sel *Condition) OnServiceDisConnect(server *Server, id string, errCode pb.ErrorReason) {
+	/*
+		客服断开
+	*/
+
+	// 踢出对接中的玩家
+	{
+		pidList := server.GetPlayersByServiceId(id)
+		for _, pid := range pidList {
+			server.KickPlayer(pid.(string), int32(errCode))
+		}
+	}
+
+	connPIds := server.DisConnService(id)
+	for _, pcId := range connPIds {
+		stream := server.GetPlayerStream(pcId.(string))
+		if stream == nil {
+			continue
+		}
+		cmd := server.QuickBuildCmdMsg(pb.ECommand_ON_SERVICE_DISCONNECT, int32(errCode), id)
+		err := server.CmdToClient(stream, cmd)
+		if err != nil {
+			continue
+		}
+	}
+	log.Println("<Condition.OnServiceDisConnect> id: ", id)
+}
+
+func (sel *Condition) OnPlayerEnterWaitQueue(server *Server, player *role.Player) {
+	/*
+		玩家加入等待队列
+	*/
+	server.AddWaitQueue(player)
+
+	// 更新队列信息to客服
+	waitPlayers := server.waitQueue.GetAll()
+	noticeService := server.GetAllService()
+	server.WaitQueueInfoUpdate(waitPlayers, noticeService)
+
+	// 更新排队人数to玩家
+	queueLen := server.waitQueue.Len()
+	server.WaitQueueLenUpdate(waitPlayers)
+
+	log.Printf("<Condition.OnPlayerEnterWaitQueue> id: %s, queueLen:%d", player.Id, queueLen)
+}
+
+func (sel *Condition) OnPlayerQuitWaitQueue(server *Server, player *role.Player) interface{} {
+	/*
+		玩家移除等待队列
+	*/
+	res := server.RemoveWaitQueue(player)
+	if res != nil {
+		// 更新队列信息to客服
+		waitPlayers := server.waitQueue.GetAll()
+		noticeService := server.GetAllService()
+		server.WaitQueueInfoUpdate(waitPlayers, noticeService)
+
+		// 更新当前排队人数to玩家
+		server.WaitQueueLenUpdate(waitPlayers)
+	}
+	log.Printf("<Condition.OnPlayerQuitWaitQueue> id:%s, queueLen:%d ", player.Id, server.waitQueue.Len())
+	return res
+}
+
+func (sel *Condition) OnConfirmConn(server *Server, sId string, pId string) error {
+	/*
+		确认分配玩家到对应客服
+	*/
+
+	// 建立连接
+	ok := server.ConfirmService(sId, pId)
+	if ok != true {
+		return errors.New("ConfirmService failed")
+	}
+
+	// 通知客服
+	var cmd = new(pb.CommandMsg)
+	cmd.CmdType = pb.ECommand_ON_PLAYER_RECEIVE_REPLY
+	cmd.CmdStr = pId
+
+	stream := server.GetServiceStream(sId)
+	err := server.CmdToService(stream, cmd)
+	if err != nil {
+		log.Println("<Condition.OnConfirmConn> CmdToService err:", err)
+	}
+
+	// 通知玩家
+	cmd.CmdStr = sId
+	stream = server.GetPlayerStream(pId)
+	err = server.CmdToClient(stream, cmd)
+	if err != nil {
+		log.Println("<Condition.OnConfirmConn> CmdToClient err:", err)
+	}
+
+	return nil
+}

+ 7 - 0
call/rpc/internal/core/config.go

@@ -0,0 +1,7 @@
+package core
+
+type Config struct {
+	HeartBeatInterval     int32 // 心跳间隔
+	WaitConnServiceLimit  int64 // 等待队列时长
+	LastTalkIntervalLimit int64 // 发言超时间隔
+}

+ 281 - 0
call/rpc/internal/core/server.go

@@ -0,0 +1,281 @@
+package core
+
+import (
+	"call_center/call/rpc/internal/role"
+	"call_center/call/rpc/pb"
+	public "call_center/public/common"
+	"container/list"
+	"fmt"
+	mapset "github.com/deckarep/golang-set"
+	"log"
+	"time"
+)
+
+var instance *Server
+
+func ServerInit(conf Config) {
+	instance = new(Server)
+
+	// 加载配置
+	instance.Config = conf
+
+	// 等待队列
+	instance.waitQueue = public.NewQueue()
+
+	log.Println("<Server.ServerInit> end, conf:", conf)
+}
+
+func GetServer() *Server {
+	return instance
+}
+
+type Server struct {
+	Condition
+	Communication
+	Config
+
+	// 玩家流管理类
+	playerMgr public.ObjMgr // pId -> Player
+
+	// 客服流管理类
+	serviceMgr public.ObjMgr // sId -> Service
+
+	// 玩家 -> 客服 映射管理类
+	p2sMgr public.ObjMgr // pId -> sId
+
+	// 客服 -> 玩家 映射管理类
+	s2pMgr public.ObjMgr // sId -> set(pId)
+
+	// 等待队列
+	waitQueue *public.SyncQueue
+}
+
+func (sel *Server) MakeId(i interface{}) string {
+	now := time.Now().Unix()
+	objId := fmt.Sprintf("%d%d", now, i)
+	return objId
+}
+
+func (sel *Server) GetServiceStream(scId string) interface{} {
+	service := sel.serviceMgr.GetObj(scId)
+	if service != nil {
+		return service.(*role.Service).Stream
+	}
+	return nil
+}
+
+func (sel *Server) GetPlayerStream(pcId string) interface{} {
+	player := sel.playerMgr.GetObj(pcId)
+	if player != nil {
+		return player.(*role.Player).Stream
+	}
+	return nil
+}
+
+func (sel *Server) GetPlayer(pId string) *role.Player {
+	p := sel.playerMgr.GetObj(pId)
+	if p != nil {
+		return p.(*role.Player)
+	}
+	return nil
+}
+
+func (sel *Server) GetService(sId string) *role.Service {
+	s := sel.serviceMgr.GetObj(sId)
+	if s != nil {
+		return s.(*role.Service)
+	}
+
+	return nil
+}
+
+func (sel *Server) GetServiceByPlayerId(pId string) *role.Service {
+	scId := sel.p2sMgr.GetObj(pId)
+	if scId == nil {
+		return nil
+	}
+	return sel.GetService(scId.(string))
+}
+
+func (sel *Server) GetPlayersByServiceId(sid string) []interface{} {
+	var res []interface{}
+	setPid := sel.s2pMgr.GetObj(sid)
+	if setPid != nil {
+		ss := setPid.(mapset.Set)
+		return ss.ToSlice()
+	}
+	return res
+}
+
+func (sel *Server) GetAllService() []interface{} {
+	return sel.serviceMgr.GetObjValues()
+}
+
+func (sel *Server) ConfirmService(scId string, pcId string) bool {
+	curScId := sel.p2sMgr.GetObj(pcId)
+	if curScId != nil {
+		if curScId == scId {
+			// 当前客服对应玩家信息一致
+			return true
+		}
+		log.Printf("<Server.ConfirmService> player<%v> already in service by %v \n", pcId, curScId)
+		return false
+	}
+
+	sel.p2sMgr.Register(pcId, scId)
+	obj := sel.s2pMgr.GetObj(scId)
+	idSet := obj.(mapset.Set)
+	idSet.Add(pcId)
+	log.Printf("<Server.ConfirmService> pcId:{%v}, scId:{%v}, idSet:{%v} \n", pcId, scId, idSet.String())
+	return true
+}
+
+func (sel *Server) ConnPlayer(pcId string, stream interface{}) *role.Player {
+	// 玩家连接
+
+	/*
+		注册玩家信息
+	*/
+	pInfo := new(role.Player)
+	pInfo.Id = pcId
+	pInfo.Stream = stream
+
+	sel.playerMgr.Register(pcId, pInfo)
+	return pInfo
+}
+
+func (sel *Server) KickPlayer(pId string, reason int32) {
+	log.Printf("<Server.KickPlayer>, id:%s, reason:%d", pId, reason)
+	player := sel.playerMgr.GetObj(pId)
+	if player != nil {
+		p := player.(*role.Player)
+		p.StopChan(reason)
+
+		log.Println("<Server.KickPlayer> <- begin kick player, id:", pId)
+		<-p.WaitLogOut()
+		log.Println("<Server.KickPlayer> -> end kick player, id:", pId)
+	}
+}
+
+func (sel *Server) KickService(sId string, reason int32) {
+	log.Printf("<Server.KickService>, id:%s, reason:%d", sId, reason)
+	service := sel.serviceMgr.GetObj(sId)
+	if service != nil {
+		s := service.(*role.Service)
+		s.StopChan(reason)
+
+		log.Println("<Server.KickService> <- begin kick service, id:", sId)
+		<-s.WaitLogOut()
+		log.Println("<Server.KickService> -> end kick service, id:", sId)
+	}
+}
+
+func (sel *Server) DisConnPlayer(pcId string) {
+	// 玩家连接关闭
+	player := sel.playerMgr.GetObj(pcId)
+
+	/*
+		删除wait queue
+	*/
+	sel.waitQueue.Remove(player)
+
+	/*
+		删除玩家info
+	*/
+
+	sel.playerMgr.DeleteObj(pcId)
+
+	/*
+		删除对接该玩家的客服映射
+	*/
+	scId := sel.p2sMgr.GetObj(pcId)
+	if scId != nil {
+		obj := sel.s2pMgr.GetObj(scId)
+		if obj != nil {
+			idSet := obj.(mapset.Set)
+			idSet.Remove(pcId)
+			log.Printf("<Server.DisConnPlayer> disConnPcId: {%v} curScId: {%v} -> pcIds: {%v} \n", pcId, scId, idSet.String())
+		}
+	}
+	sel.p2sMgr.DeleteObj(pcId)
+	player.(*role.Player).Final()
+	log.Printf("<Server.DisConnPlayer> rmPcId: %v, scId: %v", pcId, scId)
+}
+
+func (sel *Server) ConnService(scId string, stream interface{}) *role.Service {
+	// 客服连接
+
+	/*
+		注册客服stream
+	*/
+	service := new(role.Service)
+	service.Id = scId
+	service.Stream = stream
+
+	sel.serviceMgr.Register(scId, service)
+
+	/*
+	* 创建客服映射
+	 */
+	idSet := mapset.NewSet()
+	sel.s2pMgr.Register(scId, idSet)
+
+	return service
+}
+
+func (sel *Server) DisConnService(scId string) []interface{} {
+	// 客服连接关闭
+	service := sel.serviceMgr.GetObj(scId)
+	sel.serviceMgr.DeleteObj(scId)
+
+	/*
+		删除该客服对接的所有玩家
+	*/
+	// 遍历字典,获取该scId所服务的pcId
+	var delList []interface{}
+	obj := sel.s2pMgr.GetObj(scId)
+	if obj == nil {
+		return delList
+	}
+	idSet := obj.(mapset.Set)
+	it := idSet.Iterator()
+	for itId := range it.C {
+		sel.p2sMgr.DeleteObj(itId)
+		delList = append(delList, itId)
+	}
+	sel.s2pMgr.DeleteObj(scId)
+	service.(*role.Service).Final()
+	log.Printf("<Server.DisConnService> scId: %v, selId: %v \n", scId, delList)
+	return delList
+}
+
+func (sel *Server) AddWaitQueue(player *role.Player) {
+	queueLen := sel.waitQueue.PushBack(player)
+	time.AfterFunc(time.Second*time.Duration(sel.WaitConnServiceLimit), sel.verifyWaitQueue) // 初始化一个校验等待队列计时器
+	log.Printf("<Server.AddWaitQueue> playerId:%s, wait sec:%d, queue_len:%d \n",
+		player.Id, sel.WaitConnServiceLimit, queueLen)
+}
+
+func (sel *Server) RemoveWaitQueue(player *role.Player) interface{} {
+	res := sel.waitQueue.Remove(player)
+	log.Printf("<Server.RemoveWaitQueue> playerId:%s, queue_len:%d \n", player.Id, sel.waitQueue.Len())
+	return res
+}
+
+func (sel *Server) verifyWaitQueue() {
+	log.Println("<Server.verifyWaitQueue> begin, queue len:", sel.waitQueue.Len())
+	back := sel.waitQueue.Back()
+	if back == nil {
+		return
+	}
+	e := back.(*list.Element)
+	player := e.Value.(*role.Player)
+	nowTimeStamp := time.Now().Unix()
+	offset := nowTimeStamp - player.LoginTimeStamp
+	if offset >= sel.WaitConnServiceLimit {
+		log.Println("<Server.verifyWaitQueue> wait overtime, kick out id:", player.Id)
+		// sel.waitQueue.RemoveE(e)
+		sel.KickPlayer(player.Id, int32(pb.ErrorReason_PLAYER_WAIT_QUEUE_OVERTIME))
+	}
+	log.Println("<Server.verifyWaitQueue> end, queue len:", sel.waitQueue.Len())
+}

+ 43 - 0
call/rpc/internal/handler/handler_from_player_msg.go

@@ -0,0 +1,43 @@
+package handler
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/internal/interaction"
+	"call_center/call/rpc/pb"
+	"errors"
+)
+
+func FromPlayerMsg(interDb interaction.InterDb, server *core.Server, streamId string, msg *pb.CommandMsg) error {
+	chatMsg := msg.GetChatMsg()
+	player := server.GetPlayer(streamId)
+	input := chatMsg.Input
+	player.RefreshTalkTimeStamp() // 刷新发言时间
+
+	// 接收数据
+	// gid := common.GetGoroutineID()
+	// log.Printf("[gid: %v][收到消息]: %s from: %v \n", gid, input, streamId)
+
+	service := server.GetServiceByPlayerId(streamId)
+	if service != nil {
+		// 人工接听时, 消息返回给客服
+		err := server.MsgToService(service.Stream, input, streamId)
+		if err != nil {
+			return err
+		}
+		interDb.ChatLogToDb(player, streamId, service.Id, input, true)
+		// err = server.MsgToClient(stream, "success")
+	} else {
+		return errors.New("<FromPlayerMsg> 客服不存在")
+		//// 机器自动回复
+		//robotMsg := "[robot回复]" + input
+		//err := server.MsgToClient(stream, robotMsg)
+		//// interaction.DbInst.ChatLogToDb(streamId, "", input, true)
+		//
+		//if err != nil {
+		//	return err
+		//}
+
+	}
+
+	return nil
+}

+ 53 - 0
call/rpc/internal/handler/handler_from_service_msg.go

@@ -0,0 +1,53 @@
+//@Author   : KaiShin
+//@Time     : 2021/11/2
+
+package handler
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/internal/interaction"
+	"call_center/call/rpc/pb"
+	"call_center/public/exception"
+	"fmt"
+	"log"
+)
+
+func FromServiceMsg(server *core.Server, streamId string, msg *pb.CommandMsg, interDb interaction.InterDb) error {
+	// 客服连接请求
+	chatMsg := msg.GetChatMsg()
+	clientId := chatMsg.ClientId
+	player := server.GetPlayer(clientId)
+	// log.Println("Recv, 客服回复玩家<", clientId, ">:", chatMsg.Input)
+
+	var err error = nil
+	exception.Try(func() {
+		if player == nil {
+			// 玩家不存在
+			errStr := fmt.Sprintf("<serviceMsgHandler> 玩家id{%v}不存在", clientId)
+			exception.Throw(errStr)
+		}
+
+		// 客服回复玩家
+		err = server.MsgToClient(player.Stream, chatMsg.Input, streamId)
+		if err != nil {
+			log.Println("<serviceMsgHandler> err:", err)
+			exception.Throw(err)
+		}
+
+		// 推送日志
+		interDb.ChatLogToDb(player, clientId, streamId, chatMsg.Input, false)
+
+		//// 发送成功确认信息
+		//err = server.MsgToService(serviceStream, "success")
+		//if err != nil {
+		//	exception.Throw(err)
+		//}
+	}).Catch(func(e exception.Exception) {
+		log.Println("<serviceMsgHandler> err:", e)
+		err = e.(error)
+	}).Finally(func() {
+
+	})
+
+	return err
+}

+ 42 - 0
call/rpc/internal/handler/handler_get_player_chat_log.go

@@ -0,0 +1,42 @@
+//@Author   : KaiShin
+//@Time     : 2021/11/2
+
+package handler
+
+import (
+	"call_center/call/rpc/internal/interaction"
+	"call_center/call/rpc/pb"
+	db "call_center/db/rpc/pb"
+	"call_center/public/exception"
+	"log"
+)
+
+func GetPlayerChatLog(serviceId string, req *pb.CommandMsg, interDb interaction.InterDb) (*pb.CommandMsg, error) {
+	cmdMsg := new(pb.CommandMsg)
+	exception.Try(func() {
+		playerId := req.CmdStr
+		dataList := interDb.GetChatLog(playerId)
+		if dataList != nil {
+			chatLogList := new(pb.ArrayChatLog)
+			for _, v := range dataList {
+				fromPlayer := false
+				if v.ChatType == db.EDbChatType_E_DB_CHAT_TYPE_PLAYER {
+					fromPlayer = true
+				}
+				chatLogList.DataList = append(chatLogList.DataList, &pb.ChatLog{
+					Content:    v.Content,
+					TimeStamp:  v.TimeStamp,
+					GameId:     v.GameId,
+					FromPlayer: fromPlayer,
+				})
+			}
+			cmdMsg.Buff = &pb.CommandMsg_ArrayChatLog{ArrayChatLog: chatLogList}
+		}
+		log.Println("<handler.playerChatLogHandler> id:", serviceId)
+	}).Catch(func(e exception.Exception) {
+
+	}).Finally(func() {
+
+	})
+	return cmdMsg, nil
+}

+ 13 - 0
call/rpc/internal/handler/handler_player_logout.go

@@ -0,0 +1,13 @@
+//@Author   : KaiShin
+//@Time     : 2021/11/1
+
+package handler
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/pb"
+)
+
+func PlayerLogout(server *core.Server, id string) {
+	server.KickPlayer(id, int32(pb.ErrorReason_PLAYER_CALL_LOGOUT))
+}

+ 47 - 0
call/rpc/internal/handler/handler_service_reply.go

@@ -0,0 +1,47 @@
+//@Author   : KaiShin
+//@Time     : 2021/11/2
+
+package handler
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/internal/interaction"
+	"call_center/call/rpc/pb"
+	pb2 "call_center/db/rpc/pb"
+	"call_center/public/exception"
+	"fmt"
+)
+
+func ServiceReply(server *core.Server, serverId string, msg *pb.CommandMsg, interDb interaction.InterDb) error {
+	var err error
+
+	exception.Try(func() {
+		toPlayerId := msg.CmdStr
+		player := server.GetPlayer(toPlayerId)
+		if player == nil {
+			// 玩家不存在
+			exception.Throw(fmt.Sprintf("<serviceReplyHandler> player not exist, id:%v", toPlayerId))
+		}
+
+		res := server.OnPlayerQuitWaitQueue(server, player)
+		if res == nil {
+			// 玩家不在等待队列中
+			exception.Throw(fmt.Sprintf("<serviceReplyHandler> player not in wait queue, id:%v", toPlayerId))
+		}
+
+		// 建立连接
+		err := server.OnConfirmConn(server, serverId, toPlayerId)
+		if err != nil {
+			exception.Throw(err)
+		}
+
+		// 记录日志
+		interDb.ChatRecordToDb(player, serverId, toPlayerId, pb2.EDbRecordState_E_DB_RECORD_STATE_REPLY)
+	}).Catch(func(e exception.Exception) {
+		err = e.(error)
+	}).Finally(func() {
+
+	})
+
+	return err
+}

+ 230 - 0
call/rpc/internal/interaction/inter_db.go

@@ -0,0 +1,230 @@
+package interaction
+
+import (
+	"call_center/call/rpc/internal/role"
+	"call_center/db/rpc/pb"
+	"call_center/public/exception"
+	"context"
+	"encoding/json"
+	"google.golang.org/grpc/metadata"
+	"log"
+	"time"
+)
+
+/*
+	数据库交互类
+*/
+
+type (
+	InterDb interface {
+		Start()
+		ChatLogToDb(player *role.Player, playerId string, serviceId string, content string, fromPlayer bool)
+		ChatRecordToDb(player *role.Player, serviceId string, playerId string, state pb.EDbRecordState)
+		GetChatRecord(serviceId string) []*pb.DbChatRecord
+		GetChatLog(playerId string) []*pb.DbChatLog
+	}
+
+	interDb struct {
+		client   pb.DbClient
+		dbStream pb.Db_DbLoginClient
+	}
+)
+
+func NewInterDb(cli pb.DbClient) InterDb {
+	log.Println("<NewInterDb> cli:", cli)
+	dbInst := &interDb{client: cli}
+	return dbInst
+}
+
+func (sel *interDb) Start() {
+	log.Println("<Start> client:", sel.client)
+	duration := time.Second * 5
+	ticker := time.NewTicker(duration)
+	for range ticker.C {
+		exception.Try(func() {
+			sel.runDb()
+		}).Catch(func(e exception.Exception) {
+
+		}).Finally(func() {
+
+		})
+	}
+}
+
+func (sel *interDb) runDb() {
+	ctx := context.Background()
+
+	// 赋值client
+	dbClient := sel.client
+
+	// context塞入信息
+	md := metadata.Pairs("Key", "Val")
+	ctx = metadata.NewOutgoingContext(ctx, md)
+	stream, err := dbClient.DbLogin(ctx)
+	if err != nil {
+		// log.Println(err)
+		return
+	}
+
+	log.Printf("<inter_db.runDB> db连接成功, 地址:%v", &dbClient)
+
+	// 赋值stream
+	sel.dbStream = stream
+
+	// 获取配置信息
+	req := new(pb.DbMsgReq)
+	cmd := new(pb.DbCommandMsg)
+	cmd.CmdType = pb.EDbCommand_E_DB_COMMAND_GET_CONFIG
+	req.Cmd = cmd
+	if res, err := dbClient.DbCall(ctx, req); err == nil {
+		arrList := res.GetCmd().GetArrayConfig().GetDataList()
+		for _, conf := range arrList {
+			var confValueMap map[string]interface{}
+			confName := conf.ConfName
+			confKey := conf.ConfKey
+			err := json.Unmarshal([]byte(conf.ConfValue), &confValueMap)
+			if err != nil {
+				continue
+			}
+			log.Println(confName, confKey, confValueMap)
+		}
+		log.Println(arrList)
+	}
+
+	for {
+		receive, err := stream.Recv()
+		if err != nil {
+			sel.dbStream = nil
+			log.Println("<inter_db.runDB> conn broken, err:", err)
+			break
+		}
+		//res := receive.GetCmd()
+		//switch res.CmdType {
+		//
+		//}
+		log.Println("<inter_db.runDB> begin receive...:", receive)
+	}
+
+	log.Println("<inter_db.runDB> dbClient stopped, begin to reconnect...")
+}
+
+func (sel *interDb) send(cmd *pb.DbCommandMsg) {
+	if sel.dbStream == nil {
+		log.Println("<interDb.send> dbStream is nil")
+		return
+	}
+
+	err := sel.dbStream.Send(&pb.DbMsgReq{Cmd: cmd})
+	if err != nil {
+		log.Println("<interDb.send> Send err:", err)
+		return
+	}
+}
+
+func (sel *interDb) ChatLogToDb(player *role.Player, playerId string, serviceId string, content string, fromPlayer bool) {
+	if sel.dbStream == nil {
+		log.Println("<interDb.ChatLogToDb> InterDb not init")
+	}
+	exception.Try(func() {
+		chatInfo := new(pb.DbChatLog)
+		chatInfo.Content = content
+		chatInfo.TimeStamp = time.Now().Unix()
+		chatInfo.SessionId = player.SessionId
+		chatInfo.IsVisitor = player.IsVisitor
+		chatInfo.GameId = player.GameId
+		if fromPlayer == true {
+			chatInfo.ChatType = pb.EDbChatType_E_DB_CHAT_TYPE_PLAYER
+			chatInfo.FromId = playerId
+			chatInfo.ToId = serviceId
+		} else {
+			chatInfo.ChatType = pb.EDbChatType_E_DB_CHAT_TYPE_SERVICE
+			chatInfo.FromId = serviceId
+			chatInfo.ToId = playerId
+		}
+
+		cmd := new(pb.DbCommandMsg)
+		cmd.CmdType = pb.EDbCommand_E_DB_COMMAND_PUSH_CHAT_LOG
+		cmd.Data = &pb.DbCommandMsg_ChatLog{ChatLog: chatInfo}
+
+		sel.send(cmd)
+		log.Println("<interDb.ChatLogToDb> msg: ", chatInfo)
+
+	}).Catch(func(e exception.Exception) {
+
+	}).Finally(func() {
+
+	})
+}
+
+func (sel *interDb) ChatRecordToDb(player *role.Player, serviceId string, playerId string, state pb.EDbRecordState) {
+	if sel.dbStream == nil {
+		log.Println("<interDb.ChatRecordToDb> InterDb not init")
+	}
+	exception.Try(func() {
+		recordInfo := new(pb.DbChatRecord)
+		recordInfo.TimeStamp = time.Now().Unix()
+		recordInfo.SessionId = player.SessionId
+		recordInfo.IsVisitor = player.IsVisitor
+		recordInfo.GameId = player.GameId
+		recordInfo.State = state
+		recordInfo.PlayerId = playerId
+		recordInfo.ServiceId = serviceId
+
+		cmd := new(pb.DbCommandMsg)
+		cmd.CmdType = pb.EDbCommand_E_DB_COMMAND_PUSH_CHAT_RECORD
+		cmd.Data = &pb.DbCommandMsg_ChatRecord{ChatRecord: recordInfo}
+
+		sel.send(cmd)
+		log.Println("<interDb.ChatRecordToDb> msg: ", recordInfo)
+
+	}).Catch(func(e exception.Exception) {
+
+	}).Finally(func() {
+
+	})
+}
+
+func (sel *interDb) GetChatRecord(serviceId string) []*pb.DbChatRecord {
+	if sel.dbStream == nil {
+		log.Println("<interDb.ChatLogToDb> InterDb not init")
+	}
+
+	req := new(pb.DbMsgReq)
+	req.Cmd = &pb.DbCommandMsg{CmdStr: serviceId, CmdType: pb.EDbCommand_E_DB_COMMAND_GET_CHAT_RECORD}
+
+	res, err := sel.client.DbCall(context.Background(), req)
+	if err != nil {
+		log.Println("<interDb.GetChatRecord> err:", err, " id:", serviceId)
+		return nil
+	}
+
+	resCmd := res.GetCmd()
+	if resCmd != nil {
+		arrRecord := resCmd.GetArrayChatRecord()
+		if arrRecord != nil {
+			return arrRecord.GetDataList()
+		}
+	}
+
+	log.Println("<interDb.GetChatRecord> record empty, id:", serviceId)
+	return nil
+}
+
+func (sel *interDb) GetChatLog(playerId string) []*pb.DbChatLog {
+	req := new(pb.DbMsgReq)
+	req.Cmd = &pb.DbCommandMsg{CmdStr: playerId, CmdType: pb.EDbCommand_E_DB_COMMAND_GET_CHAT_LOG}
+
+	res, err := sel.client.DbCall(context.Background(), req)
+	if err != nil {
+		log.Println("<interDb.GetChatLog> err:", err, " id:", playerId)
+		return nil
+	}
+	resCmd := res.GetCmd()
+	if resCmd != nil {
+		dataList := res.GetCmd().GetArrayChatLog()
+		if dataList != nil {
+			return dataList.GetDataList()
+		}
+	}
+	return nil
+}

+ 82 - 0
call/rpc/internal/logic/client_call_logic.go

@@ -0,0 +1,82 @@
+package logic
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/internal/handler"
+	"call_center/call/rpc/pb"
+	"call_center/public/exception"
+	"context"
+	"fmt"
+	"log"
+
+	"call_center/call/rpc/internal/svc"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type ClientCallLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewClientCallLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ClientCallLogic {
+	return &ClientCallLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *ClientCallLogic) ClientCall(req *pb.ClientMsgReq) (*pb.ClientMsgRes, error) {
+	var resList []*pb.CommandMsg
+	var err error
+	server := core.GetServer()
+
+	exception.Try(func() {
+		if req.IdInfo == nil {
+			errStr := fmt.Sprintf("<ClientCall> IdInfo is nil")
+			err = exception.MakeError(int32(pb.EErrorCode_ERR_PARAM_ERROR), errStr)
+			exception.Throw(err)
+		}
+
+		id := req.IdInfo.Id
+		stream := server.GetPlayerStream(id)
+		if stream == nil {
+			errStr := fmt.Sprintf("<ClientCall> client id not login, id:%v", id)
+			err = exception.MakeError(int32(pb.EErrorCode_ERR_PARAM_ERROR), errStr)
+			exception.Throw(errStr)
+		}
+
+		// 接收玩家信息
+		for _, cmd := range req.Cmd {
+			cmdType := cmd.CmdType
+			cmdRes := new(pb.CommandMsg)
+			switch cmdType {
+			case pb.ECommand_CALL_PLAYER_MSG:
+				// 玩家发消息
+				err = handler.FromPlayerMsg(l.svcCtx.Db, server, id, cmd)
+				break
+			case pb.ECommand_CALL_PLAYER_LOGOUT:
+				// 玩家退出
+				handler.PlayerLogout(server, id)
+				break
+			default:
+				errStr := fmt.Sprintf("<ClientCall> invalid cmd type:%s", cmdType)
+				log.Println(errStr)
+				exception.Throw(errStr)
+				break
+			}
+			if err != nil {
+				continue
+			}
+			resList = append(resList, cmdRes)
+		}
+	}).Catch(func(e exception.Exception) {
+		log.Println("<ClientCall> error: ", e)
+		err = e.(error)
+	}).Finally(func() {
+		// server.OnPlayerDisConnect(server, id)
+	})
+	return &pb.ClientMsgRes{Cmd: resList}, err
+}

+ 117 - 0
call/rpc/internal/logic/client_login_logic.go

@@ -0,0 +1,117 @@
+package logic
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/pb"
+	db "call_center/db/rpc/pb"
+	"call_center/public/exception"
+	"context"
+	"log"
+	"time"
+
+	"call_center/call/rpc/internal/svc"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type ClientLoginLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewClientLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ClientLoginLogic {
+	return &ClientLoginLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *ClientLoginLogic) ClientLogin(req *pb.ClientMsgReq, stream pb.Call_ClientLoginServer) error {
+	server := core.GetServer()
+
+	idInfo := req.IdInfo
+	if idInfo == nil {
+		// 传参失效
+		errStr := "<ClientLogin> req.IdInfo is nil"
+		return exception.MakeError(int32(pb.EErrorCode_ERR_PARAM_ERROR), errStr)
+	}
+
+	if idInfo.Id != "" {
+		// 重登
+		p := server.GetPlayer(idInfo.Id)
+
+		if p != nil {
+			// 当前已连接,断开当前链接
+			server.KickPlayer(idInfo.Id, int32(pb.ErrorReason_PLAYER_REPEAT_LOGIN))
+			log.Println("<ClientLogin> player already conn, disconnect first, id:", idInfo.Id)
+		}
+	}
+
+	// 客服stream注册
+	player, err := server.OnPlayerConnect(server, stream)
+	if player == nil {
+		log.Println("<ClientLogin> OnPlayerConnect failed, err:", err)
+		//return err
+		return exception.MakeError(int32(pb.EErrorCode_ERR_PLAYER_CONN_ERR), err.Error())
+	}
+
+	// 初始化玩家信息
+	stopChan := make(chan int32)
+	player.Init(idInfo.GameId, true, stopChan)
+
+	// 加入等待队列
+	server.OnPlayerEnterWaitQueue(server, player)
+
+	// 心跳ticker
+	duration := time.Second * time.Duration(server.HeartBeatInterval)
+	ticker := time.NewTicker(duration)
+	var errCode pb.ErrorReason
+	exception.Try(func() {
+		defer func() {
+			ticker.Stop()
+		}()
+		for {
+			select {
+			case <-stream.Context().Done():
+				log.Println("<ClientLogin> heartbeat failed, id:", player.Id, " err:", stream.Context().Err())
+				errCode = pb.ErrorReason_PLAYER_HEART_BEAT_FAILED
+				return
+			case <-ticker.C:
+				// 超时未发言
+				now := time.Now().Unix()
+				lastTalkTimeStamp := player.LastTalkTimeStamp
+				if now-lastTalkTimeStamp >= server.LastTalkIntervalLimit {
+					log.Println("<ClientLogin> last talk interval limit, id:", player.Id)
+					errCode = pb.ErrorReason_PLAYER_TALK_INTERVAL_LIMIT
+					return
+				}
+			case stop := <-stopChan:
+				// 登出信号
+				errCode = pb.ErrorReason(stop)
+				log.Println("<ClientLogin> player stop connect, code:", stop)
+				return
+			}
+		}
+	}).Catch(func(ex exception.Exception) {
+		log.Println("<ClientLogin> error:", ex)
+	}).Finally(func() {
+		switch errCode {
+		// 处理等待队列中的玩家
+		case pb.ErrorReason_PLAYER_WAIT_QUEUE_OVERTIME, pb.ErrorReason_PLAYER_CALL_LOGOUT, pb.ErrorReason_PLAYER_REPEAT_LOGIN:
+			server.OnPlayerQuitWaitQueue(server, player)
+			break
+		}
+
+		// 记录日志
+		service := server.GetServiceByPlayerId(player.Id)
+		if service != nil {
+			l.svcCtx.Db.ChatRecordToDb(player, service.Id, player.Id, db.EDbRecordState_E_DB_RECORD_STATE_DISCONNECT)
+		}
+
+		// 断开处理
+		server.OnPlayerDisConnect(server, player.Id, errCode)
+	})
+	return nil
+}

+ 77 - 0
call/rpc/internal/logic/service_call_logic.go

@@ -0,0 +1,77 @@
+package logic
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/internal/handler"
+	"call_center/call/rpc/pb"
+	"call_center/public/exception"
+	"context"
+	"errors"
+	"fmt"
+	"log"
+
+	"call_center/call/rpc/internal/svc"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type ServiceCallLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewServiceCallLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ServiceCallLogic {
+	return &ServiceCallLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *ServiceCallLogic) ServiceCall(req *pb.ServiceMsgReq) (*pb.ServiceMsgRes, error) {
+	var err error
+	server := core.GetServer()
+	id := req.IdInfo.Id
+	var resList []*pb.CommandMsg
+	exception.Try(func() {
+		stream := server.GetServiceStream(id)
+		if stream == nil {
+			errStr := fmt.Sprintf("<ServiceCall> service id not login, id:%v", id)
+			err = exception.MakeError(int32(pb.EErrorCode_ERR_PARAM_ERROR), errStr)
+			exception.Throw(errStr)
+		}
+		// 接收客服信息
+		for _, cmd := range req.Cmd {
+			cmdType := cmd.CmdType
+			cmdRes := new(pb.CommandMsg)
+			switch cmdType {
+			case pb.ECommand_CALL_SERVICE_MSG:
+				err = handler.FromServiceMsg(server, id, cmd, l.svcCtx.Db)
+				break
+			case pb.ECommand_CALL_SERVICE_REPLY:
+				err = handler.ServiceReply(server, id, cmd, l.svcCtx.Db)
+				break
+			case pb.ECommand_CALL_PLAYER_CHAT_LOG:
+				cmdRes, err = handler.GetPlayerChatLog(id, cmd, l.svcCtx.Db)
+				break
+			default:
+				err = errors.New(fmt.Sprintf("<ServiceCall> invalid cmd type:%s", cmdType))
+				break
+			}
+
+			if err != nil {
+				// 过滤
+				exception.Throw(err)
+				continue
+			}
+			resList = append(resList, cmdRes)
+		}
+	}).Catch(func(e exception.Exception) {
+		log.Println("<ServiceCall> error: ", e)
+		err = e.(error)
+	}).Finally(func() {
+		// server.OnServiceDisConnect(server, id)
+	})
+	return &pb.ServiceMsgRes{Cmd: resList}, err
+}

+ 90 - 0
call/rpc/internal/logic/service_login_logic.go

@@ -0,0 +1,90 @@
+package logic
+
+import (
+	"call_center/call/rpc/internal/core"
+	"call_center/call/rpc/pb"
+	"call_center/public/exception"
+	"context"
+	"log"
+	"time"
+
+	"call_center/call/rpc/internal/svc"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type ServiceLoginLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewServiceLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ServiceLoginLogic {
+	return &ServiceLoginLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *ServiceLoginLogic) ServiceLogin(req *pb.ServiceMsgReq, stream pb.Call_ServiceLoginServer) error {
+	server := core.GetServer()
+
+	idInfo := req.IdInfo
+	if idInfo == nil {
+		// 传参失效
+		errStr := "<ServiceLogin> req.IdInfo is nil"
+		log.Println(errStr)
+		return exception.MakeError(int32(pb.EErrorCode_ERR_PARAM_ERROR), errStr)
+	}
+
+	if idInfo.Id != "" {
+		// 客服重登
+		service := server.GetService(idInfo.Id)
+		if service != nil {
+			server.KickService(idInfo.Id, int32(pb.ErrorReason_SERVICE_REPEAT_LOGIN))
+			log.Println("<ServiceLogin> service already conn, disconnect first, id:", idInfo.Id)
+		}
+	}
+
+	// 客服stream注册
+	service, err := server.OnServiceConnect(idInfo.Id, server, stream, l.svcCtx.Db)
+	if service == nil {
+		log.Println("<ClientLogin> OnPlayerConnect failed, err:", err)
+		return exception.MakeError(int32(pb.EErrorCode_ERR_SERVICE_CONN_ERR), err.Error())
+	}
+
+	// 初始化客服信息
+	stopChan := make(chan int32)
+	service.Init(stopChan)
+
+	// 心跳ticker
+	duration := time.Second * time.Duration(server.HeartBeatInterval)
+	ticker := time.NewTicker(duration)
+	var errCode pb.ErrorReason
+	exception.Try(func() {
+		defer func() {
+			ticker.Stop()
+		}()
+
+		for {
+			select {
+			case <-stream.Context().Done():
+				log.Println("<ServiceLogin> heartbeat failed, id:", service.Id, " err:", stream.Context().Err())
+				errCode = pb.ErrorReason_SERVICE_HEART_BEAT_FAILED
+				return
+			case <-ticker.C:
+				break
+			case stop := <-stopChan:
+				errCode = pb.ErrorReason(stop)
+				log.Println("<ServiceLogin> service stop connect, code:", stop)
+				return
+			}
+		}
+	}).Catch(func(ex exception.Exception) {
+		log.Println("<ServiceLogin> error:", ex)
+	}).Finally(func() {
+		server.OnServiceDisConnect(server, service.Id, errCode)
+	})
+	return nil
+}

+ 57 - 0
call/rpc/internal/role/base_role.go

@@ -0,0 +1,57 @@
+package role
+
+import (
+	"log"
+	"time"
+)
+
+type baseRole struct {
+	/*
+		基础角色
+	*/
+	Id                string
+	LoginTimeStamp    int64 // 登录时间戳
+	LastTalkTimeStamp int64 // 最近发言时间戳
+
+	connChan chan int32  // 连接channel,释放则断开连接
+	Stream   interface{} // 连接stream流
+
+	logOutChan chan interface{}
+}
+
+func (sel *baseRole) SetChan(connChan chan int32) {
+	/*
+		设置连接信号
+	*/
+	sel.connChan = connChan
+}
+
+func (sel *baseRole) RefreshTalkTimeStamp() {
+	/*
+		刷新发言时间
+	*/
+	nowStamp := time.Now().Unix()
+	sel.LastTalkTimeStamp = nowStamp
+}
+
+func (sel *baseRole) StopChan(reason int32) {
+	/*
+		发送信号:断开连接
+	*/
+	if sel.connChan == nil {
+		return
+	}
+	log.Printf("<baseRole.StopChan> id:%s, reason:%d \n", sel.Id, reason)
+	sel.connChan <- reason
+	close(sel.connChan)
+	sel.connChan = nil
+}
+
+func (sel *baseRole) WaitLogOut() <-chan interface{} {
+	return sel.logOutChan
+}
+
+func (sel *baseRole) Final() {
+	sel.logOutChan <- true
+	log.Println("<baseRole.Final> id:", sel.Id)
+}

+ 23 - 0
call/rpc/internal/role/player.go

@@ -0,0 +1,23 @@
+package role
+
+import "time"
+
+type Player struct {
+	/*
+		玩家
+	*/
+	baseRole
+	GameId    int32
+	IsVisitor bool
+	SessionId string
+}
+
+func (sel *Player) Init(gameId int32, isVisitor bool, stopChan chan int32) {
+	sel.GameId = gameId
+	sel.IsVisitor = isVisitor
+	sel.connChan = stopChan
+	sel.LoginTimeStamp = time.Now().Unix()
+	sel.LastTalkTimeStamp = sel.LoginTimeStamp
+	sel.SessionId = sel.Id
+	sel.logOutChan = make(chan interface{})
+}

+ 30 - 0
call/rpc/internal/role/service.go

@@ -0,0 +1,30 @@
+package role
+
+import (
+	"call_center/call/rpc/pb"
+	db "call_center/db/rpc/pb"
+	"log"
+	"time"
+)
+
+type Service struct {
+	/*
+		客服
+	*/
+	baseRole
+	HangUpList []*pb.IdInfo
+}
+
+func (sel *Service) Init(stopChan chan int32) {
+	sel.connChan = stopChan
+	sel.LoginTimeStamp = time.Now().Unix()
+	sel.LastTalkTimeStamp = sel.LoginTimeStamp
+	sel.logOutChan = make(chan interface{})
+}
+
+func (sel *Service) InitHandUpList(pbList []*db.DbChatRecord) {
+	for _, data := range pbList {
+		sel.HangUpList = append(sel.HangUpList, &pb.IdInfo{Id: data.PlayerId, GameId: data.GameId})
+	}
+	log.Println("<Service.InitHanUpList> len:", len(sel.HangUpList), " id:", sel.Id)
+}

+ 42 - 0
call/rpc/internal/server/call_server.go

@@ -0,0 +1,42 @@
+// Code generated by goctl. DO NOT EDIT!
+// Source: call.proto
+
+package server
+
+import (
+	"context"
+
+	"call_center/call/rpc/internal/logic"
+	"call_center/call/rpc/internal/svc"
+	"call_center/call/rpc/pb"
+)
+
+type CallServer struct {
+	svcCtx *svc.ServiceContext
+}
+
+func NewCallServer(svcCtx *svc.ServiceContext) *CallServer {
+	return &CallServer{
+		svcCtx: svcCtx,
+	}
+}
+
+func (s *CallServer) ClientLogin(in *pb.ClientMsgReq, stream pb.Call_ClientLoginServer) error {
+	l := logic.NewClientLoginLogic(stream.Context(), s.svcCtx)
+	return l.ClientLogin(in, stream)
+}
+
+func (s *CallServer) ClientCall(ctx context.Context, in *pb.ClientMsgReq) (*pb.ClientMsgRes, error) {
+	l := logic.NewClientCallLogic(ctx, s.svcCtx)
+	return l.ClientCall(in)
+}
+
+func (s *CallServer) ServiceLogin(in *pb.ServiceMsgReq, stream pb.Call_ServiceLoginServer) error {
+	l := logic.NewServiceLoginLogic(stream.Context(), s.svcCtx)
+	return l.ServiceLogin(in, stream)
+}
+
+func (s *CallServer) ServiceCall(ctx context.Context, in *pb.ServiceMsgReq) (*pb.ServiceMsgRes, error) {
+	l := logic.NewServiceCallLogic(ctx, s.svcCtx)
+	return l.ServiceCall(in)
+}

+ 22 - 0
call/rpc/internal/svc/service_context.go

@@ -0,0 +1,22 @@
+package svc
+
+import (
+	"call_center/call/rpc/internal/config"
+	"call_center/call/rpc/internal/interaction"
+	"call_center/db/rpc/db"
+	"github.com/tal-tech/go-zero/zrpc"
+)
+
+type ServiceContext struct {
+	Config config.Config
+	Db     interaction.InterDb
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	dbRpc := db.NewDb(zrpc.MustNewClient(c.DbRpc))
+	interDb := interaction.NewInterDb(dbRpc)
+	return &ServiceContext{
+		Config: c,
+		Db:     interDb,
+	}
+}

+ 469 - 0
call/rpc/pb/call.pb.go

@@ -0,0 +1,469 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: call.proto
+
+package pb
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type ClientMsgReq struct {
+	IdInfo               *IdInfo       `protobuf:"bytes,3,opt,name=id_info,json=idInfo,proto3" json:"id_info,omitempty"`
+	Cmd                  []*CommandMsg `protobuf:"bytes,1,rep,name=cmd,proto3" json:"cmd,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ClientMsgReq) Reset()         { *m = ClientMsgReq{} }
+func (m *ClientMsgReq) String() string { return proto.CompactTextString(m) }
+func (*ClientMsgReq) ProtoMessage()    {}
+func (*ClientMsgReq) Descriptor() ([]byte, []int) {
+	return fileDescriptor_caa5955d5eab2d2d, []int{0}
+}
+
+func (m *ClientMsgReq) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClientMsgReq.Unmarshal(m, b)
+}
+func (m *ClientMsgReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClientMsgReq.Marshal(b, m, deterministic)
+}
+func (m *ClientMsgReq) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClientMsgReq.Merge(m, src)
+}
+func (m *ClientMsgReq) XXX_Size() int {
+	return xxx_messageInfo_ClientMsgReq.Size(m)
+}
+func (m *ClientMsgReq) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClientMsgReq.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClientMsgReq proto.InternalMessageInfo
+
+func (m *ClientMsgReq) GetIdInfo() *IdInfo {
+	if m != nil {
+		return m.IdInfo
+	}
+	return nil
+}
+
+func (m *ClientMsgReq) GetCmd() []*CommandMsg {
+	if m != nil {
+		return m.Cmd
+	}
+	return nil
+}
+
+type ClientMsgRes struct {
+	Cmd                  []*CommandMsg `protobuf:"bytes,1,rep,name=cmd,proto3" json:"cmd,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ClientMsgRes) Reset()         { *m = ClientMsgRes{} }
+func (m *ClientMsgRes) String() string { return proto.CompactTextString(m) }
+func (*ClientMsgRes) ProtoMessage()    {}
+func (*ClientMsgRes) Descriptor() ([]byte, []int) {
+	return fileDescriptor_caa5955d5eab2d2d, []int{1}
+}
+
+func (m *ClientMsgRes) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ClientMsgRes.Unmarshal(m, b)
+}
+func (m *ClientMsgRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ClientMsgRes.Marshal(b, m, deterministic)
+}
+func (m *ClientMsgRes) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ClientMsgRes.Merge(m, src)
+}
+func (m *ClientMsgRes) XXX_Size() int {
+	return xxx_messageInfo_ClientMsgRes.Size(m)
+}
+func (m *ClientMsgRes) XXX_DiscardUnknown() {
+	xxx_messageInfo_ClientMsgRes.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClientMsgRes proto.InternalMessageInfo
+
+func (m *ClientMsgRes) GetCmd() []*CommandMsg {
+	if m != nil {
+		return m.Cmd
+	}
+	return nil
+}
+
+type ServiceMsgReq struct {
+	IdInfo               *IdInfo       `protobuf:"bytes,3,opt,name=id_info,json=idInfo,proto3" json:"id_info,omitempty"`
+	Cmd                  []*CommandMsg `protobuf:"bytes,1,rep,name=cmd,proto3" json:"cmd,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ServiceMsgReq) Reset()         { *m = ServiceMsgReq{} }
+func (m *ServiceMsgReq) String() string { return proto.CompactTextString(m) }
+func (*ServiceMsgReq) ProtoMessage()    {}
+func (*ServiceMsgReq) Descriptor() ([]byte, []int) {
+	return fileDescriptor_caa5955d5eab2d2d, []int{2}
+}
+
+func (m *ServiceMsgReq) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ServiceMsgReq.Unmarshal(m, b)
+}
+func (m *ServiceMsgReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ServiceMsgReq.Marshal(b, m, deterministic)
+}
+func (m *ServiceMsgReq) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceMsgReq.Merge(m, src)
+}
+func (m *ServiceMsgReq) XXX_Size() int {
+	return xxx_messageInfo_ServiceMsgReq.Size(m)
+}
+func (m *ServiceMsgReq) XXX_DiscardUnknown() {
+	xxx_messageInfo_ServiceMsgReq.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ServiceMsgReq proto.InternalMessageInfo
+
+func (m *ServiceMsgReq) GetIdInfo() *IdInfo {
+	if m != nil {
+		return m.IdInfo
+	}
+	return nil
+}
+
+func (m *ServiceMsgReq) GetCmd() []*CommandMsg {
+	if m != nil {
+		return m.Cmd
+	}
+	return nil
+}
+
+type ServiceMsgRes struct {
+	Cmd                  []*CommandMsg `protobuf:"bytes,1,rep,name=cmd,proto3" json:"cmd,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ServiceMsgRes) Reset()         { *m = ServiceMsgRes{} }
+func (m *ServiceMsgRes) String() string { return proto.CompactTextString(m) }
+func (*ServiceMsgRes) ProtoMessage()    {}
+func (*ServiceMsgRes) Descriptor() ([]byte, []int) {
+	return fileDescriptor_caa5955d5eab2d2d, []int{3}
+}
+
+func (m *ServiceMsgRes) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ServiceMsgRes.Unmarshal(m, b)
+}
+func (m *ServiceMsgRes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ServiceMsgRes.Marshal(b, m, deterministic)
+}
+func (m *ServiceMsgRes) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceMsgRes.Merge(m, src)
+}
+func (m *ServiceMsgRes) XXX_Size() int {
+	return xxx_messageInfo_ServiceMsgRes.Size(m)
+}
+func (m *ServiceMsgRes) XXX_DiscardUnknown() {
+	xxx_messageInfo_ServiceMsgRes.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ServiceMsgRes proto.InternalMessageInfo
+
+func (m *ServiceMsgRes) GetCmd() []*CommandMsg {
+	if m != nil {
+		return m.Cmd
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*ClientMsgReq)(nil), "pb.ClientMsgReq")
+	proto.RegisterType((*ClientMsgRes)(nil), "pb.ClientMsgRes")
+	proto.RegisterType((*ServiceMsgReq)(nil), "pb.ServiceMsgReq")
+	proto.RegisterType((*ServiceMsgRes)(nil), "pb.ServiceMsgRes")
+}
+
+func init() { proto.RegisterFile("call.proto", fileDescriptor_caa5955d5eab2d2d) }
+
+var fileDescriptor_caa5955d5eab2d2d = []byte{
+	// 241 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4a, 0x4e, 0xcc, 0xc9,
+	0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2a, 0x48, 0x92, 0xe2, 0xcd, 0x4d, 0x2d, 0x2e,
+	0x4e, 0x4c, 0x4f, 0x85, 0x08, 0x29, 0x85, 0x72, 0xf1, 0x38, 0xe7, 0x64, 0xa6, 0xe6, 0x95, 0xf8,
+	0x16, 0xa7, 0x07, 0xa5, 0x16, 0x0a, 0x29, 0x73, 0xb1, 0x67, 0xa6, 0xc4, 0x67, 0xe6, 0xa5, 0xe5,
+	0x4b, 0x30, 0x2b, 0x30, 0x6a, 0x70, 0x1b, 0x71, 0xe9, 0x15, 0x24, 0xe9, 0x79, 0xa6, 0x78, 0xe6,
+	0xa5, 0xe5, 0x07, 0xb1, 0x65, 0x82, 0x69, 0x21, 0x05, 0x2e, 0xe6, 0xe4, 0xdc, 0x14, 0x09, 0x46,
+	0x05, 0x66, 0x0d, 0x6e, 0x23, 0x3e, 0x90, 0x02, 0xe7, 0xfc, 0xdc, 0xdc, 0xc4, 0xbc, 0x14, 0x90,
+	0x21, 0x20, 0x29, 0x25, 0x03, 0x14, 0x63, 0x8b, 0x89, 0xd0, 0x11, 0xc6, 0xc5, 0x1b, 0x9c, 0x5a,
+	0x54, 0x96, 0x99, 0x9c, 0x4a, 0x5d, 0x97, 0x18, 0xa2, 0x9a, 0x4b, 0x84, 0x53, 0x8c, 0x1e, 0x31,
+	0x72, 0xb1, 0x38, 0x27, 0xe6, 0xe4, 0x08, 0x99, 0x72, 0x71, 0x43, 0x7c, 0xe1, 0x93, 0x9f, 0x9e,
+	0x99, 0x27, 0x24, 0x00, 0x56, 0x8c, 0x14, 0x5a, 0x52, 0xe8, 0x22, 0xc5, 0x4a, 0x0c, 0x06, 0x8c,
+	0x42, 0x46, 0x5c, 0x5c, 0x10, 0x31, 0xb0, 0x21, 0x44, 0xe9, 0x12, 0xb2, 0xe0, 0xe2, 0x81, 0x3a,
+	0x13, 0x62, 0x97, 0x20, 0x48, 0x0d, 0x4a, 0x80, 0x48, 0x61, 0x08, 0x41, 0x6c, 0x33, 0xe5, 0xe2,
+	0x86, 0x0a, 0x82, 0xad, 0x23, 0x52, 0xa3, 0x13, 0x6b, 0x14, 0xb3, 0x7e, 0x41, 0x52, 0x12, 0x1b,
+	0x38, 0x19, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x63, 0xe5, 0xf6, 0x2b, 0x27, 0x02, 0x00,
+	0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// CallClient is the client API for Call service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type CallClient interface {
+	ClientLogin(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (Call_ClientLoginClient, error)
+	ClientCall(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (*ClientMsgRes, error)
+	ServiceLogin(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (Call_ServiceLoginClient, error)
+	ServiceCall(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (*ServiceMsgRes, error)
+}
+
+type callClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewCallClient(cc *grpc.ClientConn) CallClient {
+	return &callClient{cc}
+}
+
+func (c *callClient) ClientLogin(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (Call_ClientLoginClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_Call_serviceDesc.Streams[0], "/pb.Call/ClientLogin", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &callClientLoginClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type Call_ClientLoginClient interface {
+	Recv() (*ClientMsgRes, error)
+	grpc.ClientStream
+}
+
+type callClientLoginClient struct {
+	grpc.ClientStream
+}
+
+func (x *callClientLoginClient) Recv() (*ClientMsgRes, error) {
+	m := new(ClientMsgRes)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *callClient) ClientCall(ctx context.Context, in *ClientMsgReq, opts ...grpc.CallOption) (*ClientMsgRes, error) {
+	out := new(ClientMsgRes)
+	err := c.cc.Invoke(ctx, "/pb.Call/ClientCall", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *callClient) ServiceLogin(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (Call_ServiceLoginClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_Call_serviceDesc.Streams[1], "/pb.Call/ServiceLogin", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &callServiceLoginClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type Call_ServiceLoginClient interface {
+	Recv() (*ServiceMsgRes, error)
+	grpc.ClientStream
+}
+
+type callServiceLoginClient struct {
+	grpc.ClientStream
+}
+
+func (x *callServiceLoginClient) Recv() (*ServiceMsgRes, error) {
+	m := new(ServiceMsgRes)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *callClient) ServiceCall(ctx context.Context, in *ServiceMsgReq, opts ...grpc.CallOption) (*ServiceMsgRes, error) {
+	out := new(ServiceMsgRes)
+	err := c.cc.Invoke(ctx, "/pb.Call/ServiceCall", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// CallServer is the server API for Call service.
+type CallServer interface {
+	ClientLogin(*ClientMsgReq, Call_ClientLoginServer) error
+	ClientCall(context.Context, *ClientMsgReq) (*ClientMsgRes, error)
+	ServiceLogin(*ServiceMsgReq, Call_ServiceLoginServer) error
+	ServiceCall(context.Context, *ServiceMsgReq) (*ServiceMsgRes, error)
+}
+
+// UnimplementedCallServer can be embedded to have forward compatible implementations.
+type UnimplementedCallServer struct {
+}
+
+func (*UnimplementedCallServer) ClientLogin(req *ClientMsgReq, srv Call_ClientLoginServer) error {
+	return status.Errorf(codes.Unimplemented, "method ClientLogin not implemented")
+}
+func (*UnimplementedCallServer) ClientCall(ctx context.Context, req *ClientMsgReq) (*ClientMsgRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ClientCall not implemented")
+}
+func (*UnimplementedCallServer) ServiceLogin(req *ServiceMsgReq, srv Call_ServiceLoginServer) error {
+	return status.Errorf(codes.Unimplemented, "method ServiceLogin not implemented")
+}
+func (*UnimplementedCallServer) ServiceCall(ctx context.Context, req *ServiceMsgReq) (*ServiceMsgRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ServiceCall not implemented")
+}
+
+func RegisterCallServer(s *grpc.Server, srv CallServer) {
+	s.RegisterService(&_Call_serviceDesc, srv)
+}
+
+func _Call_ClientLogin_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(ClientMsgReq)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(CallServer).ClientLogin(m, &callClientLoginServer{stream})
+}
+
+type Call_ClientLoginServer interface {
+	Send(*ClientMsgRes) error
+	grpc.ServerStream
+}
+
+type callClientLoginServer struct {
+	grpc.ServerStream
+}
+
+func (x *callClientLoginServer) Send(m *ClientMsgRes) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _Call_ClientCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ClientMsgReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CallServer).ClientCall(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.Call/ClientCall",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CallServer).ClientCall(ctx, req.(*ClientMsgReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Call_ServiceLogin_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(ServiceMsgReq)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(CallServer).ServiceLogin(m, &callServiceLoginServer{stream})
+}
+
+type Call_ServiceLoginServer interface {
+	Send(*ServiceMsgRes) error
+	grpc.ServerStream
+}
+
+type callServiceLoginServer struct {
+	grpc.ServerStream
+}
+
+func (x *callServiceLoginServer) Send(m *ServiceMsgRes) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _Call_ServiceCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ServiceMsgReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(CallServer).ServiceCall(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.Call/ServiceCall",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(CallServer).ServiceCall(ctx, req.(*ServiceMsgReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Call_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "pb.Call",
+	HandlerType: (*CallServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ClientCall",
+			Handler:    _Call_ClientCall_Handler,
+		},
+		{
+			MethodName: "ServiceCall",
+			Handler:    _Call_ServiceCall_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "ClientLogin",
+			Handler:       _Call_ClientLogin_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "ServiceLogin",
+			Handler:       _Call_ServiceLogin_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "call.proto",
+}

+ 422 - 0
call/rpc/pb/commands.pb.go

@@ -0,0 +1,422 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.17.3
+// source: commands.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// 状态命令枚举
+type ECommand int32
+
+const (
+	ECommand_SEND_MSG       ECommand = 0 // 消息信息
+	ECommand_MSG_HEART_BEAT ECommand = 3 // 心跳
+	// status
+	ECommand_ON_PLAYER_DISCONNECT      ECommand = 1004 // 玩家断开连接  cmd_str:玩家id cmd_val:登出原因ErrorReason
+	ECommand_ON_PLAYER_CONNECT         ECommand = 1005 // 玩家连接     cmd_str:玩家id
+	ECommand_ON_PLAYER_WAIT_QUEUE_INFO ECommand = 1006 // 玩家等待队列信息 消息体:CommandMsg.buff.array_id_info
+	ECommand_ON_PLAYER_RECEIVE_REPLY   ECommand = 1007 // 玩家被应答 cmd_str:客服id
+	ECommand_ON_PLAYER_WAIT_QUEUE_LEN  ECommand = 1008 // 玩家等待队列长度 cmd_val: 队列人数
+	ECommand_ON_SERVICE_DISCONNECT     ECommand = 3002 // 客服断开连接   cmd_str:客服id
+	ECommand_ON_SERVICE_CONNECT        ECommand = 3003 // 客服连接     cmd_str:客服id
+	ECommand_ON_SERVICE_HANG_UP_LIST   ECommand = 3004 // 客服-玩家挂断列表   消息体:CommandMsg.buff.array_id_info
+	// 请求操作
+	ECommand_CALL_PLAYER_MSG      ECommand = 2001 // 玩家->服务端 发送消息
+	ECommand_CALL_SERVICE_MSG     ECommand = 2002 // 客服->服务端 发送消息
+	ECommand_CALL_PLAYER_LOGOUT   ECommand = 2003 // 玩家登出
+	ECommand_CALL_SERVICE_LOGOUT  ECommand = 2004 // 客服登出
+	ECommand_CALL_SERVICE_REPLY   ECommand = 2005 // 客服应答 cmd_str:待应答的玩家id
+	ECommand_CALL_PLAYER_CHAT_LOG ECommand = 2006 // 获取玩家聊天记录 cmd_str:玩家id    返回:CommandMsg.buff.array_chat_log
+	// gm debug
+	ECommand_MSG_TEST ECommand = 100001
+)
+
+// Enum value maps for ECommand.
+var (
+	ECommand_name = map[int32]string{
+		0:      "SEND_MSG",
+		3:      "MSG_HEART_BEAT",
+		1004:   "ON_PLAYER_DISCONNECT",
+		1005:   "ON_PLAYER_CONNECT",
+		1006:   "ON_PLAYER_WAIT_QUEUE_INFO",
+		1007:   "ON_PLAYER_RECEIVE_REPLY",
+		1008:   "ON_PLAYER_WAIT_QUEUE_LEN",
+		3002:   "ON_SERVICE_DISCONNECT",
+		3003:   "ON_SERVICE_CONNECT",
+		3004:   "ON_SERVICE_HANG_UP_LIST",
+		2001:   "CALL_PLAYER_MSG",
+		2002:   "CALL_SERVICE_MSG",
+		2003:   "CALL_PLAYER_LOGOUT",
+		2004:   "CALL_SERVICE_LOGOUT",
+		2005:   "CALL_SERVICE_REPLY",
+		2006:   "CALL_PLAYER_CHAT_LOG",
+		100001: "MSG_TEST",
+	}
+	ECommand_value = map[string]int32{
+		"SEND_MSG":                  0,
+		"MSG_HEART_BEAT":            3,
+		"ON_PLAYER_DISCONNECT":      1004,
+		"ON_PLAYER_CONNECT":         1005,
+		"ON_PLAYER_WAIT_QUEUE_INFO": 1006,
+		"ON_PLAYER_RECEIVE_REPLY":   1007,
+		"ON_PLAYER_WAIT_QUEUE_LEN":  1008,
+		"ON_SERVICE_DISCONNECT":     3002,
+		"ON_SERVICE_CONNECT":        3003,
+		"ON_SERVICE_HANG_UP_LIST":   3004,
+		"CALL_PLAYER_MSG":           2001,
+		"CALL_SERVICE_MSG":          2002,
+		"CALL_PLAYER_LOGOUT":        2003,
+		"CALL_SERVICE_LOGOUT":       2004,
+		"CALL_SERVICE_REPLY":        2005,
+		"CALL_PLAYER_CHAT_LOG":      2006,
+		"MSG_TEST":                  100001,
+	}
+)
+
+func (x ECommand) Enum() *ECommand {
+	p := new(ECommand)
+	*p = x
+	return p
+}
+
+func (x ECommand) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ECommand) Descriptor() protoreflect.EnumDescriptor {
+	return file_commands_proto_enumTypes[0].Descriptor()
+}
+
+func (ECommand) Type() protoreflect.EnumType {
+	return &file_commands_proto_enumTypes[0]
+}
+
+func (x ECommand) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ECommand.Descriptor instead.
+func (ECommand) EnumDescriptor() ([]byte, []int) {
+	return file_commands_proto_rawDescGZIP(), []int{0}
+}
+
+// 错误枚举
+type ErrorReason int32
+
+const (
+	ErrorReason_ERROR_DUMMY                ErrorReason = 0
+	ErrorReason_PLAYER_HEART_BEAT_FAILED   ErrorReason = 1000 // 玩家心跳失败
+	ErrorReason_PLAYER_REPEAT_LOGIN        ErrorReason = 1001 // 玩家重复登录
+	ErrorReason_PLAYER_WAIT_QUEUE_OVERTIME ErrorReason = 1002 // 玩家等待队列超时
+	ErrorReason_PLAYER_TALK_INTERVAL_LIMIT ErrorReason = 1003 // 玩家发言时间超时
+	ErrorReason_PLAYER_CALL_LOGOUT         ErrorReason = 1004 // 玩家主动登出
+	ErrorReason_SERVICE_REPEAT_LOGIN       ErrorReason = 2001 // 客服重复登录
+	ErrorReason_SERVICE_CALL_LOGOUT        ErrorReason = 2002 // 客服主动登出
+	ErrorReason_SERVICE_HEART_BEAT_FAILED  ErrorReason = 2003 // 客服心跳超时
+)
+
+// Enum value maps for ErrorReason.
+var (
+	ErrorReason_name = map[int32]string{
+		0:    "ERROR_DUMMY",
+		1000: "PLAYER_HEART_BEAT_FAILED",
+		1001: "PLAYER_REPEAT_LOGIN",
+		1002: "PLAYER_WAIT_QUEUE_OVERTIME",
+		1003: "PLAYER_TALK_INTERVAL_LIMIT",
+		1004: "PLAYER_CALL_LOGOUT",
+		2001: "SERVICE_REPEAT_LOGIN",
+		2002: "SERVICE_CALL_LOGOUT",
+		2003: "SERVICE_HEART_BEAT_FAILED",
+	}
+	ErrorReason_value = map[string]int32{
+		"ERROR_DUMMY":                0,
+		"PLAYER_HEART_BEAT_FAILED":   1000,
+		"PLAYER_REPEAT_LOGIN":        1001,
+		"PLAYER_WAIT_QUEUE_OVERTIME": 1002,
+		"PLAYER_TALK_INTERVAL_LIMIT": 1003,
+		"PLAYER_CALL_LOGOUT":         1004,
+		"SERVICE_REPEAT_LOGIN":       2001,
+		"SERVICE_CALL_LOGOUT":        2002,
+		"SERVICE_HEART_BEAT_FAILED":  2003,
+	}
+)
+
+func (x ErrorReason) Enum() *ErrorReason {
+	p := new(ErrorReason)
+	*p = x
+	return p
+}
+
+func (x ErrorReason) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (ErrorReason) Descriptor() protoreflect.EnumDescriptor {
+	return file_commands_proto_enumTypes[1].Descriptor()
+}
+
+func (ErrorReason) Type() protoreflect.EnumType {
+	return &file_commands_proto_enumTypes[1]
+}
+
+func (x ErrorReason) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use ErrorReason.Descriptor instead.
+func (ErrorReason) EnumDescriptor() ([]byte, []int) {
+	return file_commands_proto_rawDescGZIP(), []int{1}
+}
+
+// 内网调试debug命令
+type EDebugCmd int32
+
+const (
+	//
+	//修改队列等待时间(s):
+	//cmd_str: WaitConnServiceLimit
+	//cmd_val: 30
+	//修改长时间聊天未发言时限(s):
+	//cmd_str:LastTalkIntervalLimit
+	//cmd_val:60
+	//
+	//消息example:
+	//msg.cmd_type: ECommand.MSG_TEST
+	//msg.cmd_val: EDebugCmd.MODIFY_CONFIG
+	//msg.cmd_str: "{\"WaitConnServiceLimit\": 3600}"
+	EDebugCmd_MODIFY_CONFIG EDebugCmd = 0 // 修改配置
+	EDebugCmd_SERVICE_REPLY EDebugCmd = 1 // 客服连接
+	EDebugCmd_GET_CHAT_LOG  EDebugCmd = 2 // 获取聊天log cmd_str:客服id
+)
+
+// Enum value maps for EDebugCmd.
+var (
+	EDebugCmd_name = map[int32]string{
+		0: "MODIFY_CONFIG",
+		1: "SERVICE_REPLY",
+		2: "GET_CHAT_LOG",
+	}
+	EDebugCmd_value = map[string]int32{
+		"MODIFY_CONFIG": 0,
+		"SERVICE_REPLY": 1,
+		"GET_CHAT_LOG":  2,
+	}
+)
+
+func (x EDebugCmd) Enum() *EDebugCmd {
+	p := new(EDebugCmd)
+	*p = x
+	return p
+}
+
+func (x EDebugCmd) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (EDebugCmd) Descriptor() protoreflect.EnumDescriptor {
+	return file_commands_proto_enumTypes[2].Descriptor()
+}
+
+func (EDebugCmd) Type() protoreflect.EnumType {
+	return &file_commands_proto_enumTypes[2]
+}
+
+func (x EDebugCmd) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use EDebugCmd.Descriptor instead.
+func (EDebugCmd) EnumDescriptor() ([]byte, []int) {
+	return file_commands_proto_rawDescGZIP(), []int{2}
+}
+
+// error
+type EErrorCode int32
+
+const (
+	EErrorCode_ERR_DUMMY            EErrorCode = 0
+	EErrorCode_ERR_HANDLER_CALL_ERR EErrorCode = 1   // 请求调用失败
+	EErrorCode_ERR_REQUEST_LIMIT    EErrorCode = 101 // 请求过于频繁
+	EErrorCode_ERR_PLAYER_CONN_ERR  EErrorCode = 102 // 玩家连接失败
+	EErrorCode_ERR_PARAM_ERROR      EErrorCode = 103 // 参数错误
+	EErrorCode_ERR_SERVICE_CONN_ERR EErrorCode = 104 // 客服连接失败
+)
+
+// Enum value maps for EErrorCode.
+var (
+	EErrorCode_name = map[int32]string{
+		0:   "ERR_DUMMY",
+		1:   "ERR_HANDLER_CALL_ERR",
+		101: "ERR_REQUEST_LIMIT",
+		102: "ERR_PLAYER_CONN_ERR",
+		103: "ERR_PARAM_ERROR",
+		104: "ERR_SERVICE_CONN_ERR",
+	}
+	EErrorCode_value = map[string]int32{
+		"ERR_DUMMY":            0,
+		"ERR_HANDLER_CALL_ERR": 1,
+		"ERR_REQUEST_LIMIT":    101,
+		"ERR_PLAYER_CONN_ERR":  102,
+		"ERR_PARAM_ERROR":      103,
+		"ERR_SERVICE_CONN_ERR": 104,
+	}
+)
+
+func (x EErrorCode) Enum() *EErrorCode {
+	p := new(EErrorCode)
+	*p = x
+	return p
+}
+
+func (x EErrorCode) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (EErrorCode) Descriptor() protoreflect.EnumDescriptor {
+	return file_commands_proto_enumTypes[3].Descriptor()
+}
+
+func (EErrorCode) Type() protoreflect.EnumType {
+	return &file_commands_proto_enumTypes[3]
+}
+
+func (x EErrorCode) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use EErrorCode.Descriptor instead.
+func (EErrorCode) EnumDescriptor() ([]byte, []int) {
+	return file_commands_proto_rawDescGZIP(), []int{3}
+}
+
+var File_commands_proto protoreflect.FileDescriptor
+
+var file_commands_proto_rawDesc = []byte{
+	0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x02, 0x70, 0x62, 0x2a, 0xb3, 0x03, 0x0a, 0x08, 0x45, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
+	0x64, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x4d, 0x53, 0x47, 0x10, 0x00, 0x12,
+	0x12, 0x0a, 0x0e, 0x4d, 0x53, 0x47, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, 0x5f, 0x42, 0x45, 0x41,
+	0x54, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x14, 0x4f, 0x4e, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52,
+	0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0xec, 0x07, 0x12, 0x16,
+	0x0a, 0x11, 0x4f, 0x4e, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x4e,
+	0x45, 0x43, 0x54, 0x10, 0xed, 0x07, 0x12, 0x1e, 0x0a, 0x19, 0x4f, 0x4e, 0x5f, 0x50, 0x4c, 0x41,
+	0x59, 0x45, 0x52, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x49,
+	0x4e, 0x46, 0x4f, 0x10, 0xee, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x4e, 0x5f, 0x50, 0x4c, 0x41,
+	0x59, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c,
+	0x59, 0x10, 0xef, 0x07, 0x12, 0x1d, 0x0a, 0x18, 0x4f, 0x4e, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45,
+	0x52, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x4c, 0x45, 0x4e,
+	0x10, 0xf0, 0x07, 0x12, 0x1a, 0x0a, 0x15, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43,
+	0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0xba, 0x17, 0x12,
+	0x17, 0x0a, 0x12, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x4f,
+	0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0xbb, 0x17, 0x12, 0x1c, 0x0a, 0x17, 0x4f, 0x4e, 0x5f, 0x53,
+	0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x48, 0x41, 0x4e, 0x47, 0x5f, 0x55, 0x50, 0x5f, 0x4c,
+	0x49, 0x53, 0x54, 0x10, 0xbc, 0x17, 0x12, 0x14, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x50,
+	0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x4d, 0x53, 0x47, 0x10, 0xd1, 0x0f, 0x12, 0x15, 0x0a, 0x10,
+	0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x53, 0x47,
+	0x10, 0xd2, 0x0f, 0x12, 0x17, 0x0a, 0x12, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59,
+	0x45, 0x52, 0x5f, 0x4c, 0x4f, 0x47, 0x4f, 0x55, 0x54, 0x10, 0xd3, 0x0f, 0x12, 0x18, 0x0a, 0x13,
+	0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4c, 0x4f, 0x47,
+	0x4f, 0x55, 0x54, 0x10, 0xd4, 0x0f, 0x12, 0x17, 0x0a, 0x12, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x53,
+	0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x59, 0x10, 0xd5, 0x0f, 0x12,
+	0x19, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x43,
+	0x48, 0x41, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0xd6, 0x0f, 0x12, 0x0e, 0x0a, 0x08, 0x4d, 0x53,
+	0x47, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0xa1, 0x8d, 0x06, 0x2a, 0x87, 0x02, 0x0a, 0x0b, 0x45,
+	0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x52,
+	0x52, 0x4f, 0x52, 0x5f, 0x44, 0x55, 0x4d, 0x4d, 0x59, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x18, 0x50,
+	0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x52, 0x54, 0x5f, 0x42, 0x45, 0x41, 0x54,
+	0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0xe8, 0x07, 0x12, 0x18, 0x0a, 0x13, 0x50, 0x4c,
+	0x41, 0x59, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x49,
+	0x4e, 0x10, 0xe9, 0x07, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x57,
+	0x41, 0x49, 0x54, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x49,
+	0x4d, 0x45, 0x10, 0xea, 0x07, 0x12, 0x1f, 0x0a, 0x1a, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f,
+	0x54, 0x41, 0x4c, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x4c, 0x49,
+	0x4d, 0x49, 0x54, 0x10, 0xeb, 0x07, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52,
+	0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x4c, 0x4f, 0x47, 0x4f, 0x55, 0x54, 0x10, 0xec, 0x07, 0x12,
+	0x19, 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41,
+	0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x49, 0x4e, 0x10, 0xd1, 0x0f, 0x12, 0x18, 0x0a, 0x13, 0x53, 0x45,
+	0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x4c, 0x4f, 0x47, 0x4f, 0x55,
+	0x54, 0x10, 0xd2, 0x0f, 0x12, 0x1e, 0x0a, 0x19, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f,
+	0x48, 0x45, 0x41, 0x52, 0x54, 0x5f, 0x42, 0x45, 0x41, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45,
+	0x44, 0x10, 0xd3, 0x0f, 0x2a, 0x43, 0x0a, 0x09, 0x45, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x6d,
+	0x64, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x46,
+	0x49, 0x47, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f,
+	0x52, 0x45, 0x50, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x47, 0x45, 0x54, 0x5f, 0x43,
+	0x48, 0x41, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0a, 0x45, 0x45,
+	0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x52, 0x52, 0x5f,
+	0x44, 0x55, 0x4d, 0x4d, 0x59, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x52, 0x52, 0x5f, 0x48,
+	0x41, 0x4e, 0x44, 0x4c, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x10,
+	0x01, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x52, 0x52, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54,
+	0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x52, 0x52, 0x5f,
+	0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x10,
+	0x66, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x52, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x5f, 0x45,
+	0x52, 0x52, 0x4f, 0x52, 0x10, 0x67, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x52, 0x52, 0x5f, 0x53, 0x45,
+	0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x10, 0x68,
+	0x42, 0x05, 0x5a, 0x03, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_commands_proto_rawDescOnce sync.Once
+	file_commands_proto_rawDescData = file_commands_proto_rawDesc
+)
+
+func file_commands_proto_rawDescGZIP() []byte {
+	file_commands_proto_rawDescOnce.Do(func() {
+		file_commands_proto_rawDescData = protoimpl.X.CompressGZIP(file_commands_proto_rawDescData)
+	})
+	return file_commands_proto_rawDescData
+}
+
+var file_commands_proto_enumTypes = make([]protoimpl.EnumInfo, 4)
+var file_commands_proto_goTypes = []interface{}{
+	(ECommand)(0),    // 0: pb.ECommand
+	(ErrorReason)(0), // 1: pb.ErrorReason
+	(EDebugCmd)(0),   // 2: pb.EDebugCmd
+	(EErrorCode)(0),  // 3: pb.EErrorCode
+}
+var file_commands_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_commands_proto_init() }
+func file_commands_proto_init() {
+	if File_commands_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_commands_proto_rawDesc,
+			NumEnums:      4,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_commands_proto_goTypes,
+		DependencyIndexes: file_commands_proto_depIdxs,
+		EnumInfos:         file_commands_proto_enumTypes,
+	}.Build()
+	File_commands_proto = out.File
+	file_commands_proto_rawDesc = nil
+	file_commands_proto_goTypes = nil
+	file_commands_proto_depIdxs = nil
+}

+ 629 - 0
call/rpc/pb/message.pb.go

@@ -0,0 +1,629 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.17.3
+// source: message.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+//
+//聊天信息
+type ChatMsg struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"` // 接收者id
+	Input    string `protobuf:"bytes,2,opt,name=input,proto3" json:"input,omitempty"`                       // 输入内容
+}
+
+func (x *ChatMsg) Reset() {
+	*x = ChatMsg{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ChatMsg) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatMsg) ProtoMessage() {}
+
+func (x *ChatMsg) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatMsg.ProtoReflect.Descriptor instead.
+func (*ChatMsg) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ChatMsg) GetClientId() string {
+	if x != nil {
+		return x.ClientId
+	}
+	return ""
+}
+
+func (x *ChatMsg) GetInput() string {
+	if x != nil {
+		return x.Input
+	}
+	return ""
+}
+
+//
+//玩家基本信息
+type IdInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id     string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`                        // id
+	GameId int32  `protobuf:"varint,2,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"` // game id
+}
+
+func (x *IdInfo) Reset() {
+	*x = IdInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *IdInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*IdInfo) ProtoMessage() {}
+
+func (x *IdInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use IdInfo.ProtoReflect.Descriptor instead.
+func (*IdInfo) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *IdInfo) GetId() string {
+	if x != nil {
+		return x.Id
+	}
+	return ""
+}
+
+func (x *IdInfo) GetGameId() int32 {
+	if x != nil {
+		return x.GameId
+	}
+	return 0
+}
+
+type ArrayIdInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	IdInfos []*IdInfo `protobuf:"bytes,1,rep,name=id_infos,json=idInfos,proto3" json:"id_infos,omitempty"`
+}
+
+func (x *ArrayIdInfo) Reset() {
+	*x = ArrayIdInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ArrayIdInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ArrayIdInfo) ProtoMessage() {}
+
+func (x *ArrayIdInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ArrayIdInfo.ProtoReflect.Descriptor instead.
+func (*ArrayIdInfo) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *ArrayIdInfo) GetIdInfos() []*IdInfo {
+	if x != nil {
+		return x.IdInfos
+	}
+	return nil
+}
+
+//
+//聊天记录
+type ChatLog struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Content    string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"`                          // 聊天内容
+	TimeStamp  int64  `protobuf:"varint,4,opt,name=time_stamp,json=timeStamp,proto3" json:"time_stamp,omitempty"`    // 时间戳
+	GameId     int32  `protobuf:"varint,5,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"`             // 游戏id
+	FromPlayer bool   `protobuf:"varint,6,opt,name=from_player,json=fromPlayer,proto3" json:"from_player,omitempty"` // 是否是玩家发言
+}
+
+func (x *ChatLog) Reset() {
+	*x = ChatLog{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ChatLog) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ChatLog) ProtoMessage() {}
+
+func (x *ChatLog) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ChatLog.ProtoReflect.Descriptor instead.
+func (*ChatLog) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ChatLog) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *ChatLog) GetTimeStamp() int64 {
+	if x != nil {
+		return x.TimeStamp
+	}
+	return 0
+}
+
+func (x *ChatLog) GetGameId() int32 {
+	if x != nil {
+		return x.GameId
+	}
+	return 0
+}
+
+func (x *ChatLog) GetFromPlayer() bool {
+	if x != nil {
+		return x.FromPlayer
+	}
+	return false
+}
+
+type ArrayChatLog struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataList []*ChatLog `protobuf:"bytes,1,rep,name=data_list,json=dataList,proto3" json:"data_list,omitempty"`
+}
+
+func (x *ArrayChatLog) Reset() {
+	*x = ArrayChatLog{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ArrayChatLog) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ArrayChatLog) ProtoMessage() {}
+
+func (x *ArrayChatLog) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ArrayChatLog.ProtoReflect.Descriptor instead.
+func (*ArrayChatLog) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *ArrayChatLog) GetDataList() []*ChatLog {
+	if x != nil {
+		return x.DataList
+	}
+	return nil
+}
+
+//
+//命令消息
+type CommandMsg struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CmdType ECommand `protobuf:"varint,1,opt,name=cmd_type,json=cmdType,proto3,enum=pb.ECommand" json:"cmd_type,omitempty"` // 命令类型
+	CmdVal  int32    `protobuf:"varint,2,opt,name=cmd_val,json=cmdVal,proto3" json:"cmd_val,omitempty"`                     // 通用val
+	CmdStr  string   `protobuf:"bytes,3,opt,name=cmd_str,json=cmdStr,proto3" json:"cmd_str,omitempty"`                      // 通用str
+	// Types that are assignable to Buff:
+	//	*CommandMsg_ChatMsg
+	//	*CommandMsg_IdInfo
+	//	*CommandMsg_ArrayIdInfo
+	//	*CommandMsg_ArrayChatLog
+	Buff isCommandMsg_Buff `protobuf_oneof:"buff"`
+}
+
+func (x *CommandMsg) Reset() {
+	*x = CommandMsg{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_message_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CommandMsg) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CommandMsg) ProtoMessage() {}
+
+func (x *CommandMsg) ProtoReflect() protoreflect.Message {
+	mi := &file_message_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CommandMsg.ProtoReflect.Descriptor instead.
+func (*CommandMsg) Descriptor() ([]byte, []int) {
+	return file_message_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *CommandMsg) GetCmdType() ECommand {
+	if x != nil {
+		return x.CmdType
+	}
+	return ECommand_SEND_MSG
+}
+
+func (x *CommandMsg) GetCmdVal() int32 {
+	if x != nil {
+		return x.CmdVal
+	}
+	return 0
+}
+
+func (x *CommandMsg) GetCmdStr() string {
+	if x != nil {
+		return x.CmdStr
+	}
+	return ""
+}
+
+func (m *CommandMsg) GetBuff() isCommandMsg_Buff {
+	if m != nil {
+		return m.Buff
+	}
+	return nil
+}
+
+func (x *CommandMsg) GetChatMsg() *ChatMsg {
+	if x, ok := x.GetBuff().(*CommandMsg_ChatMsg); ok {
+		return x.ChatMsg
+	}
+	return nil
+}
+
+func (x *CommandMsg) GetIdInfo() *IdInfo {
+	if x, ok := x.GetBuff().(*CommandMsg_IdInfo); ok {
+		return x.IdInfo
+	}
+	return nil
+}
+
+func (x *CommandMsg) GetArrayIdInfo() *ArrayIdInfo {
+	if x, ok := x.GetBuff().(*CommandMsg_ArrayIdInfo); ok {
+		return x.ArrayIdInfo
+	}
+	return nil
+}
+
+func (x *CommandMsg) GetArrayChatLog() *ArrayChatLog {
+	if x, ok := x.GetBuff().(*CommandMsg_ArrayChatLog); ok {
+		return x.ArrayChatLog
+	}
+	return nil
+}
+
+type isCommandMsg_Buff interface {
+	isCommandMsg_Buff()
+}
+
+type CommandMsg_ChatMsg struct {
+	ChatMsg *ChatMsg `protobuf:"bytes,4,opt,name=chat_msg,json=chatMsg,proto3,oneof"`
+}
+
+type CommandMsg_IdInfo struct {
+	IdInfo *IdInfo `protobuf:"bytes,5,opt,name=id_info,json=idInfo,proto3,oneof"`
+}
+
+type CommandMsg_ArrayIdInfo struct {
+	ArrayIdInfo *ArrayIdInfo `protobuf:"bytes,6,opt,name=array_id_info,json=arrayIdInfo,proto3,oneof"`
+}
+
+type CommandMsg_ArrayChatLog struct {
+	ArrayChatLog *ArrayChatLog `protobuf:"bytes,7,opt,name=array_chat_log,json=arrayChatLog,proto3,oneof"`
+}
+
+func (*CommandMsg_ChatMsg) isCommandMsg_Buff() {}
+
+func (*CommandMsg_IdInfo) isCommandMsg_Buff() {}
+
+func (*CommandMsg_ArrayIdInfo) isCommandMsg_Buff() {}
+
+func (*CommandMsg_ArrayChatLog) isCommandMsg_Buff() {}
+
+var File_message_proto protoreflect.FileDescriptor
+
+var file_message_proto_rawDesc = []byte{
+	0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x02, 0x70, 0x62, 0x1a, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0x3c, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x1b,
+	0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69,
+	0x6e, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75,
+	0x74, 0x22, 0x31, 0x0a, 0x06, 0x49, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x67,
+	0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x67, 0x61,
+	0x6d, 0x65, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x0b, 0x41, 0x72, 0x72, 0x61, 0x79, 0x49, 0x64, 0x49,
+	0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x08, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x07, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x7c, 0x0a, 0x07, 0x43, 0x68,
+	0x61, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12,
+	0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x17,
+	0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52,
+	0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f,
+	0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x66, 0x72,
+	0x6f, 0x6d, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x22, 0x38, 0x0a, 0x0c, 0x41, 0x72, 0x72, 0x61,
+	0x79, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x28, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61,
+	0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x62,
+	0x2e, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x69,
+	0x73, 0x74, 0x22, 0xb1, 0x02, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4d, 0x73,
+	0x67, 0x12, 0x27, 0x0a, 0x08, 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
+	0x64, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6d,
+	0x64, 0x5f, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6d, 0x64,
+	0x56, 0x61, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6d, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6d, 0x64, 0x53, 0x74, 0x72, 0x12, 0x28, 0x0a, 0x08,
+	0x63, 0x68, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b,
+	0x2e, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x61, 0x74, 0x4d, 0x73, 0x67, 0x48, 0x00, 0x52, 0x07, 0x63,
+	0x68, 0x61, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x25, 0x0a, 0x07, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66,
+	0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x64, 0x49,
+	0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x06, 0x69, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x35, 0x0a,
+	0x0d, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x49,
+	0x64, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x72, 0x72, 0x61, 0x79, 0x49, 0x64,
+	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x0e, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x63, 0x68,
+	0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70,
+	0x62, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x48, 0x00,
+	0x52, 0x0c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x42, 0x06,
+	0x0a, 0x04, 0x62, 0x75, 0x66, 0x66, 0x42, 0x05, 0x5a, 0x03, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_message_proto_rawDescOnce sync.Once
+	file_message_proto_rawDescData = file_message_proto_rawDesc
+)
+
+func file_message_proto_rawDescGZIP() []byte {
+	file_message_proto_rawDescOnce.Do(func() {
+		file_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_message_proto_rawDescData)
+	})
+	return file_message_proto_rawDescData
+}
+
+var file_message_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_message_proto_goTypes = []interface{}{
+	(*ChatMsg)(nil),      // 0: pb.ChatMsg
+	(*IdInfo)(nil),       // 1: pb.IdInfo
+	(*ArrayIdInfo)(nil),  // 2: pb.ArrayIdInfo
+	(*ChatLog)(nil),      // 3: pb.ChatLog
+	(*ArrayChatLog)(nil), // 4: pb.ArrayChatLog
+	(*CommandMsg)(nil),   // 5: pb.CommandMsg
+	(ECommand)(0),        // 6: pb.ECommand
+}
+var file_message_proto_depIdxs = []int32{
+	1, // 0: pb.ArrayIdInfo.id_infos:type_name -> pb.IdInfo
+	3, // 1: pb.ArrayChatLog.data_list:type_name -> pb.ChatLog
+	6, // 2: pb.CommandMsg.cmd_type:type_name -> pb.ECommand
+	0, // 3: pb.CommandMsg.chat_msg:type_name -> pb.ChatMsg
+	1, // 4: pb.CommandMsg.id_info:type_name -> pb.IdInfo
+	2, // 5: pb.CommandMsg.array_id_info:type_name -> pb.ArrayIdInfo
+	4, // 6: pb.CommandMsg.array_chat_log:type_name -> pb.ArrayChatLog
+	7, // [7:7] is the sub-list for method output_type
+	7, // [7:7] is the sub-list for method input_type
+	7, // [7:7] is the sub-list for extension type_name
+	7, // [7:7] is the sub-list for extension extendee
+	0, // [0:7] is the sub-list for field type_name
+}
+
+func init() { file_message_proto_init() }
+func file_message_proto_init() {
+	if File_message_proto != nil {
+		return
+	}
+	file_commands_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChatMsg); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*IdInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ArrayIdInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ChatLog); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ArrayChatLog); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_message_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CommandMsg); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_message_proto_msgTypes[5].OneofWrappers = []interface{}{
+		(*CommandMsg_ChatMsg)(nil),
+		(*CommandMsg_IdInfo)(nil),
+		(*CommandMsg_ArrayIdInfo)(nil),
+		(*CommandMsg_ArrayChatLog)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_message_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   6,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_message_proto_goTypes,
+		DependencyIndexes: file_message_proto_depIdxs,
+		MessageInfos:      file_message_proto_msgTypes,
+	}.Build()
+	File_message_proto = out.File
+	file_message_proto_rawDesc = nil
+	file_message_proto_goTypes = nil
+	file_message_proto_depIdxs = nil
+}

+ 41 - 0
call/rpc/proto/call.proto

@@ -0,0 +1,41 @@
+syntax = "proto3";
+
+package pb;
+
+option go_package = "/pb";
+
+import "message.proto";
+
+/*
+ 消息通道:
+ 玩家 -> 后端
+ 后端 -> 玩家
+ 客服 -> 后端
+ 后端 -> 客服
+*/
+
+message ClientMsgReq {
+    IdInfo id_info = 3;
+    repeated CommandMsg cmd = 1;
+}
+
+message ClientMsgRes {
+    repeated CommandMsg cmd = 1;
+}
+
+message ServiceMsgReq {
+    IdInfo id_info = 3;
+    repeated CommandMsg cmd = 1;
+}
+
+message ServiceMsgRes {
+    repeated CommandMsg cmd = 1;
+}
+
+service Call {
+    rpc ClientLogin(ClientMsgReq) returns (stream ClientMsgRes) {}
+    rpc ClientCall(ClientMsgReq) returns (ClientMsgRes) {}
+
+    rpc ServiceLogin(ServiceMsgReq) returns (stream ServiceMsgRes) {}
+    rpc ServiceCall(ServiceMsgReq) returns (ServiceMsgRes) {}
+}

+ 80 - 0
call/rpc/proto/commands.proto

@@ -0,0 +1,80 @@
+syntax = "proto3";
+
+package pb;
+
+option go_package = "/pb";
+
+// 状态命令枚举
+enum ECommand {
+    SEND_MSG = 0;                       // 消息信息
+    MSG_HEART_BEAT = 3;                 // 心跳
+
+    // status
+    ON_PLAYER_DISCONNECT = 1004;            // 玩家断开连接  cmd_str:玩家id cmd_val:登出原因ErrorReason
+    ON_PLAYER_CONNECT = 1005;               // 玩家连接     cmd_str:玩家id
+    ON_PLAYER_WAIT_QUEUE_INFO = 1006;       // 玩家等待队列信息 消息体:CommandMsg.buff.array_id_info
+    ON_PLAYER_RECEIVE_REPLY = 1007;         // 玩家被应答 cmd_str:客服id
+    ON_PLAYER_WAIT_QUEUE_LEN = 1008;        // 玩家等待队列长度 cmd_val: 队列人数
+
+    ON_SERVICE_DISCONNECT = 3002;           // 客服断开连接   cmd_str:客服id
+    ON_SERVICE_CONNECT = 3003;              // 客服连接     cmd_str:客服id
+    ON_SERVICE_HANG_UP_LIST = 3004;         // 客服-玩家挂断列表   消息体:CommandMsg.buff.array_id_info
+
+    // 请求操作
+    CALL_PLAYER_MSG = 2001;                 // 玩家->服务端 发送消息
+    CALL_SERVICE_MSG = 2002;                // 客服->服务端 发送消息
+    CALL_PLAYER_LOGOUT = 2003;              // 玩家登出
+    CALL_SERVICE_LOGOUT = 2004;             // 客服登出
+    CALL_SERVICE_REPLY = 2005;              // 客服应答 cmd_str:待应答的玩家id
+    CALL_PLAYER_CHAT_LOG= 2006;             // 获取玩家聊天记录 cmd_str:玩家id    返回:CommandMsg.buff.array_chat_log
+
+    // gm debug
+    MSG_TEST = 100001;
+}
+
+// 错误枚举
+enum ErrorReason {
+    ERROR_DUMMY = 0;
+    PLAYER_HEART_BEAT_FAILED = 1000;                // 玩家心跳失败
+
+    PLAYER_REPEAT_LOGIN = 1001;                     // 玩家重复登录
+    PLAYER_WAIT_QUEUE_OVERTIME = 1002;              // 玩家等待队列超时
+    PLAYER_TALK_INTERVAL_LIMIT = 1003;              // 玩家发言时间超时
+    PLAYER_CALL_LOGOUT = 1004;                      // 玩家主动登出
+
+    SERVICE_REPEAT_LOGIN = 2001;                    // 客服重复登录
+    SERVICE_CALL_LOGOUT = 2002;                     // 客服主动登出
+    SERVICE_HEART_BEAT_FAILED = 2003;               // 客服心跳超时
+}
+
+// 内网调试debug命令
+enum EDebugCmd {
+    /*
+         修改队列等待时间(s):
+            cmd_str: WaitConnServiceLimit
+            cmd_val: 30
+         修改长时间聊天未发言时限(s):
+            cmd_str:LastTalkIntervalLimit
+            cmd_val:60
+
+         *消息example:
+         msg.cmd_type: ECommand.MSG_TEST
+         msg.cmd_val: EDebugCmd.MODIFY_CONFIG
+         msg.cmd_str: "{\"WaitConnServiceLimit\": 3600}"
+     */
+    MODIFY_CONFIG = 0;  // 修改配置
+
+    SERVICE_REPLY = 1; // 客服连接
+
+    GET_CHAT_LOG = 2;   // 获取聊天log cmd_str:客服id
+}
+
+// error
+enum EErrorCode {
+    ERR_DUMMY = 0;
+    ERR_HANDLER_CALL_ERR = 1;   // 请求调用失败
+    ERR_REQUEST_LIMIT = 101;    // 请求过于频繁
+    ERR_PLAYER_CONN_ERR = 102;  // 玩家连接失败
+    ERR_PARAM_ERROR = 103;      // 参数错误
+    ERR_SERVICE_CONN_ERR = 104;  // 客服连接失败
+}

+ 56 - 0
call/rpc/proto/message.proto

@@ -0,0 +1,56 @@
+syntax = "proto3";
+
+package pb;
+
+option go_package = "/pb";
+
+import "commands.proto";
+
+/*
+聊天信息
+*/
+message ChatMsg {
+    string client_id = 1;        // 接收者id
+    string input = 2;           // 输入内容
+}
+
+/*
+玩家基本信息
+ */
+message IdInfo {
+    string id = 1;          // id
+    int32 game_id = 2;      // game id
+}
+message ArrayIdInfo {
+    repeated IdInfo id_infos = 1;
+}
+
+/*
+聊天记录
+ */
+message ChatLog {
+    string content = 3;     // 聊天内容
+    int64 time_stamp = 4;   // 时间戳
+    int32 game_id = 5;      // 游戏id
+    bool from_player = 6;   // 是否是玩家发言
+}
+message ArrayChatLog {
+    repeated ChatLog data_list = 1;
+}
+
+
+/*
+命令消息
+*/
+message CommandMsg {
+    ECommand cmd_type = 1;           // 命令类型
+    int32 cmd_val = 2;               // 通用val
+    string cmd_str = 3;              // 通用str
+
+    oneof buff {
+        ChatMsg chat_msg  = 4;
+        IdInfo id_info = 5;
+        ArrayIdInfo array_id_info = 6;
+        ArrayChatLog array_chat_log = 7;
+    }
+}

+ 31 - 0
db/api/db_api.go

@@ -0,0 +1,31 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+
+	"call_center/db/api/internal/config"
+	"call_center/db/api/internal/handler"
+	"call_center/db/api/internal/svc"
+
+	"github.com/tal-tech/go-zero/core/conf"
+	"github.com/tal-tech/go-zero/rest"
+)
+
+var configFile = flag.String("f", "etc/db_api.yaml", "the config file")
+
+func main() {
+	flag.Parse()
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+
+	ctx := svc.NewServiceContext(c)
+	server := rest.MustNewServer(c.RestConf)
+	defer server.Stop()
+
+	handler.RegisterHandlers(server, ctx)
+
+	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
+	server.Start()
+}

+ 12 - 0
db/api/db_req.api

@@ -0,0 +1,12 @@
+type request {
+	Id string `path:"id"`
+}
+
+type response {
+	Res int `json:"res"`
+}
+
+service db_api {
+	@handler apiTest
+	get /db/api/api_test/:id (request) returns (response)
+}

+ 9 - 0
db/api/etc/db_api.yaml

@@ -0,0 +1,9 @@
+Name: db_api
+Host: 0.0.0.0
+Port: 8888
+
+DbRpc:
+  Etcd:
+    Hosts:
+      - 127.0.0.1:2379
+    Key: db.rpc

+ 11 - 0
db/api/internal/config/config.go

@@ -0,0 +1,11 @@
+package config
+
+import (
+	"github.com/tal-tech/go-zero/rest"
+	"github.com/tal-tech/go-zero/zrpc"
+)
+
+type Config struct {
+	rest.RestConf
+	DbRpc zrpc.RpcClientConf
+}

+ 28 - 0
db/api/internal/handler/api_test_handler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"call_center/db/api/internal/logic"
+	"call_center/db/api/internal/svc"
+	"call_center/db/api/internal/types"
+	"github.com/tal-tech/go-zero/rest/httpx"
+)
+
+func apiTestHandler(ctx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.Request
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.Error(w, err)
+			return
+		}
+
+		l := logic.NewApiTestLogic(r.Context(), ctx)
+		resp, err := l.ApiTest(req)
+		if err != nil {
+			httpx.Error(w, err)
+		} else {
+			httpx.OkJson(w, resp)
+		}
+	}
+}

+ 22 - 0
db/api/internal/handler/routes.go

@@ -0,0 +1,22 @@
+// Code generated by goctl. DO NOT EDIT.
+package handler
+
+import (
+	"net/http"
+
+	"call_center/db/api/internal/svc"
+
+	"github.com/tal-tech/go-zero/rest"
+)
+
+func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
+	engine.AddRoutes(
+		[]rest.Route{
+			{
+				Method:  http.MethodGet,
+				Path:    "/db/api/api_test/:id",
+				Handler: apiTestHandler(serverCtx),
+			},
+		},
+	)
+}

+ 54 - 0
db/api/internal/logic/api_test_logic.go

@@ -0,0 +1,54 @@
+package logic
+
+import (
+	"call_center/db/rpc/pb"
+	"context"
+	"encoding/json"
+	"log"
+
+	"call_center/db/api/internal/svc"
+	"call_center/db/api/internal/types"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type ApiTestLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewApiTestLogic(ctx context.Context, svcCtx *svc.ServiceContext) ApiTestLogic {
+	return ApiTestLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *ApiTestLogic) ApiTest(req types.Request) (*types.Response, error) {
+	msgReq := new(pb.DbMsgReq)
+	cmd := new(pb.DbCommandMsg)
+	cmd.CmdType = pb.EDbCommand_E_DB_COMMAND_GET_CONFIG
+	msgReq.Cmd = cmd
+
+	res, err := l.svcCtx.DbRpc.DbCall(l.ctx, msgReq)
+	if err != nil {
+		return nil, err
+	}
+	confList := res.GetCmd().GetArrayConfig().GetDataList()
+	for _, conf := range confList {
+		var confValueMap map[string]interface{}
+		confName := conf.ConfName
+		confKey := conf.ConfKey
+		err = json.Unmarshal([]byte(conf.ConfValue), &confValueMap)
+		if err != nil {
+			continue
+		}
+		log.Println(confName, confKey, confValueMap)
+	}
+	log.Println("<ApiTest>")
+	return &types.Response{
+		Res: 1,
+	}, nil
+}

+ 19 - 0
db/api/internal/svc/service_context.go

@@ -0,0 +1,19 @@
+package svc
+
+import (
+	"call_center/db/api/internal/config"
+	"call_center/db/rpc/db"
+	"github.com/tal-tech/go-zero/zrpc"
+)
+
+type ServiceContext struct {
+	Config config.Config
+	DbRpc  db.Db
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	return &ServiceContext{
+		Config: c,
+		DbRpc:  db.NewDb(zrpc.MustNewClient(c.DbRpc)),
+	}
+}

+ 10 - 0
db/api/internal/types/types.go

@@ -0,0 +1,10 @@
+// Code generated by goctl. DO NOT EDIT.
+package types
+
+type Request struct {
+	Id string `path:"id"`
+}
+
+type Response struct {
+	Res int `json:"res"`
+}

+ 109 - 0
db/model/chat_configs_model.go

@@ -0,0 +1,109 @@
+package model
+
+import (
+	"database/sql"
+	"fmt"
+	"strings"
+
+	"github.com/tal-tech/go-zero/core/stores/builder"
+	"github.com/tal-tech/go-zero/core/stores/sqlc"
+	"github.com/tal-tech/go-zero/core/stores/sqlx"
+	"github.com/tal-tech/go-zero/core/stringx"
+)
+
+var (
+	chatConfigsFieldNames          = builder.RawFieldNames(&ChatConfigs{})
+	chatConfigsRows                = strings.Join(chatConfigsFieldNames, ",")
+	chatConfigsRowsExpectAutoSet   = strings.Join(stringx.Remove(chatConfigsFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
+	chatConfigsRowsWithPlaceHolder = strings.Join(stringx.Remove(chatConfigsFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
+)
+
+type (
+	ChatConfigsModel interface {
+		Insert(data *ChatConfigs) (sql.Result, error)
+		FindOne(id int64) (*ChatConfigs, error)
+		FindOneByConfKey(confKey string) (*ChatConfigs, error)
+		Update(data *ChatConfigs) error
+		Delete(id int64) error
+		FindAll() ([]ChatConfigs, error)
+	}
+
+	defaultChatConfigsModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	ChatConfigs struct {
+		Id        int64  `db:"id"`
+		ConfName  string `db:"conf_name"`
+		ConfKey   string `db:"conf_key"`
+		ConfValue string `db:"conf_value"`
+	}
+)
+
+func NewChatConfigsModel(conn sqlx.SqlConn) ChatConfigsModel {
+	return &defaultChatConfigsModel{
+		conn:  conn,
+		table: "`chat_configs`",
+	}
+}
+
+func (m *defaultChatConfigsModel) Insert(data *ChatConfigs) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?)", m.table, chatConfigsRowsExpectAutoSet)
+	ret, err := m.conn.Exec(query, data.ConfName, data.ConfKey, data.ConfValue)
+	return ret, err
+}
+
+func (m *defaultChatConfigsModel) FindOne(id int64) (*ChatConfigs, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", chatConfigsRows, m.table)
+	var resp ChatConfigs
+	err := m.conn.QueryRow(&resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultChatConfigsModel) FindOneByConfKey(confKey string) (*ChatConfigs, error) {
+	var resp ChatConfigs
+	query := fmt.Sprintf("select %s from %s where `conf_key` = ? limit 1", chatConfigsRows, m.table)
+	err := m.conn.QueryRow(&resp, query, confKey)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultChatConfigsModel) Update(data *ChatConfigs) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, chatConfigsRowsWithPlaceHolder)
+	_, err := m.conn.Exec(query, data.ConfName, data.ConfKey, data.ConfValue, data.Id)
+	return err
+}
+
+func (m *defaultChatConfigsModel) Delete(id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.Exec(query, id)
+	return err
+}
+
+func (m *defaultChatConfigsModel) FindAll() ([]ChatConfigs, error) {
+	configs := make([]ChatConfigs, 0)
+	querySql := fmt.Sprintf("select %s from %s", configsRows, m.table)
+	err := m.conn.QueryRows(&configs, querySql)
+	if err != nil {
+		if err == sqlx.ErrNotFound {
+			return nil, ErrNotFound
+		}
+		return nil, err
+	}
+
+	return configs, err
+}

+ 7 - 0
db/model/chat_sensitive_words.sql

@@ -0,0 +1,7 @@
+CREATE TABLE `chat_sensitive_words` (
+                                        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+                                        `word` varchar(128) NOT NULL DEFAULT '',
+                                        `add_type` tinyint(8) unsigned DEFAULT '0',
+                                        PRIMARY KEY (`id`),
+                                        UNIQUE KEY `idx_word` (`word`) USING HASH COMMENT '关键字索引'
+) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

+ 107 - 0
db/model/chat_sensitive_words_model.go

@@ -0,0 +1,107 @@
+package model
+
+import (
+	"database/sql"
+	"fmt"
+	"strings"
+
+	"github.com/tal-tech/go-zero/core/stores/builder"
+	"github.com/tal-tech/go-zero/core/stores/sqlc"
+	"github.com/tal-tech/go-zero/core/stores/sqlx"
+	"github.com/tal-tech/go-zero/core/stringx"
+)
+
+var (
+	chatSensitiveWordsFieldNames          = builder.RawFieldNames(&ChatSensitiveWords{})
+	chatSensitiveWordsRows                = strings.Join(chatSensitiveWordsFieldNames, ",")
+	chatSensitiveWordsRowsExpectAutoSet   = strings.Join(stringx.Remove(chatSensitiveWordsFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
+	chatSensitiveWordsRowsWithPlaceHolder = strings.Join(stringx.Remove(chatSensitiveWordsFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
+)
+
+type (
+	ChatSensitiveWordsModel interface {
+		Insert(data *ChatSensitiveWords) (sql.Result, error)
+		FindOne(id int64) (*ChatSensitiveWords, error)
+		FindOneByWord(word string) (*ChatSensitiveWords, error)
+		Update(data *ChatSensitiveWords) error
+		Delete(id int64) error
+		FindAll() (*[]ChatSensitiveWords, error)
+	}
+
+	defaultChatSensitiveWordsModel struct {
+		conn  sqlx.SqlConn
+		table string
+	}
+
+	ChatSensitiveWords struct {
+		Id      int64  `db:"id"`
+		Word    string `db:"word"`
+		AddType int64  `db:"add_type"`
+	}
+)
+
+func NewChatSensitiveWordsModel(conn sqlx.SqlConn) ChatSensitiveWordsModel {
+	return &defaultChatSensitiveWordsModel{
+		conn:  conn,
+		table: "`chat_sensitive_words`",
+	}
+}
+
+func (m *defaultChatSensitiveWordsModel) Insert(data *ChatSensitiveWords) (sql.Result, error) {
+	query := fmt.Sprintf("insert into %s (%s) values (?, ?)", m.table, chatSensitiveWordsRowsExpectAutoSet)
+	ret, err := m.conn.Exec(query, data.Word, data.AddType)
+	return ret, err
+}
+
+func (m *defaultChatSensitiveWordsModel) FindOne(id int64) (*ChatSensitiveWords, error) {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", chatSensitiveWordsRows, m.table)
+	var resp ChatSensitiveWords
+	err := m.conn.QueryRow(&resp, query, id)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultChatSensitiveWordsModel) FindOneByWord(word string) (*ChatSensitiveWords, error) {
+	var resp ChatSensitiveWords
+	query := fmt.Sprintf("select %s from %s where `word` = ? limit 1", chatSensitiveWordsRows, m.table)
+	err := m.conn.QueryRow(&resp, query, word)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultChatSensitiveWordsModel) Update(data *ChatSensitiveWords) error {
+	query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, chatSensitiveWordsRowsWithPlaceHolder)
+	_, err := m.conn.Exec(query, data.Word, data.AddType, data.Id)
+	return err
+}
+
+func (m *defaultChatSensitiveWordsModel) Delete(id int64) error {
+	query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+	_, err := m.conn.Exec(query, id)
+	return err
+}
+
+func (m *defaultChatSensitiveWordsModel) FindAll() (*[]ChatSensitiveWords, error) {
+	words := make([]ChatSensitiveWords, 0)
+	querySql := fmt.Sprintf("select %s from %s", chatSensitiveWordsRows, m.table)
+	err := m.conn.QueryRows(&words, querySql)
+	if err != nil {
+		if err == sqlx.ErrNotFound {
+			return nil, ErrNotFound
+		}
+		return nil, err
+	}
+	return &words, err
+}

+ 8 - 0
db/model/configs.sql

@@ -0,0 +1,8 @@
+CREATE TABLE `chat_configs` (
+                           `id` int unsigned NOT NULL AUTO_INCREMENT,
+                           `conf_name` varchar(255) NOT NULL DEFAULT '',
+                           `conf_key` varchar(255) NOT NULL DEFAULT '',
+                           `conf_value` varchar(1024) NOT NULL DEFAULT '',
+                           PRIMARY KEY (`id`),
+                           UNIQUE KEY `conf_key` (`conf_key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

+ 147 - 0
db/model/configs_model.go

@@ -0,0 +1,147 @@
+package model
+
+import (
+	"database/sql"
+	"fmt"
+	"strings"
+
+	"github.com/tal-tech/go-zero/core/stores/cache"
+	"github.com/tal-tech/go-zero/core/stores/sqlc"
+	"github.com/tal-tech/go-zero/core/stores/sqlx"
+	"github.com/tal-tech/go-zero/core/stringx"
+	"github.com/tal-tech/go-zero/tools/goctl/model/sql/builderx"
+)
+
+var (
+	configsFieldNames          = builderx.RawFieldNames(&Configs{})
+	configsRows                = strings.Join(configsFieldNames, ",")
+	configsRowsExpectAutoSet   = strings.Join(stringx.Remove(configsFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
+	configsRowsWithPlaceHolder = strings.Join(stringx.Remove(configsFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
+
+	cacheConfigsIdPrefix      = "cache:configs:id:"
+	cacheConfigsConfKeyPrefix = "cache:configs:confKey:"
+)
+
+type (
+	ConfigsModel interface {
+		Insert(data Configs) (sql.Result, error)
+		FindOne(id int64) (*Configs, error)
+		FindOneByConfKey(confKey string) (*Configs, error)
+		Update(data Configs) error
+		Delete(id int64) error
+		FindAll() ([]Configs, error)
+	}
+
+	defaultConfigsModel struct {
+		sqlc.CachedConn
+		table string
+	}
+
+	Configs struct {
+		Id        int64  `db:"id"`
+		ConfName  string `db:"conf_name"`
+		ConfKey   string `db:"conf_key"`
+		ConfValue string `db:"conf_value"`
+	}
+)
+
+func NewConfigsModel(conn sqlx.SqlConn, c cache.CacheConf) ConfigsModel {
+	return &defaultConfigsModel{
+		CachedConn: sqlc.NewConn(conn, c),
+		table:      "`configs`",
+	}
+}
+
+func (m *defaultConfigsModel) Insert(data Configs) (sql.Result, error) {
+	configsConfKeyKey := fmt.Sprintf("%s%v", cacheConfigsConfKeyPrefix, data.ConfKey)
+	ret, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
+		query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?)", m.table, configsRowsExpectAutoSet)
+		return conn.Exec(query, data.ConfName, data.ConfKey, data.ConfValue)
+	}, configsConfKeyKey)
+	return ret, err
+}
+
+func (m *defaultConfigsModel) FindOne(id int64) (*Configs, error) {
+	configsIdKey := fmt.Sprintf("%s%v", cacheConfigsIdPrefix, id)
+	var resp Configs
+	err := m.QueryRow(&resp, configsIdKey, func(conn sqlx.SqlConn, v interface{}) error {
+		query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", configsRows, m.table)
+		return conn.QueryRow(v, query, id)
+	})
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultConfigsModel) FindOneByConfKey(confKey string) (*Configs, error) {
+	configsConfKeyKey := fmt.Sprintf("%s%v", cacheConfigsConfKeyPrefix, confKey)
+	var resp Configs
+	err := m.QueryRowIndex(&resp, configsConfKeyKey, m.formatPrimary, func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
+		query := fmt.Sprintf("select %s from %s where `conf_key` = ? limit 1", configsRows, m.table)
+		if err := conn.QueryRow(&resp, query, confKey); err != nil {
+			return nil, err
+		}
+		return resp.Id, nil
+	}, m.queryPrimary)
+	switch err {
+	case nil:
+		return &resp, nil
+	case sqlc.ErrNotFound:
+		return nil, ErrNotFound
+	default:
+		return nil, err
+	}
+}
+
+func (m *defaultConfigsModel) Update(data Configs) error {
+	configsIdKey := fmt.Sprintf("%s%v", cacheConfigsIdPrefix, data.Id)
+	configsConfKeyKey := fmt.Sprintf("%s%v", cacheConfigsConfKeyPrefix, data.ConfKey)
+	_, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
+		query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, configsRowsWithPlaceHolder)
+		return conn.Exec(query, data.ConfName, data.ConfKey, data.ConfValue, data.Id)
+	}, configsIdKey, configsConfKeyKey)
+	return err
+}
+
+func (m *defaultConfigsModel) Delete(id int64) error {
+	data, err := m.FindOne(id)
+	if err != nil {
+		return err
+	}
+
+	configsIdKey := fmt.Sprintf("%s%v", cacheConfigsIdPrefix, id)
+	configsConfKeyKey := fmt.Sprintf("%s%v", cacheConfigsConfKeyPrefix, data.ConfKey)
+	_, err = m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
+		query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
+		return conn.Exec(query, id)
+	}, configsIdKey, configsConfKeyKey)
+	return err
+}
+
+func (m *defaultConfigsModel) formatPrimary(primary interface{}) string {
+	return fmt.Sprintf("%s%v", cacheConfigsIdPrefix, primary)
+}
+
+func (m *defaultConfigsModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
+	query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", configsRows, m.table)
+	return conn.QueryRow(v, query, primary)
+}
+
+func (m *defaultConfigsModel) FindAll() ([]Configs, error) {
+	configs := make([]Configs, 0)
+	querySql := fmt.Sprintf("select %s from %s", configsRows, m.table)
+	err := m.CachedConn.QueryRowsNoCache(&configs, querySql)
+	if err != nil {
+		if err == sqlx.ErrNotFound {
+			return nil, ErrNotFound
+		}
+		return nil, err
+	}
+
+	return configs, err
+}

+ 5 - 0
db/model/vars.go

@@ -0,0 +1,5 @@
+package model
+
+import "github.com/tal-tech/go-zero/core/stores/sqlx"
+
+var ErrNotFound = sqlx.ErrNotFound

+ 30 - 0
db/rpc/Dockerfile

@@ -0,0 +1,30 @@
+# image-name: db
+
+FROM golang:alpine AS builder
+
+LABEL stage=gobuilder
+
+ENV CGO_ENABLED 0
+ENV GOOS linux
+ENV GOPROXY https://goproxy.cn,direct
+
+WORKDIR /build/zero
+
+ADD go.mod .
+ADD go.sum .
+RUN go mod download
+COPY . .
+COPY db/rpc/etc /app/etc
+RUN go build -ldflags="-s -w" -o /app/db db/rpc/db.go
+
+
+FROM alpine
+
+RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
+ENV TZ Asia/Shanghai
+
+WORKDIR /app
+COPY --from=builder /app/db /app/db
+COPY --from=builder /app/etc /app/etc
+
+CMD ["./db", "-f", "etc/db.yaml"]

+ 51 - 0
db/rpc/db.go

@@ -0,0 +1,51 @@
+package main
+
+import (
+	"call_center/db/rpc/internal/config"
+	"call_center/db/rpc/internal/server"
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+	logic "call_center/public/common"
+	"flag"
+	"github.com/tal-tech/go-zero/core/logx"
+	"log"
+
+	"github.com/tal-tech/go-zero/core/conf"
+	"github.com/tal-tech/go-zero/core/service"
+	"github.com/tal-tech/go-zero/zrpc"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+)
+
+var configFile = flag.String("f", "etc/db.yaml", "the config file")
+
+func main() {
+	flag.Parse()
+
+	logic.PreCheckConfig(*configFile)
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+
+	// 日志模块初始化
+	logx.MustSetup(c.Log)
+	logx.CollectSysLog()
+
+	ctx := svc.NewServiceContext(c)
+	srv := server.NewDbServer(ctx)
+
+	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
+		pb.RegisterDbServer(grpcServer, srv)
+
+		switch c.Mode {
+		case service.DevMode, service.TestMode:
+			reflection.Register(grpcServer)
+		default:
+		}
+
+	})
+	defer s.Stop()
+
+	log.Printf("Starting rpc server at %s...\n", c.ListenOn)
+	s.Start()
+}

+ 55 - 0
db/rpc/db/db.go

@@ -0,0 +1,55 @@
+// Code generated by goctl. DO NOT EDIT!
+// Source: db.proto
+
+package db
+
+import (
+	"context"
+
+	"call_center/db/rpc/pb"
+
+	"github.com/tal-tech/go-zero/zrpc"
+	"google.golang.org/grpc"
+)
+
+type (
+	DbMsgReq = pb.DbMsgReq
+	DbMsgRes = pb.DbMsgRes
+	SensReq  = pb.SensReq
+	SensRes  = pb.SensRes
+
+	Db interface {
+		//  客服聊天
+		DbLogin(ctx context.Context, opts ...grpc.CallOption) (pb.Db_DbLoginClient, error)
+		DbCall(ctx context.Context, in *DbMsgReq, opts ...grpc.CallOption) (*DbMsgRes, error)
+		//  游戏聊天
+		GetSensitiveWords(ctx context.Context, in *SensReq, opts ...grpc.CallOption) (*SensRes, error)
+	}
+
+	defaultDb struct {
+		cli zrpc.Client
+	}
+)
+
+func NewDb(cli zrpc.Client) Db {
+	return &defaultDb{
+		cli: cli,
+	}
+}
+
+//  客服聊天
+func (m *defaultDb) DbLogin(ctx context.Context, opts ...grpc.CallOption) (pb.Db_DbLoginClient, error) {
+	client := pb.NewDbClient(m.cli.Conn())
+	return client.DbLogin(ctx, opts...)
+}
+
+func (m *defaultDb) DbCall(ctx context.Context, in *DbMsgReq, opts ...grpc.CallOption) (*DbMsgRes, error) {
+	client := pb.NewDbClient(m.cli.Conn())
+	return client.DbCall(ctx, in, opts...)
+}
+
+//  游戏聊天
+func (m *defaultDb) GetSensitiveWords(ctx context.Context, in *SensReq, opts ...grpc.CallOption) (*SensRes, error) {
+	client := pb.NewDbClient(m.cli.Conn())
+	return client.GetSensitiveWords(ctx, in, opts...)
+}

+ 28 - 0
db/rpc/etc/db.yaml

@@ -0,0 +1,28 @@
+Name: db.rpc
+ListenOn: 0.0.0.0:3001
+Etcd:
+  Hosts:
+    - 101.33.209.36:2379
+  Key: db.rpc
+
+Log:
+  ServiceName: db
+  Level: info
+  # 日志设置
+  Mode: volume
+  KeepDays: 30
+
+Mysql:
+#  DataSource: "root:yyxx@server#//.2021@tcp(192.168.0.226:3306)/service_center?charset=utf8mb4&parseTime=True&loc=Local"
+  DataSource: "root:123456//.2021@tcp(121.5.13.227:3306)/service_center?charset=utf8mb4&parseTime=True&loc=Local"
+
+#CacheRedis:
+#  - Host: 192.168.0.226:27549
+#    Pass: redis!python
+#    Type: node
+
+EsConf:
+  UserName: admin
+  Password: YYxx#@3976!
+  Addresses:
+    - "http://101.33.209.36:9200"

+ 14 - 0
db/rpc/internal/config/config.go

@@ -0,0 +1,14 @@
+package config
+
+import (
+	es "call_center/public/es"
+	"github.com/tal-tech/go-zero/zrpc"
+)
+
+type Config struct {
+	zrpc.RpcServerConf
+	Mysql struct {
+		DataSource string
+	}
+	EsConf es.EsConfig
+}

+ 40 - 0
db/rpc/internal/handler/handler_get_chat_log.go

@@ -0,0 +1,40 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package handler
+
+import (
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+	"fmt"
+	"log"
+)
+
+func GetChatLog(svcCtx *svc.ServiceContext, cmdMsg *pb.DbCommandMsg) *pb.DbCommandMsg {
+	playerId := cmdMsg.CmdStr
+
+	querySql := fmt.Sprintf(`select * from service_chat_visitor_log_r where sessionId = "%s" limit 100`, playerId)
+	log.Println("<handler.HandleGetChatLog> querySql:", querySql)
+
+	dataRes := svcCtx.Es.Query(querySql)
+	if dataRes == nil {
+		return &pb.DbCommandMsg{}
+	}
+
+	chatLogList := new(pb.ArrayDbChatLog)
+	for _, v := range dataRes {
+		data := v.(map[string]interface{})
+		chatLogList.DataList = append(chatLogList.DataList, &pb.DbChatLog{
+			GameId:    int32(data["gameId"].(float64)),
+			Content:   data["content"].(string),
+			FromId:    data["fromId"].(string),
+			ToId:      data["toId"].(string),
+			ChatType:  pb.EDbChatType(data["chatType"].(float64)),
+			SessionId: data["sessionId"].(string),
+			// IsVisitor: data["isVisitor"].(bool),
+			TimeStamp: int64(data["logDt"].(float64)),
+		})
+	}
+	log.Println("<handler.GetChatLog>, data len: ", len(dataRes), " playerId:", playerId)
+	return &pb.DbCommandMsg{Data: &pb.DbCommandMsg_ArrayChatLog{ArrayChatLog: chatLogList}}
+}

+ 39 - 0
db/rpc/internal/handler/handler_get_chat_record.go

@@ -0,0 +1,39 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package handler
+
+import (
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+	"fmt"
+	"log"
+	"time"
+)
+
+func GetChatRecord(svcCtx *svc.ServiceContext, cmdMsg *pb.DbCommandMsg) *pb.DbCommandMsg {
+	serviceId := cmdMsg.CmdStr
+
+	// 只获取最近一天的记录
+	now := time.Now().Unix()
+	oneDayBefore := now - (24 * 3600)
+
+	// 构建sql
+	querySql := fmt.Sprintf(`select playerId, gameId from service_chat_record where state = 1 and serviceId = '%s' and logDt >= %d limit 100`, serviceId, oneDayBefore)
+	log.Println("<handler.GetChatRecord> querySql:", querySql)
+
+	dataRes := svcCtx.Es.Query(querySql)
+	if dataRes == nil {
+		return &pb.DbCommandMsg{}
+	}
+
+	chatRecordList := new(pb.ArrayChatRecord)
+	for _, v := range dataRes {
+		data := v.(map[string]interface{})
+		chatRecordList.DataList = append(chatRecordList.DataList, &pb.DbChatRecord{
+			PlayerId: data["playerId"].(string),
+			GameId:   int32(data["gameId"].(float64)),
+		})
+	}
+	return &pb.DbCommandMsg{Data: &pb.DbCommandMsg_ArrayChatRecord{ArrayChatRecord: chatRecordList}}
+}

+ 27 - 0
db/rpc/internal/handler/handler_get_config.go

@@ -0,0 +1,27 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package handler
+
+import (
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+	"log"
+)
+
+func GetConfig(svcCtx *svc.ServiceContext) *pb.DbCommandMsg {
+	dataList := new(pb.ArrayConfig)
+	configs, err := svcCtx.ConfigModel.FindAll()
+	if err != nil {
+		log.Println("<handler.GetConfig> [ERROR] err:", err)
+	}
+	for _, conf := range configs {
+		p := new(pb.DbConfig)
+		p.ConfName = conf.ConfName
+		p.ConfValue = conf.ConfValue
+		p.ConfKey = conf.ConfKey
+		dataList.DataList = append(dataList.DataList, p)
+	}
+
+	return &pb.DbCommandMsg{Data: &pb.DbCommandMsg_ArrayConfig{ArrayConfig: dataList}}
+}

+ 30 - 0
db/rpc/internal/handler/handler_push_chat_log.go

@@ -0,0 +1,30 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package handler
+
+import (
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+	"log"
+)
+
+func PushChatLog(svcCtx *svc.ServiceContext, cmdMsg *pb.DbCommandMsg) {
+	logInfo := cmdMsg.GetChatLog()
+
+	mapInfo := make(map[string]interface{})
+	mapInfo["content"] = logInfo.GetContent()
+	mapInfo["fromId"] = logInfo.GetFromId()
+	mapInfo["toId"] = logInfo.GetToId()
+	mapInfo["chatType"] = logInfo.GetChatType()
+	mapInfo["logDt"] = logInfo.GetTimeStamp()
+	mapInfo["gameId"] = logInfo.GetGameId()
+	mapInfo["sessionId"] = logInfo.GetSessionId()
+
+	insertTable := "service_chat_log"
+	if logInfo.GetIsVisitor() == true {
+		insertTable = "service_chat_visitor_log"
+	}
+	svcCtx.Es.Insert(insertTable, mapInfo)
+	log.Printf("<handler.PushChatLog>, table:%s, msg:%s", insertTable, mapInfo)
+}

+ 28 - 0
db/rpc/internal/handler/handler_push_chat_record.go

@@ -0,0 +1,28 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package handler
+
+import (
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+	"log"
+)
+
+func PushChatRecord(svcCtx *svc.ServiceContext, cmdMsg *pb.DbCommandMsg) {
+	recordInfo := cmdMsg.GetChatRecord()
+
+	var mapInfo map[string]interface{}
+	mapInfo = make(map[string]interface{})
+	mapInfo["serviceId"] = recordInfo.GetServiceId()
+	mapInfo["playerId"] = recordInfo.GetPlayerId()
+	mapInfo["sessionId"] = recordInfo.GetSessionId()
+	mapInfo["isVisitor"] = recordInfo.GetIsVisitor()
+	mapInfo["state"] = int32(recordInfo.GetState())
+	mapInfo["logDt"] = recordInfo.GetTimeStamp()
+	mapInfo["gameId"] = recordInfo.GetGameId()
+
+	insertTable := "service_chat_record"
+	svcCtx.Es.Insert(insertTable, mapInfo)
+	log.Println("<handler.PushChatRecord>, msg:", mapInfo)
+}

+ 53 - 0
db/rpc/internal/logic/db_call_logic.go

@@ -0,0 +1,53 @@
+package logic
+
+import (
+	handler2 "call_center/db/rpc/internal/handler"
+	"call_center/public/exception"
+	"context"
+	"log"
+
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type DbCallLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewDbCallLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DbCallLogic {
+	return &DbCallLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *DbCallLogic) DbCall(in *pb.DbMsgReq) (*pb.DbMsgRes, error) {
+	var err error
+	res := new(pb.DbMsgRes)
+	exception.Try(func() {
+		cmd := in.GetCmd()
+		cmdType := cmd.CmdType
+		switch cmdType {
+		case pb.EDbCommand_E_DB_COMMAND_GET_CONFIG:
+			res.Cmd = handler2.GetConfig(l.svcCtx)
+			break
+		case pb.EDbCommand_E_DB_COMMAND_GET_CHAT_RECORD:
+			res.Cmd = handler2.GetChatRecord(l.svcCtx, cmd)
+			break
+		case pb.EDbCommand_E_DB_COMMAND_GET_CHAT_LOG:
+			res.Cmd = handler2.GetChatLog(l.svcCtx, cmd)
+			break
+		}
+		log.Println("<DbCall> cmdType: ", cmdType)
+	}).Catch(func(e exception.Exception) {
+		err = e.(error)
+	}).Finally(func() {
+
+	})
+	return res, err
+}

+ 65 - 0
db/rpc/internal/logic/db_login_logic.go

@@ -0,0 +1,65 @@
+package logic
+
+import (
+	handler2 "call_center/db/rpc/internal/handler"
+	"call_center/public/exception"
+	"context"
+	"io"
+	"log"
+
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type DbLoginLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewDbLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DbLoginLogic {
+	return &DbLoginLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *DbLoginLogic) DbLogin(stream pb.Db_DbLoginServer) error {
+	var err error
+	exception.Try(func() {
+		log.Println("<DbLogin>")
+		for {
+			req, err := stream.Recv()
+			if err != nil {
+				if err == io.EOF {
+				}
+				log.Println("<DbLogin> 连接断开, req:", req)
+				break
+			}
+
+			cmd := req.Cmd
+			cmdType := cmd.CmdType
+			switch cmdType {
+			case pb.EDbCommand_E_DB_COMMAND_PUSH_CHAT_LOG:
+				handler2.PushChatLog(l.svcCtx, cmd)
+				break
+			case pb.EDbCommand_E_DB_COMMAND_PUSH_CHAT_RECORD:
+				handler2.PushChatRecord(l.svcCtx, cmd)
+				break
+			}
+
+			if err != nil {
+				continue
+			}
+		}
+	}).Catch(func(e exception.Exception) {
+		err = e.(error)
+	}).Finally(func() {
+
+	})
+
+	return err
+}

+ 50 - 0
db/rpc/internal/logic/get_sensitive_words_logic.go

@@ -0,0 +1,50 @@
+package logic
+
+import (
+	"context"
+	"strings"
+
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type GetSensitiveWordsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewGetSensitiveWordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetSensitiveWordsLogic {
+	return &GetSensitiveWordsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *GetSensitiveWordsLogic) GetSensitiveWords(in *pb.SensReq) (*pb.SensRes, error) {
+	// todo: add your logic here and delete this line
+	res := new(pb.SensRes)
+
+	// 读取db
+	wordsModel, err := l.svcCtx.SensWordModel.FindAll()
+	if err != nil {
+		return res, err
+	}
+	filterModel, err := l.svcCtx.ConfigModel.FindOneByConfKey("sensitive_words_filter")
+	if err != nil {
+		return res, err
+	}
+
+	// 结果赋值
+	for _, v := range *wordsModel {
+		res.SensWords = append(res.SensWords, v.Word)
+	}
+	wordsFilter := strings.Split(filterModel.ConfValue, ",")
+	res.FilterWord = wordsFilter
+
+	logx.Infof("[GetSensitiveWords] sensWordLen:%s, filterWordsLen:%s", len(res.SensWords), len(res.FilterWord))
+	return res, nil
+}

+ 39 - 0
db/rpc/internal/server/db_server.go

@@ -0,0 +1,39 @@
+// Code generated by goctl. DO NOT EDIT!
+// Source: db.proto
+
+package server
+
+import (
+	"context"
+
+	"call_center/db/rpc/internal/logic"
+	"call_center/db/rpc/internal/svc"
+	"call_center/db/rpc/pb"
+)
+
+type DbServer struct {
+	svcCtx *svc.ServiceContext
+}
+
+func NewDbServer(svcCtx *svc.ServiceContext) *DbServer {
+	return &DbServer{
+		svcCtx: svcCtx,
+	}
+}
+
+//  客服聊天
+func (s *DbServer) DbLogin(stream pb.Db_DbLoginServer) error {
+	l := logic.NewDbLoginLogic(stream.Context(), s.svcCtx)
+	return l.DbLogin(stream)
+}
+
+func (s *DbServer) DbCall(ctx context.Context, in *pb.DbMsgReq) (*pb.DbMsgRes, error) {
+	l := logic.NewDbCallLogic(ctx, s.svcCtx)
+	return l.DbCall(in)
+}
+
+//  游戏聊天
+func (s *DbServer) GetSensitiveWords(ctx context.Context, in *pb.SensReq) (*pb.SensRes, error) {
+	l := logic.NewGetSensitiveWordsLogic(ctx, s.svcCtx)
+	return l.GetSensitiveWords(in)
+}

+ 25 - 0
db/rpc/internal/svc/service_context.go

@@ -0,0 +1,25 @@
+package svc
+
+import (
+	"call_center/db/model"
+	"call_center/db/rpc/internal/config"
+	es "call_center/public/es"
+	"github.com/tal-tech/go-zero/core/stores/sqlx"
+)
+
+type ServiceContext struct {
+	Config        config.Config
+	ConfigModel   model.ChatConfigsModel
+	SensWordModel model.ChatSensitiveWordsModel
+	Es            es.EsMgrInterface
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	conn := sqlx.NewMysql(c.Mysql.DataSource)
+	return &ServiceContext{
+		Config:        c,
+		ConfigModel:   model.NewChatConfigsModel(conn),
+		SensWordModel: model.NewChatSensitiveWordsModel(conn),
+		Es:            es.New(c.EsConf),
+	}
+}

+ 94 - 0
db/rpc/logs/db/Suyghurs-MacBook-Pro.local/access.log

@@ -0,0 +1,94 @@
+{"@timestamp":"2022-02-11T11:47:20.263+08","level":"info","content":"[EsMgr.Init], address: [http://192.168.0.118:9200 http://192.168.0.124:9200 http://192.168.0.251:9200]"}
+{"@timestamp":"2022-02-11T11:47:20.263+08","level":"info","content":"2022/02/11 11:47:20 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-02-11T15:17:07.886+08","level":"info","content":"[EsMgr.Init], address: [http://192.168.0.118:9200 http://192.168.0.124:9200 http://192.168.0.251:9200]"}
+{"@timestamp":"2022-02-11T15:17:07.887+08","level":"info","content":"2022/02/11 15:17:07 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-02-11T15:21:26.289+08","level":"info","content":"[EsMgr.Init], address: [http://192.168.0.118:9200 http://192.168.0.124:9200 http://192.168.0.251:9200]"}
+{"@timestamp":"2022-02-11T15:21:26.289+08","level":"info","content":"2022/02/11 15:21:26 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-02-11T15:21:41.172+08","level":"info","content":"2022/02/11 15:21:41 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-02-11T15:21:41.173+08","level":"info","content":"2022/02/11 15:21:41 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-02-11T15:21:41.173+08","level":"info","duration":"0.2ms","content":"172.16.0.69:58593 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"250aab28aedbee718b71c1fedfac4be1","span":"8c91606fccc92433"}
+{"@timestamp":"2022-02-11T15:22:14.442+08","level":"info","content":"2022/02/11 15:22:14 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-21T17:04:54.389+08","level":"info","content":"[EsMgr.Init], address: [http://101.33.209.36:9200]"}
+{"@timestamp":"2022-03-21T17:04:54.389+08","level":"info","content":"2022/03/21 17:04:54 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-03-21T17:05:19.505+08","level":"info","content":"2022/03/21 17:05:19 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-21T17:05:19.614+08","level":"info","content":"2022/03/21 17:05:19 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-21T17:05:19.614+08","level":"info","content":"2022/03/21 17:05:19 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-21T17:05:19.614+08","level":"info","duration":"108.6ms","content":"172.16.0.69:60372 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"829a24362548ca804cb27ca86e6c369f","span":"e65d83bed913e71a"}
+{"@timestamp":"2022-03-21T17:48:33.706+08","level":"info","content":"2022/03/21 17:48:33 \u003chandler.GetChatRecord\u003e querySql: select playerId, gameId from service_chat_record where state = 1 and serviceId = '1647856113824637811568' and logDt \u003e= 1647769713 limit 100\n"}
+{"@timestamp":"2022-03-21T17:48:33.757+08","level":"info","content":"[EsMgr.Query] es search err, err:map[error:map[index:service_chat_record index_uuid:_na_ reason:no such index [service_chat_record] resource.id:service_chat_record resource.type:index_or_alias root_cause:[map[index:service_chat_record index_uuid:_na_ reason:no such index [service_chat_record] resource.id:service_chat_record resource.type:index_or_alias type:index_not_found_exception]] type:index_not_found_exception] status:404]"}
+{"@timestamp":"2022-03-21T17:48:33.757+08","level":"info","content":"2022/03/21 17:48:33 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CHAT_RECORD\n"}
+{"@timestamp":"2022-03-21T17:48:33.757+08","level":"info","duration":"51.7ms","content":"172.16.0.69:60372 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2002,\"cmd_str\":\"1647856113824637811568\",\"Data\":null}}","trace":"076acb74e825882e9a86e63a3ef0ef61","span":"d808130483e4fb98"}
+{"@timestamp":"2022-03-21T17:50:13.911+08","level":"info","content":"2022/03/21 17:50:13 \u003chandler.PushChatRecord\u003e, msg: map[gameId:1001 isVisitor:true logDt:1647856213 playerId:1647856133824633804960 serviceId:1647856113824637811568 sessionId:1647856133824633804960 state:0]\n"}
+{"@timestamp":"2022-03-21T17:50:24.396+08","level":"info","content":"2022/03/21 17:50:24 \u003chandler.PushChatLog\u003e, table:service_chat_visitor_log, msg:map[chatType:E_DB_CHAT_TYPE_SERVICE content:haha\n fromId:1647856113824637811568 gameId:%!s(int32=1001) logDt:%!s(int64=1647856223) sessionId:1647856133824633804960 toId:1647856133824633804960]\n"}
+{"@timestamp":"2022-03-21T17:52:36.671+08","level":"info","content":"2022/03/21 17:52:36 \u003chandler.PushChatLog\u003e, table:service_chat_visitor_log, msg:map[chatType:E_DB_CHAT_TYPE_PLAYER content:haha\n fromId:1647856133824633804960 gameId:%!s(int32=1001) logDt:%!s(int64=1647856356) sessionId:1647856133824633804960 toId:1647856113824637811568]\n"}
+{"@timestamp":"2022-03-21T18:02:38.762+08","level":"info","content":"2022/03/21 18:02:38 \u003chandler.PushChatRecord\u003e, msg: map[gameId:1001 isVisitor:true logDt:1647856958 playerId:1647856133824633804960 serviceId:1647856113824637811568 sessionId:1647856133824633804960 state:1]\n"}
+{"@timestamp":"2022-03-22T15:57:25.953+08","level":"info","content":"[EsMgr.Init], address: [http://101.33.209.36:9200]"}
+{"@timestamp":"2022-03-22T15:57:25.953+08","level":"info","content":"2022/03/22 15:57:25 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-03-22T15:57:31.457+08","level":"info","content":"2022/03/22 15:57:31 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T15:57:31.560+08","level":"info","content":"2022/03/22 15:57:31 \u003chandler.GetChatRecord\u003e querySql: select playerId, gameId from service_chat_record where state = 1 and serviceId = '1647935851824634855120' and logDt \u003e= 1647849451 limit 100\n"}
+{"@timestamp":"2022-03-22T15:57:31.564+08","level":"info","content":"2022/03/22 15:57:31 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T15:57:31.564+08","level":"info","content":"2022/03/22 15:57:31 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T15:57:31.564+08","level":"info","duration":"106.7ms","content":"172.16.0.69:65165 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"2ce41e494033430c2124bd2f35d20742","span":"b2a331d3c0dc252b"}
+{"@timestamp":"2022-03-22T15:57:31.590+08","level":"info","content":"2022/03/22 15:57:31 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CHAT_RECORD\n"}
+{"@timestamp":"2022-03-22T15:57:31.590+08","level":"info","duration":"29.3ms","content":"172.16.0.69:65165 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2002,\"cmd_str\":\"1647935851824634855120\",\"Data\":null}}","trace":"bd3b6b9c8efe3017a6d3018458b5116a","span":"5b5fae5fbb17f0d1"}
+{"@timestamp":"2022-03-22T15:58:49.963+08","level":"info","content":"2022/03/22 15:58:49 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T15:58:59.971+08","level":"info","content":"2022/03/22 15:58:59 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T15:59:00.070+08","level":"info","duration":"96.8ms","content":"sql query: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`"}
+{"@timestamp":"2022-03-22T15:59:00.070+08","level":"info","content":"2022/03/22 15:59:00 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T15:59:00.070+08","level":"info","content":"2022/03/22 15:59:00 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T15:59:00.070+08","level":"info","duration":"97.1ms","content":"172.16.0.69:65224 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"c1c4e1eb09bf2c7fbfcf478b7516d53a","span":"9458787c8b055950"}
+{"@timestamp":"2022-03-22T16:00:14.675+08","level":"info","content":"2022/03/22 16:00:14 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T16:00:24.593+08","level":"info","content":"2022/03/22 16:00:24 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T16:00:24.710+08","level":"info","duration":"115.9ms","content":"sql query: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`"}
+{"@timestamp":"2022-03-22T16:00:24.710+08","level":"info","content":"2022/03/22 16:00:24 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T16:00:24.710+08","level":"info","content":"2022/03/22 16:00:24 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T16:00:24.710+08","level":"info","duration":"116.2ms","content":"172.16.0.69:65271 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"c936ada90a89584b0584a1bd574f7ea8","span":"8e94a673ad5071aa"}
+{"@timestamp":"2022-03-22T16:01:55.992+08","level":"info","content":"2022/03/22 16:01:55 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T16:02:04.755+08","level":"info","content":"2022/03/22 16:02:04 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T16:02:04.847+08","level":"info","duration":"91.1ms","content":"sql query: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`"}
+{"@timestamp":"2022-03-22T16:02:04.847+08","level":"info","content":"2022/03/22 16:02:04 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T16:02:04.847+08","level":"info","content":"2022/03/22 16:02:04 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T16:02:04.847+08","level":"info","duration":"91.3ms","content":"172.16.0.69:65326 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"06f8470bb8f02217d05c6cb2fdd689f7","span":"11617da8bcfa71f6"}
+{"@timestamp":"2022-03-22T16:02:33.453+08","level":"info","content":"2022/03/22 16:02:33 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T16:02:42.277+08","level":"info","content":"2022/03/22 16:02:42 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T16:02:42.377+08","level":"info","duration":"99.7ms","content":"sql query: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`"}
+{"@timestamp":"2022-03-22T16:02:42.377+08","level":"info","content":"2022/03/22 16:02:42 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T16:02:42.377+08","level":"info","content":"2022/03/22 16:02:42 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T16:02:42.377+08","level":"info","duration":"99.9ms","content":"172.16.0.69:65351 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"da390821c9a5cd38f28c13ec8f9faac9","span":"8d038c72dee58b51"}
+{"@timestamp":"2022-03-22T16:03:03.887+08","level":"info","content":"2022/03/22 16:03:03 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T16:03:12.657+08","level":"info","content":"2022/03/22 16:03:12 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T16:03:12.749+08","level":"info","duration":"91.9ms","content":"sql query: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`"}
+{"@timestamp":"2022-03-22T16:03:12.749+08","level":"info","content":"2022/03/22 16:03:12 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T16:03:12.749+08","level":"info","content":"2022/03/22 16:03:12 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T16:03:12.749+08","level":"info","duration":"92.1ms","content":"172.16.0.69:65374 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"d9e624baced439d92bb51707d1a20de8","span":"48cc00f21d9cf368"}
+{"@timestamp":"2022-03-22T16:05:21.760+08","level":"info","content":"2022/03/22 16:05:21 \u003chandler.GetChatRecord\u003e querySql: select playerId, gameId from service_chat_record where state = 1 and serviceId = '1647936321824640832512' and logDt \u003e= 1647849921 limit 100\n"}
+{"@timestamp":"2022-03-22T16:05:21.801+08","level":"info","content":"2022/03/22 16:05:21 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CHAT_RECORD\n"}
+{"@timestamp":"2022-03-22T16:05:21.801+08","level":"info","duration":"40.8ms","content":"172.16.0.69:65374 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2002,\"cmd_str\":\"1647936321824640832512\",\"Data\":null}}","trace":"ba18e60db6d4283444646e30e3e4729c","span":"28709515dd398f78"}
+{"@timestamp":"2022-03-22T16:05:38.806+08","level":"info","content":"2022/03/22 16:05:38 \u003chandler.PushChatRecord\u003e, msg: map[gameId:1001 isVisitor:true logDt:1647936338 playerId:1647936324824640835360 serviceId:1647936321824640832512 sessionId:1647936324824640835360 state:0]\n"}
+{"@timestamp":"2022-03-22T16:05:41.457+08","level":"info","content":"2022/03/22 16:05:41 \u003chandler.PushChatLog\u003e, table:service_chat_visitor_log, msg:map[chatType:E_DB_CHAT_TYPE_SERVICE content:aaaa\n fromId:1647936321824640832512 gameId:%!s(int32=1001) logDt:%!s(int64=1647936341) sessionId:1647936324824640835360 toId:1647936324824640835360]\n"}
+{"@timestamp":"2022-03-22T16:15:24.724+08","level":"info","content":"2022/03/22 16:15:24 \u003chandler.PushChatRecord\u003e, msg: map[gameId:1001 isVisitor:true logDt:1647936924 playerId:1647936324824640835360 serviceId:1647936321824640832512 sessionId:1647936324824640835360 state:1]\n"}
+{"@timestamp":"2022-03-22T17:56:17.373+08","level":"info","content":"2022/03/22 17:56:17 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T17:58:14.872+08","level":"info","content":"[EsMgr.Init], address: [http://101.33.209.36:9200]"}
+{"@timestamp":"2022-03-22T17:58:14.872+08","level":"info","content":"2022/03/22 17:58:14 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-03-22T17:58:21.759+08","level":"info","content":"2022/03/22 17:58:21 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T17:58:22.031+08","level":"info","content":"2022/03/22 17:58:22 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T17:58:22.031+08","level":"info","content":"2022/03/22 17:58:22 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T17:58:22.031+08","level":"info","duration":"271.1ms","content":"172.16.0.69:52250 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"6f3664b3d24610489741e97ca3d560f7","span":"b9d47c392bd8de09"}
+{"@timestamp":"2022-03-22T17:58:23.137+08","level":"info","content":"2022/03/22 17:58:23 \u003chandler.GetChatRecord\u003e querySql: select playerId, gameId from service_chat_record where state = 1 and serviceId = '1647943103824635916048' and logDt \u003e= 1647856703 limit 100\n"}
+{"@timestamp":"2022-03-22T17:58:23.172+08","level":"info","content":"2022/03/22 17:58:23 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CHAT_RECORD\n"}
+{"@timestamp":"2022-03-22T17:58:23.172+08","level":"info","duration":"34.9ms","content":"172.16.0.69:52250 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2002,\"cmd_str\":\"1647943103824635916048\",\"Data\":null}}","trace":"60245f20608bcbcd33095ed8ce2ae538","span":"71ca1203a5a26236"}
+{"@timestamp":"2022-03-22T19:42:16.748+08","level":"info","content":"2022/03/22 19:42:16 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}
+{"@timestamp":"2022-03-22T20:37:08.099+08","level":"info","content":"[EsMgr.Init], address: [http://101.33.209.36:9200]"}
+{"@timestamp":"2022-03-22T20:37:08.100+08","level":"info","content":"2022/03/22 20:37:08 Starting rpc server at 0.0.0.0:3001...\n"}
+{"@timestamp":"2022-03-22T20:37:14.179+08","level":"info","content":"2022/03/22 20:37:14 \u003cDbLogin\u003e\n"}
+{"@timestamp":"2022-03-22T20:37:14.285+08","level":"info","content":"2022/03/22 20:37:14 \u003chandler.GetConfig\u003e [ERROR] err: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)\n"}
+{"@timestamp":"2022-03-22T20:37:14.285+08","level":"info","content":"2022/03/22 20:37:14 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CONFIG\n"}
+{"@timestamp":"2022-03-22T20:37:14.286+08","level":"info","duration":"105.3ms","content":"172.16.0.69:51862 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2001,\"Data\":null}}","trace":"718ca88f22b70751e3ad0d1e19cd3b78","span":"f13f2d598ee9f795"}
+{"@timestamp":"2022-03-22T20:38:06.813+08","level":"info","content":"2022/03/22 20:38:06 \u003chandler.GetChatRecord\u003e querySql: select playerId, gameId from service_chat_record where state = 1 and serviceId = '1647952686824640894016' and logDt \u003e= 1647866286 limit 100\n"}
+{"@timestamp":"2022-03-22T20:38:06.843+08","level":"info","content":"2022/03/22 20:38:06 \u003cDbCall\u003e cmdType:  E_DB_COMMAND_GET_CHAT_RECORD\n"}
+{"@timestamp":"2022-03-22T20:38:06.843+08","level":"info","duration":"30.3ms","content":"172.16.0.69:51862 - /pb.Db/DbCall - {\"cmd\":{\"cmd_type\":2002,\"cmd_str\":\"1647952686824640894016\",\"Data\":null}}","trace":"8a9518b724e2ff632abc92ee51c659c3","span":"fbacc921885c5469"}
+{"@timestamp":"2022-03-22T20:52:13.805+08","level":"info","content":"2022/03/22 20:52:13 \u003chandler.PushChatRecord\u003e, msg: map[gameId:0 isVisitor:true logDt:1647953533 playerId:1647953477824641594720 serviceId:1647952686824640894016 sessionId:1647953477824641594720 state:0]\n"}
+{"@timestamp":"2022-03-22T20:52:58.085+08","level":"info","content":"2022/03/22 20:52:58 \u003chandler.PushChatRecord\u003e, msg: map[gameId:0 isVisitor:true logDt:1647953578 playerId:1647953477824641594720 serviceId:1647952686824640894016 sessionId:1647953477824641594720 state:1]\n"}
+{"@timestamp":"2022-03-22T20:53:42.677+08","level":"info","content":"2022/03/22 20:53:42 \u003chandler.PushChatRecord\u003e, msg: map[gameId:0 isVisitor:true logDt:1647953622 playerId:1647953613824640725424 serviceId:1647952686824640894016 sessionId:1647953613824640725424 state:0]\n"}
+{"@timestamp":"2022-03-22T20:59:54.488+08","level":"info","content":"2022/03/22 20:59:54 \u003chandler.PushChatRecord\u003e, msg: map[gameId:0 isVisitor:true logDt:1647953994 playerId:1647953613824640725424 serviceId:1647952686824640894016 sessionId:1647953613824640725424 state:1]\n"}
+{"@timestamp":"2022-03-22T20:59:57.337+08","level":"info","content":"2022/03/22 20:59:57 \u003cDbLogin\u003e 连接断开, req: \u003cnil\u003e\n"}

+ 10 - 0
db/rpc/logs/db/Suyghurs-MacBook-Pro.local/error.log

@@ -0,0 +1,10 @@
+{"@timestamp":"2022-02-11T11:47:25.264+08","level":"error","content":"server.go:90 context deadline exceeded"}
+{"@timestamp":"2022-03-21T17:05:19.614+08","level":"error","content":"utils.go:109 Error on getting sql instance of tcp(121.5.13.227:3306)/service_center?charset=utf8mb4\u0026parseTime=True\u0026loc=Local: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T15:57:31.564+08","level":"error","content":"utils.go:109 Error on getting sql instance of tcp(121.5.13.227:3306)/service_center?charset=utf8mb4\u0026parseTime=True\u0026loc=Local: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T15:59:00.070+08","level":"error","content":"utils.go:114 stmt: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`, error: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T16:00:24.710+08","level":"error","content":"utils.go:114 stmt: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`, error: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T16:02:04.847+08","level":"error","content":"utils.go:114 stmt: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`, error: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T16:02:42.377+08","level":"error","content":"utils.go:114 stmt: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`, error: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T16:03:12.749+08","level":"error","content":"utils.go:114 stmt: select `id`,`conf_name`,`conf_key`,`conf_value` from `chat_configs`, error: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T17:58:22.031+08","level":"error","content":"utils.go:109 Error on getting sql instance of tcp(121.5.13.227:3306)/service_center?charset=utf8mb4\u0026parseTime=True\u0026loc=Local: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}
+{"@timestamp":"2022-03-22T20:37:14.285+08","level":"error","content":"utils.go:109 Error on getting sql instance of tcp(121.5.13.227:3306)/service_center?charset=utf8mb4\u0026parseTime=True\u0026loc=Local: Error 1045: Access denied for user 'root'@'113.108.198.146' (using password: YES)"}

+ 0 - 0
db/rpc/logs/db/Suyghurs-MacBook-Pro.local/severe.log


+ 0 - 0
db/rpc/logs/db/Suyghurs-MacBook-Pro.local/slow.log


+ 993 - 0
db/rpc/logs/db/Suyghurs-MacBook-Pro.local/stat.log

@@ -0,0 +1,993 @@
+{"@timestamp":"2022-02-11T15:18:07.877+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.2Mi, Sys=16.8Mi, NumGC=3"}
+{"@timestamp":"2022-02-11T15:18:07.888+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-02-11T15:19:07.877+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=6.4Mi, Sys=16.8Mi, NumGC=3"}
+{"@timestamp":"2022-02-11T15:19:07.888+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-02-11T15:20:07.878+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=6.5Mi, Sys=16.8Mi, NumGC=4"}
+{"@timestamp":"2022-02-11T15:20:07.889+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-02-11T15:21:07.879+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.5Mi, Sys=16.8Mi, NumGC=4"}
+{"@timestamp":"2022-02-11T15:21:07.890+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:05:54.378+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=6.5Mi, Sys=16.6Mi, NumGC=3"}
+{"@timestamp":"2022-03-21T17:05:54.391+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 1, pass: 1, drop: 0"}
+{"@timestamp":"2022-03-21T17:06:19.616+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 108.0ms, med: 108.6ms, 90th: 108.6ms, 99th: 108.6ms, 99.9th: 108.6ms"}
+{"@timestamp":"2022-03-21T17:06:54.380+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.6Mi, TotalAlloc=6.6Mi, Sys=16.6Mi, NumGC=3"}
+{"@timestamp":"2022-03-21T17:06:54.392+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:07:19.618+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:07:54.381+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.7Mi, Sys=16.6Mi, NumGC=4"}
+{"@timestamp":"2022-03-21T17:07:54.394+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:08:19.619+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:08:54.384+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.7Mi, Sys=16.6Mi, NumGC=4"}
+{"@timestamp":"2022-03-21T17:08:54.396+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:09:19.622+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:09:54.385+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.8Mi, Sys=16.6Mi, NumGC=5"}
+{"@timestamp":"2022-03-21T17:09:54.398+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:10:19.624+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:10:54.387+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.8Mi, Sys=16.6Mi, NumGC=5"}
+{"@timestamp":"2022-03-21T17:10:54.399+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:11:19.624+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:11:54.388+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.9Mi, Sys=16.8Mi, NumGC=6"}
+{"@timestamp":"2022-03-21T17:11:54.401+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:12:19.626+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:12:54.390+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.0Mi, Sys=16.8Mi, NumGC=6"}
+{"@timestamp":"2022-03-21T17:12:54.402+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:13:19.629+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:13:54.393+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.0Mi, Sys=16.8Mi, NumGC=7"}
+{"@timestamp":"2022-03-21T17:13:54.405+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:14:19.630+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:14:54.394+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.1Mi, Sys=16.8Mi, NumGC=7"}
+{"@timestamp":"2022-03-21T17:14:54.406+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:15:19.632+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:15:54.396+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.1Mi, Sys=16.8Mi, NumGC=8"}
+{"@timestamp":"2022-03-21T17:15:54.408+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:16:19.633+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:16:54.397+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.2Mi, Sys=16.8Mi, NumGC=8"}
+{"@timestamp":"2022-03-21T17:16:54.409+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:17:19.635+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:17:54.399+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.3Mi, Sys=17.1Mi, NumGC=9"}
+{"@timestamp":"2022-03-21T17:17:54.411+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:18:19.637+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:18:54.402+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.3Mi, Sys=17.1Mi, NumGC=9"}
+{"@timestamp":"2022-03-21T17:18:54.413+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:19:19.639+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:19:54.403+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.4Mi, Sys=17.1Mi, NumGC=10"}
+{"@timestamp":"2022-03-21T17:19:54.415+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:20:19.640+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:20:54.405+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.4Mi, Sys=17.1Mi, NumGC=10"}
+{"@timestamp":"2022-03-21T17:20:54.416+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:21:19.636+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:21:54.389+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.5Mi, Sys=17.1Mi, NumGC=11"}
+{"@timestamp":"2022-03-21T17:21:54.401+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:22:19.626+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:22:54.389+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.6Mi, Sys=17.1Mi, NumGC=11"}
+{"@timestamp":"2022-03-21T17:22:54.402+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:23:19.628+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:23:54.391+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.6Mi, Sys=17.1Mi, NumGC=12"}
+{"@timestamp":"2022-03-21T17:23:54.403+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:24:19.629+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:24:54.392+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.7Mi, Sys=17.1Mi, NumGC=12"}
+{"@timestamp":"2022-03-21T17:24:54.404+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:25:19.630+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:25:54.393+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.7Mi, Sys=17.1Mi, NumGC=13"}
+{"@timestamp":"2022-03-21T17:25:54.406+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:26:19.631+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:26:54.395+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.8Mi, Sys=17.1Mi, NumGC=13"}
+{"@timestamp":"2022-03-21T17:26:54.407+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:27:19.633+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:27:54.395+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.9Mi, Sys=17.1Mi, NumGC=14"}
+{"@timestamp":"2022-03-21T17:27:54.408+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:28:19.634+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:28:54.397+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.9Mi, Sys=17.1Mi, NumGC=14"}
+{"@timestamp":"2022-03-21T17:28:54.409+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:29:19.635+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:29:54.399+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.0Mi, Sys=17.1Mi, NumGC=15"}
+{"@timestamp":"2022-03-21T17:29:54.412+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:30:19.638+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:30:54.401+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.0Mi, Sys=17.1Mi, NumGC=15"}
+{"@timestamp":"2022-03-21T17:30:54.414+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:31:19.640+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:31:54.402+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.1Mi, Sys=17.1Mi, NumGC=16"}
+{"@timestamp":"2022-03-21T17:31:54.415+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:32:19.641+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:32:54.403+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.2Mi, Sys=17.1Mi, NumGC=16"}
+{"@timestamp":"2022-03-21T17:32:54.416+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:33:19.642+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:33:54.404+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.2Mi, Sys=17.1Mi, NumGC=17"}
+{"@timestamp":"2022-03-21T17:33:54.417+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:34:19.643+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:34:54.407+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.3Mi, Sys=17.1Mi, NumGC=17"}
+{"@timestamp":"2022-03-21T17:34:54.419+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:35:19.644+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:35:54.408+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.4Mi, Sys=17.1Mi, NumGC=18"}
+{"@timestamp":"2022-03-21T17:35:54.420+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:36:19.645+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:36:54.409+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.4Mi, Sys=17.1Mi, NumGC=18"}
+{"@timestamp":"2022-03-21T17:36:54.421+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:37:19.647+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:37:54.410+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.5Mi, Sys=17.1Mi, NumGC=19"}
+{"@timestamp":"2022-03-21T17:37:54.423+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:38:19.650+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:38:54.411+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.5Mi, Sys=17.1Mi, NumGC=19"}
+{"@timestamp":"2022-03-21T17:38:54.424+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:39:19.650+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:39:54.414+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.6Mi, Sys=17.1Mi, NumGC=20"}
+{"@timestamp":"2022-03-21T17:39:54.427+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:40:19.654+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:40:54.417+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.7Mi, Sys=17.1Mi, NumGC=20"}
+{"@timestamp":"2022-03-21T17:40:54.428+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:41:19.654+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:41:54.418+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.7Mi, Sys=17.1Mi, NumGC=21"}
+{"@timestamp":"2022-03-21T17:41:54.429+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:42:19.655+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:42:54.419+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.8Mi, Sys=17.1Mi, NumGC=21"}
+{"@timestamp":"2022-03-21T17:42:54.431+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:43:19.657+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:43:54.420+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.8Mi, Sys=17.1Mi, NumGC=22"}
+{"@timestamp":"2022-03-21T17:43:54.432+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:44:19.658+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:44:54.421+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.9Mi, Sys=17.1Mi, NumGC=22"}
+{"@timestamp":"2022-03-21T17:44:54.433+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:45:19.659+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:45:54.422+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.9Mi, Sys=17.1Mi, NumGC=23"}
+{"@timestamp":"2022-03-21T17:45:54.434+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:46:19.660+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:46:54.423+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.0Mi, Sys=17.1Mi, NumGC=23"}
+{"@timestamp":"2022-03-21T17:46:54.435+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:47:19.661+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:47:54.425+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.1Mi, Sys=17.1Mi, NumGC=24"}
+{"@timestamp":"2022-03-21T17:47:54.437+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:48:19.663+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:48:54.427+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=9.3Mi, Sys=17.1Mi, NumGC=24"}
+{"@timestamp":"2022-03-21T17:48:54.439+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 1, pass: 1, drop: 0"}
+{"@timestamp":"2022-03-21T17:49:19.666+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 51.0ms, med: 51.7ms, 90th: 51.7ms, 99th: 51.7ms, 99.9th: 51.7ms"}
+{"@timestamp":"2022-03-21T17:49:54.429+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.3Mi, Sys=17.1Mi, NumGC=25"}
+{"@timestamp":"2022-03-21T17:49:54.441+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:50:19.667+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:50:54.429+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=9.5Mi, Sys=17.1Mi, NumGC=25"}
+{"@timestamp":"2022-03-21T17:50:54.442+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:51:19.667+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:51:54.432+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.5Mi, Sys=17.1Mi, NumGC=26"}
+{"@timestamp":"2022-03-21T17:51:54.443+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:52:19.669+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:52:54.433+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.6Mi, Sys=17.1Mi, NumGC=26"}
+{"@timestamp":"2022-03-21T17:52:54.445+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:53:19.670+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:53:54.434+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.7Mi, Sys=17.1Mi, NumGC=27"}
+{"@timestamp":"2022-03-21T17:53:54.446+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:54:19.672+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:54:54.435+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.8Mi, Sys=17.1Mi, NumGC=27"}
+{"@timestamp":"2022-03-21T17:54:54.448+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:55:19.673+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:55:54.437+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.8Mi, Sys=17.1Mi, NumGC=28"}
+{"@timestamp":"2022-03-21T17:55:54.449+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:56:19.675+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:56:54.438+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.9Mi, Sys=17.1Mi, NumGC=28"}
+{"@timestamp":"2022-03-21T17:56:54.450+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:57:19.675+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:57:54.440+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.9Mi, Sys=17.1Mi, NumGC=29"}
+{"@timestamp":"2022-03-21T17:57:54.452+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:58:19.679+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:58:54.442+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.0Mi, Sys=17.1Mi, NumGC=29"}
+{"@timestamp":"2022-03-21T17:58:54.454+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T17:59:19.680+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T17:59:54.443+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.1Mi, Sys=17.1Mi, NumGC=30"}
+{"@timestamp":"2022-03-21T17:59:54.455+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:00:19.681+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:00:54.445+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.1Mi, Sys=17.1Mi, NumGC=30"}
+{"@timestamp":"2022-03-21T18:00:54.457+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:01:19.683+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:01:54.446+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.2Mi, Sys=17.1Mi, NumGC=31"}
+{"@timestamp":"2022-03-21T18:01:54.458+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:02:19.683+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:02:54.448+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.3Mi, Sys=17.1Mi, NumGC=31"}
+{"@timestamp":"2022-03-21T18:02:54.459+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:03:19.686+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:03:54.449+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.3Mi, Sys=17.1Mi, NumGC=32"}
+{"@timestamp":"2022-03-21T18:03:54.461+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:04:19.686+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:04:54.449+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.4Mi, Sys=17.1Mi, NumGC=32"}
+{"@timestamp":"2022-03-21T18:04:54.462+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:05:19.687+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:05:54.451+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.5Mi, Sys=17.1Mi, NumGC=33"}
+{"@timestamp":"2022-03-21T18:05:54.463+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:06:19.689+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:06:54.452+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.5Mi, Sys=17.1Mi, NumGC=33"}
+{"@timestamp":"2022-03-21T18:06:54.465+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:07:19.690+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:07:54.454+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.6Mi, Sys=17.1Mi, NumGC=34"}
+{"@timestamp":"2022-03-21T18:07:54.467+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:08:19.693+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:08:54.456+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.6Mi, Sys=17.1Mi, NumGC=34"}
+{"@timestamp":"2022-03-21T18:08:54.468+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:09:19.694+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:09:54.457+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.7Mi, Sys=17.1Mi, NumGC=35"}
+{"@timestamp":"2022-03-21T18:09:54.469+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:10:19.695+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:10:54.458+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.8Mi, Sys=17.1Mi, NumGC=35"}
+{"@timestamp":"2022-03-21T18:10:54.470+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:11:19.696+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:11:54.460+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.8Mi, Sys=17.1Mi, NumGC=36"}
+{"@timestamp":"2022-03-21T18:11:54.472+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:12:19.698+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:12:54.462+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.9Mi, Sys=17.1Mi, NumGC=36"}
+{"@timestamp":"2022-03-21T18:12:54.474+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:13:19.700+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:13:54.463+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.9Mi, Sys=17.1Mi, NumGC=37"}
+{"@timestamp":"2022-03-21T18:13:54.475+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:14:19.701+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:14:54.464+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.0Mi, Sys=17.1Mi, NumGC=37"}
+{"@timestamp":"2022-03-21T18:14:54.476+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:15:19.702+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:15:54.466+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.1Mi, Sys=17.1Mi, NumGC=38"}
+{"@timestamp":"2022-03-21T18:15:54.478+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:16:19.703+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:16:54.468+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.1Mi, Sys=17.1Mi, NumGC=38"}
+{"@timestamp":"2022-03-21T18:16:54.480+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:17:19.706+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:17:54.469+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.2Mi, Sys=17.1Mi, NumGC=39"}
+{"@timestamp":"2022-03-21T18:17:54.481+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:18:19.707+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:18:54.470+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.2Mi, Sys=17.1Mi, NumGC=39"}
+{"@timestamp":"2022-03-21T18:18:54.482+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:19:19.708+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:19:54.471+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.3Mi, Sys=17.1Mi, NumGC=40"}
+{"@timestamp":"2022-03-21T18:19:54.484+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:20:19.709+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:20:54.473+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.4Mi, Sys=17.1Mi, NumGC=40"}
+{"@timestamp":"2022-03-21T18:20:54.485+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:21:19.711+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:21:54.475+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.4Mi, Sys=17.1Mi, NumGC=41"}
+{"@timestamp":"2022-03-21T18:21:54.487+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:22:19.713+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:22:54.477+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.5Mi, Sys=17.1Mi, NumGC=41"}
+{"@timestamp":"2022-03-21T18:22:54.488+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:23:19.714+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:23:54.479+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.5Mi, Sys=17.1Mi, NumGC=42"}
+{"@timestamp":"2022-03-21T18:23:54.490+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:24:19.715+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:24:54.479+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.6Mi, Sys=17.1Mi, NumGC=42"}
+{"@timestamp":"2022-03-21T18:24:54.491+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:25:19.711+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:25:54.455+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.7Mi, Sys=17.1Mi, NumGC=43"}
+{"@timestamp":"2022-03-21T18:25:54.467+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:26:19.691+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:26:54.454+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.7Mi, Sys=17.1Mi, NumGC=43"}
+{"@timestamp":"2022-03-21T18:26:54.466+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:27:19.691+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:27:54.454+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.8Mi, Sys=17.1Mi, NumGC=44"}
+{"@timestamp":"2022-03-21T18:27:54.467+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:28:19.693+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:28:54.455+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.8Mi, Sys=17.1Mi, NumGC=44"}
+{"@timestamp":"2022-03-21T18:28:54.468+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-21T18:29:19.693+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-21T18:29:54.457+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.9Mi, Sys=17.1Mi, NumGC=45"}
+{"@timestamp":"2022-03-21T18:29:54.469+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T15:58:25.944+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.6Mi, Sys=20.6Mi, NumGC=3"}
+{"@timestamp":"2022-03-22T15:58:25.955+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 2, pass: 2, drop: 0"}
+{"@timestamp":"2022-03-22T15:58:31.567+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 67.5ms, med: 106.7ms, 90th: 106.7ms, 99th: 106.7ms, 99.9th: 106.7ms"}
+{"@timestamp":"2022-03-22T15:59:25.946+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.6Mi, TotalAlloc=6.8Mi, Sys=20.6Mi, NumGC=3"}
+{"@timestamp":"2022-03-22T15:59:25.957+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 1, pass: 1, drop: 0"}
+{"@timestamp":"2022-03-22T15:59:31.567+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 97.0ms, med: 97.1ms, 90th: 97.1ms, 99th: 97.1ms, 99.9th: 97.1ms"}
+{"@timestamp":"2022-03-22T16:00:25.947+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=7.0Mi, Sys=20.6Mi, NumGC=4"}
+{"@timestamp":"2022-03-22T16:00:25.959+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 1, pass: 1, drop: 0"}
+{"@timestamp":"2022-03-22T16:00:31.570+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 116.0ms, med: 116.2ms, 90th: 116.2ms, 99th: 116.2ms, 99.9th: 116.2ms"}
+{"@timestamp":"2022-03-22T16:01:25.948+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=7.1Mi, Sys=20.6Mi, NumGC=4"}
+{"@timestamp":"2022-03-22T16:01:25.960+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:01:31.572+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:02:25.950+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=7.3Mi, Sys=20.6Mi, NumGC=5"}
+{"@timestamp":"2022-03-22T16:02:25.962+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 1, pass: 1, drop: 0"}
+{"@timestamp":"2022-03-22T16:02:31.573+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 91.0ms, med: 91.3ms, 90th: 91.3ms, 99th: 91.3ms, 99.9th: 91.3ms"}
+{"@timestamp":"2022-03-22T16:03:25.952+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.7Mi, TotalAlloc=7.6Mi, Sys=20.6Mi, NumGC=5"}
+{"@timestamp":"2022-03-22T16:03:25.963+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 2, pass: 2, drop: 0"}
+{"@timestamp":"2022-03-22T16:03:31.575+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 96.0ms, med: 99.9ms, 90th: 99.9ms, 99th: 99.9ms, 99.9th: 99.9ms"}
+{"@timestamp":"2022-03-22T16:04:25.953+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.7Mi, Sys=20.6Mi, NumGC=6"}
+{"@timestamp":"2022-03-22T16:04:25.965+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:04:31.576+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:05:25.955+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=7.9Mi, Sys=20.6Mi, NumGC=6"}
+{"@timestamp":"2022-03-22T16:05:25.967+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 1, pass: 1, drop: 0"}
+{"@timestamp":"2022-03-22T16:05:31.578+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 40.0ms, med: 40.8ms, 90th: 40.8ms, 99th: 40.8ms, 99.9th: 40.8ms"}
+{"@timestamp":"2022-03-22T16:06:25.956+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.0Mi, Sys=20.6Mi, NumGC=7"}
+{"@timestamp":"2022-03-22T16:06:25.968+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:06:31.580+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:07:25.958+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.0Mi, Sys=20.6Mi, NumGC=7"}
+{"@timestamp":"2022-03-22T16:07:25.970+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:07:31.581+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:08:25.959+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.1Mi, Sys=20.6Mi, NumGC=8"}
+{"@timestamp":"2022-03-22T16:08:25.971+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:08:31.583+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:09:25.962+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.2Mi, Sys=20.6Mi, NumGC=8"}
+{"@timestamp":"2022-03-22T16:09:25.974+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:09:31.585+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:10:25.963+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.2Mi, Sys=20.6Mi, NumGC=9"}
+{"@timestamp":"2022-03-22T16:10:25.975+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:10:31.587+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:11:25.965+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.3Mi, Sys=20.6Mi, NumGC=9"}
+{"@timestamp":"2022-03-22T16:11:25.977+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:11:31.588+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:12:25.966+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.3Mi, Sys=20.6Mi, NumGC=10"}
+{"@timestamp":"2022-03-22T16:12:25.978+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:12:31.590+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:13:25.968+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.4Mi, Sys=20.6Mi, NumGC=10"}
+{"@timestamp":"2022-03-22T16:13:25.980+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:13:31.592+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:14:25.971+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.5Mi, Sys=20.6Mi, NumGC=11"}
+{"@timestamp":"2022-03-22T16:14:25.983+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:14:31.594+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:15:25.972+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.6Mi, Sys=20.6Mi, NumGC=11"}
+{"@timestamp":"2022-03-22T16:15:25.984+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:15:31.595+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:16:25.973+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.6Mi, Sys=20.6Mi, NumGC=12"}
+{"@timestamp":"2022-03-22T16:16:25.986+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:16:31.597+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:17:25.975+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.7Mi, Sys=20.6Mi, NumGC=12"}
+{"@timestamp":"2022-03-22T16:17:25.987+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:17:31.599+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:18:25.978+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.7Mi, Sys=20.6Mi, NumGC=13"}
+{"@timestamp":"2022-03-22T16:18:25.990+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:18:31.601+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:19:25.980+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.8Mi, Sys=20.6Mi, NumGC=13"}
+{"@timestamp":"2022-03-22T16:19:25.991+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:19:31.602+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:20:25.981+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.9Mi, Sys=20.6Mi, NumGC=14"}
+{"@timestamp":"2022-03-22T16:20:25.993+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:20:31.604+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:21:25.982+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=8.9Mi, Sys=20.6Mi, NumGC=14"}
+{"@timestamp":"2022-03-22T16:21:25.994+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:21:31.606+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:22:25.985+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.0Mi, Sys=20.6Mi, NumGC=15"}
+{"@timestamp":"2022-03-22T16:22:25.996+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:22:31.608+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:23:25.985+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.0Mi, Sys=20.6Mi, NumGC=15"}
+{"@timestamp":"2022-03-22T16:23:25.997+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:23:31.608+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:24:25.987+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.1Mi, Sys=20.6Mi, NumGC=16"}
+{"@timestamp":"2022-03-22T16:24:25.999+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:24:31.610+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:25:25.990+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.2Mi, Sys=20.6Mi, NumGC=16"}
+{"@timestamp":"2022-03-22T16:25:26.001+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:25:31.611+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:26:25.990+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.2Mi, Sys=20.6Mi, NumGC=17"}
+{"@timestamp":"2022-03-22T16:26:26.002+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:26:31.613+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:27:25.993+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.3Mi, Sys=20.6Mi, NumGC=17"}
+{"@timestamp":"2022-03-22T16:27:26.004+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:27:31.614+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:28:25.994+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.4Mi, Sys=20.6Mi, NumGC=18"}
+{"@timestamp":"2022-03-22T16:28:26.005+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:28:31.617+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:29:25.995+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.4Mi, Sys=20.6Mi, NumGC=18"}
+{"@timestamp":"2022-03-22T16:29:26.007+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:29:31.618+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:30:25.998+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.5Mi, Sys=20.6Mi, NumGC=19"}
+{"@timestamp":"2022-03-22T16:30:26.009+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:30:31.620+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:31:25.998+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.5Mi, Sys=20.6Mi, NumGC=19"}
+{"@timestamp":"2022-03-22T16:31:26.010+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:31:31.622+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:32:26.000+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.6Mi, Sys=20.6Mi, NumGC=20"}
+{"@timestamp":"2022-03-22T16:32:26.012+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:32:31.623+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:33:26.002+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.7Mi, Sys=20.6Mi, NumGC=20"}
+{"@timestamp":"2022-03-22T16:33:26.013+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:33:31.625+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:34:26.003+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.7Mi, Sys=20.6Mi, NumGC=21"}
+{"@timestamp":"2022-03-22T16:34:26.015+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:34:31.626+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:35:26.006+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.8Mi, Sys=20.6Mi, NumGC=21"}
+{"@timestamp":"2022-03-22T16:35:26.017+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:35:31.629+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:36:26.008+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.8Mi, Sys=20.6Mi, NumGC=22"}
+{"@timestamp":"2022-03-22T16:36:26.019+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:36:31.630+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:37:26.008+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.9Mi, Sys=20.6Mi, NumGC=22"}
+{"@timestamp":"2022-03-22T16:37:26.020+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:37:31.632+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:38:26.011+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.0Mi, Sys=20.6Mi, NumGC=23"}
+{"@timestamp":"2022-03-22T16:38:26.022+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:38:31.633+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:39:25.997+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.0Mi, Sys=20.6Mi, NumGC=23"}
+{"@timestamp":"2022-03-22T16:39:26.008+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:39:31.618+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:40:25.994+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.1Mi, Sys=20.6Mi, NumGC=24"}
+{"@timestamp":"2022-03-22T16:40:26.005+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:40:31.616+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:41:25.995+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.1Mi, Sys=20.6Mi, NumGC=24"}
+{"@timestamp":"2022-03-22T16:41:26.006+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:41:31.617+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:42:25.996+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.2Mi, Sys=20.6Mi, NumGC=25"}
+{"@timestamp":"2022-03-22T16:42:26.007+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:42:31.618+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:43:25.997+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.3Mi, Sys=20.6Mi, NumGC=25"}
+{"@timestamp":"2022-03-22T16:43:26.008+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:43:31.620+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:44:25.999+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.3Mi, Sys=20.8Mi, NumGC=26"}
+{"@timestamp":"2022-03-22T16:44:26.011+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:44:31.622+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:45:26.000+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.4Mi, Sys=20.8Mi, NumGC=26"}
+{"@timestamp":"2022-03-22T16:45:26.012+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:45:31.623+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:46:26.001+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.4Mi, Sys=20.8Mi, NumGC=27"}
+{"@timestamp":"2022-03-22T16:46:26.013+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:46:31.624+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:47:26.002+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.5Mi, Sys=20.8Mi, NumGC=27"}
+{"@timestamp":"2022-03-22T16:47:26.014+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:47:31.625+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:48:26.004+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.6Mi, Sys=20.8Mi, NumGC=28"}
+{"@timestamp":"2022-03-22T16:48:26.016+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:48:31.627+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:49:26.006+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.6Mi, Sys=20.8Mi, NumGC=28"}
+{"@timestamp":"2022-03-22T16:49:26.018+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:49:31.629+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:50:26.007+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.7Mi, Sys=20.8Mi, NumGC=29"}
+{"@timestamp":"2022-03-22T16:50:26.019+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:50:31.630+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:51:26.009+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.7Mi, Sys=20.8Mi, NumGC=29"}
+{"@timestamp":"2022-03-22T16:51:26.020+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:51:31.631+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:52:26.009+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.8Mi, Sys=20.8Mi, NumGC=30"}
+{"@timestamp":"2022-03-22T16:52:26.021+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:52:31.632+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:53:26.012+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=10.9Mi, Sys=20.8Mi, NumGC=30"}
+{"@timestamp":"2022-03-22T16:53:26.023+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:53:31.634+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:54:26.013+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.9Mi, Sys=20.8Mi, NumGC=31"}
+{"@timestamp":"2022-03-22T16:54:26.025+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:54:31.636+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:55:26.014+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.0Mi, Sys=20.8Mi, NumGC=31"}
+{"@timestamp":"2022-03-22T16:55:26.026+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:55:31.637+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:56:26.015+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.0Mi, Sys=20.8Mi, NumGC=32"}
+{"@timestamp":"2022-03-22T16:56:26.027+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:56:31.638+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:57:26.017+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.1Mi, Sys=20.8Mi, NumGC=32"}
+{"@timestamp":"2022-03-22T16:57:26.029+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:57:31.640+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:58:26.020+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.2Mi, Sys=20.8Mi, NumGC=33"}
+{"@timestamp":"2022-03-22T16:58:26.031+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:58:31.642+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T16:59:26.020+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.2Mi, Sys=20.8Mi, NumGC=33"}
+{"@timestamp":"2022-03-22T16:59:26.032+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T16:59:31.643+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:00:26.022+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.3Mi, Sys=20.8Mi, NumGC=34"}
+{"@timestamp":"2022-03-22T17:00:26.033+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:00:31.645+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:01:26.023+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.3Mi, Sys=20.8Mi, NumGC=34"}
+{"@timestamp":"2022-03-22T17:01:26.035+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:01:31.646+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:02:25.905+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.4Mi, Sys=20.8Mi, NumGC=35"}
+{"@timestamp":"2022-03-22T17:02:25.916+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:02:31.528+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:03:25.905+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.5Mi, Sys=20.8Mi, NumGC=35"}
+{"@timestamp":"2022-03-22T17:03:25.916+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:03:31.528+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:04:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.5Mi, Sys=20.8Mi, NumGC=36"}
+{"@timestamp":"2022-03-22T17:04:25.916+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:04:31.527+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:05:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.6Mi, Sys=20.8Mi, NumGC=36"}
+{"@timestamp":"2022-03-22T17:05:25.916+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:05:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:06:25.905+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.6Mi, Sys=20.8Mi, NumGC=37"}
+{"@timestamp":"2022-03-22T17:06:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:06:31.528+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:07:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.7Mi, Sys=20.8Mi, NumGC=37"}
+{"@timestamp":"2022-03-22T17:07:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:07:31.527+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:08:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.8Mi, Sys=20.8Mi, NumGC=38"}
+{"@timestamp":"2022-03-22T17:08:25.917+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:08:31.527+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:09:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.8Mi, Sys=20.8Mi, NumGC=38"}
+{"@timestamp":"2022-03-22T17:09:25.916+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:09:31.527+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:10:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.9Mi, Sys=20.8Mi, NumGC=39"}
+{"@timestamp":"2022-03-22T17:10:25.916+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:10:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:11:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=11.9Mi, Sys=20.8Mi, NumGC=39"}
+{"@timestamp":"2022-03-22T17:11:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:11:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:12:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.0Mi, Sys=20.8Mi, NumGC=40"}
+{"@timestamp":"2022-03-22T17:12:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:12:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:13:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.1Mi, Sys=20.8Mi, NumGC=40"}
+{"@timestamp":"2022-03-22T17:13:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:13:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:14:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.1Mi, Sys=20.8Mi, NumGC=41"}
+{"@timestamp":"2022-03-22T17:14:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:14:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:15:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.2Mi, Sys=20.8Mi, NumGC=41"}
+{"@timestamp":"2022-03-22T17:15:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:15:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:16:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.2Mi, Sys=20.8Mi, NumGC=42"}
+{"@timestamp":"2022-03-22T17:16:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:16:31.527+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:17:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.3Mi, Sys=20.8Mi, NumGC=42"}
+{"@timestamp":"2022-03-22T17:17:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:17:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:18:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.4Mi, Sys=20.8Mi, NumGC=43"}
+{"@timestamp":"2022-03-22T17:18:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:18:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:19:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.4Mi, Sys=20.8Mi, NumGC=43"}
+{"@timestamp":"2022-03-22T17:19:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:19:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:20:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.5Mi, Sys=20.8Mi, NumGC=44"}
+{"@timestamp":"2022-03-22T17:20:25.915+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:20:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:21:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.5Mi, Sys=20.8Mi, NumGC=44"}
+{"@timestamp":"2022-03-22T17:21:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:21:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:22:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.6Mi, Sys=20.8Mi, NumGC=45"}
+{"@timestamp":"2022-03-22T17:22:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:22:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:23:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.7Mi, Sys=20.8Mi, NumGC=45"}
+{"@timestamp":"2022-03-22T17:23:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:23:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:24:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.7Mi, Sys=20.8Mi, NumGC=46"}
+{"@timestamp":"2022-03-22T17:24:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:24:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:25:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.8Mi, Sys=20.8Mi, NumGC=46"}
+{"@timestamp":"2022-03-22T17:25:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:25:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:26:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.9Mi, Sys=20.8Mi, NumGC=47"}
+{"@timestamp":"2022-03-22T17:26:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:26:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:27:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.9Mi, Sys=20.8Mi, NumGC=47"}
+{"@timestamp":"2022-03-22T17:27:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:27:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:28:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.0Mi, Sys=20.8Mi, NumGC=48"}
+{"@timestamp":"2022-03-22T17:28:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:28:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:29:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.0Mi, Sys=20.8Mi, NumGC=48"}
+{"@timestamp":"2022-03-22T17:29:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:29:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:30:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.1Mi, Sys=20.8Mi, NumGC=49"}
+{"@timestamp":"2022-03-22T17:30:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:30:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:31:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.1Mi, Sys=20.8Mi, NumGC=49"}
+{"@timestamp":"2022-03-22T17:31:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:31:31.526+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:32:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.2Mi, Sys=20.8Mi, NumGC=50"}
+{"@timestamp":"2022-03-22T17:32:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:32:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:33:25.904+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.3Mi, Sys=20.8Mi, NumGC=50"}
+{"@timestamp":"2022-03-22T17:33:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:33:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:34:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.3Mi, Sys=20.8Mi, NumGC=51"}
+{"@timestamp":"2022-03-22T17:34:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:34:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:35:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.4Mi, Sys=20.8Mi, NumGC=51"}
+{"@timestamp":"2022-03-22T17:35:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:35:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:36:25.901+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.5Mi, Sys=20.8Mi, NumGC=52"}
+{"@timestamp":"2022-03-22T17:36:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:36:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:37:25.901+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.5Mi, Sys=20.8Mi, NumGC=52"}
+{"@timestamp":"2022-03-22T17:37:25.912+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:37:31.523+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:38:25.900+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.6Mi, Sys=20.8Mi, NumGC=53"}
+{"@timestamp":"2022-03-22T17:38:25.912+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:38:31.523+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:39:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.6Mi, Sys=20.8Mi, NumGC=53"}
+{"@timestamp":"2022-03-22T17:39:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:39:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:40:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.7Mi, Sys=20.8Mi, NumGC=54"}
+{"@timestamp":"2022-03-22T17:40:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:40:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:41:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.8Mi, Sys=20.8Mi, NumGC=54"}
+{"@timestamp":"2022-03-22T17:41:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:41:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:42:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.8Mi, Sys=20.8Mi, NumGC=55"}
+{"@timestamp":"2022-03-22T17:42:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:42:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:43:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=13.9Mi, Sys=20.8Mi, NumGC=55"}
+{"@timestamp":"2022-03-22T17:43:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:43:31.523+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:44:25.903+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=13.9Mi, Sys=20.8Mi, NumGC=56"}
+{"@timestamp":"2022-03-22T17:44:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:44:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:45:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=14.0Mi, Sys=20.8Mi, NumGC=56"}
+{"@timestamp":"2022-03-22T17:45:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:45:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:46:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=14.1Mi, Sys=20.8Mi, NumGC=57"}
+{"@timestamp":"2022-03-22T17:46:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:46:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:47:25.901+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=14.1Mi, Sys=20.8Mi, NumGC=57"}
+{"@timestamp":"2022-03-22T17:47:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:47:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:48:25.901+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=14.2Mi, Sys=20.8Mi, NumGC=58"}
+{"@timestamp":"2022-03-22T17:48:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:48:31.523+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:49:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=14.2Mi, Sys=20.8Mi, NumGC=58"}
+{"@timestamp":"2022-03-22T17:49:25.914+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:49:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:50:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=14.3Mi, Sys=20.8Mi, NumGC=59"}
+{"@timestamp":"2022-03-22T17:50:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:50:31.525+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:51:25.902+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=14.4Mi, Sys=20.8Mi, NumGC=59"}
+{"@timestamp":"2022-03-22T17:51:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:51:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:52:25.901+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=14.4Mi, Sys=20.8Mi, NumGC=60"}
+{"@timestamp":"2022-03-22T17:52:25.913+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:52:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:53:25.900+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=14.5Mi, Sys=20.8Mi, NumGC=60"}
+{"@timestamp":"2022-03-22T17:53:25.912+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:53:31.524+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:54:25.900+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=14.5Mi, Sys=20.8Mi, NumGC=61"}
+{"@timestamp":"2022-03-22T17:54:25.912+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:54:31.523+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:55:25.901+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=14.6Mi, Sys=20.8Mi, NumGC=61"}
+{"@timestamp":"2022-03-22T17:55:25.912+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T17:55:31.523+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T17:59:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.6Mi, TotalAlloc=6.6Mi, Sys=16.3Mi, NumGC=3"}
+{"@timestamp":"2022-03-22T17:59:14.872+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 2, pass: 2, drop: 0"}
+{"@timestamp":"2022-03-22T17:59:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 153.0ms, med: 271.1ms, 90th: 271.1ms, 99th: 271.1ms, 99.9th: 271.1ms"}
+{"@timestamp":"2022-03-22T18:00:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.7Mi, TotalAlloc=6.7Mi, Sys=16.3Mi, NumGC=3"}
+{"@timestamp":"2022-03-22T18:00:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:00:22.030+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:01:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.8Mi, Sys=16.3Mi, NumGC=4"}
+{"@timestamp":"2022-03-22T18:01:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:01:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:02:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=6.8Mi, Sys=16.3Mi, NumGC=4"}
+{"@timestamp":"2022-03-22T18:02:14.872+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:02:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:03:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.9Mi, Sys=16.3Mi, NumGC=5"}
+{"@timestamp":"2022-03-22T18:03:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:03:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:04:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.0Mi, Sys=16.3Mi, NumGC=5"}
+{"@timestamp":"2022-03-22T18:04:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:04:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:05:14.857+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.0Mi, Sys=16.3Mi, NumGC=6"}
+{"@timestamp":"2022-03-22T18:05:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:05:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:06:14.857+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.1Mi, Sys=16.3Mi, NumGC=6"}
+{"@timestamp":"2022-03-22T18:06:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:06:22.030+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:07:14.859+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.1Mi, Sys=16.3Mi, NumGC=7"}
+{"@timestamp":"2022-03-22T18:07:14.872+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:07:22.031+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:08:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.2Mi, Sys=16.3Mi, NumGC=7"}
+{"@timestamp":"2022-03-22T18:08:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:08:22.030+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:09:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.3Mi, Sys=16.3Mi, NumGC=8"}
+{"@timestamp":"2022-03-22T18:09:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:09:22.030+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:10:14.858+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.3Mi, Sys=16.3Mi, NumGC=8"}
+{"@timestamp":"2022-03-22T18:10:14.871+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:10:22.030+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:11:15.053+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.4Mi, Sys=16.3Mi, NumGC=9"}
+{"@timestamp":"2022-03-22T18:11:15.067+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:11:22.227+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:12:15.056+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.4Mi, Sys=16.3Mi, NumGC=9"}
+{"@timestamp":"2022-03-22T18:12:15.069+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:12:22.229+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:13:15.058+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.5Mi, Sys=16.6Mi, NumGC=10"}
+{"@timestamp":"2022-03-22T18:13:15.071+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:13:22.231+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:14:15.059+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.6Mi, Sys=16.6Mi, NumGC=10"}
+{"@timestamp":"2022-03-22T18:14:15.073+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:14:22.232+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:15:15.061+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.6Mi, Sys=16.6Mi, NumGC=11"}
+{"@timestamp":"2022-03-22T18:15:15.074+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:15:22.233+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:16:15.064+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.7Mi, Sys=16.6Mi, NumGC=11"}
+{"@timestamp":"2022-03-22T18:16:15.077+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:16:22.237+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:17:15.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.7Mi, Sys=16.6Mi, NumGC=12"}
+{"@timestamp":"2022-03-22T18:17:15.079+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:17:22.239+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:18:15.068+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.8Mi, Sys=16.6Mi, NumGC=12"}
+{"@timestamp":"2022-03-22T18:18:15.081+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:18:22.240+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:19:15.070+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.9Mi, Sys=16.6Mi, NumGC=13"}
+{"@timestamp":"2022-03-22T18:19:15.083+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:19:22.242+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:20:15.072+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.9Mi, Sys=16.6Mi, NumGC=13"}
+{"@timestamp":"2022-03-22T18:20:15.085+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:20:22.244+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:21:15.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.0Mi, Sys=16.6Mi, NumGC=14"}
+{"@timestamp":"2022-03-22T18:21:15.087+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:21:22.246+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:22:15.075+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.0Mi, Sys=16.6Mi, NumGC=14"}
+{"@timestamp":"2022-03-22T18:22:15.088+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:22:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:23:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.1Mi, Sys=16.6Mi, NumGC=15"}
+{"@timestamp":"2022-03-22T18:23:15.090+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:23:22.249+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:24:15.078+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.2Mi, Sys=16.6Mi, NumGC=15"}
+{"@timestamp":"2022-03-22T18:24:15.092+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:24:22.252+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:25:15.082+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.2Mi, Sys=16.6Mi, NumGC=16"}
+{"@timestamp":"2022-03-22T18:25:15.096+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:25:22.255+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:26:15.084+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.3Mi, Sys=16.6Mi, NumGC=16"}
+{"@timestamp":"2022-03-22T18:26:15.098+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:26:22.257+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:27:15.085+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.3Mi, Sys=16.6Mi, NumGC=17"}
+{"@timestamp":"2022-03-22T18:27:15.099+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:27:22.258+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:28:15.088+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.4Mi, Sys=16.6Mi, NumGC=17"}
+{"@timestamp":"2022-03-22T18:28:15.101+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:28:22.260+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:29:15.090+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.5Mi, Sys=16.6Mi, NumGC=18"}
+{"@timestamp":"2022-03-22T18:29:15.104+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:29:22.263+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:30:15.092+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.5Mi, Sys=16.6Mi, NumGC=18"}
+{"@timestamp":"2022-03-22T18:30:15.106+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:30:22.265+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:31:15.094+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.6Mi, Sys=16.6Mi, NumGC=19"}
+{"@timestamp":"2022-03-22T18:31:15.107+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:31:22.267+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:32:15.095+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.6Mi, Sys=16.6Mi, NumGC=19"}
+{"@timestamp":"2022-03-22T18:32:15.109+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:32:22.269+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:33:15.098+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.7Mi, Sys=16.6Mi, NumGC=20"}
+{"@timestamp":"2022-03-22T18:33:15.111+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:33:22.270+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:34:15.100+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.8Mi, Sys=16.6Mi, NumGC=20"}
+{"@timestamp":"2022-03-22T18:34:15.113+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:34:22.273+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:35:15.102+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.8Mi, Sys=16.6Mi, NumGC=21"}
+{"@timestamp":"2022-03-22T18:35:15.116+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:35:22.275+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:36:15.104+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=8.9Mi, Sys=16.6Mi, NumGC=21"}
+{"@timestamp":"2022-03-22T18:36:15.117+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:36:22.276+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:37:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.0Mi, Sys=16.6Mi, NumGC=22"}
+{"@timestamp":"2022-03-22T18:37:15.090+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:37:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:38:15.076+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.0Mi, Sys=16.6Mi, NumGC=22"}
+{"@timestamp":"2022-03-22T18:38:15.090+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:38:22.249+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:39:15.078+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.1Mi, Sys=16.6Mi, NumGC=23"}
+{"@timestamp":"2022-03-22T18:39:15.091+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:39:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:40:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.1Mi, Sys=16.6Mi, NumGC=23"}
+{"@timestamp":"2022-03-22T18:40:15.092+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:40:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:41:15.078+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.2Mi, Sys=16.6Mi, NumGC=24"}
+{"@timestamp":"2022-03-22T18:41:15.092+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:41:22.251+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:42:15.079+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.2Mi, Sys=16.6Mi, NumGC=24"}
+{"@timestamp":"2022-03-22T18:42:15.093+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:42:22.252+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:43:15.080+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.3Mi, Sys=16.6Mi, NumGC=25"}
+{"@timestamp":"2022-03-22T18:43:15.094+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:43:22.253+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:44:15.082+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.4Mi, Sys=16.6Mi, NumGC=25"}
+{"@timestamp":"2022-03-22T18:44:15.095+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:44:22.255+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:45:15.083+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.4Mi, Sys=16.6Mi, NumGC=26"}
+{"@timestamp":"2022-03-22T18:45:15.096+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:45:22.256+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:46:15.083+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=9.5Mi, Sys=16.6Mi, NumGC=26"}
+{"@timestamp":"2022-03-22T18:46:15.097+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:46:22.256+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:47:15.084+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.6Mi, Sys=16.6Mi, NumGC=27"}
+{"@timestamp":"2022-03-22T18:47:15.098+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:47:22.257+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:48:15.085+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.6Mi, Sys=16.6Mi, NumGC=27"}
+{"@timestamp":"2022-03-22T18:48:15.099+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:48:22.259+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:49:15.085+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.7Mi, Sys=16.6Mi, NumGC=28"}
+{"@timestamp":"2022-03-22T18:49:15.099+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:49:22.259+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:50:15.087+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.7Mi, Sys=16.6Mi, NumGC=28"}
+{"@timestamp":"2022-03-22T18:50:15.100+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:50:22.259+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:51:15.088+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.8Mi, Sys=16.6Mi, NumGC=29"}
+{"@timestamp":"2022-03-22T18:51:15.101+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:51:22.261+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:52:15.068+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.9Mi, Sys=16.6Mi, NumGC=29"}
+{"@timestamp":"2022-03-22T18:52:15.081+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:52:22.238+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:53:15.063+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=9.9Mi, Sys=16.6Mi, NumGC=30"}
+{"@timestamp":"2022-03-22T18:53:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:53:22.237+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:54:15.063+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.0Mi, Sys=16.6Mi, NumGC=30"}
+{"@timestamp":"2022-03-22T18:54:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:54:22.236+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:55:15.063+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.0Mi, Sys=16.6Mi, NumGC=31"}
+{"@timestamp":"2022-03-22T18:55:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:55:22.237+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:56:15.063+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.1Mi, Sys=16.6Mi, NumGC=31"}
+{"@timestamp":"2022-03-22T18:56:15.077+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:56:22.238+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:57:15.064+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.2Mi, Sys=16.6Mi, NumGC=32"}
+{"@timestamp":"2022-03-22T18:57:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:57:22.238+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:58:15.064+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.2Mi, Sys=16.6Mi, NumGC=32"}
+{"@timestamp":"2022-03-22T18:58:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:58:22.237+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T18:59:15.064+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.3Mi, Sys=16.6Mi, NumGC=33"}
+{"@timestamp":"2022-03-22T18:59:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T18:59:22.237+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:00:15.065+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.3Mi, Sys=16.6Mi, NumGC=33"}
+{"@timestamp":"2022-03-22T19:00:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:00:22.238+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:01:15.065+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.4Mi, Sys=16.6Mi, NumGC=34"}
+{"@timestamp":"2022-03-22T19:01:15.078+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:01:22.237+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:02:15.065+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.5Mi, Sys=16.6Mi, NumGC=34"}
+{"@timestamp":"2022-03-22T19:02:15.079+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:02:22.238+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:03:15.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.5Mi, Sys=16.6Mi, NumGC=35"}
+{"@timestamp":"2022-03-22T19:03:15.079+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:03:22.239+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:04:15.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.6Mi, Sys=16.6Mi, NumGC=35"}
+{"@timestamp":"2022-03-22T19:04:15.079+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:04:22.238+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:05:15.069+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.6Mi, Sys=16.6Mi, NumGC=36"}
+{"@timestamp":"2022-03-22T19:05:15.079+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:05:22.239+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:06:15.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.7Mi, Sys=16.6Mi, NumGC=36"}
+{"@timestamp":"2022-03-22T19:06:15.079+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:06:22.239+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:07:15.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.8Mi, Sys=16.6Mi, NumGC=37"}
+{"@timestamp":"2022-03-22T19:07:15.080+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:07:22.239+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:08:15.067+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.8Mi, Sys=16.6Mi, NumGC=37"}
+{"@timestamp":"2022-03-22T19:08:15.081+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:08:22.241+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:09:15.068+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.9Mi, Sys=16.6Mi, NumGC=38"}
+{"@timestamp":"2022-03-22T19:09:15.081+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:09:22.241+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:10:15.068+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=10.9Mi, Sys=16.6Mi, NumGC=38"}
+{"@timestamp":"2022-03-22T19:10:15.081+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:10:22.241+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:11:15.069+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.0Mi, Sys=16.6Mi, NumGC=39"}
+{"@timestamp":"2022-03-22T19:11:15.082+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:11:22.242+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:12:15.069+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.1Mi, Sys=16.6Mi, NumGC=39"}
+{"@timestamp":"2022-03-22T19:12:15.083+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:12:22.242+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:13:15.069+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.1Mi, Sys=16.6Mi, NumGC=40"}
+{"@timestamp":"2022-03-22T19:13:15.084+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:13:22.243+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:14:15.069+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.2Mi, Sys=16.6Mi, NumGC=40"}
+{"@timestamp":"2022-03-22T19:14:15.083+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:14:22.243+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:15:15.071+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.2Mi, Sys=16.6Mi, NumGC=41"}
+{"@timestamp":"2022-03-22T19:15:15.084+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:15:22.242+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:16:15.071+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.3Mi, Sys=16.6Mi, NumGC=41"}
+{"@timestamp":"2022-03-22T19:16:15.084+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:16:22.244+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:17:15.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.4Mi, Sys=16.6Mi, NumGC=42"}
+{"@timestamp":"2022-03-22T19:17:15.085+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:17:22.245+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:18:15.072+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.4Mi, Sys=16.6Mi, NumGC=42"}
+{"@timestamp":"2022-03-22T19:18:15.086+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:18:22.244+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:19:15.072+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.5Mi, Sys=16.6Mi, NumGC=43"}
+{"@timestamp":"2022-03-22T19:19:15.086+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:19:22.245+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:20:15.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.5Mi, Sys=16.6Mi, NumGC=43"}
+{"@timestamp":"2022-03-22T19:20:15.086+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:20:22.244+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:21:15.072+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.6Mi, Sys=16.6Mi, NumGC=44"}
+{"@timestamp":"2022-03-22T19:21:15.086+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:21:22.245+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:22:15.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.7Mi, Sys=16.6Mi, NumGC=44"}
+{"@timestamp":"2022-03-22T19:22:15.087+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:22:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:23:15.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.7Mi, Sys=16.6Mi, NumGC=45"}
+{"@timestamp":"2022-03-22T19:23:15.087+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:23:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:24:15.074+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.8Mi, Sys=16.6Mi, NumGC=45"}
+{"@timestamp":"2022-03-22T19:24:15.088+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:24:22.247+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:25:15.074+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.8Mi, Sys=16.6Mi, NumGC=46"}
+{"@timestamp":"2022-03-22T19:25:15.087+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:25:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:26:15.076+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=11.9Mi, Sys=16.6Mi, NumGC=46"}
+{"@timestamp":"2022-03-22T19:26:15.089+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:26:22.249+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:27:15.075+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.0Mi, Sys=16.6Mi, NumGC=47"}
+{"@timestamp":"2022-03-22T19:27:15.089+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:27:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:28:15.075+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.0Mi, Sys=16.6Mi, NumGC=47"}
+{"@timestamp":"2022-03-22T19:28:15.089+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:28:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:29:15.075+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.1Mi, Sys=16.6Mi, NumGC=48"}
+{"@timestamp":"2022-03-22T19:29:15.089+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:29:22.249+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:30:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.1Mi, Sys=16.8Mi, NumGC=48"}
+{"@timestamp":"2022-03-22T19:30:15.089+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:30:22.248+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:31:15.078+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.2Mi, Sys=16.8Mi, NumGC=49"}
+{"@timestamp":"2022-03-22T19:31:15.090+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:31:22.249+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:32:15.076+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.3Mi, Sys=16.8Mi, NumGC=49"}
+{"@timestamp":"2022-03-22T19:32:15.090+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:32:22.249+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:33:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.3Mi, Sys=16.8Mi, NumGC=50"}
+{"@timestamp":"2022-03-22T19:33:15.091+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:33:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:34:15.076+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.4Mi, Sys=16.8Mi, NumGC=50"}
+{"@timestamp":"2022-03-22T19:34:15.091+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:34:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:35:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.5Mi, Sys=16.8Mi, NumGC=51"}
+{"@timestamp":"2022-03-22T19:35:15.091+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:35:22.251+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:36:15.078+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.5Mi, Sys=16.8Mi, NumGC=51"}
+{"@timestamp":"2022-03-22T19:36:15.091+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:36:22.251+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:37:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.6Mi, Sys=16.8Mi, NumGC=52"}
+{"@timestamp":"2022-03-22T19:37:15.091+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:37:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:38:15.077+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.6Mi, Sys=16.8Mi, NumGC=52"}
+{"@timestamp":"2022-03-22T19:38:15.102+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:38:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:39:15.078+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.7Mi, Sys=16.8Mi, NumGC=53"}
+{"@timestamp":"2022-03-22T19:39:15.092+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:39:22.250+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:40:15.079+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.8Mi, Sys=16.8Mi, NumGC=53"}
+{"@timestamp":"2022-03-22T19:40:15.093+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:40:22.253+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:41:15.079+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=12.8Mi, Sys=16.8Mi, NumGC=54"}
+{"@timestamp":"2022-03-22T19:41:15.093+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T19:41:22.252+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T19:42:15.080+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=12.9Mi, Sys=16.8Mi, NumGC=54"}
+{"@timestamp":"2022-03-22T19:42:15.094+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:38:08.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=6.5Mi, Sys=20.3Mi, NumGC=3"}
+{"@timestamp":"2022-03-22T20:38:08.101+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 2, pass: 2, drop: 0"}
+{"@timestamp":"2022-03-22T20:38:14.287+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 67.5ms, med: 105.3ms, 90th: 105.3ms, 99th: 105.3ms, 99.9th: 105.3ms"}
+{"@timestamp":"2022-03-22T20:39:08.066+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.5Mi, TotalAlloc=6.6Mi, Sys=20.3Mi, NumGC=3"}
+{"@timestamp":"2022-03-22T20:39:08.102+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:39:14.288+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:40:08.067+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.7Mi, Sys=20.3Mi, NumGC=4"}
+{"@timestamp":"2022-03-22T20:40:08.102+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:40:14.288+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:41:08.068+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.7Mi, Sys=20.3Mi, NumGC=4"}
+{"@timestamp":"2022-03-22T20:41:08.103+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:41:14.288+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:42:08.069+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=6.8Mi, Sys=20.3Mi, NumGC=5"}
+{"@timestamp":"2022-03-22T20:42:08.104+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:42:14.289+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:43:08.070+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.9Mi, Sys=20.3Mi, NumGC=5"}
+{"@timestamp":"2022-03-22T20:43:08.105+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:43:14.290+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:44:08.070+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=6.9Mi, Sys=20.3Mi, NumGC=6"}
+{"@timestamp":"2022-03-22T20:44:08.105+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:44:14.290+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:45:08.070+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.0Mi, Sys=20.3Mi, NumGC=6"}
+{"@timestamp":"2022-03-22T20:45:08.105+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:45:14.292+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:46:08.071+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=7.1Mi, Sys=20.3Mi, NumGC=7"}
+{"@timestamp":"2022-03-22T20:46:08.107+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:46:14.292+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:47:08.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.1Mi, Sys=20.3Mi, NumGC=7"}
+{"@timestamp":"2022-03-22T20:47:08.107+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:47:14.293+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:48:08.073+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=7.2Mi, Sys=20.3Mi, NumGC=8"}
+{"@timestamp":"2022-03-22T20:48:08.109+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:48:14.294+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:49:08.075+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.2Mi, Sys=20.3Mi, NumGC=8"}
+{"@timestamp":"2022-03-22T20:49:08.109+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:49:14.295+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:50:08.075+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=7.3Mi, Sys=20.3Mi, NumGC=9"}
+{"@timestamp":"2022-03-22T20:50:08.110+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:50:14.295+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:51:08.126+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.3Mi, Sys=20.3Mi, NumGC=9"}
+{"@timestamp":"2022-03-22T20:51:08.162+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:51:14.347+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:52:08.128+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.2Mi, TotalAlloc=7.4Mi, Sys=20.3Mi, NumGC=10"}
+{"@timestamp":"2022-03-22T20:52:08.163+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:52:14.349+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:53:08.129+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=7.5Mi, Sys=20.3Mi, NumGC=10"}
+{"@timestamp":"2022-03-22T20:53:08.165+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:53:14.350+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:54:08.130+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.6Mi, Sys=20.3Mi, NumGC=11"}
+{"@timestamp":"2022-03-22T20:54:08.166+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:54:14.351+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:55:08.132+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.4Mi, TotalAlloc=7.7Mi, Sys=20.3Mi, NumGC=11"}
+{"@timestamp":"2022-03-22T20:55:08.167+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:55:14.352+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:56:08.134+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.7Mi, Sys=20.6Mi, NumGC=12"}
+{"@timestamp":"2022-03-22T20:56:08.169+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:56:14.355+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:57:08.135+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.8Mi, Sys=20.6Mi, NumGC=12"}
+{"@timestamp":"2022-03-22T20:57:08.170+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:57:14.356+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:58:08.137+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.9Mi, Sys=20.6Mi, NumGC=13"}
+{"@timestamp":"2022-03-22T20:58:08.172+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:58:14.357+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}
+{"@timestamp":"2022-03-22T20:59:08.138+08","level":"stat","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=7.9Mi, Sys=20.6Mi, NumGC=13"}
+{"@timestamp":"2022-03-22T20:59:08.174+08","level":"stat","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0"}
+{"@timestamp":"2022-03-22T20:59:14.359+08","level":"stat","content":"(db.rpc) - qps: 0.0/s, drops: 0, avg time: 0.0ms, med: 0.0ms, 90th: 0.0ms, 99th: 0.0ms, 99.9th: 0.0ms"}

+ 547 - 0
db/rpc/pb/db.pb.go

@@ -0,0 +1,547 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.27.1
+// 	protoc        v3.17.3
+// source: db.proto
+
+package pb
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+//
+//客服聊天msg
+type DbMsgReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Cmd *DbCommandMsg `protobuf:"bytes,1,opt,name=cmd,proto3" json:"cmd,omitempty"`
+}
+
+func (x *DbMsgReq) Reset() {
+	*x = DbMsgReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DbMsgReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DbMsgReq) ProtoMessage() {}
+
+func (x *DbMsgReq) ProtoReflect() protoreflect.Message {
+	mi := &file_db_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DbMsgReq.ProtoReflect.Descriptor instead.
+func (*DbMsgReq) Descriptor() ([]byte, []int) {
+	return file_db_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *DbMsgReq) GetCmd() *DbCommandMsg {
+	if x != nil {
+		return x.Cmd
+	}
+	return nil
+}
+
+type DbMsgRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Cmd *DbCommandMsg `protobuf:"bytes,1,opt,name=cmd,proto3" json:"cmd,omitempty"`
+}
+
+func (x *DbMsgRes) Reset() {
+	*x = DbMsgRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DbMsgRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DbMsgRes) ProtoMessage() {}
+
+func (x *DbMsgRes) ProtoReflect() protoreflect.Message {
+	mi := &file_db_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DbMsgRes.ProtoReflect.Descriptor instead.
+func (*DbMsgRes) Descriptor() ([]byte, []int) {
+	return file_db_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *DbMsgRes) GetCmd() *DbCommandMsg {
+	if x != nil {
+		return x.Cmd
+	}
+	return nil
+}
+
+//
+//敏感词信息msg
+type SensReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+}
+
+func (x *SensReq) Reset() {
+	*x = SensReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SensReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SensReq) ProtoMessage() {}
+
+func (x *SensReq) ProtoReflect() protoreflect.Message {
+	mi := &file_db_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SensReq.ProtoReflect.Descriptor instead.
+func (*SensReq) Descriptor() ([]byte, []int) {
+	return file_db_proto_rawDescGZIP(), []int{2}
+}
+
+type SensRes struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SensWords  []string `protobuf:"bytes,1,rep,name=sens_words,json=sensWords,proto3" json:"sens_words,omitempty"`
+	FilterWord []string `protobuf:"bytes,2,rep,name=filter_word,json=filterWord,proto3" json:"filter_word,omitempty"`
+}
+
+func (x *SensRes) Reset() {
+	*x = SensRes{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SensRes) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SensRes) ProtoMessage() {}
+
+func (x *SensRes) ProtoReflect() protoreflect.Message {
+	mi := &file_db_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SensRes.ProtoReflect.Descriptor instead.
+func (*SensRes) Descriptor() ([]byte, []int) {
+	return file_db_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *SensRes) GetSensWords() []string {
+	if x != nil {
+		return x.SensWords
+	}
+	return nil
+}
+
+func (x *SensRes) GetFilterWord() []string {
+	if x != nil {
+		return x.FilterWord
+	}
+	return nil
+}
+
+var File_db_proto protoreflect.FileDescriptor
+
+var file_db_proto_rawDesc = []byte{
+	0x0a, 0x08, 0x64, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x0c,
+	0x64, 0x62, 0x5f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2e, 0x0a, 0x08,
+	0x44, 0x62, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x22, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x43, 0x6f, 0x6d,
+	0x6d, 0x61, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x22, 0x2e, 0x0a, 0x08,
+	0x44, 0x62, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x43, 0x6f, 0x6d,
+	0x6d, 0x61, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x22, 0x09, 0x0a, 0x07,
+	0x53, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x22, 0x49, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x73, 0x52,
+	0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6e, 0x73, 0x5f, 0x77, 0x6f, 0x72, 0x64, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x57, 0x6f, 0x72, 0x64,
+	0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x77, 0x6f, 0x72, 0x64,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x57, 0x6f,
+	0x72, 0x64, 0x32, 0x8a, 0x01, 0x0a, 0x02, 0x44, 0x62, 0x12, 0x2b, 0x0a, 0x07, 0x44, 0x62, 0x4c,
+	0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x4d, 0x73, 0x67, 0x52,
+	0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73,
+	0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x26, 0x0a, 0x06, 0x44, 0x62, 0x43, 0x61, 0x6c, 0x6c,
+	0x12, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x0c,
+	0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x22, 0x00, 0x12, 0x2f,
+	0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x57, 0x6f,
+	0x72, 0x64, 0x73, 0x12, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71,
+	0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x22, 0x00, 0x42,
+	0x05, 0x5a, 0x03, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_db_proto_rawDescOnce sync.Once
+	file_db_proto_rawDescData = file_db_proto_rawDesc
+)
+
+func file_db_proto_rawDescGZIP() []byte {
+	file_db_proto_rawDescOnce.Do(func() {
+		file_db_proto_rawDescData = protoimpl.X.CompressGZIP(file_db_proto_rawDescData)
+	})
+	return file_db_proto_rawDescData
+}
+
+var file_db_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_db_proto_goTypes = []interface{}{
+	(*DbMsgReq)(nil),     // 0: pb.DbMsgReq
+	(*DbMsgRes)(nil),     // 1: pb.DbMsgRes
+	(*SensReq)(nil),      // 2: pb.SensReq
+	(*SensRes)(nil),      // 3: pb.SensRes
+	(*DbCommandMsg)(nil), // 4: pb.DbCommandMsg
+}
+var file_db_proto_depIdxs = []int32{
+	4, // 0: pb.DbMsgReq.cmd:type_name -> pb.DbCommandMsg
+	4, // 1: pb.DbMsgRes.cmd:type_name -> pb.DbCommandMsg
+	0, // 2: pb.Db.DbLogin:input_type -> pb.DbMsgReq
+	0, // 3: pb.Db.DbCall:input_type -> pb.DbMsgReq
+	2, // 4: pb.Db.GetSensitiveWords:input_type -> pb.SensReq
+	1, // 5: pb.Db.DbLogin:output_type -> pb.DbMsgRes
+	1, // 6: pb.Db.DbCall:output_type -> pb.DbMsgRes
+	3, // 7: pb.Db.GetSensitiveWords:output_type -> pb.SensRes
+	5, // [5:8] is the sub-list for method output_type
+	2, // [2:5] is the sub-list for method input_type
+	2, // [2:2] is the sub-list for extension type_name
+	2, // [2:2] is the sub-list for extension extendee
+	0, // [0:2] is the sub-list for field type_name
+}
+
+func init() { file_db_proto_init() }
+func file_db_proto_init() {
+	if File_db_proto != nil {
+		return
+	}
+	file_db_msg_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_db_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DbMsgReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DbMsgRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SensReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SensRes); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_db_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_db_proto_goTypes,
+		DependencyIndexes: file_db_proto_depIdxs,
+		MessageInfos:      file_db_proto_msgTypes,
+	}.Build()
+	File_db_proto = out.File
+	file_db_proto_rawDesc = nil
+	file_db_proto_goTypes = nil
+	file_db_proto_depIdxs = nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// DbClient is the client API for Db service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type DbClient interface {
+	// 客服聊天
+	DbLogin(ctx context.Context, opts ...grpc.CallOption) (Db_DbLoginClient, error)
+	DbCall(ctx context.Context, in *DbMsgReq, opts ...grpc.CallOption) (*DbMsgRes, error)
+	// 游戏聊天
+	// 敏感词库信息获取
+	GetSensitiveWords(ctx context.Context, in *SensReq, opts ...grpc.CallOption) (*SensRes, error)
+}
+
+type dbClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewDbClient(cc grpc.ClientConnInterface) DbClient {
+	return &dbClient{cc}
+}
+
+func (c *dbClient) DbLogin(ctx context.Context, opts ...grpc.CallOption) (Db_DbLoginClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_Db_serviceDesc.Streams[0], "/pb.Db/DbLogin", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &dbDbLoginClient{stream}
+	return x, nil
+}
+
+type Db_DbLoginClient interface {
+	Send(*DbMsgReq) error
+	Recv() (*DbMsgRes, error)
+	grpc.ClientStream
+}
+
+type dbDbLoginClient struct {
+	grpc.ClientStream
+}
+
+func (x *dbDbLoginClient) Send(m *DbMsgReq) error {
+	return x.ClientStream.SendMsg(m)
+}
+
+func (x *dbDbLoginClient) Recv() (*DbMsgRes, error) {
+	m := new(DbMsgRes)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *dbClient) DbCall(ctx context.Context, in *DbMsgReq, opts ...grpc.CallOption) (*DbMsgRes, error) {
+	out := new(DbMsgRes)
+	err := c.cc.Invoke(ctx, "/pb.Db/DbCall", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *dbClient) GetSensitiveWords(ctx context.Context, in *SensReq, opts ...grpc.CallOption) (*SensRes, error) {
+	out := new(SensRes)
+	err := c.cc.Invoke(ctx, "/pb.Db/GetSensitiveWords", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// DbServer is the server API for Db service.
+type DbServer interface {
+	// 客服聊天
+	DbLogin(Db_DbLoginServer) error
+	DbCall(context.Context, *DbMsgReq) (*DbMsgRes, error)
+	// 游戏聊天
+	// 敏感词库信息获取
+	GetSensitiveWords(context.Context, *SensReq) (*SensRes, error)
+}
+
+// UnimplementedDbServer can be embedded to have forward compatible implementations.
+type UnimplementedDbServer struct {
+}
+
+func (*UnimplementedDbServer) DbLogin(Db_DbLoginServer) error {
+	return status.Errorf(codes.Unimplemented, "method DbLogin not implemented")
+}
+func (*UnimplementedDbServer) DbCall(context.Context, *DbMsgReq) (*DbMsgRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DbCall not implemented")
+}
+func (*UnimplementedDbServer) GetSensitiveWords(context.Context, *SensReq) (*SensRes, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSensitiveWords not implemented")
+}
+
+func RegisterDbServer(s *grpc.Server, srv DbServer) {
+	s.RegisterService(&_Db_serviceDesc, srv)
+}
+
+func _Db_DbLogin_Handler(srv interface{}, stream grpc.ServerStream) error {
+	return srv.(DbServer).DbLogin(&dbDbLoginServer{stream})
+}
+
+type Db_DbLoginServer interface {
+	Send(*DbMsgRes) error
+	Recv() (*DbMsgReq, error)
+	grpc.ServerStream
+}
+
+type dbDbLoginServer struct {
+	grpc.ServerStream
+}
+
+func (x *dbDbLoginServer) Send(m *DbMsgRes) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func (x *dbDbLoginServer) Recv() (*DbMsgReq, error) {
+	m := new(DbMsgReq)
+	if err := x.ServerStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func _Db_DbCall_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DbMsgReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DbServer).DbCall(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.Db/DbCall",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DbServer).DbCall(ctx, req.(*DbMsgReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Db_GetSensitiveWords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SensReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(DbServer).GetSensitiveWords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/pb.Db/GetSensitiveWords",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(DbServer).GetSensitiveWords(ctx, req.(*SensReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Db_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "pb.Db",
+	HandlerType: (*DbServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "DbCall",
+			Handler:    _Db_DbCall_Handler,
+		},
+		{
+			MethodName: "GetSensitiveWords",
+			Handler:    _Db_GetSensitiveWords_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "DbLogin",
+			Handler:       _Db_DbLogin_Handler,
+			ServerStreams: true,
+			ClientStreams: true,
+		},
+	},
+	Metadata: "db.proto",
+}

+ 252 - 0
db/rpc/pb/db_cmds.pb.go

@@ -0,0 +1,252 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.17.3
+// source: db_cmds.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type EDbCommand int32
+
+const (
+	EDbCommand_E_DB_COMMAND_UNSPECIFIED      EDbCommand = 0
+	EDbCommand_E_DB_COMMAND_PUSH_CHAT_LOG    EDbCommand = 1001 // 推送聊天日志
+	EDbCommand_E_DB_COMMAND_PUSH_CHAT_RECORD EDbCommand = 1002 // 推送客服对接记录
+	EDbCommand_E_DB_COMMAND_GET_CONFIG       EDbCommand = 2001 // 获取配置
+	EDbCommand_E_DB_COMMAND_GET_CHAT_RECORD  EDbCommand = 2002 // 获取客服对接记录
+	EDbCommand_E_DB_COMMAND_GET_CHAT_LOG     EDbCommand = 2003 // 获取日志记录
+)
+
+// Enum value maps for EDbCommand.
+var (
+	EDbCommand_name = map[int32]string{
+		0:    "E_DB_COMMAND_UNSPECIFIED",
+		1001: "E_DB_COMMAND_PUSH_CHAT_LOG",
+		1002: "E_DB_COMMAND_PUSH_CHAT_RECORD",
+		2001: "E_DB_COMMAND_GET_CONFIG",
+		2002: "E_DB_COMMAND_GET_CHAT_RECORD",
+		2003: "E_DB_COMMAND_GET_CHAT_LOG",
+	}
+	EDbCommand_value = map[string]int32{
+		"E_DB_COMMAND_UNSPECIFIED":      0,
+		"E_DB_COMMAND_PUSH_CHAT_LOG":    1001,
+		"E_DB_COMMAND_PUSH_CHAT_RECORD": 1002,
+		"E_DB_COMMAND_GET_CONFIG":       2001,
+		"E_DB_COMMAND_GET_CHAT_RECORD":  2002,
+		"E_DB_COMMAND_GET_CHAT_LOG":     2003,
+	}
+)
+
+func (x EDbCommand) Enum() *EDbCommand {
+	p := new(EDbCommand)
+	*p = x
+	return p
+}
+
+func (x EDbCommand) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (EDbCommand) Descriptor() protoreflect.EnumDescriptor {
+	return file_db_cmds_proto_enumTypes[0].Descriptor()
+}
+
+func (EDbCommand) Type() protoreflect.EnumType {
+	return &file_db_cmds_proto_enumTypes[0]
+}
+
+func (x EDbCommand) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use EDbCommand.Descriptor instead.
+func (EDbCommand) EnumDescriptor() ([]byte, []int) {
+	return file_db_cmds_proto_rawDescGZIP(), []int{0}
+}
+
+type EDbChatType int32
+
+const (
+	EDbChatType_E_DB_CHAT_TYPE_PLAYER  EDbChatType = 0 // 玩家发言
+	EDbChatType_E_DB_CHAT_TYPE_SERVICE EDbChatType = 1 // 客服发言
+)
+
+// Enum value maps for EDbChatType.
+var (
+	EDbChatType_name = map[int32]string{
+		0: "E_DB_CHAT_TYPE_PLAYER",
+		1: "E_DB_CHAT_TYPE_SERVICE",
+	}
+	EDbChatType_value = map[string]int32{
+		"E_DB_CHAT_TYPE_PLAYER":  0,
+		"E_DB_CHAT_TYPE_SERVICE": 1,
+	}
+)
+
+func (x EDbChatType) Enum() *EDbChatType {
+	p := new(EDbChatType)
+	*p = x
+	return p
+}
+
+func (x EDbChatType) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (EDbChatType) Descriptor() protoreflect.EnumDescriptor {
+	return file_db_cmds_proto_enumTypes[1].Descriptor()
+}
+
+func (EDbChatType) Type() protoreflect.EnumType {
+	return &file_db_cmds_proto_enumTypes[1]
+}
+
+func (x EDbChatType) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use EDbChatType.Descriptor instead.
+func (EDbChatType) EnumDescriptor() ([]byte, []int) {
+	return file_db_cmds_proto_rawDescGZIP(), []int{1}
+}
+
+type EDbRecordState int32
+
+const (
+	EDbRecordState_E_DB_RECORD_STATE_REPLY      EDbRecordState = 0
+	EDbRecordState_E_DB_RECORD_STATE_DISCONNECT EDbRecordState = 1
+)
+
+// Enum value maps for EDbRecordState.
+var (
+	EDbRecordState_name = map[int32]string{
+		0: "E_DB_RECORD_STATE_REPLY",
+		1: "E_DB_RECORD_STATE_DISCONNECT",
+	}
+	EDbRecordState_value = map[string]int32{
+		"E_DB_RECORD_STATE_REPLY":      0,
+		"E_DB_RECORD_STATE_DISCONNECT": 1,
+	}
+)
+
+func (x EDbRecordState) Enum() *EDbRecordState {
+	p := new(EDbRecordState)
+	*p = x
+	return p
+}
+
+func (x EDbRecordState) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (EDbRecordState) Descriptor() protoreflect.EnumDescriptor {
+	return file_db_cmds_proto_enumTypes[2].Descriptor()
+}
+
+func (EDbRecordState) Type() protoreflect.EnumType {
+	return &file_db_cmds_proto_enumTypes[2]
+}
+
+func (x EDbRecordState) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use EDbRecordState.Descriptor instead.
+func (EDbRecordState) EnumDescriptor() ([]byte, []int) {
+	return file_db_cmds_proto_rawDescGZIP(), []int{2}
+}
+
+var File_db_cmds_proto protoreflect.FileDescriptor
+
+var file_db_cmds_proto_rawDesc = []byte{
+	0x0a, 0x0d, 0x64, 0x62, 0x5f, 0x63, 0x6d, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x02, 0x70, 0x62, 0x2a, 0xd0, 0x01, 0x0a, 0x0a, 0x45, 0x44, 0x62, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+	0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41,
+	0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x1f, 0x0a, 0x1a, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44,
+	0x5f, 0x50, 0x55, 0x53, 0x48, 0x5f, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x10, 0xe9,
+	0x07, 0x12, 0x22, 0x0a, 0x1d, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e,
+	0x44, 0x5f, 0x50, 0x55, 0x53, 0x48, 0x5f, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x4f,
+	0x52, 0x44, 0x10, 0xea, 0x07, 0x12, 0x1c, 0x0a, 0x17, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x4f,
+	0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47,
+	0x10, 0xd1, 0x0f, 0x12, 0x21, 0x0a, 0x1c, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x4f, 0x4d, 0x4d,
+	0x41, 0x4e, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x52, 0x45, 0x43,
+	0x4f, 0x52, 0x44, 0x10, 0xd2, 0x0f, 0x12, 0x1e, 0x0a, 0x19, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43,
+	0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x54, 0x5f,
+	0x4c, 0x4f, 0x47, 0x10, 0xd3, 0x0f, 0x2a, 0x44, 0x0a, 0x0b, 0x45, 0x44, 0x62, 0x43, 0x68, 0x61,
+	0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x48,
+	0x41, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x52, 0x10, 0x00,
+	0x12, 0x1a, 0x0a, 0x16, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x43, 0x48, 0x41, 0x54, 0x5f, 0x54, 0x59,
+	0x50, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x2a, 0x4f, 0x0a, 0x0e,
+	0x45, 0x44, 0x62, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b,
+	0x0a, 0x17, 0x45, 0x5f, 0x44, 0x42, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x52, 0x44, 0x5f, 0x53, 0x54,
+	0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x45,
+	0x5f, 0x44, 0x42, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x52, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45,
+	0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x01, 0x42, 0x05, 0x5a,
+	0x03, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_db_cmds_proto_rawDescOnce sync.Once
+	file_db_cmds_proto_rawDescData = file_db_cmds_proto_rawDesc
+)
+
+func file_db_cmds_proto_rawDescGZIP() []byte {
+	file_db_cmds_proto_rawDescOnce.Do(func() {
+		file_db_cmds_proto_rawDescData = protoimpl.X.CompressGZIP(file_db_cmds_proto_rawDescData)
+	})
+	return file_db_cmds_proto_rawDescData
+}
+
+var file_db_cmds_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
+var file_db_cmds_proto_goTypes = []interface{}{
+	(EDbCommand)(0),     // 0: pb.EDbCommand
+	(EDbChatType)(0),    // 1: pb.EDbChatType
+	(EDbRecordState)(0), // 2: pb.EDbRecordState
+}
+var file_db_cmds_proto_depIdxs = []int32{
+	0, // [0:0] is the sub-list for method output_type
+	0, // [0:0] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_db_cmds_proto_init() }
+func file_db_cmds_proto_init() {
+	if File_db_cmds_proto != nil {
+		return
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_db_cmds_proto_rawDesc,
+			NumEnums:      3,
+			NumMessages:   0,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_db_cmds_proto_goTypes,
+		DependencyIndexes: file_db_cmds_proto_depIdxs,
+		EnumInfos:         file_db_cmds_proto_enumTypes,
+	}.Build()
+	File_db_cmds_proto = out.File
+	file_db_cmds_proto_rawDesc = nil
+	file_db_cmds_proto_goTypes = nil
+	file_db_cmds_proto_depIdxs = nil
+}

+ 818 - 0
db/rpc/pb/db_msg.pb.go

@@ -0,0 +1,818 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.26.0
+// 	protoc        v3.17.3
+// source: db_msg.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// 配置信息
+type DbConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ConfName  string `protobuf:"bytes,1,opt,name=conf_name,json=confName,proto3" json:"conf_name,omitempty"`
+	ConfKey   string `protobuf:"bytes,2,opt,name=conf_key,json=confKey,proto3" json:"conf_key,omitempty"`
+	ConfValue string `protobuf:"bytes,3,opt,name=conf_value,json=confValue,proto3" json:"conf_value,omitempty"`
+}
+
+func (x *DbConfig) Reset() {
+	*x = DbConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DbConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DbConfig) ProtoMessage() {}
+
+func (x *DbConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DbConfig.ProtoReflect.Descriptor instead.
+func (*DbConfig) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *DbConfig) GetConfName() string {
+	if x != nil {
+		return x.ConfName
+	}
+	return ""
+}
+
+func (x *DbConfig) GetConfKey() string {
+	if x != nil {
+		return x.ConfKey
+	}
+	return ""
+}
+
+func (x *DbConfig) GetConfValue() string {
+	if x != nil {
+		return x.ConfValue
+	}
+	return ""
+}
+
+type ArrayConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataList []*DbConfig `protobuf:"bytes,1,rep,name=data_list,json=dataList,proto3" json:"data_list,omitempty"`
+}
+
+func (x *ArrayConfig) Reset() {
+	*x = ArrayConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ArrayConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ArrayConfig) ProtoMessage() {}
+
+func (x *ArrayConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ArrayConfig.ProtoReflect.Descriptor instead.
+func (*ArrayConfig) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *ArrayConfig) GetDataList() []*DbConfig {
+	if x != nil {
+		return x.DataList
+	}
+	return nil
+}
+
+// 客服聊天记录
+type DbChatLog struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	FromId    string      `protobuf:"bytes,1,opt,name=from_id,json=fromId,proto3" json:"from_id,omitempty"`
+	ToId      string      `protobuf:"bytes,2,opt,name=to_id,json=toId,proto3" json:"to_id,omitempty"`
+	Content   string      `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"`
+	TimeStamp int64       `protobuf:"varint,4,opt,name=time_stamp,json=timeStamp,proto3" json:"time_stamp,omitempty"`
+	ChatType  EDbChatType `protobuf:"varint,5,opt,name=chat_type,json=chatType,proto3,enum=pb.EDbChatType" json:"chat_type,omitempty"`
+	SessionId string      `protobuf:"bytes,6,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
+	GameId    int32       `protobuf:"varint,7,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"`
+	IsVisitor bool        `protobuf:"varint,8,opt,name=is_visitor,json=isVisitor,proto3" json:"is_visitor,omitempty"`
+}
+
+func (x *DbChatLog) Reset() {
+	*x = DbChatLog{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DbChatLog) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DbChatLog) ProtoMessage() {}
+
+func (x *DbChatLog) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DbChatLog.ProtoReflect.Descriptor instead.
+func (*DbChatLog) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *DbChatLog) GetFromId() string {
+	if x != nil {
+		return x.FromId
+	}
+	return ""
+}
+
+func (x *DbChatLog) GetToId() string {
+	if x != nil {
+		return x.ToId
+	}
+	return ""
+}
+
+func (x *DbChatLog) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *DbChatLog) GetTimeStamp() int64 {
+	if x != nil {
+		return x.TimeStamp
+	}
+	return 0
+}
+
+func (x *DbChatLog) GetChatType() EDbChatType {
+	if x != nil {
+		return x.ChatType
+	}
+	return EDbChatType_E_DB_CHAT_TYPE_PLAYER
+}
+
+func (x *DbChatLog) GetSessionId() string {
+	if x != nil {
+		return x.SessionId
+	}
+	return ""
+}
+
+func (x *DbChatLog) GetGameId() int32 {
+	if x != nil {
+		return x.GameId
+	}
+	return 0
+}
+
+func (x *DbChatLog) GetIsVisitor() bool {
+	if x != nil {
+		return x.IsVisitor
+	}
+	return false
+}
+
+type ArrayDbChatLog struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataList []*DbChatLog `protobuf:"bytes,1,rep,name=data_list,json=dataList,proto3" json:"data_list,omitempty"`
+}
+
+func (x *ArrayDbChatLog) Reset() {
+	*x = ArrayDbChatLog{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ArrayDbChatLog) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ArrayDbChatLog) ProtoMessage() {}
+
+func (x *ArrayDbChatLog) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ArrayDbChatLog.ProtoReflect.Descriptor instead.
+func (*ArrayDbChatLog) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *ArrayDbChatLog) GetDataList() []*DbChatLog {
+	if x != nil {
+		return x.DataList
+	}
+	return nil
+}
+
+type DbChatRecord struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	SessionId string         `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
+	ServiceId string         `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
+	PlayerId  string         `protobuf:"bytes,2,opt,name=player_id,json=playerId,proto3" json:"player_id,omitempty"`
+	IsVisitor bool           `protobuf:"varint,4,opt,name=is_visitor,json=isVisitor,proto3" json:"is_visitor,omitempty"`
+	State     EDbRecordState `protobuf:"varint,5,opt,name=state,proto3,enum=pb.EDbRecordState" json:"state,omitempty"`
+	TimeStamp int64          `protobuf:"varint,6,opt,name=time_stamp,json=timeStamp,proto3" json:"time_stamp,omitempty"`
+	GameId    int32          `protobuf:"varint,7,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"`
+}
+
+func (x *DbChatRecord) Reset() {
+	*x = DbChatRecord{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DbChatRecord) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DbChatRecord) ProtoMessage() {}
+
+func (x *DbChatRecord) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DbChatRecord.ProtoReflect.Descriptor instead.
+func (*DbChatRecord) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *DbChatRecord) GetSessionId() string {
+	if x != nil {
+		return x.SessionId
+	}
+	return ""
+}
+
+func (x *DbChatRecord) GetServiceId() string {
+	if x != nil {
+		return x.ServiceId
+	}
+	return ""
+}
+
+func (x *DbChatRecord) GetPlayerId() string {
+	if x != nil {
+		return x.PlayerId
+	}
+	return ""
+}
+
+func (x *DbChatRecord) GetIsVisitor() bool {
+	if x != nil {
+		return x.IsVisitor
+	}
+	return false
+}
+
+func (x *DbChatRecord) GetState() EDbRecordState {
+	if x != nil {
+		return x.State
+	}
+	return EDbRecordState_E_DB_RECORD_STATE_REPLY
+}
+
+func (x *DbChatRecord) GetTimeStamp() int64 {
+	if x != nil {
+		return x.TimeStamp
+	}
+	return 0
+}
+
+func (x *DbChatRecord) GetGameId() int32 {
+	if x != nil {
+		return x.GameId
+	}
+	return 0
+}
+
+type ArrayChatRecord struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	DataList []*DbChatRecord `protobuf:"bytes,1,rep,name=data_list,json=dataList,proto3" json:"data_list,omitempty"`
+}
+
+func (x *ArrayChatRecord) Reset() {
+	*x = ArrayChatRecord{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ArrayChatRecord) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ArrayChatRecord) ProtoMessage() {}
+
+func (x *ArrayChatRecord) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ArrayChatRecord.ProtoReflect.Descriptor instead.
+func (*ArrayChatRecord) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *ArrayChatRecord) GetDataList() []*DbChatRecord {
+	if x != nil {
+		return x.DataList
+	}
+	return nil
+}
+
+//
+//命令消息
+type DbCommandMsg struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CmdType  EDbCommand `protobuf:"varint,1,opt,name=cmd_type,json=cmdType,proto3,enum=pb.EDbCommand" json:"cmd_type,omitempty"` // 命令类型
+	CmdValue int32      `protobuf:"varint,2,opt,name=cmd_value,json=cmdValue,proto3" json:"cmd_value,omitempty"`                 // 通用val
+	CmdStr   string     `protobuf:"bytes,3,opt,name=cmd_str,json=cmdStr,proto3" json:"cmd_str,omitempty"`                        // 通用str
+	// Types that are assignable to Data:
+	//	*DbCommandMsg_ArrayConfig
+	//	*DbCommandMsg_ChatLog
+	//	*DbCommandMsg_ChatRecord
+	//	*DbCommandMsg_ArrayChatRecord
+	//	*DbCommandMsg_ArrayChatLog
+	Data isDbCommandMsg_Data `protobuf_oneof:"data"`
+}
+
+func (x *DbCommandMsg) Reset() {
+	*x = DbCommandMsg{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_db_msg_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DbCommandMsg) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DbCommandMsg) ProtoMessage() {}
+
+func (x *DbCommandMsg) ProtoReflect() protoreflect.Message {
+	mi := &file_db_msg_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DbCommandMsg.ProtoReflect.Descriptor instead.
+func (*DbCommandMsg) Descriptor() ([]byte, []int) {
+	return file_db_msg_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *DbCommandMsg) GetCmdType() EDbCommand {
+	if x != nil {
+		return x.CmdType
+	}
+	return EDbCommand_E_DB_COMMAND_UNSPECIFIED
+}
+
+func (x *DbCommandMsg) GetCmdValue() int32 {
+	if x != nil {
+		return x.CmdValue
+	}
+	return 0
+}
+
+func (x *DbCommandMsg) GetCmdStr() string {
+	if x != nil {
+		return x.CmdStr
+	}
+	return ""
+}
+
+func (m *DbCommandMsg) GetData() isDbCommandMsg_Data {
+	if m != nil {
+		return m.Data
+	}
+	return nil
+}
+
+func (x *DbCommandMsg) GetArrayConfig() *ArrayConfig {
+	if x, ok := x.GetData().(*DbCommandMsg_ArrayConfig); ok {
+		return x.ArrayConfig
+	}
+	return nil
+}
+
+func (x *DbCommandMsg) GetChatLog() *DbChatLog {
+	if x, ok := x.GetData().(*DbCommandMsg_ChatLog); ok {
+		return x.ChatLog
+	}
+	return nil
+}
+
+func (x *DbCommandMsg) GetChatRecord() *DbChatRecord {
+	if x, ok := x.GetData().(*DbCommandMsg_ChatRecord); ok {
+		return x.ChatRecord
+	}
+	return nil
+}
+
+func (x *DbCommandMsg) GetArrayChatRecord() *ArrayChatRecord {
+	if x, ok := x.GetData().(*DbCommandMsg_ArrayChatRecord); ok {
+		return x.ArrayChatRecord
+	}
+	return nil
+}
+
+func (x *DbCommandMsg) GetArrayChatLog() *ArrayDbChatLog {
+	if x, ok := x.GetData().(*DbCommandMsg_ArrayChatLog); ok {
+		return x.ArrayChatLog
+	}
+	return nil
+}
+
+type isDbCommandMsg_Data interface {
+	isDbCommandMsg_Data()
+}
+
+type DbCommandMsg_ArrayConfig struct {
+	ArrayConfig *ArrayConfig `protobuf:"bytes,1001,opt,name=array_config,json=arrayConfig,proto3,oneof"`
+}
+
+type DbCommandMsg_ChatLog struct {
+	ChatLog *DbChatLog `protobuf:"bytes,1002,opt,name=chat_log,json=chatLog,proto3,oneof"`
+}
+
+type DbCommandMsg_ChatRecord struct {
+	ChatRecord *DbChatRecord `protobuf:"bytes,1003,opt,name=chat_record,json=chatRecord,proto3,oneof"`
+}
+
+type DbCommandMsg_ArrayChatRecord struct {
+	ArrayChatRecord *ArrayChatRecord `protobuf:"bytes,1004,opt,name=array_chat_record,json=arrayChatRecord,proto3,oneof"`
+}
+
+type DbCommandMsg_ArrayChatLog struct {
+	ArrayChatLog *ArrayDbChatLog `protobuf:"bytes,1005,opt,name=array_chat_log,json=arrayChatLog,proto3,oneof"`
+}
+
+func (*DbCommandMsg_ArrayConfig) isDbCommandMsg_Data() {}
+
+func (*DbCommandMsg_ChatLog) isDbCommandMsg_Data() {}
+
+func (*DbCommandMsg_ChatRecord) isDbCommandMsg_Data() {}
+
+func (*DbCommandMsg_ArrayChatRecord) isDbCommandMsg_Data() {}
+
+func (*DbCommandMsg_ArrayChatLog) isDbCommandMsg_Data() {}
+
+var File_db_msg_proto protoreflect.FileDescriptor
+
+var file_db_msg_proto_rawDesc = []byte{
+	0x0a, 0x0c, 0x64, 0x62, 0x5f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02,
+	0x70, 0x62, 0x1a, 0x0d, 0x64, 0x62, 0x5f, 0x63, 0x6d, 0x64, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x22, 0x61, 0x0a, 0x08, 0x44, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a,
+	0x09, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x6f,
+	0x6e, 0x66, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f,
+	0x6e, 0x66, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x22, 0x38, 0x0a, 0x0b, 0x41, 0x72, 0x72, 0x61, 0x79, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x12, 0x29, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x69, 0x73, 0x74,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x43, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xf7,
+	0x01, 0x0a, 0x09, 0x44, 0x62, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x0a, 0x07,
+	0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66,
+	0x72, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x6f, 0x5f, 0x69, 0x64, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x6f, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e,
+	0x74, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61,
+	0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74,
+	0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x44, 0x62, 0x43,
+	0x68, 0x61, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x63, 0x68, 0x61, 0x74, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18,
+	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64,
+	0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f,
+	0x76, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69,
+	0x73, 0x56, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x22, 0x3c, 0x0a, 0x0e, 0x41, 0x72, 0x72, 0x61,
+	0x79, 0x44, 0x62, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x2a, 0x0a, 0x09, 0x64, 0x61,
+	0x74, 0x61, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
+	0x70, 0x62, 0x2e, 0x44, 0x62, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x08, 0x64, 0x61,
+	0x74, 0x61, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xea, 0x01, 0x0a, 0x0c, 0x44, 0x62, 0x43, 0x68, 0x61,
+	0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69,
+	0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+	0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f,
+	0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72,
+	0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x56, 0x69, 0x73, 0x69, 0x74, 0x6f,
+	0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e,
+	0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x44, 0x62, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x53,
+	0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74,
+	0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61,
+	0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x67, 0x61, 0x6d,
+	0x65, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x0f, 0x41, 0x72, 0x72, 0x61, 0x79, 0x43, 0x68, 0x61, 0x74,
+	0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x2d, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c,
+	0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x44,
+	0x62, 0x43, 0x68, 0x61, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x08, 0x64, 0x61, 0x74,
+	0x61, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x92, 0x03, 0x0a, 0x0c, 0x44, 0x62, 0x43, 0x6f, 0x6d, 0x6d,
+	0x61, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x12, 0x29, 0x0a, 0x08, 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79,
+	0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x44,
+	0x62, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6d, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x6d, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x17,
+	0x0a, 0x07, 0x63, 0x6d, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x63, 0x6d, 0x64, 0x53, 0x74, 0x72, 0x12, 0x35, 0x0a, 0x0c, 0x61, 0x72, 0x72, 0x61, 0x79,
+	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x70, 0x62, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48,
+	0x00, 0x52, 0x0b, 0x61, 0x72, 0x72, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b,
+	0x0a, 0x08, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x43, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67,
+	0x48, 0x00, 0x52, 0x07, 0x63, 0x68, 0x61, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x34, 0x0a, 0x0b, 0x63,
+	0x68, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x62, 0x43, 0x68, 0x61, 0x74, 0x52, 0x65, 0x63,
+	0x6f, 0x72, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72,
+	0x64, 0x12, 0x42, 0x0a, 0x11, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x63, 0x68, 0x61, 0x74, 0x5f,
+	0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e,
+	0x70, 0x62, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x43, 0x68, 0x61, 0x74, 0x52, 0x65, 0x63, 0x6f,
+	0x72, 0x64, 0x48, 0x00, 0x52, 0x0f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x43, 0x68, 0x61, 0x74, 0x52,
+	0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x3b, 0x0a, 0x0e, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x63,
+	0x68, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12,
+	0x2e, 0x70, 0x62, 0x2e, 0x41, 0x72, 0x72, 0x61, 0x79, 0x44, 0x62, 0x43, 0x68, 0x61, 0x74, 0x4c,
+	0x6f, 0x67, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x43, 0x68, 0x61, 0x74, 0x4c,
+	0x6f, 0x67, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x42, 0x05, 0x5a, 0x03, 0x2f, 0x70,
+	0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_db_msg_proto_rawDescOnce sync.Once
+	file_db_msg_proto_rawDescData = file_db_msg_proto_rawDesc
+)
+
+func file_db_msg_proto_rawDescGZIP() []byte {
+	file_db_msg_proto_rawDescOnce.Do(func() {
+		file_db_msg_proto_rawDescData = protoimpl.X.CompressGZIP(file_db_msg_proto_rawDescData)
+	})
+	return file_db_msg_proto_rawDescData
+}
+
+var file_db_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
+var file_db_msg_proto_goTypes = []interface{}{
+	(*DbConfig)(nil),        // 0: pb.DbConfig
+	(*ArrayConfig)(nil),     // 1: pb.ArrayConfig
+	(*DbChatLog)(nil),       // 2: pb.DbChatLog
+	(*ArrayDbChatLog)(nil),  // 3: pb.ArrayDbChatLog
+	(*DbChatRecord)(nil),    // 4: pb.DbChatRecord
+	(*ArrayChatRecord)(nil), // 5: pb.ArrayChatRecord
+	(*DbCommandMsg)(nil),    // 6: pb.DbCommandMsg
+	(EDbChatType)(0),        // 7: pb.EDbChatType
+	(EDbRecordState)(0),     // 8: pb.EDbRecordState
+	(EDbCommand)(0),         // 9: pb.EDbCommand
+}
+var file_db_msg_proto_depIdxs = []int32{
+	0,  // 0: pb.ArrayConfig.data_list:type_name -> pb.DbConfig
+	7,  // 1: pb.DbChatLog.chat_type:type_name -> pb.EDbChatType
+	2,  // 2: pb.ArrayDbChatLog.data_list:type_name -> pb.DbChatLog
+	8,  // 3: pb.DbChatRecord.state:type_name -> pb.EDbRecordState
+	4,  // 4: pb.ArrayChatRecord.data_list:type_name -> pb.DbChatRecord
+	9,  // 5: pb.DbCommandMsg.cmd_type:type_name -> pb.EDbCommand
+	1,  // 6: pb.DbCommandMsg.array_config:type_name -> pb.ArrayConfig
+	2,  // 7: pb.DbCommandMsg.chat_log:type_name -> pb.DbChatLog
+	4,  // 8: pb.DbCommandMsg.chat_record:type_name -> pb.DbChatRecord
+	5,  // 9: pb.DbCommandMsg.array_chat_record:type_name -> pb.ArrayChatRecord
+	3,  // 10: pb.DbCommandMsg.array_chat_log:type_name -> pb.ArrayDbChatLog
+	11, // [11:11] is the sub-list for method output_type
+	11, // [11:11] is the sub-list for method input_type
+	11, // [11:11] is the sub-list for extension type_name
+	11, // [11:11] is the sub-list for extension extendee
+	0,  // [0:11] is the sub-list for field type_name
+}
+
+func init() { file_db_msg_proto_init() }
+func file_db_msg_proto_init() {
+	if File_db_msg_proto != nil {
+		return
+	}
+	file_db_cmds_proto_init()
+	if !protoimpl.UnsafeEnabled {
+		file_db_msg_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DbConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_msg_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ArrayConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_msg_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DbChatLog); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_msg_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ArrayDbChatLog); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_msg_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DbChatRecord); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_msg_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ArrayChatRecord); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_db_msg_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DbCommandMsg); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_db_msg_proto_msgTypes[6].OneofWrappers = []interface{}{
+		(*DbCommandMsg_ArrayConfig)(nil),
+		(*DbCommandMsg_ChatLog)(nil),
+		(*DbCommandMsg_ChatRecord)(nil),
+		(*DbCommandMsg_ArrayChatRecord)(nil),
+		(*DbCommandMsg_ArrayChatLog)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_db_msg_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   7,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_db_msg_proto_goTypes,
+		DependencyIndexes: file_db_msg_proto_depIdxs,
+		MessageInfos:      file_db_msg_proto_msgTypes,
+	}.Build()
+	File_db_msg_proto = out.File
+	file_db_msg_proto_rawDesc = nil
+	file_db_msg_proto_goTypes = nil
+	file_db_msg_proto_depIdxs = nil
+}

+ 39 - 0
db/rpc/proto/db.proto

@@ -0,0 +1,39 @@
+syntax = "proto3";
+
+package pb;
+
+option go_package = "/pb";
+
+import "db_msg.proto";
+/*
+ 服务
+ */
+service Db {
+    // 客服聊天
+    rpc DbLogin(stream DbMsgReq) returns (stream DbMsgRes) {}
+    rpc DbCall(DbMsgReq) returns (DbMsgRes) {}
+
+    // 游戏聊天
+    // 敏感词库信息获取
+    rpc GetSensitiveWords(SensReq) returns (SensRes) {}
+}
+
+/*
+    客服聊天msg
+ */
+message DbMsgReq {
+    DbCommandMsg cmd = 1;
+}
+message DbMsgRes {
+    DbCommandMsg cmd = 1;
+}
+
+/*
+    敏感词信息msg
+ */
+message SensReq {
+}
+message SensRes {
+    repeated string sens_words = 1;
+    repeated string filter_word = 2;
+}

+ 25 - 0
db/rpc/proto/db_cmds.proto

@@ -0,0 +1,25 @@
+syntax = "proto3";
+
+package pb;
+
+option go_package = "/pb";
+
+enum EDbCommand {
+    E_DB_COMMAND_UNSPECIFIED = 0;
+    E_DB_COMMAND_PUSH_CHAT_LOG = 1001;                  // 推送聊天日志
+    E_DB_COMMAND_PUSH_CHAT_RECORD = 1002;               // 推送客服对接记录
+
+    E_DB_COMMAND_GET_CONFIG = 2001;                     // 获取配置
+    E_DB_COMMAND_GET_CHAT_RECORD = 2002;                // 获取客服对接记录
+    E_DB_COMMAND_GET_CHAT_LOG = 2003;                   // 获取日志记录
+}
+
+enum EDbChatType {
+    E_DB_CHAT_TYPE_PLAYER = 0;                      // 玩家发言
+    E_DB_CHAT_TYPE_SERVICE = 1;                     // 客服发言
+}
+
+enum EDbRecordState {
+    E_DB_RECORD_STATE_REPLY = 0;
+    E_DB_RECORD_STATE_DISCONNECT = 1;
+}

+ 66 - 0
db/rpc/proto/db_msg.proto

@@ -0,0 +1,66 @@
+syntax = "proto3";
+
+import "db_cmds.proto";
+
+package pb;
+
+option go_package = "/pb";
+
+/*
+ db消息体
+ */
+
+// 配置信息
+message DbConfig {
+    string conf_name  = 1;
+    string conf_key = 2;
+    string conf_value = 3;
+}
+message ArrayConfig {
+    repeated DbConfig data_list = 1;
+}
+
+// 客服聊天记录
+message DbChatLog {
+    string from_id = 1;
+    string to_id = 2;
+    string content = 3;
+    int64 time_stamp = 4;
+    EDbChatType chat_type = 5;
+    string session_id = 6;
+    int32 game_id = 7;
+    bool is_visitor = 8;
+}
+message ArrayDbChatLog {
+    repeated DbChatLog data_list = 1;
+}
+
+message DbChatRecord {
+    string session_id = 3;
+    string service_id = 1;
+    string player_id = 2;
+    bool is_visitor = 4;
+    EDbRecordState state = 5;
+    int64 time_stamp = 6;
+    int32 game_id = 7;
+}
+message ArrayChatRecord {
+    repeated DbChatRecord data_list = 1;
+}
+
+/*
+命令消息
+*/
+message DbCommandMsg {
+    EDbCommand cmd_type = 1;           // 命令类型
+    int32 cmd_value = 2;               // 通用val
+    string cmd_str = 3;              // 通用str
+
+    oneof data {
+        ArrayConfig array_config = 1001;
+        DbChatLog   chat_log = 1002;
+        DbChatRecord chat_record = 1003;
+        ArrayChatRecord array_chat_record = 1004;
+        ArrayDbChatLog array_chat_log = 1005;
+    }
+}

+ 18 - 0
demo/data/data.go

@@ -0,0 +1,18 @@
+//@Author   : KaiShin
+//@Time     : 2022/3/16
+
+package data
+
+import "call_center/call/rpc/call"
+
+const (
+	GameId = 1001
+)
+
+var (
+	PlayerId  = "" // 游客id
+	ServiceId = "" // 客服id
+	Addr      = "localhost:3000"
+)
+
+var Client call.Call

+ 112 - 0
demo/player/player.go

@@ -0,0 +1,112 @@
+//@Author   : KaiShin
+//@Time     : 2022/3/16
+
+package main
+
+import (
+	"bufio"
+	"call_center/call/rpc/call"
+	"call_center/call/rpc/pb"
+	"call_center/demo/data"
+	"context"
+	"github.com/tal-tech/go-zero/core/logx"
+	"github.com/tal-tech/go-zero/zrpc"
+	"io"
+	"os"
+)
+
+func playerLogin() {
+	conf := new(zrpc.RpcClientConf)
+	conf.Target = data.Addr
+	data.Client = call.NewCall(zrpc.MustNewClient(*conf))
+
+	req := new(call.ClientMsgReq)
+	cmd := pb.CommandMsg{}
+
+	idInfo := pb.IdInfo{GameId: data.GameId} // 游客登录不需要id
+	req.Cmd = append(req.Cmd, &cmd)
+	req.IdInfo = &idInfo
+	stream, err := data.Client.ClientLogin(context.Background(), req)
+	if err != nil {
+		logx.Errorf("playerLogin failed, playerId:%s, err:%s", err)
+		return
+	}
+
+	for {
+		res, err := stream.Recv()
+		if err == io.EOF {
+			logx.Info("收到服务端的结束信号")
+			break
+		}
+
+		if err != nil {
+			logx.Info("接收数据错误:", err)
+		}
+
+		if res == nil {
+			break
+		}
+
+		for _, cmd := range res.Cmd {
+			if cmd.CmdType != pb.ECommand_MSG_HEART_BEAT {
+				logx.Infof("[DEBUG] 收到cmd:%v, val:%v, str:%v, buff:%s", cmd.CmdType, cmd.CmdVal, cmd.CmdStr, cmd.GetBuff())
+			}
+
+			switch cmd.CmdType {
+			case pb.ECommand_SEND_MSG:
+				msg := cmd.GetChatMsg()
+				logx.Infof("[客户端收到]:%s", msg.Input)
+			case pb.ECommand_ON_PLAYER_CONNECT:
+				data.PlayerId = cmd.CmdStr
+				logx.Info("player conn, id: ", data.PlayerId)
+				break
+			case pb.ECommand_ON_SERVICE_DISCONNECT:
+				logx.Infof("服务客服{%v}已断开", cmd.CmdStr)
+				break
+			case pb.ECommand_ON_PLAYER_RECEIVE_REPLY:
+				data.ServiceId = cmd.CmdStr
+				logx.Info("分配到客服:", data.ServiceId)
+			default:
+				break
+			}
+		}
+	}
+}
+
+func playerOnCall() {
+	input := bufio.NewReader(os.Stdin)
+	for {
+		logx.Info("请输入信息:")
+		cmdStr, _ := input.ReadString('\n')
+
+		var proto = new(pb.ClientMsgReq)
+
+		var cmd = new(pb.CommandMsg)
+		cmd.CmdType = pb.ECommand_CALL_PLAYER_MSG
+
+		var chatMsg = new(pb.CommandMsg_ChatMsg)
+		chatMsg.ChatMsg = &pb.ChatMsg{Input: cmdStr}
+		cmd.Buff = chatMsg
+
+		proto.Cmd = append(proto.Cmd, cmd)
+
+		var idInfo = new(pb.IdInfo)
+		idInfo.Id = data.PlayerId
+		proto.IdInfo = idInfo
+
+		if data.Client == nil {
+			logx.Error("player not playerLogin, client is null")
+			continue
+		}
+
+		if _, err := data.Client.ClientCall(context.Background(), proto); err != nil {
+			logx.Error("call error:", err)
+			continue
+		}
+	}
+}
+
+func main() {
+	go playerOnCall()
+	playerLogin()
+}

+ 160 - 0
demo/service/service.go

@@ -0,0 +1,160 @@
+//@Author   : KaiShin
+//@Time     : 2022/3/16
+
+package main
+
+import (
+	"bufio"
+	"call_center/call/rpc/call"
+	"call_center/call/rpc/pb"
+	"call_center/demo/data"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/tal-tech/go-zero/core/logx"
+	"github.com/tal-tech/go-zero/zrpc"
+	"io"
+	"log"
+	"os"
+	"strings"
+)
+
+func serviceLogin() {
+	conf := new(zrpc.RpcClientConf)
+	conf.Target = data.Addr
+	data.Client = call.NewCall(zrpc.MustNewClient(*conf))
+
+	req := new(call.ServiceMsgReq)
+	cmd := pb.CommandMsg{}
+
+	idInfo := pb.IdInfo{GameId: data.GameId, Id: data.ServiceId}
+	req.Cmd = append(req.Cmd, &cmd)
+	req.IdInfo = &idInfo
+	stream, err := data.Client.ServiceLogin(context.Background(), req)
+	if err != nil {
+		logx.Errorf("playerLogin failed, playerId:%s, err:%s", err)
+		return
+	}
+
+	for {
+		res, err := stream.Recv()
+		if err == io.EOF {
+			logx.Info("收到服务端的结束信号")
+			break
+		}
+
+		if err != nil {
+			logx.Info("接收数据错误:", err)
+		}
+
+		if res == nil {
+			break
+		}
+
+		for _, cmd := range res.Cmd {
+			if cmd.CmdType != pb.ECommand_MSG_HEART_BEAT {
+				logx.Infof("[DEBUG] 收到cmd:%v, val:%v, str:%v, buff:%s", cmd.CmdType, cmd.CmdVal, cmd.CmdStr, cmd.GetBuff())
+			}
+
+			switch cmd.CmdType {
+			case pb.ECommand_ON_PLAYER_RECEIVE_REPLY:
+				data.PlayerId = cmd.CmdStr
+				logx.Info("分配到玩家:", data.PlayerId)
+			case pb.ECommand_SEND_MSG:
+				buff := cmd.GetChatMsg()
+				logx.Info("[客戶端收到]:", buff.Input)
+			case pb.ECommand_ON_PLAYER_DISCONNECT:
+				if data.ServiceId == cmd.CmdStr {
+					data.PlayerId = "default"
+					logx.Infof("玩家[%v]已断开\n", cmd.CmdStr)
+				}
+			case pb.ECommand_ON_SERVICE_CONNECT:
+				data.ServiceId = cmd.CmdStr
+			case pb.ECommand_ON_PLAYER_CONNECT:
+				// 玩家登录
+				if data.PlayerId == "default" {
+					data.PlayerId = cmd.CmdStr
+					logx.Infof("玩家{%v}登录,客服{%v}当前空闲,已分配", data.PlayerId, data.ServiceId)
+				}
+			default:
+				break
+			}
+		}
+	}
+}
+
+func serviceOnCall() {
+	input := bufio.NewReader(os.Stdin)
+
+	for {
+		logx.Info("请输入信息:\n")
+		chatContent, _ := input.ReadString('\n')
+
+		if data.Client == nil {
+			logx.Error("service not login, client is null")
+			continue
+		}
+
+		var proto = new(pb.ServiceMsgReq)
+		var cmd = new(pb.CommandMsg)
+		cmd = parseGmCmd(chatContent)
+		if cmd != nil {
+
+		} else {
+			cmd = new(pb.CommandMsg)
+			cmd.CmdType = pb.ECommand_CALL_SERVICE_MSG
+			var chatMsg = new(pb.CommandMsg_ChatMsg)
+			chatMsg.ChatMsg = &pb.ChatMsg{ClientId: data.PlayerId, Input: chatContent}
+			cmd.Buff = chatMsg
+		}
+
+		proto.Cmd = append(proto.Cmd, cmd)
+		proto.IdInfo = &pb.IdInfo{Id: data.ServiceId}
+
+		if res, err := data.Client.ServiceCall(context.Background(), proto); err != nil {
+			fmt.Println("error:", err)
+			continue
+		} else {
+			if res != nil {
+				log.Println(res)
+			}
+		}
+	}
+}
+
+func parseGmCmd(cmd string) *pb.CommandMsg {
+	/*
+		 客服连接
+		{"cmd_type": 2005, "cmd_val": 1, "cmd_str": "1648121824824636975904"}
+
+		获取聊天日志
+		{"cmd_type": 2006, "cmd_val": 2, "cmd_str": "16474122581374391221744"}
+	*/
+
+	ok := strings.Contains(cmd, "cmd_type")
+	if ok != true {
+		return nil
+	}
+	cmd = strings.Replace(cmd, "\n", "", -1)
+
+	cmdMsg := new(pb.CommandMsg)
+
+	var cmdStr map[string]interface{}
+	err := json.Unmarshal([]byte(cmd), &cmdStr)
+	if err != nil {
+		log.Println("<ParseCmd> err:", err)
+		return nil
+	}
+
+	cmdTpe := int32(cmdStr["cmd_type"].(float64))
+	cmdVal := int32(cmdStr["cmd_val"].(float64))
+	cmdMsg.CmdType = pb.ECommand(cmdTpe)
+	cmdMsg.CmdVal = cmdVal
+	cmdMsg.CmdStr = cmdStr["cmd_str"].(string)
+	return cmdMsg
+}
+
+func main() {
+	go serviceLogin()
+	serviceOnCall()
+}

+ 79 - 0
go.mod

@@ -0,0 +1,79 @@
+module call_center
+
+go 1.17
+
+require (
+	github.com/deckarep/golang-set v1.7.1
+	github.com/elastic/go-elasticsearch/v7 v7.13.0
+	github.com/farmerx/elasticsql v0.0.0-20210914060049-21e7202ed877
+	github.com/golang/protobuf v1.5.2
+	github.com/tal-tech/go-zero v1.2.5
+	github.com/tal-tech/go-zero/tools/goctl v1.2.6
+	google.golang.org/grpc v1.44.0
+	google.golang.org/protobuf v1.27.1
+	gopkg.in/fsnotify.v1 v1.4.7
+)
+
+require (
+	github.com/alicebob/miniredis/v2 v2.17.0 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cespare/xxhash/v2 v2.1.2 // indirect
+	github.com/coreos/go-semver v0.3.0 // indirect
+	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/go-logr/logr v1.2.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-redis/redis v6.15.9+incompatible // indirect
+	github.com/go-sql-driver/mysql v1.6.0 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang-jwt/jwt v3.2.1+incompatible // indirect
+	github.com/golang/mock v1.6.0 // indirect
+	github.com/google/go-cmp v0.5.6 // indirect
+	github.com/google/gofuzz v1.1.0 // indirect
+	github.com/google/uuid v1.3.0 // indirect
+	github.com/googleapis/gnostic v0.4.1 // indirect
+	github.com/hashicorp/golang-lru v0.5.1 // indirect
+	github.com/json-iterator/go v1.1.11 // indirect
+	github.com/justinas/alice v1.2.0 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.1 // indirect
+	github.com/openzipkin/zipkin-go v0.4.0 // indirect
+	github.com/prometheus/client_golang v1.11.0 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.26.0 // indirect
+	github.com/prometheus/procfs v0.6.0 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	github.com/xwb1989/sqlparser v0.0.0-20171128062118-da747e0c62c4 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.2 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.2 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.2 // indirect
+	go.opentelemetry.io/otel v1.3.0 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.3.0 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.3.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.3.0 // indirect
+	go.opentelemetry.io/otel/trace v1.3.0 // indirect
+	go.uber.org/atomic v1.9.0 // indirect
+	go.uber.org/automaxprocs v1.4.0 // indirect
+	go.uber.org/goleak v1.1.12 // indirect
+	go.uber.org/multierr v1.8.0 // indirect
+	go.uber.org/zap v1.21.0 // indirect
+	golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect
+	golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
+	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
+	golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 // indirect
+	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
+	golang.org/x/text v0.3.7 // indirect
+	golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
+	google.golang.org/appengine v1.6.5 // indirect
+	google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7 // indirect
+	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	k8s.io/api v0.20.12 // indirect
+	k8s.io/apimachinery v0.20.12 // indirect
+	k8s.io/client-go v0.20.12 // indirect
+	k8s.io/klog/v2 v2.40.1 // indirect
+	k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect
+	sigs.k8s.io/yaml v1.2.0 // indirect
+)

+ 778 - 0
go.sum

@@ -0,0 +1,778 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
+github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
+github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
+github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
+github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
+github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
+github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
+github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
+github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
+github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
+github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis/v2 v2.16.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I=
+github.com/alicebob/miniredis/v2 v2.17.0 h1:EwLdrIS50uczw71Jc7iVSxZluTKj5nfSP8n7ARRnJy0=
+github.com/alicebob/miniredis/v2 v2.17.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210521184019-c5ad59b459ec/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ=
+github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/elastic/go-elasticsearch/v7 v7.13.0 h1:sXRxqABXy3wC0msonnFltRI41uN4Q1p7Vylm/U0BvO4=
+github.com/elastic/go-elasticsearch/v7 v7.13.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4=
+github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emicklei/proto v1.9.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/farmerx/elasticsql v0.0.0-20210914060049-21e7202ed877 h1:rDUDlA2R/Vvfkh4a7ZUbI+O8mR8YLDkx3+/lgxE0lig=
+github.com/farmerx/elasticsql v0.0.0-20210914060049-21e7202ed877/go.mod h1:s3tHLcXjLWW+cKBlmp8LhvlPaHVng8jy1Ni2oC/pcSg=
+github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
+github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
+github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
+github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
+github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
+github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
+github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=
+github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
+github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
+github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
+github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
+github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
+github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
+github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
+github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
+github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
+github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc=
+github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
+github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo=
+github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
+github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=
+github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE=
+github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
+github.com/openzipkin/zipkin-go v0.4.0 h1:CtfRrOVZtbDj8rt1WXjklw0kqqJQwICrCKmlfUuBUUw=
+github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
+github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tal-tech/go-zero v1.2.5 h1:DpqTM/OTCThRtJoQPlp6b4/YnbCVkZ3gDT7+nFGUo3k=
+github.com/tal-tech/go-zero v1.2.5/go.mod h1:OM2UangPHFMJ+5boRUaeQ/z6xpVvqprZda/JUWG1D7Y=
+github.com/tal-tech/go-zero/tools/goctl v1.2.6 h1:WyVxsZNNjApcfCpMDx08HwtjOhVjNCuRawXvi+iOdV4=
+github.com/tal-tech/go-zero/tools/goctl v1.2.6/go.mod h1:cx1SVMN6aV1dLqpZgOyG8VoB5VkGROpxaCT8rRPSOyY=
+github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
+github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
+github.com/xwb1989/sqlparser v0.0.0-20171128062118-da747e0c62c4 h1:w96oitIHwAbUymu2zUSla/82gOKNzpJYkFdwCHE/UOA=
+github.com/xwb1989/sqlparser v0.0.0-20171128062118-da747e0c62c4/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da h1:NimzV1aGyq29m5ukMK0AMWEhFaL/lrEOaephfuoiARg=
+github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
+github.com/zeromicro/antlr v0.0.1/go.mod h1:nfpjEwFR6Q4xGDJMcZnCL9tEfQRgszMwu3rDz2Z+p5M=
+github.com/zeromicro/ddl-parser v0.0.0-20210712021150-63520aca7348/go.mod h1:ISU/8NuPyEpl9pa17Py9TBPetMjtsiHrb9f5XGiYbo8=
+go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/api/v3 v3.5.2 h1:tXok5yLlKyuQ/SXSjtqHc4uzNaMqZi2XsoSPr/LlJXI=
+go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.2 h1:4hzqQ6hIb3blLyQ8usCU4h3NghkqcsohEQ3o3VetYxE=
+go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=
+go.etcd.io/etcd/client/v3 v3.5.2 h1:WdnejrUtQC4nCxK0/dLTMqKOB+U5TP/2Ya0BJL+1otA=
+go.etcd.io/etcd/client/v3 v3.5.2/go.mod h1:kOOaWFFgHygyT0WlSmL8TJiXmMysO/nNUlEsSsN6W4o=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.1.0/go.mod h1:7cww0OW51jQ8IaZChIEdqLwgh+44+7uiTdWsAL0wQpA=
+go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y=
+go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
+go.opentelemetry.io/otel/exporters/jaeger v1.1.0/go.mod h1:D/GIBwAdrFTTqCy1iITpC9nh5rgJpIbFVgkhlz2vCXk=
+go.opentelemetry.io/otel/exporters/jaeger v1.3.0 h1:HfydzioALdtcB26H5WHc4K47iTETJCdloL7VN579/L0=
+go.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc=
+go.opentelemetry.io/otel/exporters/zipkin v1.1.0/go.mod h1:LZwDnf1mVGTPMq9hdRUHfFBH30SuQvZ1BJaVywpg0VI=
+go.opentelemetry.io/otel/exporters/zipkin v1.3.0 h1:uOD28dZ7yIKITTcUS6MeAGNHYy3uhP7DTkhcJM6onlQ=
+go.opentelemetry.io/otel/exporters/zipkin v1.3.0/go.mod h1:LxGGfHIYbvsFnrJtBcazb0yG24xHdDGrT/H6RB9r3+8=
+go.opentelemetry.io/otel/sdk v1.1.0/go.mod h1:3aQvM6uLm6C4wJpHtT8Od3vNzeZ34Pqc6bps8MywWzo=
+go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI=
+go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
+go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLwwHt8wiUsWGTI=
+go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY=
+go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0=
+go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
+go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
+go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8=
+golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211106132015-ebca88c72f68/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs=
+golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M=
+golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210928142010-c7af6a1a74c9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7 h1:ntPPoHzFW6Xp09ueznmahONZufyoSakK/piXnr2BU3I=
+google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=
+google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
+gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+k8s.io/api v0.20.12 h1:LfRpmRkJLwPP8eaYehsVVmIIfg1yCBIIUHaSsdqCgHA=
+k8s.io/api v0.20.12/go.mod h1:A2brwyEkVLM3wQGNnzoAa5JsQRzHK0uoOQ+bsnv7V68=
+k8s.io/apimachinery v0.20.12 h1:2c0LIVNMvB8k2Ozstmhl2zGeCEcPazznuLYEwxFdNjM=
+k8s.io/apimachinery v0.20.12/go.mod h1:uM7hCI0NyBymUwgshMgZyte475lxhr+QH6h3cvdnzEc=
+k8s.io/client-go v0.20.12 h1:U75SxTC31BHT9i7CbX/hL4v+U1Wkzy/E1vt5ClDPp3I=
+k8s.io/client-go v0.20.12/go.mod h1:NBJj6Evp73Xy/4v/O/RDRaH0+3JoxNfjRxkyRgrdbsA=
+k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4=
+k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
+k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw=
+k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
+sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno=
+sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=

+ 98 - 0
public/common/common.go

@@ -0,0 +1,98 @@
+//@Author   : KaiShin
+//@Time     : 2021/11/1
+
+package logic
+
+import (
+	"crypto/md5"
+	"encoding/json"
+	"fmt"
+	"gopkg.in/fsnotify.v1"
+	"io"
+	"io/ioutil"
+	"log"
+	"strings"
+	"sync"
+)
+
+func GetSyncMapKeys(mm *sync.Map) []interface{} {
+	var keyList []interface{}
+
+	mm.Range(func(key, value interface{}) bool {
+		keyList = append(keyList, key)
+		return true
+	})
+	return keyList
+}
+
+func GetSyncMapValues(mm *sync.Map) []interface{} {
+	var valList []interface{}
+
+	mm.Range(func(key, value interface{}) bool {
+		valList = append(valList, value)
+		return true
+	})
+	return valList
+}
+
+func PreCheckConfig(path string) {
+	_, err := ioutil.ReadFile(path)
+	if err != nil {
+		log.Println("<PreCheckConfig> err:", err)
+		log.Println("<PreCheckConfig> load conf failed, wait file create...")
+		watch, err := fsnotify.NewWatcher()
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		defer watch.Close()
+
+		// 获取当前目录的上一级
+		prePath := strings.Split(path, "/")
+
+		err = watch.Add(prePath[0])
+		if err != nil {
+			log.Fatal(err)
+		}
+
+		select {
+		case ev := <-watch.Events:
+			{
+				log.Println("<PreCheckConfig> ev.Op: ", ev.Op)
+				if ev.Op&fsnotify.Create == fsnotify.Create {
+					break
+				}
+				if ev.Op&fsnotify.Write == fsnotify.Write {
+					break
+				}
+			}
+		}
+
+		log.Printf("<PreCheckConfig> %s has bean created", path)
+	}
+}
+
+func Md5(str string) string {
+	w := md5.New()
+	io.WriteString(w, str)
+	md5str := fmt.Sprintf("%x", w.Sum(nil))
+	return md5str
+}
+
+func CleanContent(chatStr string) string {
+	cleanStr := strings.Replace(chatStr, " ", "", -1)
+	cleanStr = strings.Replace(cleanStr, "\n", "", -1)
+	cleanStr = strings.Replace(cleanStr, "\x0B", "", -1)
+	cleanStr = strings.Replace(cleanStr, "\t", "", -1)
+	return cleanStr
+}
+
+func StructToMap(v interface{}) map[string]interface{} {
+	m := make(map[string]interface{})
+	data, _ := json.Marshal(v)
+	err := json.Unmarshal(data, &m)
+	if err != nil {
+		return nil
+	}
+	return m
+}

+ 37 - 0
public/common/obj_mgr.go

@@ -0,0 +1,37 @@
+package logic
+
+import (
+	"sync"
+)
+
+type ObjMgr struct {
+	DictInfo sync.Map
+}
+
+func (sel *ObjMgr) Register(key, val interface{}) {
+	//log.Printf("<ObjMgr.Register> key:%v, value:%v", key, reflect.TypeOf(val).String())
+	sel.DictInfo.Store(key, val)
+}
+
+func (sel *ObjMgr) GetObj(objName interface{}) interface{} {
+	obj, ok := sel.DictInfo.Load(objName)
+	if ok == true {
+		return obj
+	} else {
+		// log.Println("<ObjMgr> GetObj nil, objName:", objName)
+		return nil
+	}
+}
+
+func (sel *ObjMgr) DeleteObj(objName interface{}) {
+	sel.DictInfo.Delete(objName)
+	//log.Printf("<ObjMgr.DeleteObj> [%v] : %v \n", &sel.DictInfo, objName)
+}
+
+func (sel *ObjMgr) GetObjKeys() []interface{} {
+	return GetSyncMapKeys(&sel.DictInfo)
+}
+
+func (sel *ObjMgr) GetObjValues() []interface{} {
+	return GetSyncMapValues(&sel.DictInfo)
+}

+ 83 - 0
public/common/queue.go

@@ -0,0 +1,83 @@
+package logic
+
+import (
+	"container/list"
+	"sync"
+)
+
+type SyncQueue struct {
+	lock sync.RWMutex
+	data *list.List
+}
+
+func NewQueue() *SyncQueue {
+	q := new(SyncQueue)
+	q.data = list.New()
+	return q
+}
+
+func (sel *SyncQueue) GetAll() []interface{} {
+	sel.lock.RLock()
+	var valList []interface{}
+	for e := sel.data.Front(); e != nil; e = e.Next() {
+		valList = append(valList, e.Value)
+	}
+	sel.lock.RUnlock()
+	return valList
+}
+
+func (sel *SyncQueue) PushBack(v interface{}) int {
+	sel.lock.Lock()
+	sel.data.PushBack(v)
+	sel.lock.Unlock()
+	return sel.data.Len()
+}
+
+func (sel *SyncQueue) Pop() interface{} {
+	sel.lock.Lock()
+	e := sel.data.Back()
+	resData := sel.data.Remove(e)
+	sel.lock.Unlock()
+	return resData
+}
+
+func (sel *SyncQueue) Back() interface{} {
+	sel.lock.RLock()
+	e := sel.data.Back()
+	sel.lock.RUnlock()
+	if e != nil {
+		return e
+	}
+	return nil
+}
+
+func (sel *SyncQueue) Len() int {
+	sel.lock.RLock()
+	l := sel.data.Len()
+	sel.lock.RUnlock()
+	return l
+}
+
+func (sel *SyncQueue) RemoveE(e *list.Element) interface{} {
+	sel.lock.Lock()
+	res := sel.data.Remove(e)
+	sel.lock.Unlock()
+	return res
+}
+
+func (sel *SyncQueue) Remove(v interface{}) interface{} {
+	sel.lock.Lock()
+	var rmE *list.Element
+	var rmV interface{}
+	for e := sel.data.Front(); e != nil; e = e.Next() {
+		if e.Value == v {
+			rmE = e
+			break
+		}
+	}
+	if rmE != nil {
+		rmV = sel.data.Remove(rmE)
+	}
+	sel.lock.Unlock()
+	return rmV
+}

+ 34 - 0
public/common/single_class_mgr.go

@@ -0,0 +1,34 @@
+package logic
+
+var instance *SingleClassMgr
+
+type SingleClassMgr struct {
+	// DictInfo map[string] interface{}
+	ObjMgr
+}
+
+func init() {
+	instance = new(SingleClassMgr)
+	// instance.DictInfo = make(map[interface{}]interface{})
+}
+
+func GetClassInstance() *SingleClassMgr {
+	return instance
+}
+
+//func (se *SingleClassMgr) Register(i interface{}){
+//	fmt.Println("<SingleClassMgr> Register", reflect.ValueOf(i), reflect.TypeOf(i).String())
+//	className := reflect.TypeOf(i).String()
+//	se.DictInfo[className] = i
+//	fmt.Println(se.DictInfo)
+//}
+//
+//func (se *SingleClassMgr) GetObj(objName string) interface{}{
+//	obj, ok := se.DictInfo[objName]
+//	if ok == true {
+//		return obj
+//	} else {
+//		fmt.Println("<SingleClassMgr> GetObj nil, objName:", objName)
+//		return nil
+//	}
+//}

+ 100 - 0
public/doc/cmd.md

@@ -0,0 +1,100 @@
+[TOC]
+
+
+## 命令参考
+
+### 环境搭建
+- 安装go环境
+    - 安装go管理插件g:参考[github](https://github.com/voidint/g)
+    - 设置代理:`go env -w GOPROXY=https://goproxy.cn,direct`
+- 安装protoc
+    - 进入[protobuf release](https://github.com/protocolbuffers/protobuf/releases)
+    - 下载对应压缩包并解压进入目录
+    - 将启动的protoc二进制文件移动到环境变量path下,如:
+      > mv protoc /root/bin/
+    - 验证安装结果:
+      > protoc --version
+    - 安装goctl:
+      > go get -u github.com/zeromicro/go-zero/tools/goctl
+      > cp /root/go/bin/goctl /root/bin/
+
+### 构建工程
+```
+cd path/proto
+goctl rpc proto -src x.proto -dir ../ --style go_zero
+```
+
+### 构建model
+```
+cd path/model
+goctl model mysql ddl -src configs.sql -dir . -style go_zero -c
+```
+
+### 生成base.proto
+```
+protoc --go_out=../pb/ --go_opt=paths=source_relative commands.proto message.proto
+
+```
+
+------------
+
+
+### docker相关
+
+#### centos7安装docker
+
+###### 卸载已有docker
+- `service stop docker`
+- `yum remove docker`
+- `yum remove docker-common`
+- `yum remove docker-client`
+
+######安装docker
+```
+curl -fsSL https://get.docker.com/ | sh
+service docker start
+```
+###### 修改docker存储路径
+- 新建存储路径
+> mkdir /opt/data/docker
+- 修改docker.service配置
+```
+# vim /usr/lib/systemd/system/docker.service
+#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (注释原先的)
+ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph=/data/docker(新增的)
+```
+- 重启服务
+-  `systemctl daemon-reload`
+- `systemctl restart docker`
+------------
+
+
+#### 生成Dockerfile并运行
+
+###### Dockerfile
+- `goctl docker -go hello.go`
+
+###### build
+- `docker build -t hello:v1 -f Dockerfile .`
+- `docker build -t call:v1 -f call/rpc/Dockerfile .`
+
+###### run
+- ` docker run --rm -it -p 8888:8888 --name hello hello:v1`
+- `docker run  --network host --name call -d call:v2`
+
+------------
+
+
+#### docker常用命令
+- 进入bash:`docker exec -it {container_id} sh `
+- 查看日志:`docker logs -f {container name}`
+- 移除none镜像:`docker image prune`
+- 批量移除镜像:`docker images | grep trunking-debug | awk '{print $3}' | xargs docker rmi -f`
+
+#### 华为云构建容器
+- `docker tag greet:v2 swr.cn-south-1.myhuaweicloud.com/yyxxgame_houtai/greet:v2`
+- `docker push swr.cn-south-1.myhuaweicloud.com/yyxxgame_houtai/greet:v2`
+
+### 参考文档
+[go-zero官方文档](https://go-zero.dev/cn/)
+[华为云容器镜像上传服务](https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html)

+ 10 - 0
public/es/config.go

@@ -0,0 +1,10 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package es_mgr
+
+type EsConfig struct {
+	UserName  string
+	Password  string
+	Addresses []string
+}

+ 173 - 0
public/es/es_mgr.go

@@ -0,0 +1,173 @@
+//@Author   : KaiShin
+//@Time     : 2021/10/28
+
+package es_mgr
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"github.com/elastic/go-elasticsearch/v7"
+	"github.com/elastic/go-elasticsearch/v7/esapi"
+	"github.com/farmerx/elasticsql"
+	"github.com/tal-tech/go-zero/core/logx"
+	"io"
+)
+
+type EsMgr struct {
+	Es *elasticsearch.Client
+}
+
+type EsMgrInterface interface {
+	Insert(index string, data map[string]interface{})
+	Query(sql string) []interface{}
+}
+
+func New(conf EsConfig) EsMgrInterface {
+	var sel = new(EsMgr)
+
+	config := elasticsearch.Config{
+		Addresses: conf.Addresses,
+		Username:  conf.UserName,
+		Password:  conf.Password,
+	}
+
+	es, err := elasticsearch.NewClient(config)
+	if err != nil {
+		logx.Error("[EsMgr.Init] elasticsearch.NewClient failed, err:", err)
+		return nil
+	}
+
+	sel.Es = es
+	logx.Info("[EsMgr.Init], address: ", conf.Addresses)
+	return sel
+}
+
+func (sel *EsMgr) Insert(index string, data map[string]interface{}) {
+	var buf bytes.Buffer
+	if err := json.NewEncoder(&buf).Encode(data); err != nil {
+		logx.Errorf("[EsMgr.Insert] err:", err)
+		return
+	}
+
+	req := esapi.IndexRequest{
+		Index:   index,
+		Body:    &buf,
+		Refresh: "true",
+	}
+	res, err := req.Do(context.Background(), sel.Es)
+	if err != nil {
+		logx.Errorf("[EsMgr.Insert] Error getting response: %s", err)
+		return
+	}
+	defer res.Body.Close()
+
+	if res.IsError() {
+		logx.Errorf("[EsMgr.Insert] [%s] Error indexing document data=%s", res.Status(), data)
+	}
+
+	defer func(Body io.ReadCloser) {
+		err := Body.Close()
+		if err != nil {
+
+		}
+	}(res.Body)
+
+}
+
+func (sel *EsMgr) Query(sql string) []interface{} {
+	// dsl, index, err := elasticsql.Convert(sql)
+	index, dsl, err := elasticsql.NewElasticSQL().SQLConvert(sql)
+	if err != nil {
+		logx.Errorf("[EsMgr.Query] Convert, err: %s", err)
+		return nil
+	}
+	// logx.Infof("[DEBUG][EsMgr.Query] dsl:", dsl)
+
+	var query map[string]interface{}
+	err = json.Unmarshal([]byte(dsl), &query)
+	if err != nil {
+		logx.Errorf("[EsMgr.Query] json.Unmarshal err: %s", err)
+		return nil
+	}
+
+	var buf bytes.Buffer
+	if err := json.NewEncoder(&buf).Encode(query); err != nil {
+		logx.Errorf("[EsMgr.Query] json.NewEncoder err: %s", err)
+		return nil
+	}
+
+	////// todo sql query demo
+	//q := map[string] interface{}{
+	//	"query": sql,
+	//}
+	//jsonBody, _ := json.Marshal(q)
+	//req := esapi.SQLQueryRequest{Body: bytes.NewReader(jsonBody)}
+	//res, _ := req.Do(context.Background(), sel.Es)
+	//
+	//defer res.Body.Close()
+	//log.Println(res.String())
+
+	res, err := sel.Es.Search(
+		sel.Es.Search.WithContext(context.Background()),
+		sel.Es.Search.WithIndex(index),
+		sel.Es.Search.WithBody(&buf),
+		sel.Es.Search.WithPretty(),
+	)
+	if err != nil {
+		logx.Errorf("[EsMgr.Query] Es.Search err: %s", err)
+		return nil
+	}
+
+	defer func(Body io.ReadCloser) {
+		err := Body.Close()
+		if err != nil {
+
+		}
+	}(res.Body)
+
+	var r map[string]interface{}
+	if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
+		logx.Errorf("[EsMgr.Query] err: %s", err)
+		return nil
+	}
+	_, ok := r["error"]
+	if ok == true {
+		logx.Infof("[EsMgr.Query] es search err, err:%+v", r)
+		return nil
+	}
+	var dataList []interface{}
+	hits := r["hits"].(map[string]interface{})["hits"].([]interface{})
+	for _, data := range hits {
+		dataList = append(dataList, data.(map[string]interface{})["_source"])
+	}
+	return dataList
+}
+
+func (sel *EsMgr) parseConf(confStr string) ([]string, string, string) {
+	var mapConfStr map[string]interface{}
+	err := json.Unmarshal([]byte(confStr), &mapConfStr)
+	if err != nil {
+		return nil, "", ""
+	}
+
+	address, ok := mapConfStr["Addresses"].([]interface{})
+	if ok != true {
+		return nil, "", ""
+	}
+	var addStrList []string
+	for _, addr := range address {
+		addStrList = append(addStrList, addr.(string))
+	}
+
+	username, ok := mapConfStr["Username"].(string)
+	if ok != true {
+		return nil, "", ""
+	}
+	password, ok := mapConfStr["Password"].(string)
+	if ok != true {
+		return nil, "", ""
+	}
+
+	return addStrList, username, password
+}

+ 77 - 0
public/exception/exception.go

@@ -0,0 +1,77 @@
+package exception
+
+import (
+	"errors"
+	"fmt"
+	"github.com/tal-tech/go-zero/core/logx"
+)
+
+type Exception interface {
+}
+
+type TryStruct struct {
+	catches map[string]HandlerEx
+	try     func()
+}
+
+func Try(tryHandler func()) *TryStruct {
+	tryStruct := TryStruct{
+		catches: make(map[string]HandlerEx),
+		try:     tryHandler,
+	}
+	return &tryStruct
+}
+
+type HandlerEx func(Exception)
+
+func (sel *TryStruct) Catches(exceptionId string, catch func(Exception)) *TryStruct {
+	sel.catches[exceptionId] = catch
+	return sel
+}
+
+func (sel *TryStruct) Catch(catch func(Exception)) *TryStruct {
+	sel.catches["default"] = catch
+	return sel
+}
+
+func (sel *TryStruct) Finally(finally func()) {
+	defer func() {
+		if e := recover(); nil != e {
+			exception := ""
+			switch e.(type) {
+			case string:
+				exception = e.(string)
+			case error:
+				err := e.(error)
+				exception = err.Error()
+			}
+
+			if catch, ok := sel.catches[exception]; ok {
+				catch(e)
+			} else if catch, ok = sel.catches["default"]; ok {
+				catch(e)
+			}
+
+			logx.Info("[Exception] err:", e)
+		}
+		finally()
+	}()
+
+	sel.try()
+}
+
+func Throw(err interface{}) Exception {
+	switch err.(type) {
+	case string:
+		err = errors.New(err.(string))
+	case int32:
+		errStr := fmt.Sprintf("%d", err)
+		err = errors.New(errStr)
+	}
+	panic(err)
+}
+
+func MakeError(errCode int32, errStr string) error {
+	s := fmt.Sprintf("%d@%s", errCode, errStr)
+	return errors.New(s)
+}