From 3fcc2c267815a107cd1e62cc74df50355bea7d02 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Sat, 3 Sep 2022 15:48:45 +0800 Subject: [PATCH 01/69] cache for GetDefaultGatewayConn4Unique --- pkg/grpc-etcdv3/getcdv3/resolver.go | 33 +++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/pkg/grpc-etcdv3/getcdv3/resolver.go b/pkg/grpc-etcdv3/getcdv3/resolver.go index e77bb626b..878cabc64 100644 --- a/pkg/grpc-etcdv3/getcdv3/resolver.go +++ b/pkg/grpc-etcdv3/getcdv3/resolver.go @@ -6,7 +6,6 @@ import ( "Open_IM/pkg/utils" "context" "fmt" - "go.etcd.io/etcd/api/v3/mvccpb" clientv3 "go.etcd.io/etcd/client/v3" @@ -277,8 +276,38 @@ func (r *Resolver) watch(prefix string, addrList []resolver.Address) { } } +var Conn4UniqueList []*grpc.ClientConn +var Conn4UniqueListMtx sync.RWMutex +var IsUpdateStart bool +var IsUpdateStartMtx sync.RWMutex + func GetDefaultGatewayConn4Unique(schema, etcdaddr, operationID string) []*grpc.ClientConn { - grpcConns := getConn4Unique(schema, etcdaddr, config.Config.RpcRegisterName.OpenImRelayName) + IsUpdateStartMtx.Lock() + if IsUpdateStart == false { + Conn4UniqueList = getConn4Unique(schema, etcdaddr, config.Config.RpcRegisterName.OpenImRelayName) + go func() { + for { + select { + case <-time.After(time.Second * time.Duration(30)): + Conn4UniqueListMtx.Lock() + Conn4UniqueList = getConn4Unique(schema, etcdaddr, config.Config.RpcRegisterName.OpenImRelayName) + Conn4UniqueListMtx.Unlock() + } + } + }() + } + IsUpdateStart = true + IsUpdateStartMtx.Unlock() + + Conn4UniqueListMtx.Lock() + var clientConnList []*grpc.ClientConn + for _, v := range Conn4UniqueList { + clientConnList = append(clientConnList, v) + } + Conn4UniqueListMtx.Unlock() + + //grpcConns := getConn4Unique(schema, etcdaddr, config.Config.RpcRegisterName.OpenImRelayName) + grpcConns := clientConnList if len(grpcConns) > 0 { return grpcConns } From 6754fdb580907d96b55f7c0d01f45d6692027d93 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 7 Sep 2022 18:20:41 +0800 Subject: [PATCH 02/69] getui --- config/config.yaml | 2 ++ internal/push/getui/push.go | 16 ++++++++++------ pkg/common/config/config.go | 2 ++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 6e10a65b2..c738166fd 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -221,6 +221,8 @@ push: appKey: "" intent: "" enable: false + channelID: "" + channelName: "" fcm: #firebase cloud message 消息推送 serviceAccount: "openim-5c6c0-firebase-adminsdk-ppwol-8765884a78.json" #帐号文件,此处需要改修配置,并且这个文件放在 config目录下 enable: false diff --git a/internal/push/getui/push.go b/internal/push/getui/push.go index 7f7012bb2..27c107b8c 100644 --- a/internal/push/getui/push.go +++ b/internal/push/getui/push.go @@ -88,9 +88,11 @@ type Android struct { } type Notification struct { - Title string `json:"title"` - Body string `json:"body"` - ClickType string `json:"click_type"` + Title string `json:"title"` + Body string `json:"body"` + ChannelID string `json:"channelID"` + ChannelName string `json:"ChannelName"` + ClickType string `json:"click_type"` } type Options struct { @@ -135,9 +137,11 @@ func (g *Getui) Push(userIDList []string, alert, detailContent, operationID stri }{Alias: []string{userIDList[0]}}, } pushReq.PushMessage.Notification = Notification{ - Title: alert, - Body: alert, - ClickType: "startapp", + Title: alert, + Body: alert, + ClickType: "startapp", + ChannelID: config.Config.Push.Getui.ChannelID, + ChannelName: config.Config.Push.Getui.ChannelName, } pushReq.PushChannel.Ios.Aps.Sound = "default" pushReq.PushChannel.Ios.Aps.Alert = Alert{ diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index d5450aa11..6440467ba 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -199,6 +199,8 @@ type config struct { Enable bool `yaml:"enable"` Intent string `yaml:"intent"` MasterSecret string `yaml:"masterSecret"` + ChannelID string `yaml:"channelID"` + ChannelName string `yaml:"channelName"` } Fcm struct { ServiceAccount string `yaml:"serviceAccount"` From 9a5c0bae50a207c08bc314a797f95c35cf2f1e85 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Tue, 13 Sep 2022 18:02:37 +0800 Subject: [PATCH 03/69] hash --- internal/rpc/group/group.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 9c0eb6bc8..a36547c2c 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -1552,6 +1552,9 @@ func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGrou if err := rocksCache.DelGroupInfoFromCache(req.GroupID); err != nil { log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID) } + if err := rocksCache.DelGroupMemberListHashFromCache(req.GroupID); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error(), req.GroupID) + } log.NewInfo(req.OperationID, utils.GetSelfFuncName(), "rpc return ", pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}) return &pbGroup.DismissGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil } From 0d52759455757ff207662501b393d483350234ff Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 13 Sep 2022 18:15:33 +0800 Subject: [PATCH 04/69] fix bug : messages can be sent after the group is disbanded --- go.mod | 3 +-- go.sum | 23 ++++++----------------- internal/utils/local_cache.go | 7 +++++++ 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index eb00c505f..6bb3ab4c0 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/olivere/elastic/v7 v7.0.23 github.com/pelletier/go-toml/v2 v2.0.2 // indirect github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.13.0 // indirect + github.com/prometheus/client_golang v1.13.0 github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.8.1 @@ -49,7 +49,6 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.428 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.428 github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca - github.com/xuri/excelize/v2 v2.6.0 go.etcd.io/etcd/api/v3 v3.5.4 go.etcd.io/etcd/client/v3 v3.5.4 go.mongodb.org/mongo-driver v1.8.3 diff --git a/go.sum b/go.sum index 74c81cccd..945c71ab3 100644 --- a/go.sum +++ b/go.sum @@ -156,6 +156,7 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= @@ -178,6 +179,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m 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/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -249,6 +251,7 @@ 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/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0= github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= 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= @@ -419,6 +422,7 @@ github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkL github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8= github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= +github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lithammer/shortuuid v3.0.0+incompatible h1:NcD0xWW/MZYXEHa6ITy6kaXN5nwm/V115vj2YXfhS0w= github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w= @@ -430,6 +434,7 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= 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= @@ -450,8 +455,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= 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= @@ -521,10 +524,6 @@ github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= -github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= -github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o= -github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= @@ -594,12 +593,6 @@ github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyh github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg/scram v1.0.3/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xuri/efp v0.0.0-20220407160117-ad0f7a785be8 h1:3X7aE0iLKJ5j+tz58BpvIZkXNV7Yq4jC93Z/rbN2Fxk= -github.com/xuri/efp v0.0.0-20220407160117-ad0f7a785be8/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/excelize/v2 v2.6.0 h1:m/aXAzSAqxgt74Nfd+sNzpzVKhTGl7+S9nbG4A57mF4= -github.com/xuri/excelize/v2 v2.6.0/go.mod h1:Q1YetlHesXEKwGFfeJn7PfEZz2IvHb6wdOeYjBxVcVs= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M= -github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -654,7 +647,6 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -747,7 +739,6 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220622184535-263ec571b305 h1:dAgbJ2SP4jD6XYfMNLVj0BF21jo2PjChrtGaAvF5M3I= golang.org/x/net v0.0.0-20220622184535-263ec571b305/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -766,8 +757,8 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 h1:B333XXssMuKQeBwiNODx4TupZy7bf4sxFZnN2ZOcvUE= golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= @@ -779,7 +770,6 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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 h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1076,7 +1066,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= diff --git a/internal/utils/local_cache.go b/internal/utils/local_cache.go index 5efec4fb3..b37692d2a 100644 --- a/internal/utils/local_cache.go +++ b/internal/utils/local_cache.go @@ -33,6 +33,13 @@ func GetGroupMemberUserIDList(groupID string, operationID string) ([]string, err CacheGroupMtx.Lock() defer CacheGroupMtx.Unlock() + + if groupHashRemote == 0 { + log.Info(operationID, "groupHashRemote == 0 ", groupID) + delete(CacheGroupMemberUserIDList, groupID) + return []string{}, nil + } + groupInLocalCache, ok := CacheGroupMemberUserIDList[groupID] if ok && groupInLocalCache.MemberListHash == groupHashRemote { log.Debug(operationID, "in local cache ", groupID) From d491c482a5243c9954f4fc83f837c8c04a15a957 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Tue, 13 Sep 2022 18:31:47 +0800 Subject: [PATCH 05/69] hash --- pkg/common/db/rocks_cache/rocks_cache.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/common/db/rocks_cache/rocks_cache.go b/pkg/common/db/rocks_cache/rocks_cache.go index ce8bd76c6..b8346c0d0 100644 --- a/pkg/common/db/rocks_cache/rocks_cache.go +++ b/pkg/common/db/rocks_cache/rocks_cache.go @@ -433,6 +433,13 @@ func DelJoinedSuperGroupIDListFromCache(userID string) error { func GetGroupMemberListHashFromCache(groupID string) (uint64, error) { generateHash := func() (string, error) { + groupInfo, err := GetGroupInfoFromCache(groupID) + if err != nil { + return "0", utils.Wrap(err, "GetGroupInfoFromCache failed") + } + if groupInfo.Status == constant.GroupStatusDismissed { + return "0", nil + } groupMemberIDList, err := GetGroupMemberIDListFromCache(groupID) if err != nil { return "", utils.Wrap(err, "GetGroupMemberIDListFromCache failed") @@ -447,6 +454,9 @@ func GetGroupMemberListHashFromCache(groupID string) (uint64, error) { return strconv.Itoa(int(bi.Uint64())), nil } hashCode, err := db.DB.Rc.Fetch(groupMemberListHashCache+groupID, time.Second*30*60, generateHash) + if err != nil { + return 0, utils.Wrap(err, "fetch failed") + } hashCodeUint64, err := strconv.Atoi(hashCode) return uint64(hashCodeUint64), err } From e32a3fbfcae33f1394b61de902af209945bd5a86 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Tue, 13 Sep 2022 19:58:48 +0800 Subject: [PATCH 06/69] hash --- .../msg_transfer/logic/persistent_msg_handler.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/internal/msg_transfer/logic/persistent_msg_handler.go b/internal/msg_transfer/logic/persistent_msg_handler.go index dec72181b..52049a6f1 100644 --- a/internal/msg_transfer/logic/persistent_msg_handler.go +++ b/internal/msg_transfer/logic/persistent_msg_handler.go @@ -44,6 +44,7 @@ func (pc *PersistentConsumerHandler) Init() { } func (pc *PersistentConsumerHandler) initPrometheus() { + // counter msgInsertMysqlCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "insert_mysql_msg_total", Help: "The total number of msg insert mysql events", @@ -52,6 +53,13 @@ func (pc *PersistentConsumerHandler) initPrometheus() { Name: "insert_mysql_failed_msg_total", Help: "The total number of msg insert mysql events", }) + + // msgInsertMysqlEvery := prometheus.NewHistogram(prometheus.HistogramOpts{ + // Name: "http_request_duration_seconds", + // Help: "A histogram of the HTTP request durations in seconds.", + // Buckets: []float64{10, 20, 0.25, 0.5, 1, 2.5, 5, 10}, + // }) + } func (pc *PersistentConsumerHandler) handleChatWs2Mysql(cMsg *sarama.ConsumerMessage, msgKey string, _ sarama.ConsumerGroupSession) { @@ -85,7 +93,9 @@ func (pc *PersistentConsumerHandler) handleChatWs2Mysql(cMsg *sarama.ConsumerMes log.NewInfo(msgFromMQ.OperationID, "msg_transfer msg persisting", string(msg)) if err = im_mysql_msg_model.InsertMessageToChatLog(msgFromMQ); err != nil { log.NewError(msgFromMQ.OperationID, "Message insert failed", "err", err.Error(), "msg", msgFromMQ.String()) - msgInsertFailedMysqlCounter.Inc() + if config.Config.Prometheus.Enable { + msgInsertFailedMysqlCounter.Inc() + } return } if config.Config.Prometheus.Enable { From 54a3a755d688a1b631ea24da9934568d528bfd1b Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 10:25:31 +0800 Subject: [PATCH 07/69] prome --- script/msg_transfer_start.sh | 7 ++++++- script/start_rpc_service.sh | 2 -- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/script/msg_transfer_start.sh b/script/msg_transfer_start.sh index b54513999..8a66ec35e 100755 --- a/script/msg_transfer_start.sh +++ b/script/msg_transfer_start.sh @@ -22,7 +22,12 @@ sleep 1 cd ${msg_transfer_binary_root} for ((i = 0; i < ${msg_transfer_service_num}; i++)); do - nohup ./${msg_transfer_name} -prometheus_port ${prome_ports[$i]} >>../logs/openIM.log 2>&1 & + prome_port=${prome_ports[$i]} + cmd="nohup ./${msg_transfer_name}" + if [ $prome_port != "" ]; then + cmd=$cmd+" -prometheus_port $prome_port" + fi + $cmd >>../logs/openIM.log 2>&1 & done #Check launched service process diff --git a/script/start_rpc_service.sh b/script/start_rpc_service.sh index bb53a85b6..8abfde5ed 100644 --- a/script/start_rpc_service.sh +++ b/script/start_rpc_service.sh @@ -80,10 +80,8 @@ for ((i = 0; i < ${#service_filename[*]}; i++)); do list_to_string $portList2 prome_ports=($ports_array) #Start related rpc services based on the number of ports - # for j in ${service_ports}; do for ((j = 0; j < ${#service_ports[*]}; j++)); do #Start the service in the background - # ./${service_filename[$i]} -port $j & cmd="./${service_filename[$i]} -port ${service_ports[$j]} -prometheus_port ${prome_ports[$j]}" if [ $i -eq 0 -o $i -eq 1 ]; then cmd="./${service_filename[$i]} -port ${service_ports[$j]}" From 4d6e05989e2900459a1f3abd64de36716d55d6b9 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 10:25:44 +0800 Subject: [PATCH 08/69] prome --- internal/msg_transfer/logic/persistent_msg_handler.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/internal/msg_transfer/logic/persistent_msg_handler.go b/internal/msg_transfer/logic/persistent_msg_handler.go index 52049a6f1..6894e7244 100644 --- a/internal/msg_transfer/logic/persistent_msg_handler.go +++ b/internal/msg_transfer/logic/persistent_msg_handler.go @@ -54,12 +54,16 @@ func (pc *PersistentConsumerHandler) initPrometheus() { Help: "The total number of msg insert mysql events", }) - // msgInsertMysqlEvery := prometheus.NewHistogram(prometheus.HistogramOpts{ + // 启动计时器 + // requestDurations := prometheus.NewHistogram(prometheus.HistogramOpts{ // Name: "http_request_duration_seconds", // Help: "A histogram of the HTTP request durations in seconds.", - // Buckets: []float64{10, 20, 0.25, 0.5, 1, 2.5, 5, 10}, + // Buckets: []float64{0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10}, // }) - + // 开始 + // timer := prometheus.NewTimer(requestDurations) + // 停止 + // timer.ObserveDuration() } func (pc *PersistentConsumerHandler) handleChatWs2Mysql(cMsg *sarama.ConsumerMessage, msgKey string, _ sarama.ConsumerGroupSession) { From 1c53c90ab5c7da9bcca3ed0854222de96f0b87d4 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 10:29:49 +0800 Subject: [PATCH 09/69] hash --- pkg/common/db/rocks_cache/rocks_cache.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/common/db/rocks_cache/rocks_cache.go b/pkg/common/db/rocks_cache/rocks_cache.go index d698029b6..440ae40c5 100644 --- a/pkg/common/db/rocks_cache/rocks_cache.go +++ b/pkg/common/db/rocks_cache/rocks_cache.go @@ -394,6 +394,13 @@ func DelJoinedSuperGroupIDListFromCache(userID string) error { func GetGroupMemberListHashFromCache(groupID string) (uint64, error) { generateHash := func() (string, error) { + groupInfo, err := GetGroupInfoFromCache(groupID) + if err != nil { + return "0", utils.Wrap(err, "GetGroupInfoFromCache failed") + } + if groupInfo.Status == constant.GroupStatusDismissed { + return "0", nil + } groupMemberIDList, err := GetGroupMemberIDListFromCache(groupID) if err != nil { return "", utils.Wrap(err, "GetGroupMemberIDListFromCache failed") @@ -408,6 +415,9 @@ func GetGroupMemberListHashFromCache(groupID string) (uint64, error) { return strconv.Itoa(int(bi.Uint64())), nil } hashCode, err := db.DB.Rc.Fetch(groupMemberListHashCache+groupID, time.Second*30*60, generateHash) + if err != nil { + return 0, utils.Wrap(err, "fetch failed") + } hashCodeUint64, err := strconv.Atoi(hashCode) return uint64(hashCodeUint64), err } From e9ad462f9e1db3c6000c16e59537f75ea8d723d5 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 10:42:02 +0800 Subject: [PATCH 10/69] log --- cmd/open_im_api/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index 6a78121dd..a7f4e9573 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -48,7 +48,7 @@ func main() { // gin.SetMode(gin.DebugMode) r := gin.Default() r.Use(utils.CorsHandler()) - log.Info("load config: ", config.Config) + log.Info("load config: ", config.Config) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) if config.Config.Prometheus.Enable { r.GET("/metrics", promePkg.PrometheusHandler()) From 2368a8fba336021d60df63e5adc5e2890567df53 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 11:00:27 +0800 Subject: [PATCH 11/69] fix transfer --- script/msg_transfer_start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/msg_transfer_start.sh b/script/msg_transfer_start.sh index 8a66ec35e..746cf3342 100755 --- a/script/msg_transfer_start.sh +++ b/script/msg_transfer_start.sh @@ -25,7 +25,7 @@ for ((i = 0; i < ${msg_transfer_service_num}; i++)); do prome_port=${prome_ports[$i]} cmd="nohup ./${msg_transfer_name}" if [ $prome_port != "" ]; then - cmd=$cmd+" -prometheus_port $prome_port" + cmd="$cmd -prometheus_port $prome_port" fi $cmd >>../logs/openIM.log 2>&1 & done From 88af048e907c38438fb048573a0e619cf6527929 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 12:19:17 +0800 Subject: [PATCH 12/69] add log --- pkg/common/db/mysql.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go index 4f746fc1e..9702f4b43 100644 --- a/pkg/common/db/mysql.go +++ b/pkg/common/db/mysql.go @@ -23,6 +23,7 @@ func (w Writer) Printf(format string, args ...interface{}) { } func initMysqlDB() { + fmt.Println("init mysqlDB start") //When there is no open IM database, connect to the mysql built-in database to create openIM database dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], "mysql") From c018d6311781ba7f14482a5648e08a84828c3067 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 12:24:29 +0800 Subject: [PATCH 13/69] add log --- pkg/common/db/mysql.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go index 9702f4b43..d43ce736d 100644 --- a/pkg/common/db/mysql.go +++ b/pkg/common/db/mysql.go @@ -41,7 +41,7 @@ func initMysqlDB() { panic(err1.Error()) } } - + fmt.Println("init db", db) //Check the database and table during initialization sql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8 COLLATE utf8_general_ci;", config.Config.Mysql.DBDatabaseName) err = db.Exec(sql).Error @@ -49,7 +49,7 @@ func initMysqlDB() { fmt.Println("0", "Exec failed ", err.Error(), sql) panic(err.Error()) } - + fmt.Println(sql) dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], config.Config.Mysql.DBDatabaseName) @@ -69,12 +69,12 @@ func initMysqlDB() { fmt.Println("0", "Open failed ", err.Error(), dsn) panic(err.Error()) } - + fmt.Println("init db2", db) sqlDB, err := db.DB() if err != nil { panic(err.Error()) } - + fmt.Println("init sqlDB", sqlDB) sqlDB.SetConnMaxLifetime(time.Second * time.Duration(config.Config.Mysql.DBMaxLifeTime)) sqlDB.SetMaxOpenConns(config.Config.Mysql.DBMaxOpenConns) sqlDB.SetMaxIdleConns(config.Config.Mysql.DBMaxIdleConns) From 60f0c80c36267395942e5428356dad0aa23cdcb3 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 12:31:24 +0800 Subject: [PATCH 14/69] log --- cmd/open_im_api/main.go | 8 ++++---- pkg/common/config/config.go | 2 -- pkg/common/db/model.go | 4 ++-- pkg/common/db/mysql_model/im_mysql_model/user_model.go | 9 ++++----- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index a7f4e9573..0c839fc56 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -48,7 +48,7 @@ func main() { // gin.SetMode(gin.DebugMode) r := gin.Default() r.Use(utils.CorsHandler()) - log.Info("load config: ", config.Config) + fmt.Println("load config: ", config.Config) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) if config.Config.Prometheus.Enable { r.GET("/metrics", promePkg.PrometheusHandler()) @@ -226,10 +226,10 @@ func main() { if config.Config.Api.ListenIP != "" { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } - address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start api server, address: ", address) + fmt.Println("start api server, address: \n", address) err := r.Run(address) if err != nil { - log.Error("", "api run failed ", *ginPort, err.Error()) + log.Error("", "api run failed ", address, err.Error()) + panic("api start failed " + err.Error()) } } diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index b2222d6c2..730d7c0f5 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -1,7 +1,6 @@ package config import ( - "fmt" "io/ioutil" "os" "path/filepath" @@ -545,7 +544,6 @@ type PDefaultTips struct { func init() { cfgName := os.Getenv("CONFIG_NAME") - fmt.Println("GET IM DEFAULT CONFIG PATH :", Root, "ENV PATH:", cfgName) if len(cfgName) != 0 { bytes, err := ioutil.ReadFile(filepath.Join(cfgName, "config", "config.yaml")) if err != nil { diff --git a/pkg/common/db/model.go b/pkg/common/db/model.go index 0fd699018..7fe53b77a 100644 --- a/pkg/common/db/model.go +++ b/pkg/common/db/model.go @@ -77,7 +77,7 @@ func init() { panic(err1.Error()) } } - fmt.Println("0", utils.GetSelfFuncName(), "mongo driver client init success: ", uri) + fmt.Println("mongo driver client init success: ", uri) // mongodb create index if err := createMongoIndex(mongoClient, cSendLog, false, "send_id", "-send_time"); err != nil { fmt.Println("send_id", "-send_time", "index create failed", err.Error()) @@ -100,7 +100,7 @@ func init() { if err := createMongoIndex(mongoClient, cTag, true, "tag_id"); err != nil { fmt.Println("tag_id", "index create failed", err.Error()) } - fmt.Println("create index success") + fmt.Println("createMongoIndex success") DB.mongoClient = mongoClient // redis pool init diff --git a/pkg/common/db/mysql_model/im_mysql_model/user_model.go b/pkg/common/db/mysql_model/im_mysql_model/user_model.go index 7eb6fcbfe..5e280418c 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/user_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/user_model.go @@ -12,11 +12,9 @@ import ( ) func init() { - //init managers for k, v := range config.Config.Manager.AppManagerUid { - user, err := GetUserByUserID(v) + _, err := GetUserByUserID(v) if err != nil { - fmt.Println("GetUserByUserID failed ", err.Error(), v, user) } else { continue } @@ -30,9 +28,10 @@ func init() { appMgr.AppMangerLevel = constant.AppAdmin err = UserRegister(appMgr) if err != nil { - fmt.Println("AppManager insert error", err.Error(), appMgr, "time: ", appMgr.Birth.Unix()) + fmt.Println("AppManager insert error ", err.Error(), appMgr) + } else { + fmt.Println("AppManager insert ", appMgr) } - } } From 685cacf4900690d7b32740cd287b96566136eb3d Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 12:43:10 +0800 Subject: [PATCH 15/69] log --- cmd/open_im_api/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index 0c839fc56..925e81c63 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -41,6 +41,7 @@ import ( // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @BasePath / func main() { + fmt.Println("api start ") log.NewPrivateLog(constant.LogFileName) gin.SetMode(gin.ReleaseMode) f, _ := os.Create("../logs/api.log") From 7295f39d68cadbdfad5955bc8d413b272ba8eaa4 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 12:45:42 +0800 Subject: [PATCH 16/69] log --- cmd/open_im_api/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index 925e81c63..14d88f042 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -42,7 +42,6 @@ import ( // @BasePath / func main() { fmt.Println("api start ") - log.NewPrivateLog(constant.LogFileName) gin.SetMode(gin.ReleaseMode) f, _ := os.Create("../logs/api.log") gin.DefaultWriter = io.MultiWriter(f) @@ -50,6 +49,7 @@ func main() { r := gin.Default() r.Use(utils.CorsHandler()) fmt.Println("load config: ", config.Config) + log.NewPrivateLog(constant.LogFileName) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) if config.Config.Prometheus.Enable { r.GET("/metrics", promePkg.PrometheusHandler()) From f2f35e115c00c446fc4d24771acea1ac7d5a0afa Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 13:08:15 +0800 Subject: [PATCH 17/69] log --- cmd/open_im_api/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index 14d88f042..d382c965b 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -227,7 +227,7 @@ func main() { if config.Config.Api.ListenIP != "" { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } - fmt.Println("start api server, address: \n", address) + fmt.Println("start api server, address: ", address, "\n") err := r.Run(address) if err != nil { log.Error("", "api run failed ", address, err.Error()) From 4aaa1a7afa3049a25939e236eb1b79413b3988c5 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 13:09:04 +0800 Subject: [PATCH 18/69] log --- cmd/open_im_api/main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index d382c965b..38889574b 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -41,15 +41,14 @@ import ( // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @BasePath / func main() { - fmt.Println("api start ") + log.NewPrivateLog(constant.LogFileName) gin.SetMode(gin.ReleaseMode) f, _ := os.Create("../logs/api.log") gin.DefaultWriter = io.MultiWriter(f) // gin.SetMode(gin.DebugMode) r := gin.Default() r.Use(utils.CorsHandler()) - fmt.Println("load config: ", config.Config) - log.NewPrivateLog(constant.LogFileName) + log.Info("load config: ", config.Config) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) if config.Config.Prometheus.Enable { r.GET("/metrics", promePkg.PrometheusHandler()) From 72d092045882f7ff1e801d847e2a49b25b9b80fc Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 14:42:35 +0800 Subject: [PATCH 19/69] log --- cmd/open_im_cms_api/main.go | 2 +- cmd/open_im_demo/main.go | 2 +- cmd/open_im_msg_gateway/main.go | 2 +- cmd/open_im_msg_transfer/main.go | 2 +- cmd/open_im_push/main.go | 2 +- cmd/rpc/open_im_admin_cms/main.go | 2 +- cmd/rpc/open_im_auth/main.go | 2 +- cmd/rpc/open_im_cache/main.go | 2 +- cmd/rpc/open_im_conversation/main.go | 2 +- cmd/rpc/open_im_friend/main.go | 2 +- cmd/rpc/open_im_group/main.go | 2 +- cmd/rpc/open_im_msg/main.go | 2 +- cmd/rpc/open_im_office/main.go | 2 +- cmd/rpc/open_im_organization/main.go | 2 +- cmd/rpc/open_im_user/main.go | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cmd/open_im_cms_api/main.go b/cmd/open_im_cms_api/main.go index 622d72924..deaebc196 100644 --- a/cmd/open_im_cms_api/main.go +++ b/cmd/open_im_cms_api/main.go @@ -24,6 +24,6 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start cms api server, address: ", address) + fmt.Println("start cms api server, address: ", address, "\n") router.Run(address) } diff --git a/cmd/open_im_demo/main.go b/cmd/open_im_demo/main.go index 1125c7827..703a9a74d 100644 --- a/cmd/open_im_demo/main.go +++ b/cmd/open_im_demo/main.go @@ -71,7 +71,7 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start demo api server address: ", address) + fmt.Println("start demo api server address: ", address, "\n") go register.OnboardingProcessRoutine() go register.ImportFriendRoutine() err := r.Run(address) diff --git a/cmd/open_im_msg_gateway/main.go b/cmd/open_im_msg_gateway/main.go index 32d6df69f..cc6621ffc 100644 --- a/cmd/open_im_msg_gateway/main.go +++ b/cmd/open_im_msg_gateway/main.go @@ -21,7 +21,7 @@ func main() { flag.Parse() var wg sync.WaitGroup wg.Add(1) - fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort) + fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, "\n") gate.Init(*rpcPort, *wsPort) gate.Run(*prometheusPort) wg.Wait() diff --git a/cmd/open_im_msg_transfer/main.go b/cmd/open_im_msg_transfer/main.go index c112c56ba..4b501406e 100644 --- a/cmd/open_im_msg_transfer/main.go +++ b/cmd/open_im_msg_transfer/main.go @@ -17,7 +17,7 @@ func main() { flag.Parse() log.NewPrivateLog(constant.LogFileName) logic.Init() - fmt.Println("start msg_transfer server") + fmt.Println("start msg_transfer server \n") logic.Run(*prometheusPort) wg.Wait() } diff --git a/cmd/open_im_push/main.go b/cmd/open_im_push/main.go index 806515524..09ffde048 100644 --- a/cmd/open_im_push/main.go +++ b/cmd/open_im_push/main.go @@ -18,7 +18,7 @@ func main() { var wg sync.WaitGroup wg.Add(1) log.NewPrivateLog(constant.LogFileName) - fmt.Println("start push rpc server, port: ", *rpcPort) + fmt.Println("start push rpc server, port: ", *rpcPort, "\n") logic.Init(*rpcPort) logic.Run(*prometheusPort) wg.Wait() diff --git a/cmd/rpc/open_im_admin_cms/main.go b/cmd/rpc/open_im_admin_cms/main.go index 57c73713b..1f2dfb51c 100644 --- a/cmd/rpc/open_im_admin_cms/main.go +++ b/cmd/rpc/open_im_admin_cms/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AdminCmsPrometheusPort[0], "adminCMSPrometheusPort default listen port") flag.Parse() - fmt.Println("start cms rpc server, port: ", *rpcPort) + fmt.Println("start cms rpc server, port: ", *rpcPort, "\n") rpcServer := rpcMessageCMS.NewAdminCMSServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_auth/main.go b/cmd/rpc/open_im_auth/main.go index 113f1c646..063cda4a1 100644 --- a/cmd/rpc/open_im_auth/main.go +++ b/cmd/rpc/open_im_auth/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AuthPrometheusPort[0], "authPrometheusPort default listen port") flag.Parse() - fmt.Println("start auth rpc server, port: ", *rpcPort) + fmt.Println("start auth rpc server, port: ", *rpcPort, "\n") rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_cache/main.go b/cmd/rpc/open_im_cache/main.go index 002d71bdf..185e8fac1 100644 --- a/cmd/rpc/open_im_cache/main.go +++ b/cmd/rpc/open_im_cache/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.CachePrometheusPort[0], "cachePrometheusPort default listen port") flag.Parse() - fmt.Println("start cache rpc server, port: ", *rpcPort) + fmt.Println("start cache rpc server, port: ", *rpcPort, "\n") rpcServer := rpcCache.NewCacheServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_conversation/main.go b/cmd/rpc/open_im_conversation/main.go index 0980c7a96..268aa5ed9 100644 --- a/cmd/rpc/open_im_conversation/main.go +++ b/cmd/rpc/open_im_conversation/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcConversation default listen port 11300") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.ConversationPrometheusPort[0], "conversationPrometheusPort default listen port") flag.Parse() - fmt.Println("start conversation rpc server, port: ", *rpcPort) + fmt.Println("start conversation rpc server, port: ", *rpcPort, "\n") rpcServer := rpcConversation.NewRpcConversationServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_friend/main.go b/cmd/rpc/open_im_friend/main.go index b8ad67aba..489b8541d 100644 --- a/cmd/rpc/open_im_friend/main.go +++ b/cmd/rpc/open_im_friend/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcFriendPort from cmd,default 12000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.FriendPrometheusPort[0], "friendPrometheusPort default listen port") flag.Parse() - fmt.Println("start friend rpc server, port: ", *rpcPort) + fmt.Println("start friend rpc server, port: ", *rpcPort, "\n") rpcServer := friend.NewFriendServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_group/main.go b/cmd/rpc/open_im_group/main.go index 3961b93d0..8e32f48ab 100644 --- a/cmd/rpc/open_im_group/main.go +++ b/cmd/rpc/open_im_group/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcGroupPort from cmd,default 16000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.GroupPrometheusPort[0], "groupPrometheusPort default listen port") flag.Parse() - fmt.Println("start group rpc server, port: ", *rpcPort) + fmt.Println("start group rpc server, port: ", *rpcPort, "\n") rpcServer := group.NewGroupServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_msg/main.go b/cmd/rpc/open_im_msg/main.go index e198adac3..34294e546 100644 --- a/cmd/rpc/open_im_msg/main.go +++ b/cmd/rpc/open_im_msg/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.MessagePrometheusPort[0], "msgPrometheusPort default listen port") flag.Parse() - fmt.Println("start msg rpc server, port: ", *rpcPort) + fmt.Println("start msg rpc server, port: ", *rpcPort, "\n") rpcServer := msg.NewRpcChatServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_office/main.go b/cmd/rpc/open_im_office/main.go index 0597a53de..369328319 100644 --- a/cmd/rpc/open_im_office/main.go +++ b/cmd/rpc/open_im_office/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OfficePrometheusPort[0], "officePrometheusPort default listen port") flag.Parse() - fmt.Println("start office rpc server, port: ", *rpcPort) + fmt.Println("start office rpc server, port: ", *rpcPort, "\n") rpcServer := rpc.NewOfficeServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_organization/main.go b/cmd/rpc/open_im_organization/main.go index 66d817eac..3b748c010 100644 --- a/cmd/rpc/open_im_organization/main.go +++ b/cmd/rpc/open_im_organization/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcOrganizationPort from cmd,default 11200 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OrganizationPrometheusPort[0], "organizationPrometheusPort default listen port") flag.Parse() - fmt.Println("start organization rpc server, port: ", *rpcPort) + fmt.Println("start organization rpc server, port: ", *rpcPort, "\n") rpcServer := organization.NewServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_user/main.go b/cmd/rpc/open_im_user/main.go index 7895894dc..61fc25790 100644 --- a/cmd/rpc/open_im_user/main.go +++ b/cmd/rpc/open_im_user/main.go @@ -13,7 +13,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.UserPrometheusPort[0], "userPrometheusPort default listen port") flag.Parse() - fmt.Println("start user rpc server, port: ", *rpcPort) + fmt.Println("start user rpc server, port: ", *rpcPort, "\n") rpcServer := user.NewUserServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) From 285cb346b925780d67c9271a55f5d86b064a6f4b Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 14:52:14 +0800 Subject: [PATCH 20/69] log --- pkg/utils/get_server_ip.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/utils/get_server_ip.go b/pkg/utils/get_server_ip.go index 63156f26f..b8056af9d 100644 --- a/pkg/utils/get_server_ip.go +++ b/pkg/utils/get_server_ip.go @@ -2,7 +2,6 @@ package utils import ( "errors" - "fmt" "net" ) @@ -11,14 +10,12 @@ var ServerIP = "" func GetLocalIP() (string, error) { addrs, err := net.InterfaceAddrs() if err != nil { - return "", err } for _, address := range addrs { if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { - fmt.Println(ipnet.IP.String()) return ipnet.IP.String(), nil } } From e7ab59a9328f6f4a2f4df5218db38f38cf601ad8 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 15:24:56 +0800 Subject: [PATCH 21/69] log --- cmd/open_im_api/main.go | 2 +- cmd/open_im_cms_api/main.go | 3 ++- cmd/open_im_demo/main.go | 2 +- cmd/open_im_msg_gateway/main.go | 2 +- cmd/open_im_msg_transfer/main.go | 2 +- cmd/open_im_push/main.go | 2 +- cmd/rpc/open_im_admin_cms/main.go | 3 ++- cmd/rpc/open_im_auth/main.go | 3 ++- cmd/rpc/open_im_cache/main.go | 3 ++- cmd/rpc/open_im_conversation/main.go | 3 ++- cmd/rpc/open_im_friend/main.go | 3 ++- cmd/rpc/open_im_group/main.go | 3 ++- cmd/rpc/open_im_msg/main.go | 3 ++- cmd/rpc/open_im_office/main.go | 3 ++- cmd/rpc/open_im_organization/main.go | 3 ++- cmd/rpc/open_im_user/main.go | 3 ++- pkg/common/constant/constant.go | 2 ++ 17 files changed, 29 insertions(+), 16 deletions(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index 38889574b..b13fc5d68 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -226,7 +226,7 @@ func main() { if config.Config.Api.ListenIP != "" { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } - fmt.Println("start api server, address: ", address, "\n") + fmt.Println("start api server, address: ", address, "version: ", constant.CurrentVersion, "\n") err := r.Run(address) if err != nil { log.Error("", "api run failed ", address, err.Error()) diff --git a/cmd/open_im_cms_api/main.go b/cmd/open_im_cms_api/main.go index deaebc196..3cc52c75d 100644 --- a/cmd/open_im_cms_api/main.go +++ b/cmd/open_im_cms_api/main.go @@ -2,6 +2,7 @@ package main import ( "Open_IM/internal/cms_api" + "Open_IM/pkg/common/constant" "Open_IM/pkg/utils" "flag" "fmt" @@ -24,6 +25,6 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start cms api server, address: ", address, "\n") + fmt.Println("start cms api server, address: ", address, "version: ", constant.CurrentVersion, "\n") router.Run(address) } diff --git a/cmd/open_im_demo/main.go b/cmd/open_im_demo/main.go index 703a9a74d..30dfca176 100644 --- a/cmd/open_im_demo/main.go +++ b/cmd/open_im_demo/main.go @@ -71,7 +71,7 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start demo api server address: ", address, "\n") + fmt.Println("start demo api server address: ", address, "version: ", constant.CurrentVersion, "\n") go register.OnboardingProcessRoutine() go register.ImportFriendRoutine() err := r.Run(address) diff --git a/cmd/open_im_msg_gateway/main.go b/cmd/open_im_msg_gateway/main.go index cc6621ffc..f61f105a9 100644 --- a/cmd/open_im_msg_gateway/main.go +++ b/cmd/open_im_msg_gateway/main.go @@ -21,7 +21,7 @@ func main() { flag.Parse() var wg sync.WaitGroup wg.Add(1) - fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, "\n") + fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, "version: ", constant.CurrentVersion, "\n") gate.Init(*rpcPort, *wsPort) gate.Run(*prometheusPort) wg.Wait() diff --git a/cmd/open_im_msg_transfer/main.go b/cmd/open_im_msg_transfer/main.go index 4b501406e..b7e7cb88f 100644 --- a/cmd/open_im_msg_transfer/main.go +++ b/cmd/open_im_msg_transfer/main.go @@ -17,7 +17,7 @@ func main() { flag.Parse() log.NewPrivateLog(constant.LogFileName) logic.Init() - fmt.Println("start msg_transfer server \n") + fmt.Println("start msg_transfer server ", "version: ", constant.CurrentVersion, "\n") logic.Run(*prometheusPort) wg.Wait() } diff --git a/cmd/open_im_push/main.go b/cmd/open_im_push/main.go index 09ffde048..c7b1cfe37 100644 --- a/cmd/open_im_push/main.go +++ b/cmd/open_im_push/main.go @@ -18,7 +18,7 @@ func main() { var wg sync.WaitGroup wg.Add(1) log.NewPrivateLog(constant.LogFileName) - fmt.Println("start push rpc server, port: ", *rpcPort, "\n") + fmt.Println("start push rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") logic.Init(*rpcPort) logic.Run(*prometheusPort) wg.Wait() diff --git a/cmd/rpc/open_im_admin_cms/main.go b/cmd/rpc/open_im_admin_cms/main.go index 1f2dfb51c..22f775939 100644 --- a/cmd/rpc/open_im_admin_cms/main.go +++ b/cmd/rpc/open_im_admin_cms/main.go @@ -3,6 +3,7 @@ package main import ( rpcMessageCMS "Open_IM/internal/rpc/admin_cms" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AdminCmsPrometheusPort[0], "adminCMSPrometheusPort default listen port") flag.Parse() - fmt.Println("start cms rpc server, port: ", *rpcPort, "\n") + fmt.Println("start cms rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := rpcMessageCMS.NewAdminCMSServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_auth/main.go b/cmd/rpc/open_im_auth/main.go index 063cda4a1..0255516b5 100644 --- a/cmd/rpc/open_im_auth/main.go +++ b/cmd/rpc/open_im_auth/main.go @@ -3,6 +3,7 @@ package main import ( rpcAuth "Open_IM/internal/rpc/auth" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AuthPrometheusPort[0], "authPrometheusPort default listen port") flag.Parse() - fmt.Println("start auth rpc server, port: ", *rpcPort, "\n") + fmt.Println("start auth rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_cache/main.go b/cmd/rpc/open_im_cache/main.go index 185e8fac1..c685a0a2c 100644 --- a/cmd/rpc/open_im_cache/main.go +++ b/cmd/rpc/open_im_cache/main.go @@ -3,6 +3,7 @@ package main import ( rpcCache "Open_IM/internal/rpc/cache" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" @@ -14,7 +15,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.CachePrometheusPort[0], "cachePrometheusPort default listen port") flag.Parse() - fmt.Println("start cache rpc server, port: ", *rpcPort, "\n") + fmt.Println("start cache rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := rpcCache.NewCacheServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_conversation/main.go b/cmd/rpc/open_im_conversation/main.go index 268aa5ed9..3f3e3fdcc 100644 --- a/cmd/rpc/open_im_conversation/main.go +++ b/cmd/rpc/open_im_conversation/main.go @@ -3,6 +3,7 @@ package main import ( rpcConversation "Open_IM/internal/rpc/conversation" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcConversation default listen port 11300") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.ConversationPrometheusPort[0], "conversationPrometheusPort default listen port") flag.Parse() - fmt.Println("start conversation rpc server, port: ", *rpcPort, "\n") + fmt.Println("start conversation rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := rpcConversation.NewRpcConversationServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_friend/main.go b/cmd/rpc/open_im_friend/main.go index 489b8541d..176cb861d 100644 --- a/cmd/rpc/open_im_friend/main.go +++ b/cmd/rpc/open_im_friend/main.go @@ -3,6 +3,7 @@ package main import ( "Open_IM/internal/rpc/friend" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcFriendPort from cmd,default 12000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.FriendPrometheusPort[0], "friendPrometheusPort default listen port") flag.Parse() - fmt.Println("start friend rpc server, port: ", *rpcPort, "\n") + fmt.Println("start friend rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := friend.NewFriendServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_group/main.go b/cmd/rpc/open_im_group/main.go index 8e32f48ab..b5e6cc2af 100644 --- a/cmd/rpc/open_im_group/main.go +++ b/cmd/rpc/open_im_group/main.go @@ -3,6 +3,7 @@ package main import ( "Open_IM/internal/rpc/group" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcGroupPort from cmd,default 16000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.GroupPrometheusPort[0], "groupPrometheusPort default listen port") flag.Parse() - fmt.Println("start group rpc server, port: ", *rpcPort, "\n") + fmt.Println("start group rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := group.NewGroupServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_msg/main.go b/cmd/rpc/open_im_msg/main.go index 34294e546..3d92b615e 100644 --- a/cmd/rpc/open_im_msg/main.go +++ b/cmd/rpc/open_im_msg/main.go @@ -3,6 +3,7 @@ package main import ( "Open_IM/internal/rpc/msg" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.MessagePrometheusPort[0], "msgPrometheusPort default listen port") flag.Parse() - fmt.Println("start msg rpc server, port: ", *rpcPort, "\n") + fmt.Println("start msg rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := msg.NewRpcChatServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_office/main.go b/cmd/rpc/open_im_office/main.go index 369328319..5effa31cd 100644 --- a/cmd/rpc/open_im_office/main.go +++ b/cmd/rpc/open_im_office/main.go @@ -3,6 +3,7 @@ package main import ( rpc "Open_IM/internal/rpc/office" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OfficePrometheusPort[0], "officePrometheusPort default listen port") flag.Parse() - fmt.Println("start office rpc server, port: ", *rpcPort, "\n") + fmt.Println("start office rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := rpc.NewOfficeServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_organization/main.go b/cmd/rpc/open_im_organization/main.go index 3b748c010..dc88a75ad 100644 --- a/cmd/rpc/open_im_organization/main.go +++ b/cmd/rpc/open_im_organization/main.go @@ -3,6 +3,7 @@ package main import ( "Open_IM/internal/rpc/organization" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcOrganizationPort from cmd,default 11200 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OrganizationPrometheusPort[0], "organizationPrometheusPort default listen port") flag.Parse() - fmt.Println("start organization rpc server, port: ", *rpcPort, "\n") + fmt.Println("start organization rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := organization.NewServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_user/main.go b/cmd/rpc/open_im_user/main.go index 61fc25790..cdfa05a59 100644 --- a/cmd/rpc/open_im_user/main.go +++ b/cmd/rpc/open_im_user/main.go @@ -3,6 +3,7 @@ package main import ( "Open_IM/internal/rpc/user" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" promePkg "Open_IM/pkg/common/prometheus" "flag" "fmt" @@ -13,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.UserPrometheusPort[0], "userPrometheusPort default listen port") flag.Parse() - fmt.Println("start user rpc server, port: ", *rpcPort, "\n") + fmt.Println("start user rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") rpcServer := user.NewUserServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go index ecc53ea26..3642b31c3 100644 --- a/pkg/common/constant/constant.go +++ b/pkg/common/constant/constant.go @@ -336,3 +336,5 @@ const LogFileName = "OpenIM.log" const StatisticsTimeInterval = 60 const MaxNotificationNum = 100 + +const CurrentVersion = "v2.3.3" From 398be73f5b919f4fcc81ef3aaa730330170e5cf6 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 15:34:09 +0800 Subject: [PATCH 22/69] log --- cmd/open_im_api/main.go | 2 +- cmd/open_im_cms_api/main.go | 2 +- cmd/open_im_demo/main.go | 2 +- cmd/open_im_msg_gateway/main.go | 2 +- cmd/open_im_msg_transfer/main.go | 2 +- cmd/open_im_push/main.go | 2 +- cmd/rpc/open_im_admin_cms/main.go | 2 +- cmd/rpc/open_im_auth/main.go | 2 +- cmd/rpc/open_im_cache/main.go | 2 +- cmd/rpc/open_im_conversation/main.go | 2 +- cmd/rpc/open_im_friend/main.go | 2 +- cmd/rpc/open_im_group/main.go | 2 +- cmd/rpc/open_im_msg/main.go | 2 +- cmd/rpc/open_im_office/main.go | 2 +- cmd/rpc/open_im_organization/main.go | 2 +- cmd/rpc/open_im_user/main.go | 2 +- internal/cms_api/admin/admin.go | 2 ++ 17 files changed, 18 insertions(+), 16 deletions(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index b13fc5d68..fb192cbf7 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -226,7 +226,7 @@ func main() { if config.Config.Api.ListenIP != "" { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } - fmt.Println("start api server, address: ", address, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start api server, address: ", address, "OpenIM version: ", constant.CurrentVersion, "\n") err := r.Run(address) if err != nil { log.Error("", "api run failed ", address, err.Error()) diff --git a/cmd/open_im_cms_api/main.go b/cmd/open_im_cms_api/main.go index 3cc52c75d..94c662b0b 100644 --- a/cmd/open_im_cms_api/main.go +++ b/cmd/open_im_cms_api/main.go @@ -25,6 +25,6 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start cms api server, address: ", address, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start cms api server, address: ", address, "OpenIM version: ", constant.CurrentVersion, "\n") router.Run(address) } diff --git a/cmd/open_im_demo/main.go b/cmd/open_im_demo/main.go index 30dfca176..0e2dbaea6 100644 --- a/cmd/open_im_demo/main.go +++ b/cmd/open_im_demo/main.go @@ -71,7 +71,7 @@ func main() { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) } address = config.Config.CmsApi.ListenIP + ":" + strconv.Itoa(*ginPort) - fmt.Println("start demo api server address: ", address, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start demo api server address: ", address, "OpenIM version: ", constant.CurrentVersion, "\n") go register.OnboardingProcessRoutine() go register.ImportFriendRoutine() err := r.Run(address) diff --git a/cmd/open_im_msg_gateway/main.go b/cmd/open_im_msg_gateway/main.go index f61f105a9..44f55ce19 100644 --- a/cmd/open_im_msg_gateway/main.go +++ b/cmd/open_im_msg_gateway/main.go @@ -21,7 +21,7 @@ func main() { flag.Parse() var wg sync.WaitGroup wg.Add(1) - fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start rpc/msg_gateway server, port: ", *rpcPort, *wsPort, *prometheusPort, "OpenIM version: ", constant.CurrentVersion, "\n") gate.Init(*rpcPort, *wsPort) gate.Run(*prometheusPort) wg.Wait() diff --git a/cmd/open_im_msg_transfer/main.go b/cmd/open_im_msg_transfer/main.go index b7e7cb88f..b11fa5a1a 100644 --- a/cmd/open_im_msg_transfer/main.go +++ b/cmd/open_im_msg_transfer/main.go @@ -17,7 +17,7 @@ func main() { flag.Parse() log.NewPrivateLog(constant.LogFileName) logic.Init() - fmt.Println("start msg_transfer server ", "version: ", constant.CurrentVersion, "\n") + fmt.Println("start msg_transfer server ", "OpenIM version: ", constant.CurrentVersion, "\n") logic.Run(*prometheusPort) wg.Wait() } diff --git a/cmd/open_im_push/main.go b/cmd/open_im_push/main.go index c7b1cfe37..b14581690 100644 --- a/cmd/open_im_push/main.go +++ b/cmd/open_im_push/main.go @@ -18,7 +18,7 @@ func main() { var wg sync.WaitGroup wg.Add(1) log.NewPrivateLog(constant.LogFileName) - fmt.Println("start push rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start push rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") logic.Init(*rpcPort) logic.Run(*prometheusPort) wg.Wait() diff --git a/cmd/rpc/open_im_admin_cms/main.go b/cmd/rpc/open_im_admin_cms/main.go index 22f775939..f35b71300 100644 --- a/cmd/rpc/open_im_admin_cms/main.go +++ b/cmd/rpc/open_im_admin_cms/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AdminCmsPrometheusPort[0], "adminCMSPrometheusPort default listen port") flag.Parse() - fmt.Println("start cms rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start cms rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := rpcMessageCMS.NewAdminCMSServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_auth/main.go b/cmd/rpc/open_im_auth/main.go index 0255516b5..56f2df0df 100644 --- a/cmd/rpc/open_im_auth/main.go +++ b/cmd/rpc/open_im_auth/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.AuthPrometheusPort[0], "authPrometheusPort default listen port") flag.Parse() - fmt.Println("start auth rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start auth rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := rpcAuth.NewRpcAuthServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_cache/main.go b/cmd/rpc/open_im_cache/main.go index c685a0a2c..7df5d80f7 100644 --- a/cmd/rpc/open_im_cache/main.go +++ b/cmd/rpc/open_im_cache/main.go @@ -15,7 +15,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcToken default listen port 10800") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.CachePrometheusPort[0], "cachePrometheusPort default listen port") flag.Parse() - fmt.Println("start cache rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start cache rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := rpcCache.NewCacheServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_conversation/main.go b/cmd/rpc/open_im_conversation/main.go index 3f3e3fdcc..f3c746ade 100644 --- a/cmd/rpc/open_im_conversation/main.go +++ b/cmd/rpc/open_im_conversation/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "RpcConversation default listen port 11300") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.ConversationPrometheusPort[0], "conversationPrometheusPort default listen port") flag.Parse() - fmt.Println("start conversation rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start conversation rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := rpcConversation.NewRpcConversationServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_friend/main.go b/cmd/rpc/open_im_friend/main.go index 176cb861d..ae5ae0090 100644 --- a/cmd/rpc/open_im_friend/main.go +++ b/cmd/rpc/open_im_friend/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcFriendPort from cmd,default 12000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.FriendPrometheusPort[0], "friendPrometheusPort default listen port") flag.Parse() - fmt.Println("start friend rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start friend rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := friend.NewFriendServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_group/main.go b/cmd/rpc/open_im_group/main.go index b5e6cc2af..42b7f1f5c 100644 --- a/cmd/rpc/open_im_group/main.go +++ b/cmd/rpc/open_im_group/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcGroupPort from cmd,default 16000 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.GroupPrometheusPort[0], "groupPrometheusPort default listen port") flag.Parse() - fmt.Println("start group rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start group rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := group.NewGroupServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_msg/main.go b/cmd/rpc/open_im_msg/main.go index 3d92b615e..a9d87a7ba 100644 --- a/cmd/rpc/open_im_msg/main.go +++ b/cmd/rpc/open_im_msg/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.MessagePrometheusPort[0], "msgPrometheusPort default listen port") flag.Parse() - fmt.Println("start msg rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start msg rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := msg.NewRpcChatServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_office/main.go b/cmd/rpc/open_im_office/main.go index 5effa31cd..0af5444d6 100644 --- a/cmd/rpc/open_im_office/main.go +++ b/cmd/rpc/open_im_office/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OfficePrometheusPort[0], "officePrometheusPort default listen port") flag.Parse() - fmt.Println("start office rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start office rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := rpc.NewOfficeServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_organization/main.go b/cmd/rpc/open_im_organization/main.go index dc88a75ad..5dc27ccd5 100644 --- a/cmd/rpc/open_im_organization/main.go +++ b/cmd/rpc/open_im_organization/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "get RpcOrganizationPort from cmd,default 11200 as port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.OrganizationPrometheusPort[0], "organizationPrometheusPort default listen port") flag.Parse() - fmt.Println("start organization rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start organization rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := organization.NewServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/cmd/rpc/open_im_user/main.go b/cmd/rpc/open_im_user/main.go index cdfa05a59..3e64ac805 100644 --- a/cmd/rpc/open_im_user/main.go +++ b/cmd/rpc/open_im_user/main.go @@ -14,7 +14,7 @@ func main() { rpcPort := flag.Int("port", defaultPorts[0], "rpc listening port") prometheusPort := flag.Int("prometheus_port", config.Config.Prometheus.UserPrometheusPort[0], "userPrometheusPort default listen port") flag.Parse() - fmt.Println("start user rpc server, port: ", *rpcPort, "version: ", constant.CurrentVersion, "\n") + fmt.Println("start user rpc server, port: ", *rpcPort, "OpenIM version: ", constant.CurrentVersion, "\n") rpcServer := user.NewUserServer(*rpcPort) go func() { err := promePkg.StartPromeSrv(*prometheusPort) diff --git a/internal/cms_api/admin/admin.go b/internal/cms_api/admin/admin.go index 7d4c450fb..2c98502da 100644 --- a/internal/cms_api/admin/admin.go +++ b/internal/cms_api/admin/admin.go @@ -3,6 +3,7 @@ package admin import ( apiStruct "Open_IM/pkg/cms_api_struct" "Open_IM/pkg/common/config" + "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbAdmin "Open_IM/pkg/proto/admin_cms" @@ -25,6 +26,7 @@ var ( ) func init() { + log.NewPrivateLog(constant.LogFileName) operationID := utils.OperationIDGenerator() log.NewInfo(operationID, utils.GetSelfFuncName(), "minio config: ", config.Config.Credential.Minio) var initUrl string From 46d3dd409a964815cfce9a3284a19b3571e5e8bf Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 16:29:22 +0800 Subject: [PATCH 23/69] log --- pkg/common/db/mysql.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go index d43ce736d..0095ba3b0 100644 --- a/pkg/common/db/mysql.go +++ b/pkg/common/db/mysql.go @@ -31,13 +31,13 @@ func initMysqlDB() { var err1 error db, err := gorm.Open(mysql.Open(dsn), nil) if err != nil { - fmt.Println("0", "Open failed ", err.Error(), dsn) + fmt.Println("Open failed ", err.Error(), dsn) } if err != nil { time.Sleep(time.Duration(30) * time.Second) db, err1 = gorm.Open(mysql.Open(dsn), nil) if err1 != nil { - fmt.Println("0", "Open failed ", err1.Error(), dsn) + fmt.Println("Open failed ", err1.Error(), dsn) panic(err1.Error()) } } @@ -46,10 +46,10 @@ func initMysqlDB() { sql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8 COLLATE utf8_general_ci;", config.Config.Mysql.DBDatabaseName) err = db.Exec(sql).Error if err != nil { - fmt.Println("0", "Exec failed ", err.Error(), sql) + fmt.Println("Exec failed ", err.Error(), sql) panic(err.Error()) } - fmt.Println(sql) + dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], config.Config.Mysql.DBDatabaseName) @@ -66,20 +66,20 @@ func initMysqlDB() { Logger: newLogger, }) if err != nil { - fmt.Println("0", "Open failed ", err.Error(), dsn) + fmt.Println("Open failed ", err.Error(), dsn) panic(err.Error()) } - fmt.Println("init db2", db) + sqlDB, err := db.DB() if err != nil { panic(err.Error()) } - fmt.Println("init sqlDB", sqlDB) + sqlDB.SetConnMaxLifetime(time.Second * time.Duration(config.Config.Mysql.DBMaxLifeTime)) sqlDB.SetMaxOpenConns(config.Config.Mysql.DBMaxOpenConns) sqlDB.SetMaxIdleConns(config.Config.Mysql.DBMaxIdleConns) - fmt.Println("open db ok ", dsn) + fmt.Println("open mysql ok ", dsn) db.AutoMigrate( &Register{}, &Friend{}, From 939eb95cdcb56eca921068a9c38dfb1854e1ee65 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 16:39:03 +0800 Subject: [PATCH 24/69] log --- pkg/common/db/mysql.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go index 0095ba3b0..e046354c5 100644 --- a/pkg/common/db/mysql.go +++ b/pkg/common/db/mysql.go @@ -41,15 +41,16 @@ func initMysqlDB() { panic(err1.Error()) } } - fmt.Println("init db", db) + //Check the database and table during initialization sql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8 COLLATE utf8_general_ci;", config.Config.Mysql.DBDatabaseName) + fmt.Println("exec sql: ", sql, " begin") err = db.Exec(sql).Error if err != nil { fmt.Println("Exec failed ", err.Error(), sql) panic(err.Error()) } - + fmt.Println("exec sql: ", sql, " end") dsn = fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=true&loc=Local", config.Config.Mysql.DBUserName, config.Config.Mysql.DBPassword, config.Config.Mysql.DBAddress[0], config.Config.Mysql.DBDatabaseName) From d534f026b0df4d5645a6914ad870c5064647a9ef Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 17:45:38 +0800 Subject: [PATCH 25/69] promethues --- cmd/open_im_api/main.go | 3 ++- config/config.yaml | 2 ++ docker-compose.yaml | 6 +++--- internal/cms_api/router.go | 3 ++- internal/rpc/auth/auth.go | 25 +++++++++++++++++++++++++ internal/rpc/msg/rpcChat.go | 24 +++++++++++++++++++++++- internal/rpc/msg/send_msg.go | 4 +++- pkg/common/config/config.go | 2 ++ pkg/common/db/mysql.go | 8 ++++---- pkg/common/prometheus/prometheus.go | 7 +++++++ 10 files changed, 73 insertions(+), 11 deletions(-) diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index 38889574b..e9e253338 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -46,7 +46,8 @@ func main() { f, _ := os.Create("../logs/api.log") gin.DefaultWriter = io.MultiWriter(f) // gin.SetMode(gin.DebugMode) - r := gin.Default() + r := gin.New() + r.Use(gin.Recovery()) r.Use(utils.CorsHandler()) log.Info("load config: ", config.Config) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) diff --git a/config/config.yaml b/config/config.yaml index d277b6442..2224e914f 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -20,6 +20,8 @@ mysql: dbMaxOpenConns: 100 dbMaxIdleConns: 10 dbMaxLifeTime: 5 + logLevel: 1 #1=slient 2=error 3=warn 4=info + slowThreshold: 500 mongo: dbUri: ""#当dbUri值不为空则直接使用该值 diff --git a/docker-compose.yaml b/docker-compose.yaml index 81697ebb6..8a903890a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -153,11 +153,11 @@ services: grafana: image: grafana/grafana volumes: - # - ./grafana/dashboards/dashboard.json:/var/lib/grafana/dashboards/dashboard.json - # - ./grafana/provisioning/dashboard.yaml:/etc/grafana/provisioning/dashboards/dashboard.yaml - ./docker-compose_cfg/datasource-compose.yaml:/etc/grafana/provisioning/datasources/datasource.yaml - ./docker-compose_cfg/grafana.ini:/etc/grafana/grafana.ini - - ./docker-compose_cfg/node-exporter-full_rev1.json:/var/lib/grafana/dashboards/node-exporter-full_rev1.json + # - ./docker-compose_cfg/node-exporter-full_rev1.json:/var/lib/grafana/dashboards/node-exporter-full_rev1.json + # - ./components/grafana:/var/lib/grafana + - ./docker-compose_cfg/grafana.db:/var/lib/grafana/grafana.db container_name: grafana ports: - 10007:10007 diff --git a/internal/cms_api/router.go b/internal/cms_api/router.go index 69e3357d0..4047a46d3 100644 --- a/internal/cms_api/router.go +++ b/internal/cms_api/router.go @@ -18,7 +18,8 @@ import ( func NewGinRouter() *gin.Engine { gin.SetMode(gin.ReleaseMode) - baseRouter := gin.Default() + baseRouter := gin.New() + baseRouter.Use() if config.Config.Prometheus.Enable { baseRouter.GET("/metrics", promePkg.PrometheusHandler()) } diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index a9ab75569..0947cb4f9 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -5,6 +5,7 @@ import ( "Open_IM/pkg/common/db" imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbAuth "Open_IM/pkg/proto/auth" @@ -16,11 +17,30 @@ import ( "strconv" "strings" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "Open_IM/pkg/common/config" "google.golang.org/grpc" ) +var ( + userLoginCounter prometheus.Counter + userRegisterCounter prometheus.Counter +) + +func (rpc *rpcAuth) initPrometheus() { + userLoginCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "user_login", + Help: "The number of user login", + }) + userRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "user_register", + Help: "The number of user register", + }) +} + func (rpc *rpcAuth) UserRegister(_ context.Context, req *pbAuth.UserRegisterReq) (*pbAuth.UserRegisterResp, error) { log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String()) var user db.User @@ -35,6 +55,7 @@ func (rpc *rpcAuth) UserRegister(_ context.Context, req *pbAuth.UserRegisterReq) log.NewError(req.OperationID, errMsg, user) return &pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}}, nil } + promePkg.PromeInc(userRegisterCounter) log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{}}) return &pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{}}, nil } @@ -47,6 +68,7 @@ func (rpc *rpcAuth) UserToken(_ context.Context, req *pbAuth.UserTokenReq) (*pbA log.NewError(req.OperationID, errMsg) return &pbAuth.UserTokenResp{CommonResp: &pbAuth.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}}, nil } + promePkg.PromeInc(userLoginCounter) log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", pbAuth.UserTokenResp{CommonResp: &pbAuth.CommonResp{}, Token: tokens, ExpiredTime: expTime}) return &pbAuth.UserTokenResp{CommonResp: &pbAuth.CommonResp{}, Token: tokens, ExpiredTime: expTime}, nil } @@ -141,6 +163,9 @@ func (rpc *rpcAuth) Run() { } log.NewInfo(operationID, "RegisterAuthServer ok ", rpc.etcdSchema, strings.Join(rpc.etcdAddr, ","), rpcRegisterIP, rpc.rpcPort, rpc.rpcRegisterName) + if config.Config.Prometheus.Enable { + rpc.initPrometheus() + } err = srv.Serve(listener) if err != nil { log.NewError(operationID, "Serve failed ", err.Error()) diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index fde8536be..2c4c6270c 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -9,10 +9,18 @@ import ( "Open_IM/pkg/grpc-etcdv3/getcdv3" "Open_IM/pkg/proto/msg" "Open_IM/pkg/utils" - "google.golang.org/grpc" "net" "strconv" "strings" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "google.golang.org/grpc" +) + +var ( + sendMsgSuccessCounter prometheus.Counter + sendMsgFailedCounter prometheus.Counter ) type rpcChat struct { @@ -46,6 +54,17 @@ func NewRpcChatServer(port int) *rpcChat { return &rc } +func (rpc *rpcChat) initPrometheus() { + sendMsgSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "send_msg_success", + Help: "The number of send msg success", + }) + sendMsgFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "send_msg_failed", + Help: "The number of send msg failed", + }) +} + func (rpc *rpcChat) Run() { log.Info("", "rpcChat init...") listenIP := "" @@ -78,6 +97,9 @@ func (rpc *rpcChat) Run() { panic(utils.Wrap(err, "register chat module rpc to etcd err")) } go rpc.runCh() + if config.Config.Prometheus.Enable { + rpc.initPrometheus() + } err = srv.Serve(listener) if err != nil { log.Error("", "rpc rpcChat failed ", err.Error()) diff --git a/internal/rpc/msg/send_msg.go b/internal/rpc/msg/send_msg.go index 02d8a163e..876f2cda7 100644 --- a/internal/rpc/msg/send_msg.go +++ b/internal/rpc/msg/send_msg.go @@ -30,7 +30,9 @@ import ( //When the number of group members is greater than this value,Online users will be sent first,Guaranteed service availability const GroupMemberNum = 500 -var ExcludeContentType = []int{constant.HasReadReceipt, constant.GroupHasReadReceipt} +var ( + ExcludeContentType = []int{constant.HasReadReceipt, constant.GroupHasReadReceipt} +) type MsgCallBackReq struct { SendID string `json:"sendID"` diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 730d7c0f5..56cc66bb7 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -99,6 +99,8 @@ type config struct { DBMaxOpenConns int `yaml:"dbMaxOpenConns"` DBMaxIdleConns int `yaml:"dbMaxIdleConns"` DBMaxLifeTime int `yaml:"dbMaxLifeTime"` + LogLevel int `yaml:"logLevel"` + SlowThreshold int `yaml:"slowThreshold"` } Mongo struct { DBUri string `yaml:"dbUri"` diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go index d43ce736d..72641e37d 100644 --- a/pkg/common/db/mysql.go +++ b/pkg/common/db/mysql.go @@ -56,10 +56,10 @@ func initMysqlDB() { newLogger := logger.New( Writer{}, logger.Config{ - SlowThreshold: 200 * time.Millisecond, // Slow SQL threshold - LogLevel: logger.Warn, // Log level - IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger - Colorful: true, // Disable color + SlowThreshold: time.Duration(config.Config.Mysql.SlowThreshold) * time.Millisecond, // Slow SQL threshold + LogLevel: logger.LogLevel(config.Config.Mysql.LogLevel), // Log level + IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + Colorful: true, // Disable color }, ) db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ diff --git a/pkg/common/prometheus/prometheus.go b/pkg/common/prometheus/prometheus.go index 5d7e3d901..12d5671bb 100644 --- a/pkg/common/prometheus/prometheus.go +++ b/pkg/common/prometheus/prometheus.go @@ -6,6 +6,7 @@ import ( "strconv" "github.com/gin-gonic/gin" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -24,3 +25,9 @@ func PrometheusHandler() gin.HandlerFunc { h.ServeHTTP(c.Writer, c.Request) } } + +func PromeInc(counter prometheus.Counter) { + if config.Config.Prometheus.Enable { + counter.Inc() + } +} From 5ce0cf1aad6c0ed56b644094746e9ae8383cfa24 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 18:16:02 +0800 Subject: [PATCH 26/69] prome --- internal/rpc/auth/auth.go | 22 ++++------------------ pkg/common/prometheus/constant.go | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 pkg/common/prometheus/constant.go diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 0947cb4f9..3f6a957db 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -17,28 +17,14 @@ import ( "strconv" "strings" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - "Open_IM/pkg/common/config" "google.golang.org/grpc" ) -var ( - userLoginCounter prometheus.Counter - userRegisterCounter prometheus.Counter -) - func (rpc *rpcAuth) initPrometheus() { - userLoginCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "user_login", - Help: "The number of user login", - }) - userRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "user_register", - Help: "The number of user register", - }) + promePkg.NewUserLoginCounter() + promePkg.NewUserRegisterCounter() } func (rpc *rpcAuth) UserRegister(_ context.Context, req *pbAuth.UserRegisterReq) (*pbAuth.UserRegisterResp, error) { @@ -55,7 +41,7 @@ func (rpc *rpcAuth) UserRegister(_ context.Context, req *pbAuth.UserRegisterReq) log.NewError(req.OperationID, errMsg, user) return &pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}}, nil } - promePkg.PromeInc(userRegisterCounter) + promePkg.PromeInc(promePkg.UserRegisterCounter) log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{}}) return &pbAuth.UserRegisterResp{CommonResp: &pbAuth.CommonResp{}}, nil } @@ -68,7 +54,7 @@ func (rpc *rpcAuth) UserToken(_ context.Context, req *pbAuth.UserTokenReq) (*pbA log.NewError(req.OperationID, errMsg) return &pbAuth.UserTokenResp{CommonResp: &pbAuth.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg}}, nil } - promePkg.PromeInc(userLoginCounter) + promePkg.PromeInc(promePkg.UserLoginCounter) log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc return ", pbAuth.UserTokenResp{CommonResp: &pbAuth.CommonResp{}, Token: tokens, ExpiredTime: expTime}) return &pbAuth.UserTokenResp{CommonResp: &pbAuth.CommonResp{}, Token: tokens, ExpiredTime: expTime}, nil } diff --git a/pkg/common/prometheus/constant.go b/pkg/common/prometheus/constant.go new file mode 100644 index 000000000..9ced5908d --- /dev/null +++ b/pkg/common/prometheus/constant.go @@ -0,0 +1,26 @@ +package prometheus + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + // user rpc + UserLoginCounter prometheus.Counter + UserRegisterCounter prometheus.Counter +) + +func NewUserLoginCounter() { + UserLoginCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "user_login", + Help: "The number of user login", + }) +} + +func NewUserRegisterCounter() { + UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "user_register", + Help: "The number of user register", + }) +} From e1b1af9a486828840d5add3c4f79744733506cf4 Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Wed, 14 Sep 2022 18:31:56 +0800 Subject: [PATCH 27/69] private message cache update --- internal/rpc/conversation/conversaion.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index ef86dee3d..3a6af935e 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -148,7 +148,11 @@ func syncPeerUserConversation(conversation *pbConversation.Conversation, operati } err = rocksCache.DelConversationFromCache(conversation.UserID, utils.GetConversationIDBySessionType(conversation.OwnerUserID, constant.SingleChatType)) if err != nil { - log.NewError(operationID, utils.GetSelfFuncName(), "DelConversationFromCache failed", err.Error()) + log.NewError(operationID, utils.GetSelfFuncName(), "DelConversationFromCache failed", err.Error(), conversation.OwnerUserID, conversation.ConversationID) + } + err = rocksCache.DelConversationFromCache(conversation.OwnerUserID, conversation.ConversationID) + if err != nil { + log.NewError(operationID, utils.GetSelfFuncName(), "DelConversationFromCache failed", err.Error(), conversation.OwnerUserID, conversation.ConversationID) } chat.ConversationSetPrivateNotification(operationID, conversation.OwnerUserID, conversation.UserID, conversation.IsPrivateChat) return nil From e78f7a2a37b21ba0e62cb47ebcddd44dfb4faa41 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 18:47:11 +0800 Subject: [PATCH 28/69] prometheus for statistics --- pkg/common/prometheus/{constant.go => gather.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pkg/common/prometheus/{constant.go => gather.go} (100%) diff --git a/pkg/common/prometheus/constant.go b/pkg/common/prometheus/gather.go similarity index 100% rename from pkg/common/prometheus/constant.go rename to pkg/common/prometheus/gather.go From 8dce5396b07c3b460a51a2d9af0c61dd0c629baa Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 18:58:30 +0800 Subject: [PATCH 29/69] prometheus for statistics --- pkg/common/prometheus/gather.go | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index 9ced5908d..b5d252e66 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -9,6 +9,11 @@ var ( // user rpc UserLoginCounter prometheus.Counter UserRegisterCounter prometheus.Counter + + SeqGetSuccessCounter prometheus.Counter + SeqGetFailedCounter prometheus.Counter + SeqSetSuccessCounter prometheus.Counter + SeqSetFailedCounter prometheus.Counter ) func NewUserLoginCounter() { @@ -18,9 +23,28 @@ func NewUserLoginCounter() { }) } -func NewUserRegisterCounter() { - UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "user_register", - Help: "The number of user register", +func NewSeqGetSuccessCounter() { + SeqGetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "seq_get_success", + Help: "The number of successful get seq", + }) +} +func NewSeqGetFailedCounter() { + SeqGetFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "seq_get_failed", + Help: "The number of failed get seq", + }) +} + +func NewSeqSetSuccessCounter() { + SeqSetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "seq_set_success", + Help: "The number of successful set seq", + }) +} +func NewSeqSetFailedCounter() { + SeqSetFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "seq_set_failed", + Help: "The number of failed set seq", }) } From 7e5b62377fc500615408aa902b6bd99f72d59b55 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Wed, 14 Sep 2022 19:28:17 +0800 Subject: [PATCH 30/69] add --- pkg/common/prometheus/prometheus.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/common/prometheus/prometheus.go b/pkg/common/prometheus/prometheus.go index 12d5671bb..a6b65fee0 100644 --- a/pkg/common/prometheus/prometheus.go +++ b/pkg/common/prometheus/prometheus.go @@ -31,3 +31,9 @@ func PromeInc(counter prometheus.Counter) { counter.Inc() } } + +func PromeAdd(counter prometheus.Counter, add int) { + if config.Config.Prometheus.Enable { + counter.Add(float64(add)) + } +} From ebdb875c5618258aa0a54fe29538f84f3bedf52f Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 19:36:59 +0800 Subject: [PATCH 31/69] prometheus for statistics --- internal/cron_task/test/main.go | 9 +- .../logic/persistent_msg_handler.go | 44 +--- pkg/common/db/RedisModel.go | 6 +- pkg/common/db/batch_insert_chat.go | 200 ++++++++++-------- pkg/common/db/redisModel_test.go | 2 +- pkg/common/prometheus/gather.go | 24 ++- 6 files changed, 145 insertions(+), 140 deletions(-) diff --git a/internal/cron_task/test/main.go b/internal/cron_task/test/main.go index d32f27739..5a2b3f44a 100644 --- a/internal/cron_task/test/main.go +++ b/internal/cron_task/test/main.go @@ -1,7 +1,6 @@ package main -import "Open_IM/pkg/common/db" - -func main() { - db.DB.BatchInsertChat() -} +// +//func main() { +// db.DB.BatchInsertChat() +//} diff --git a/internal/msg_transfer/logic/persistent_msg_handler.go b/internal/msg_transfer/logic/persistent_msg_handler.go index 6894e7244..3c89820ec 100644 --- a/internal/msg_transfer/logic/persistent_msg_handler.go +++ b/internal/msg_transfer/logic/persistent_msg_handler.go @@ -18,13 +18,7 @@ import ( "github.com/Shopify/sarama" "github.com/golang/protobuf/proto" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" -) - -var ( - msgInsertMysqlCounter prometheus.Counter - msgInsertFailedMysqlCounter prometheus.Counter + promePkg "Open_IM/pkg/common/prometheus" ) type PersistentConsumerHandler struct { @@ -38,32 +32,16 @@ func (pc *PersistentConsumerHandler) Init() { pc.persistentConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0, OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.Ws2mschat.Topic}, config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMySql) - if config.Config.Prometheus.Enable { - pc.initPrometheus() - } + pc.initPrometheus() } func (pc *PersistentConsumerHandler) initPrometheus() { - // counter - msgInsertMysqlCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "insert_mysql_msg_total", - Help: "The total number of msg insert mysql events", - }) - msgInsertFailedMysqlCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "insert_mysql_failed_msg_total", - Help: "The total number of msg insert mysql events", - }) - - // 启动计时器 - // requestDurations := prometheus.NewHistogram(prometheus.HistogramOpts{ - // Name: "http_request_duration_seconds", - // Help: "A histogram of the HTTP request durations in seconds.", - // Buckets: []float64{0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10}, - // }) - // 开始 - // timer := prometheus.NewTimer(requestDurations) - // 停止 - // timer.ObserveDuration() + promePkg.NewSeqGetSuccessCounter() + promePkg.NewSeqGetFailedCounter() + promePkg.NewSeqSetSuccessCounter() + promePkg.NewSeqSetFailedCounter() + promePkg.NewMsgInsertRedisSuccessCounter() + promePkg.NewMsgInsertRedisFailedCounter() } func (pc *PersistentConsumerHandler) handleChatWs2Mysql(cMsg *sarama.ConsumerMessage, msgKey string, _ sarama.ConsumerGroupSession) { @@ -97,14 +75,8 @@ func (pc *PersistentConsumerHandler) handleChatWs2Mysql(cMsg *sarama.ConsumerMes log.NewInfo(msgFromMQ.OperationID, "msg_transfer msg persisting", string(msg)) if err = im_mysql_msg_model.InsertMessageToChatLog(msgFromMQ); err != nil { log.NewError(msgFromMQ.OperationID, "Message insert failed", "err", err.Error(), "msg", msgFromMQ.String()) - if config.Config.Prometheus.Enable { - msgInsertFailedMysqlCounter.Inc() - } return } - if config.Config.Prometheus.Enable { - msgInsertMysqlCounter.Inc() - } } } diff --git a/pkg/common/db/RedisModel.go b/pkg/common/db/RedisModel.go index efd0db9a3..63be03533 100644 --- a/pkg/common/db/RedisModel.go +++ b/pkg/common/db/RedisModel.go @@ -205,7 +205,7 @@ func (d *DataBases) GetMessageListBySeq(userID string, seqList []uint32, operati return seqMsg, failedSeqList, errResult } -func (d *DataBases) SetMessageToCache(msgList []*pbChat.MsgDataToMQ, uid string, operationID string) error { +func (d *DataBases) SetMessageToCache(msgList []*pbChat.MsgDataToMQ, uid string, operationID string) (error, int) { ctx := context.Background() pipe := d.RDB.Pipeline() var failedList []pbChat.MsgDataToMQ @@ -225,10 +225,10 @@ func (d *DataBases) SetMessageToCache(msgList []*pbChat.MsgDataToMQ, uid string, } } if len(failedList) != 0 { - return errors.New(fmt.Sprintf("set msg to cache failed, failed lists: %q,%s", failedList, operationID)) + return errors.New(fmt.Sprintf("set msg to cache failed, failed lists: %q,%s", failedList, operationID)), len(failedList) } _, err := pipe.Exec(ctx) - return err + return err, 0 } func (d *DataBases) DeleteMessageFromCache(msgList []*pbChat.MsgDataToMQ, uid string, operationID string) error { ctx := context.Background() diff --git a/pkg/common/db/batch_insert_chat.go b/pkg/common/db/batch_insert_chat.go index 16096f9bb..51d573899 100644 --- a/pkg/common/db/batch_insert_chat.go +++ b/pkg/common/db/batch_insert_chat.go @@ -4,6 +4,7 @@ import ( "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" pbMsg "Open_IM/pkg/proto/msg" "Open_IM/pkg/utils" "context" @@ -129,8 +130,11 @@ func (d *DataBases) BatchInsertChat2Cache(insertID string, msgList []*pbMsg.MsgD log.Debug(operationID, "constant.SingleChatType lastMaxSeq before add ", currentMaxSeq, "userID ", insertID, err) } if err != nil && err != go_redis.Nil { + promePkg.PromeInc(promePkg.SeqGetFailedCounter) return utils.Wrap(err, ""), 0 } + promePkg.PromeInc(promePkg.SeqGetSuccessCounter) + promePkg.SeqGetSuccessCounter.Inc() lastMaxSeq := currentMaxSeq for _, m := range msgList { @@ -142,9 +146,12 @@ func (d *DataBases) BatchInsertChat2Cache(insertID string, msgList []*pbMsg.MsgD log.Debug(operationID, "cache msg node ", m.String(), m.MsgData.ClientMsgID, "userID: ", insertID, "seq: ", currentMaxSeq) } log.Debug(operationID, "SetMessageToCache ", insertID, len(msgList)) - err = d.SetMessageToCache(msgList, insertID, operationID) + err, failedNum := d.SetMessageToCache(msgList, insertID, operationID) if err != nil { + promePkg.PromeAdd(promePkg.MsgInsertRedisFailedCounter, failedNum) log.Error(operationID, "setMessageToCache failed, continue ", err.Error(), len(msgList), insertID) + } else { + promePkg.PromeInc(promePkg.MsgInsertRedisSuccessCounter) } log.Debug(operationID, "batch to redis cost time ", getCurrentTimestampByMill()-newTime, insertID, len(msgList)) if msgList[0].MsgData.SessionType == constant.SuperGroupChatType { @@ -152,6 +159,11 @@ func (d *DataBases) BatchInsertChat2Cache(insertID string, msgList []*pbMsg.MsgD } else { err = d.SetUserMaxSeq(insertID, currentMaxSeq) } + if err != nil { + promePkg.PromeInc(promePkg.SeqSetFailedCounter) + } else { + promePkg.PromeInc(promePkg.SeqSetSuccessCounter) + } return utils.Wrap(err, ""), lastMaxSeq } @@ -171,99 +183,99 @@ func (d *DataBases) BatchInsertChat2Cache(insertID string, msgList []*pbMsg.MsgD // } // return nil, lastMaxSeq //} - -func (d *DataBases) BatchInsertChat(userID string, msgList []*pbMsg.MsgDataToMQ, operationID string) error { - newTime := getCurrentTimestampByMill() - if len(msgList) > GetSingleGocMsgNum() { - return errors.New("too large") - } - isInit := false - currentMaxSeq, err := d.GetUserMaxSeq(userID) - if err == nil { - - } else if err == go_redis.Nil { - isInit = true - currentMaxSeq = 0 - } else { - return utils.Wrap(err, "") - } - var remain uint64 - //if currentMaxSeq < uint64(GetSingleGocMsgNum()) { - // remain = uint64(GetSingleGocMsgNum()-1) - (currentMaxSeq % uint64(GetSingleGocMsgNum())) - //} else { - // remain = uint64(GetSingleGocMsgNum()) - ((currentMaxSeq - (uint64(GetSingleGocMsgNum()) - 1)) % uint64(GetSingleGocMsgNum())) - //} - - blk0 := uint64(GetSingleGocMsgNum() - 1) - if currentMaxSeq < uint64(GetSingleGocMsgNum()) { - remain = blk0 - currentMaxSeq - } else { - excludeBlk0 := currentMaxSeq - blk0 - remain = (uint64(GetSingleGocMsgNum()) - (excludeBlk0 % uint64(GetSingleGocMsgNum()))) % uint64(GetSingleGocMsgNum()) - } - - insertCounter := uint64(0) - msgListToMongo := make([]MsgInfo, 0) - msgListToMongoNext := make([]MsgInfo, 0) - seqUid := "" - seqUidNext := "" - log.Debug(operationID, "remain ", remain, "insertCounter ", insertCounter, "currentMaxSeq ", currentMaxSeq, userID, len(msgList)) - //4998 remain ==1 - //4999 - for _, m := range msgList { - log.Debug(operationID, "msg node ", m.String(), m.MsgData.ClientMsgID) - currentMaxSeq++ - sMsg := MsgInfo{} - sMsg.SendTime = m.MsgData.SendTime - m.MsgData.Seq = uint32(currentMaxSeq) - if sMsg.Msg, err = proto.Marshal(m.MsgData); err != nil { - return utils.Wrap(err, "") - } - if isInit { - msgListToMongoNext = append(msgListToMongoNext, sMsg) - seqUidNext = getSeqUid(userID, uint32(currentMaxSeq)) - log.Debug(operationID, "msgListToMongoNext ", seqUidNext, m.MsgData.Seq, m.MsgData.ClientMsgID, insertCounter, remain) - continue - } - if insertCounter < remain { - msgListToMongo = append(msgListToMongo, sMsg) - insertCounter++ - seqUid = getSeqUid(userID, uint32(currentMaxSeq)) - log.Debug(operationID, "msgListToMongo ", seqUid, m.MsgData.Seq, m.MsgData.ClientMsgID, insertCounter, remain) - } else { - msgListToMongoNext = append(msgListToMongoNext, sMsg) - seqUidNext = getSeqUid(userID, uint32(currentMaxSeq)) - log.Debug(operationID, "msgListToMongoNext ", seqUidNext, m.MsgData.Seq, m.MsgData.ClientMsgID, insertCounter, remain) - } - } - // ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) - - ctx := context.Background() - c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cChat) - - if seqUid != "" { - filter := bson.M{"uid": seqUid} - log.NewDebug(operationID, "filter ", seqUid, "list ", msgListToMongo) - err := c.FindOneAndUpdate(ctx, filter, bson.M{"$push": bson.M{"msg": bson.M{"$each": msgListToMongo}}}).Err() - if err != nil { - log.Error(operationID, "FindOneAndUpdate failed ", err.Error(), filter) - return utils.Wrap(err, "") - } - } - if seqUidNext != "" { - filter := bson.M{"uid": seqUidNext} - sChat := UserChat{} - sChat.UID = seqUidNext - sChat.Msg = msgListToMongoNext - log.NewDebug(operationID, "filter ", seqUidNext, "list ", msgListToMongoNext) - if _, err = c.InsertOne(ctx, &sChat); err != nil { - log.NewError(operationID, "InsertOne failed", filter, err.Error(), sChat) - return utils.Wrap(err, "") - } - } - log.NewWarn(operationID, "batch mgo cost time ", getCurrentTimestampByMill()-newTime, userID, len(msgList)) - return utils.Wrap(d.SetUserMaxSeq(userID, uint64(currentMaxSeq)), "") -} +// +//func (d *DataBases) BatchInsertChat(userID string, msgList []*pbMsg.MsgDataToMQ, operationID string) error { +// newTime := getCurrentTimestampByMill() +// if len(msgList) > GetSingleGocMsgNum() { +// return errors.New("too large") +// } +// isInit := false +// currentMaxSeq, err := d.GetUserMaxSeq(userID) +// if err == nil { +// +// } else if err == go_redis.Nil { +// isInit = true +// currentMaxSeq = 0 +// } else { +// return utils.Wrap(err, "") +// } +// var remain uint64 +// //if currentMaxSeq < uint64(GetSingleGocMsgNum()) { +// // remain = uint64(GetSingleGocMsgNum()-1) - (currentMaxSeq % uint64(GetSingleGocMsgNum())) +// //} else { +// // remain = uint64(GetSingleGocMsgNum()) - ((currentMaxSeq - (uint64(GetSingleGocMsgNum()) - 1)) % uint64(GetSingleGocMsgNum())) +// //} +// +// blk0 := uint64(GetSingleGocMsgNum() - 1) +// if currentMaxSeq < uint64(GetSingleGocMsgNum()) { +// remain = blk0 - currentMaxSeq +// } else { +// excludeBlk0 := currentMaxSeq - blk0 +// remain = (uint64(GetSingleGocMsgNum()) - (excludeBlk0 % uint64(GetSingleGocMsgNum()))) % uint64(GetSingleGocMsgNum()) +// } +// +// insertCounter := uint64(0) +// msgListToMongo := make([]MsgInfo, 0) +// msgListToMongoNext := make([]MsgInfo, 0) +// seqUid := "" +// seqUidNext := "" +// log.Debug(operationID, "remain ", remain, "insertCounter ", insertCounter, "currentMaxSeq ", currentMaxSeq, userID, len(msgList)) +// //4998 remain ==1 +// //4999 +// for _, m := range msgList { +// log.Debug(operationID, "msg node ", m.String(), m.MsgData.ClientMsgID) +// currentMaxSeq++ +// sMsg := MsgInfo{} +// sMsg.SendTime = m.MsgData.SendTime +// m.MsgData.Seq = uint32(currentMaxSeq) +// if sMsg.Msg, err = proto.Marshal(m.MsgData); err != nil { +// return utils.Wrap(err, "") +// } +// if isInit { +// msgListToMongoNext = append(msgListToMongoNext, sMsg) +// seqUidNext = getSeqUid(userID, uint32(currentMaxSeq)) +// log.Debug(operationID, "msgListToMongoNext ", seqUidNext, m.MsgData.Seq, m.MsgData.ClientMsgID, insertCounter, remain) +// continue +// } +// if insertCounter < remain { +// msgListToMongo = append(msgListToMongo, sMsg) +// insertCounter++ +// seqUid = getSeqUid(userID, uint32(currentMaxSeq)) +// log.Debug(operationID, "msgListToMongo ", seqUid, m.MsgData.Seq, m.MsgData.ClientMsgID, insertCounter, remain) +// } else { +// msgListToMongoNext = append(msgListToMongoNext, sMsg) +// seqUidNext = getSeqUid(userID, uint32(currentMaxSeq)) +// log.Debug(operationID, "msgListToMongoNext ", seqUidNext, m.MsgData.Seq, m.MsgData.ClientMsgID, insertCounter, remain) +// } +// } +// // ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second) +// +// ctx := context.Background() +// c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cChat) +// +// if seqUid != "" { +// filter := bson.M{"uid": seqUid} +// log.NewDebug(operationID, "filter ", seqUid, "list ", msgListToMongo) +// err := c.FindOneAndUpdate(ctx, filter, bson.M{"$push": bson.M{"msg": bson.M{"$each": msgListToMongo}}}).Err() +// if err != nil { +// log.Error(operationID, "FindOneAndUpdate failed ", err.Error(), filter) +// return utils.Wrap(err, "") +// } +// } +// if seqUidNext != "" { +// filter := bson.M{"uid": seqUidNext} +// sChat := UserChat{} +// sChat.UID = seqUidNext +// sChat.Msg = msgListToMongoNext +// log.NewDebug(operationID, "filter ", seqUidNext, "list ", msgListToMongoNext) +// if _, err = c.InsertOne(ctx, &sChat); err != nil { +// log.NewError(operationID, "InsertOne failed", filter, err.Error(), sChat) +// return utils.Wrap(err, "") +// } +// } +// log.NewWarn(operationID, "batch mgo cost time ", getCurrentTimestampByMill()-newTime, userID, len(msgList)) +// return utils.Wrap(d.SetUserMaxSeq(userID, uint64(currentMaxSeq)), "") +//} //func (d *DataBases)setMessageToCache(msgList []*pbMsg.MsgDataToMQ, uid string) (err error) { // diff --git a/pkg/common/db/redisModel_test.go b/pkg/common/db/redisModel_test.go index 602c51a16..7c1cf9f60 100644 --- a/pkg/common/db/redisModel_test.go +++ b/pkg/common/db/redisModel_test.go @@ -71,7 +71,7 @@ func Test_NewSetMessageToCache(t *testing.T) { data.AtUserIDList = []string{"1212", "23232"} msg.MsgData = &data messageList := []*pbChat.MsgDataToMQ{&msg} - err := DB.SetMessageToCache(messageList, uid, "cacheTest") + err, _ := DB.SetMessageToCache(messageList, uid, "cacheTest") assert.Nil(t, err) } diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index b5d252e66..8b28424fd 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -6,7 +6,6 @@ import ( ) var ( - // user rpc UserLoginCounter prometheus.Counter UserRegisterCounter prometheus.Counter @@ -14,6 +13,9 @@ var ( SeqGetFailedCounter prometheus.Counter SeqSetSuccessCounter prometheus.Counter SeqSetFailedCounter prometheus.Counter + + MsgInsertRedisSuccessCounter prometheus.Counter + MsgInsertRedisFailedCounter prometheus.Counter ) func NewUserLoginCounter() { @@ -22,6 +24,12 @@ func NewUserLoginCounter() { Help: "The number of user login", }) } +func NewUserRegisterCounter() { + UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "user_register", + Help: "The number of user register", + }) +} func NewSeqGetSuccessCounter() { SeqGetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ @@ -48,3 +56,17 @@ func NewSeqSetFailedCounter() { Help: "The number of failed set seq", }) } + +func NewMsgInsertRedisSuccessCounter() { + MsgInsertRedisSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_insert_redis_success", + Help: "The number of successful insert msg to redis", + }) +} + +func NewMsgInsertRedisFailedCounter() { + MsgInsertRedisFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_insert_redis_failed", + Help: "The number of failed insert msg to redis", + }) +} From a110b4c26b72097115406b85542745fd18551a0e Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 20:27:54 +0800 Subject: [PATCH 32/69] prometheus for statistics --- pkg/common/prometheus/gather.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index 8b28424fd..534a27d68 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -16,6 +16,9 @@ var ( MsgInsertRedisSuccessCounter prometheus.Counter MsgInsertRedisFailedCounter prometheus.Counter + + MsgInsertMongoSuccessCounter prometheus.Counter + MsgInsertMongoFailedCounter prometheus.Counter ) func NewUserLoginCounter() { @@ -70,3 +73,17 @@ func NewMsgInsertRedisFailedCounter() { Help: "The number of failed insert msg to redis", }) } + +func NewMsgInsertMongoSuccessCounter() { + MsgInsertMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_insert_mongo_success", + Help: "The number of successful insert msg to mongo", + }) +} + +func NewMsgInsertMongoFailedCounter() { + MsgInsertMongoFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_insert_mongo_failed", + Help: "The number of failed insert msg to mongo", + }) +} From 375fc0c89e19879043ed287aff3d8c1219d37d25 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 21:11:40 +0800 Subject: [PATCH 33/69] prometheus for statistics --- internal/msg_transfer/logic/init.go | 1 + .../msg_transfer/logic/persistent_msg_handler.go | 6 ++++-- pkg/common/db/batch_insert_chat.go | 15 +++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/internal/msg_transfer/logic/init.go b/internal/msg_transfer/logic/init.go index b98f0e8a4..aa7ba0b9a 100644 --- a/internal/msg_transfer/logic/init.go +++ b/internal/msg_transfer/logic/init.go @@ -37,6 +37,7 @@ var ( func Init() { cmdCh = make(chan Cmd2Value, 10000) w = new(sync.Mutex) + initPrometheus() persistentCH.Init() // ws2mschat save mysql historyCH.Init(cmdCh) // historyMongoCH.Init() diff --git a/internal/msg_transfer/logic/persistent_msg_handler.go b/internal/msg_transfer/logic/persistent_msg_handler.go index 3c89820ec..3bfa99255 100644 --- a/internal/msg_transfer/logic/persistent_msg_handler.go +++ b/internal/msg_transfer/logic/persistent_msg_handler.go @@ -32,16 +32,18 @@ func (pc *PersistentConsumerHandler) Init() { pc.persistentConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0, OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.Ws2mschat.Topic}, config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.ConsumerGroupID.MsgToMySql) - pc.initPrometheus() + } -func (pc *PersistentConsumerHandler) initPrometheus() { +func initPrometheus() { promePkg.NewSeqGetSuccessCounter() promePkg.NewSeqGetFailedCounter() promePkg.NewSeqSetSuccessCounter() promePkg.NewSeqSetFailedCounter() promePkg.NewMsgInsertRedisSuccessCounter() promePkg.NewMsgInsertRedisFailedCounter() + promePkg.NewMsgInsertMongoSuccessCounter() + promePkg.NewMsgInsertMongoFailedCounter() } func (pc *PersistentConsumerHandler) handleChatWs2Mysql(cMsg *sarama.ConsumerMessage, msgKey string, _ sarama.ConsumerGroupSession) { diff --git a/pkg/common/db/batch_insert_chat.go b/pkg/common/db/batch_insert_chat.go index 51d573899..9be8f0874 100644 --- a/pkg/common/db/batch_insert_chat.go +++ b/pkg/common/db/batch_insert_chat.go @@ -15,10 +15,6 @@ import ( "go.mongodb.org/mongo-driver/mongo" ) -func (d *DataBases) BatchDeleteChat2DB(userID string, msgList []*pbMsg.MsgDataToMQ, operationID string) { - -} - func (d *DataBases) BatchInsertChat2DB(userID string, msgList []*pbMsg.MsgDataToMQ, operationID string, currentMaxSeq uint64) error { newTime := getCurrentTimestampByMill() if len(msgList) > GetSingleGocMsgNum() { @@ -86,10 +82,13 @@ func (d *DataBases) BatchInsertChat2DB(userID string, msgList []*pbMsg.MsgDataTo sChat.Msg = msgListToMongo log.NewDebug(operationID, "filter ", seqUid, "list ", msgListToMongo) if _, err = c.InsertOne(ctx, &sChat); err != nil { + promePkg.PromeInc(promePkg.MsgInsertMongoFailedCounter) log.NewError(operationID, "InsertOne failed", filter, err.Error(), sChat) return utils.Wrap(err, "") } + promePkg.PromeInc(promePkg.MsgInsertMongoSuccessCounter) } else { + promePkg.PromeInc(promePkg.MsgInsertMongoFailedCounter) log.Error(operationID, "FindOneAndUpdate failed ", err.Error(), filter) return utils.Wrap(err, "") } @@ -102,9 +101,11 @@ func (d *DataBases) BatchInsertChat2DB(userID string, msgList []*pbMsg.MsgDataTo sChat.Msg = msgListToMongoNext log.NewDebug(operationID, "filter ", seqUidNext, "list ", msgListToMongoNext, "userID: ", userID) if _, err = c.InsertOne(ctx, &sChat); err != nil { + promePkg.PromeInc(promePkg.MsgInsertMongoFailedCounter) log.NewError(operationID, "InsertOne failed", filter, err.Error(), sChat) return utils.Wrap(err, "") } + promePkg.PromeInc(promePkg.MsgInsertMongoSuccessCounter) } log.Debug(operationID, "batch mgo cost time ", getCurrentTimestampByMill()-newTime, userID, len(msgList)) return nil @@ -280,9 +281,3 @@ func (d *DataBases) BatchInsertChat2Cache(insertID string, msgList []*pbMsg.MsgD //func (d *DataBases)setMessageToCache(msgList []*pbMsg.MsgDataToMQ, uid string) (err error) { // //} - -func (d *DataBases) GetFromCacheAndInsertDB(msgUserIDPrefix string) { - //get value from redis - - //batch insert to db -} From 6a6009827c3d7ab9afffbd8a16fcd333c0731e59 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Wed, 14 Sep 2022 21:42:04 +0800 Subject: [PATCH 34/69] prometheus for statistics --- pkg/common/prometheus/prometheus.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/common/prometheus/prometheus.go b/pkg/common/prometheus/prometheus.go index a6b65fee0..2a0d9fe1c 100644 --- a/pkg/common/prometheus/prometheus.go +++ b/pkg/common/prometheus/prometheus.go @@ -28,12 +28,17 @@ func PrometheusHandler() gin.HandlerFunc { func PromeInc(counter prometheus.Counter) { if config.Config.Prometheus.Enable { - counter.Inc() + if counter != nil { + counter.Inc() + } + } } func PromeAdd(counter prometheus.Counter, add int) { if config.Config.Prometheus.Enable { - counter.Add(float64(add)) + if counter != nil { + counter.Add(float64(add)) + } } } From a1f79f45081be2cbd9bc6e19844950a653bd8df0 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 01:22:20 +0800 Subject: [PATCH 35/69] prome --- cmd/open_im_api/main.go | 4 ++ internal/msg_gateway/gate/relay_rpc_server.go | 10 ++- internal/push/logic/push_rpc_server.go | 7 +- internal/rpc/auth/auth.go | 7 +- internal/rpc/conversation/conversaion.go | 7 +- internal/rpc/friend/friend.go | 9 ++- internal/rpc/group/group.go | 5 ++ internal/rpc/msg/rpcChat.go | 23 ++---- internal/rpc/user/user.go | 7 +- pkg/common/kafka/producer.go | 6 ++ pkg/common/prometheus/gather.go | 70 ++++++++++++++++++- pkg/common/prometheus/grpc.go | 35 ++++++++++ pkg/common/prometheus/prometheus.go | 23 ++++++ 13 files changed, 187 insertions(+), 26 deletions(-) create mode 100644 pkg/common/prometheus/grpc.go diff --git a/cmd/open_im_api/main.go b/cmd/open_im_api/main.go index a4db0e616..8f45a38c8 100644 --- a/cmd/open_im_api/main.go +++ b/cmd/open_im_api/main.go @@ -52,6 +52,10 @@ func main() { log.Info("load config: ", config.Config) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) if config.Config.Prometheus.Enable { + promePkg.NewApiRequestCounter() + promePkg.NewApiRequestFailedCounter() + promePkg.NewApiRequestSuccessCounter() + r.Use(promePkg.PromeTheusMiddleware) r.GET("/metrics", promePkg.PrometheusHandler()) } // user routing group, which handles user registration and login services diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index 406cb991e..e201061e3 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -4,6 +4,7 @@ import ( "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbRelay "Open_IM/pkg/proto/relay" @@ -12,11 +13,12 @@ import ( "bytes" "context" "encoding/gob" - "github.com/golang/protobuf/proto" "net" "strconv" "strings" + "github.com/golang/protobuf/proto" + "github.com/gorilla/websocket" "google.golang.org/grpc" ) @@ -52,7 +54,11 @@ func (r *RPCServer) run() { panic("listening err:" + err.Error() + r.rpcRegisterName) } defer listener.Close() - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() pbRelay.RegisterRelayServer(srv, r) diff --git a/internal/push/logic/push_rpc_server.go b/internal/push/logic/push_rpc_server.go index 8fb99dbfb..a95afd24e 100644 --- a/internal/push/logic/push_rpc_server.go +++ b/internal/push/logic/push_rpc_server.go @@ -4,6 +4,7 @@ import ( "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbPush "Open_IM/pkg/proto/push" "Open_IM/pkg/utils" @@ -42,7 +43,11 @@ func (r *RPCServer) run() { panic("listening err:" + err.Error() + r.rpcRegisterName) } defer listener.Close() - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() pbPush.RegisterPushMsgServiceServer(srv, r) rpcRegisterIP := config.Config.RpcRegisterIP diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 3f6a957db..46ec43f2b 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -126,8 +126,11 @@ func (rpc *rpcAuth) Run() { panic("listening err:" + err.Error() + rpc.rpcRegisterName) } log.NewInfo(operationID, "listen network success, ", address, listener) - //grpc server - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //service registers with etcd diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index 3a6af935e..19cd5ead7 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -7,6 +7,7 @@ import ( imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" rocksCache "Open_IM/pkg/common/db/rocks_cache" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbConversation "Open_IM/pkg/proto/conversation" "Open_IM/pkg/utils" @@ -184,7 +185,11 @@ func (rpc *rpcConversation) Run() { } log.NewInfo("0", "listen network success, ", address, listener) //grpc server - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //service registers with etcd diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index 29ec99eab..6f174c697 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -6,8 +6,9 @@ import ( "Open_IM/pkg/common/constant" "Open_IM/pkg/common/db" imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" - "Open_IM/pkg/common/db/rocks_cache" + rocksCache "Open_IM/pkg/common/db/rocks_cache" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" cp "Open_IM/pkg/common/utils" "Open_IM/pkg/grpc-etcdv3/getcdv3" @@ -60,7 +61,11 @@ func (s *friendServer) Run() { log.NewInfo("0", "listen ok ", address) defer listener.Close() //grpc server - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //User friend related services register to etcd pbFriend.RegisterFriendServer(srv, s) diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index a36547c2c..062765069 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -8,6 +8,7 @@ import ( imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" rocksCache "Open_IM/pkg/common/db/rocks_cache" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" cp "Open_IM/pkg/common/utils" "Open_IM/pkg/grpc-etcdv3/getcdv3" @@ -69,6 +70,10 @@ func (s *groupServer) Run() { grpc.MaxRecvMsgSize(recvSize), grpc.MaxSendMsgSize(sendSize), } + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } srv := grpc.NewServer(options...) defer srv.GracefulStop() //Service registers with etcd diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index 2c4c6270c..bbd249622 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -6,6 +6,7 @@ import ( "Open_IM/pkg/common/db" "Open_IM/pkg/common/kafka" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/grpc-etcdv3/getcdv3" "Open_IM/pkg/proto/msg" "Open_IM/pkg/utils" @@ -13,16 +14,9 @@ import ( "strconv" "strings" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" "google.golang.org/grpc" ) -var ( - sendMsgSuccessCounter prometheus.Counter - sendMsgFailedCounter prometheus.Counter -) - type rpcChat struct { rpcPort int rpcRegisterName string @@ -55,14 +49,7 @@ func NewRpcChatServer(port int) *rpcChat { } func (rpc *rpcChat) initPrometheus() { - sendMsgSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "send_msg_success", - Help: "The number of send msg success", - }) - sendMsgFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "send_msg_failed", - Help: "The number of send msg failed", - }) + promePkg.NewSendMsgCount() } func (rpc *rpcChat) Run() { @@ -80,7 +67,11 @@ func (rpc *rpcChat) Run() { } log.Info("", "listen network success, address ", address) - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() rpcRegisterIP := config.Config.RpcRegisterIP diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index cf4e959a5..241e6d081 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -8,6 +8,7 @@ import ( imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" rocksCache "Open_IM/pkg/common/db/rocks_cache" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbConversation "Open_IM/pkg/proto/conversation" @@ -61,7 +62,11 @@ func (s *userServer) Run() { log.NewInfo("0", "listen network success, address ", address, listener) defer listener.Close() //grpc server - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //Service registers with etcd pbUser.RegisterUserServer(srv, s) diff --git a/pkg/common/kafka/producer.go b/pkg/common/kafka/producer.go index 4eb10aebd..15c08ac04 100644 --- a/pkg/common/kafka/producer.go +++ b/pkg/common/kafka/producer.go @@ -4,8 +4,11 @@ import ( log "Open_IM/pkg/common/log" "Open_IM/pkg/utils" "errors" + "github.com/Shopify/sarama" "github.com/golang/protobuf/proto" + + promePkg "Open_IM/pkg/common/prometheus" ) type Producer struct { @@ -57,5 +60,8 @@ func (p *Producer) SendMessage(m proto.Message, key string, operationID string) } a, b, c := p.producer.SendMessage(kMsg) log.Info(operationID, "ByteEncoder SendMessage end", "key ", kMsg.Key.Length(), kMsg.Value.Length(), p.producer) + if c == nil { + promePkg.PromeInc(promePkg.SendMsgCounter) + } return a, b, utils.Wrap(c, "") } diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index b5d252e66..ccac941c2 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -6,7 +6,7 @@ import ( ) var ( - // user rpc + //auth rpc UserLoginCounter prometheus.Counter UserRegisterCounter prometheus.Counter @@ -14,6 +14,18 @@ var ( SeqGetFailedCounter prometheus.Counter SeqSetSuccessCounter prometheus.Counter SeqSetFailedCounter prometheus.Counter + + // api + ApiRequestCounter prometheus.Counter + ApiRequestSuccessCounter prometheus.Counter + ApiRequestFailedCounter prometheus.Counter + + // grpc + GrpcRequestCounter prometheus.Counter + GrpcRequestSuccessCounter prometheus.Counter + GrpcRequestFailedCounter prometheus.Counter + + SendMsgCounter prometheus.Counter ) func NewUserLoginCounter() { @@ -23,6 +35,13 @@ func NewUserLoginCounter() { }) } +func NewUserRegisterCounter() { + UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "user_register", + Help: "The number of user register", + }) +} + func NewSeqGetSuccessCounter() { SeqGetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "seq_get_success", @@ -48,3 +67,52 @@ func NewSeqSetFailedCounter() { Help: "The number of failed set seq", }) } + +func NewApiRequestCounter() { + ApiRequestCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "api_request", + Help: "The number of api request", + }) +} + +func NewApiRequestSuccessCounter() { + ApiRequestSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "api_request_success", + Help: "The number of api request success", + }) +} + +func NewApiRequestFailedCounter() { + ApiRequestFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "api_request_failed", + Help: "The number of api request failed", + }) +} + +func NewGrpcRequestCounter() { + GrpcRequestCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "grpc_request", + Help: "The number of api request", + }) +} + +func NewGrpcRequestSuccessCounter() { + GrpcRequestSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "grpc_request_success", + Help: "The number of grpc request success", + }) +} + +func NewGrpcRequestFailedCounter() { + GrpcRequestFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "grpc_request_failed", + Help: "The number of grpc request failed", + }) +} + +func NewSendMsgCount() { + SendMsgCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "send_msg", + Help: "The number of send msg", + }) +} diff --git a/pkg/common/prometheus/grpc.go b/pkg/common/prometheus/grpc.go new file mode 100644 index 000000000..d0d513b00 --- /dev/null +++ b/pkg/common/prometheus/grpc.go @@ -0,0 +1,35 @@ +package prometheus + +import ( + "context" + "encoding/json" + "time" + + "Open_IM/pkg/common/log" + + "google.golang.org/grpc" + "google.golang.org/grpc/peer" +) + +func UnaryServerInterceptorProme(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { + remote, _ := peer.FromContext(ctx) + remoteAddr := remote.Addr.String() + + in, _ := json.Marshal(req) + inStr := string(in) + log.NewInfo("ip", remoteAddr, "access_start", info.FullMethod, "in", inStr) + + start := time.Now() + defer func() { + out, _ := json.Marshal(resp) + outStr := string(out) + duration := int64(time.Since(start) / time.Millisecond) + if duration >= 500 { + log.NewInfo("ip", remoteAddr, "access_end", info.FullMethod, "in", inStr, "out", outStr, "err", err, "duration/ms", duration) + } else { + log.NewInfo("ip", remoteAddr, "access_end", info.FullMethod, "in", inStr, "out", outStr, "err", err, "duration/ms", duration) + } + }() + resp, err = handler(ctx, req) + return +} diff --git a/pkg/common/prometheus/prometheus.go b/pkg/common/prometheus/prometheus.go index a6b65fee0..4951823cc 100644 --- a/pkg/common/prometheus/prometheus.go +++ b/pkg/common/prometheus/prometheus.go @@ -2,6 +2,7 @@ package prometheus import ( "Open_IM/pkg/common/config" + "bytes" "net/http" "strconv" @@ -26,6 +27,28 @@ func PrometheusHandler() gin.HandlerFunc { } } +type responseBodyWriter struct { + gin.ResponseWriter + body *bytes.Buffer +} + +func (r responseBodyWriter) Write(b []byte) (int, error) { + r.body.Write(b) + return r.ResponseWriter.Write(b) +} + +func PromeTheusMiddleware(c *gin.Context) { + PromeInc(ApiRequestCounter) + w := &responseBodyWriter{body: &bytes.Buffer{}, ResponseWriter: c.Writer} + c.Writer = w + c.Next() + if c.Writer.Status() == http.StatusOK { + PromeInc(ApiRequestSuccessCounter) + } else { + PromeInc(ApiRequestFailedCounter) + } +} + func PromeInc(counter prometheus.Counter) { if config.Config.Prometheus.Enable { counter.Inc() From 07170135e6ec633bbec0f3d8f1f5f0ff2fe58fa2 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 01:28:56 +0800 Subject: [PATCH 36/69] prome --- pkg/common/prometheus/gather.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index cbca7ee61..9f6991e81 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -46,13 +46,6 @@ func NewUserRegisterCounter() { }) } -func NewUserRegisterCounter() { - UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "user_register", - Help: "The number of user register", - }) -} - func NewSeqGetSuccessCounter() { SeqGetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "seq_get_success", From aa6b439e8c11dbff705b09adce1a30184e958b7d Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 01:35:08 +0800 Subject: [PATCH 37/69] prome --- internal/msg_gateway/gate/relay_rpc_server.go | 2 +- internal/push/logic/push_rpc_server.go | 2 +- internal/rpc/auth/auth.go | 2 +- internal/rpc/conversation/conversaion.go | 2 +- internal/rpc/friend/friend.go | 2 +- internal/rpc/group/group.go | 2 +- internal/rpc/msg/rpcChat.go | 2 +- internal/rpc/user/user.go | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index e201061e3..34aac553a 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -56,7 +56,7 @@ func (r *RPCServer) run() { defer listener.Close() var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/push/logic/push_rpc_server.go b/internal/push/logic/push_rpc_server.go index a95afd24e..8f0344a3e 100644 --- a/internal/push/logic/push_rpc_server.go +++ b/internal/push/logic/push_rpc_server.go @@ -45,7 +45,7 @@ func (r *RPCServer) run() { defer listener.Close() var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 46ec43f2b..cbd88d8b0 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -128,7 +128,7 @@ func (rpc *rpcAuth) Run() { log.NewInfo(operationID, "listen network success, ", address, listener) var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index 19cd5ead7..b57c7c163 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -187,7 +187,7 @@ func (rpc *rpcConversation) Run() { //grpc server var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index 6f174c697..0d2a8e209 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -63,7 +63,7 @@ func (s *friendServer) Run() { //grpc server var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 062765069..380d6c021 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -72,7 +72,7 @@ func (s *groupServer) Run() { } var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(options...) defer srv.GracefulStop() diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index bbd249622..f6280df37 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -69,7 +69,7 @@ func (rpc *rpcChat) Run() { var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 241e6d081..7d980d4be 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -64,7 +64,7 @@ func (s *userServer) Run() { //grpc server var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { - grpcOpts = append(grpcOpts, promePkg.UnaryServerInterceptorProme) + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() From c091b5f3856df403a9e68337b3b6cdd98ae4f4c0 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 01:46:22 +0800 Subject: [PATCH 38/69] prome --- docker-compose_cfg/grafana.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose_cfg/grafana.ini b/docker-compose_cfg/grafana.ini index eeac17d6f..180de10af 100644 --- a/docker-compose_cfg/grafana.ini +++ b/docker-compose_cfg/grafana.ini @@ -1105,7 +1105,7 @@ disable_sanitize_html = false enable_alpha = false app_tls_skip_verify_insecure = false # Enter a comma-separated list of plugin identifiers to identify plugins to load even if they are unsigned. Plugins with modified signatures are never loaded. -allow_loading_unsigned_plugins = +allow_loading_unsigned_plugins = grafana-simple-json-backend-datasource # Enable or disable installing / uninstalling / updating plugins directly from within Grafana. plugin_admin_enabled = true plugin_admin_external_manage_enabled = false From c1a94a1b6c75de163e605aedf6c502c4e5f2aa70 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 01:48:24 +0800 Subject: [PATCH 39/69] prome --- docker-compose.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 8a903890a..96fa42353 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -157,13 +157,14 @@ services: - ./docker-compose_cfg/grafana.ini:/etc/grafana/grafana.ini # - ./docker-compose_cfg/node-exporter-full_rev1.json:/var/lib/grafana/dashboards/node-exporter-full_rev1.json # - ./components/grafana:/var/lib/grafana - - ./docker-compose_cfg/grafana.db:/var/lib/grafana/grafana.db + # - ./docker-compose_cfg/grafana.db:/var/lib/grafana/grafana.db container_name: grafana ports: - 10007:10007 depends_on: - prometheus network_mode: "host" + # -rw-r----- node-exporter: image: quay.io/prometheus/node-exporter From 144cf279f9664c26c05499aac5e2ca5653432ca2 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 08:45:10 +0800 Subject: [PATCH 40/69] prome --- internal/msg_gateway/gate/relay_rpc_server.go | 3 +++ internal/push/logic/push_rpc_server.go | 3 +++ internal/rpc/admin_cms/admin_cms.go | 11 +++++++++-- internal/rpc/auth/auth.go | 11 +++-------- internal/rpc/conversation/conversaion.go | 3 +++ internal/rpc/friend/friend.go | 3 +++ internal/rpc/group/group.go | 3 +++ internal/rpc/msg/rpcChat.go | 3 +++ internal/rpc/office/office.go | 11 +++++++++-- internal/rpc/organization/organization.go | 10 +++++++++- internal/rpc/user/user.go | 3 +++ 11 files changed, 51 insertions(+), 13 deletions(-) diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index 34aac553a..35623d17d 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -56,6 +56,9 @@ func (r *RPCServer) run() { defer listener.Close() var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) diff --git a/internal/push/logic/push_rpc_server.go b/internal/push/logic/push_rpc_server.go index 8f0344a3e..44269d504 100644 --- a/internal/push/logic/push_rpc_server.go +++ b/internal/push/logic/push_rpc_server.go @@ -45,6 +45,9 @@ func (r *RPCServer) run() { defer listener.Close() var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) diff --git a/internal/rpc/admin_cms/admin_cms.go b/internal/rpc/admin_cms/admin_cms.go index 6c477af16..bde6d421b 100644 --- a/internal/rpc/admin_cms/admin_cms.go +++ b/internal/rpc/admin_cms/admin_cms.go @@ -6,6 +6,7 @@ import ( "Open_IM/pkg/common/db" imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbAdminCMS "Open_IM/pkg/proto/admin_cms" @@ -57,8 +58,14 @@ func (s *adminCMSServer) Run() { } log.NewInfo("0", "listen network success, ", address, listener) defer listener.Close() - //grpc server - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //Service registers with etcd pbAdminCMS.RegisterAdminCMSServer(srv, s) diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index cbd88d8b0..a23b7d3f4 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -22,11 +22,6 @@ import ( "google.golang.org/grpc" ) -func (rpc *rpcAuth) initPrometheus() { - promePkg.NewUserLoginCounter() - promePkg.NewUserRegisterCounter() -} - func (rpc *rpcAuth) UserRegister(_ context.Context, req *pbAuth.UserRegisterReq) (*pbAuth.UserRegisterResp, error) { log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " rpc args ", req.String()) var user db.User @@ -128,6 +123,9 @@ func (rpc *rpcAuth) Run() { log.NewInfo(operationID, "listen network success, ", address, listener) var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) @@ -152,9 +150,6 @@ func (rpc *rpcAuth) Run() { } log.NewInfo(operationID, "RegisterAuthServer ok ", rpc.etcdSchema, strings.Join(rpc.etcdAddr, ","), rpcRegisterIP, rpc.rpcPort, rpc.rpcRegisterName) - if config.Config.Prometheus.Enable { - rpc.initPrometheus() - } err = srv.Serve(listener) if err != nil { log.NewError(operationID, "Serve failed ", err.Error()) diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index b57c7c163..ee04b1974 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -187,6 +187,9 @@ func (rpc *rpcConversation) Run() { //grpc server var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index 0d2a8e209..696217cb8 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -63,6 +63,9 @@ func (s *friendServer) Run() { //grpc server var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 380d6c021..2193cd89c 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -72,6 +72,9 @@ func (s *groupServer) Run() { } var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(options...) diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index f6280df37..22bd3840e 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -69,6 +69,9 @@ func (rpc *rpcChat) Run() { var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) diff --git a/internal/rpc/office/office.go b/internal/rpc/office/office.go index 741938ca3..4d12267e5 100644 --- a/internal/rpc/office/office.go +++ b/internal/rpc/office/office.go @@ -8,6 +8,7 @@ import ( "Open_IM/pkg/common/db/mysql_model/im_mysql_model" imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbCache "Open_IM/pkg/proto/cache" pbOffice "Open_IM/pkg/proto/office" @@ -63,11 +64,17 @@ func (s *officeServer) Run() { //grpc server recvSize := 1024 * 1024 * 30 sendSize := 1024 * 1024 * 30 - var options = []grpc.ServerOption{ + var grpcOpts = []grpc.ServerOption{ grpc.MaxRecvMsgSize(recvSize), grpc.MaxSendMsgSize(sendSize), } - srv := grpc.NewServer(options...) + if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //Service registers with etcd pbOffice.RegisterOfficeServiceServer(srv, s) diff --git a/internal/rpc/organization/organization.go b/internal/rpc/organization/organization.go index 89cd15321..327e40003 100644 --- a/internal/rpc/organization/organization.go +++ b/internal/rpc/organization/organization.go @@ -8,6 +8,7 @@ import ( imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model" rocksCache "Open_IM/pkg/common/db/rocks_cache" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbAuth "Open_IM/pkg/proto/auth" @@ -58,7 +59,14 @@ func (s *organizationServer) Run() { log.NewInfo("", "listen network success, ", address, listener) defer listener.Close() //grpc server - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() + grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //Service registers with etcd rpc.RegisterOrganizationServer(srv, s) diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 7d980d4be..080a50b7f 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -64,6 +64,9 @@ func (s *userServer) Run() { //grpc server var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) From 355c672ed18ebaf978c05f304bad823f9fcf4a98 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 08:50:29 +0800 Subject: [PATCH 41/69] prome --- docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 96fa42353..8692c7ba0 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -157,7 +157,7 @@ services: - ./docker-compose_cfg/grafana.ini:/etc/grafana/grafana.ini # - ./docker-compose_cfg/node-exporter-full_rev1.json:/var/lib/grafana/dashboards/node-exporter-full_rev1.json # - ./components/grafana:/var/lib/grafana - # - ./docker-compose_cfg/grafana.db:/var/lib/grafana/grafana.db + - ./docker-compose_cfg/grafana.db:/var/lib/grafana/grafana.db container_name: grafana ports: - 10007:10007 From 9afaba4382ea9b29f1bf65d96623109f40f4cc0c Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 09:16:08 +0800 Subject: [PATCH 42/69] prome --- internal/msg_transfer/logic/init.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/msg_transfer/logic/init.go b/internal/msg_transfer/logic/init.go index aa7ba0b9a..201c6ee41 100644 --- a/internal/msg_transfer/logic/init.go +++ b/internal/msg_transfer/logic/init.go @@ -37,7 +37,9 @@ var ( func Init() { cmdCh = make(chan Cmd2Value, 10000) w = new(sync.Mutex) - initPrometheus() + if config.Config.Prometheus.Enable { + initPrometheus() + } persistentCH.Init() // ws2mschat save mysql historyCH.Init(cmdCh) // historyMongoCH.Init() From 7f1acb45320173aa9c0471b0896a28ec7db3d29f Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 09:30:23 +0800 Subject: [PATCH 43/69] prome --- internal/rpc/auth/auth.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index a23b7d3f4..498edf609 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -126,6 +126,8 @@ func (rpc *rpcAuth) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() + promePkg.NewUserRegisterCounter() + promePkg.NewUserLoginCounter() grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) } srv := grpc.NewServer(grpcOpts...) From 979100850cc8ba476b94b6bd373ab01988a6788d Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 15 Sep 2022 12:07:28 +0800 Subject: [PATCH 44/69] prometheus for statistics --- internal/msg_gateway/gate/init.go | 3 +- internal/msg_gateway/gate/logic.go | 4 + internal/msg_gateway/gate/relay_rpc_server.go | 12 ++ internal/push/logic/init.go | 5 + internal/push/logic/push_to_client.go | 6 +- internal/rpc/msg/pull_message.go | 15 +- internal/rpc/msg/rpcChat.go | 46 +++-- internal/rpc/msg/send_msg.go | 16 ++ pkg/common/db/RedisModel.go | 1 - pkg/common/prometheus/gather.go | 165 +++++++++++++++++- pkg/common/prometheus/prometheus.go | 1 - 11 files changed, 244 insertions(+), 30 deletions(-) diff --git a/internal/msg_gateway/gate/init.go b/internal/msg_gateway/gate/init.go index 8269a03b0..88ef3d12d 100644 --- a/internal/msg_gateway/gate/init.go +++ b/internal/msg_gateway/gate/init.go @@ -27,14 +27,13 @@ var ( ) func Init(rpcPort, wsPort int) { - //log initialization - rwLock = new(sync.RWMutex) validate = validator.New() statistics.NewStatistics(&sendMsgAllCount, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second recv to msg_gateway sendMsgCount", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval) statistics.NewStatistics(&userCount, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second add user conn", constant.StatisticsTimeInterval), constant.StatisticsTimeInterval) ws.onInit(wsPort) rpcSvr.onInit(rpcPort) + initPrometheus() } func Run(promethuesPort int) { diff --git a/internal/msg_gateway/gate/logic.go b/internal/msg_gateway/gate/logic.go index 2ee9be712..7b77840a7 100644 --- a/internal/msg_gateway/gate/logic.go +++ b/internal/msg_gateway/gate/logic.go @@ -5,6 +5,7 @@ import ( "Open_IM/pkg/common/constant" "Open_IM/pkg/common/db" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbChat "Open_IM/pkg/proto/msg" pbRtc "Open_IM/pkg/proto/rtc" @@ -43,15 +44,18 @@ func (ws *WServer) msgParse(conn *UserConn, binaryMsg []byte) { case constant.WSGetNewestSeq: log.NewInfo(m.OperationID, "getSeqReq ", m.SendID, m.MsgIncr, m.ReqIdentifier) ws.getSeqReq(conn, &m) + promePkg.PromeInc(promePkg.GetNewestSeqTotalCounter) case constant.WSSendMsg: log.NewInfo(m.OperationID, "sendMsgReq ", m.SendID, m.MsgIncr, m.ReqIdentifier) ws.sendMsgReq(conn, &m) + promePkg.PromeInc(promePkg.MsgRecvTotalCounter) case constant.WSSendSignalMsg: log.NewInfo(m.OperationID, "sendSignalMsgReq ", m.SendID, m.MsgIncr, m.ReqIdentifier) ws.sendSignalMsgReq(conn, &m) case constant.WSPullMsgBySeqList: log.NewInfo(m.OperationID, "pullMsgBySeqListReq ", m.SendID, m.MsgIncr, m.ReqIdentifier) ws.pullMsgBySeqListReq(conn, &m) + promePkg.PromeInc(promePkg.PullMsgBySeqListTotalCounter) case constant.WsLogoutMsg: log.NewInfo(m.OperationID, "conn.Close()", m.SendID, m.MsgIncr, m.ReqIdentifier) // conn.Close() diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index 406cb991e..35636a762 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -4,6 +4,7 @@ import ( "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbRelay "Open_IM/pkg/proto/relay" @@ -31,6 +32,16 @@ type RPCServer struct { target string } +func initPrometheus() { + promePkg.NewMsgRecvTotalCounter() + promePkg.NewGetNewestSeqTotalCounter() + promePkg.NewPullMsgBySeqListTotalCounter() + promePkg.NewMsgOnlinePushSuccessCounter() + //promePkg.NewSingleChatMsgRecvSuccessCounter() + //promePkg.NewGroupChatMsgRecvSuccessCounter() + //promePkg.NewWorkSuperGroupChatMsgRecvSuccessCounter() +} + func (r *RPCServer) onInit(rpcPort int) { r.rpcPort = rpcPort r.rpcRegisterName = config.Config.RpcRegisterName.OpenImRelayName @@ -174,6 +185,7 @@ func (r *RPCServer) SuperGroupOnlineBatchPushOneMsg(_ context.Context, req *pbRe resultCode := sendMsgBatchToUser(userConn, replyBytes.Bytes(), req, platform, v) if resultCode == 0 && utils.IsContainInt(platform, r.pushTerminal) { tempT.OnlinePush = true + promePkg.PromeInc(promePkg.MsgOnlinePushSuccessCounter) log.Info(req.OperationID, "PushSuperMsgToUser is success By Ws", "args", req.String(), "recvPlatForm", constant.PlatformIDToName(platform), "recvID", v) temp := &pbRelay.SingleMsgToUserPlatform{ ResultCode: resultCode, diff --git a/internal/push/logic/init.go b/internal/push/logic/init.go index ce996d3c5..81ed48087 100644 --- a/internal/push/logic/init.go +++ b/internal/push/logic/init.go @@ -47,6 +47,11 @@ func init() { } } +func initPrometheus() { + promePkg.NewMsgOfflinePushSuccessCounter() + promePkg.NewMsgOfflinePushFailedCounter() +} + func Run(promethuesPort int) { go rpcServer.run() go pushCh.pushConsumerGroup.RegisterHandleAndConsumer(&pushCh) diff --git a/internal/push/logic/push_to_client.go b/internal/push/logic/push_to_client.go index f129ad385..634d2e008 100644 --- a/internal/push/logic/push_to_client.go +++ b/internal/push/logic/push_to_client.go @@ -21,6 +21,7 @@ import ( "context" "strings" + promePkg "Open_IM/pkg/common/prometheus" "github.com/golang/protobuf/proto" ) @@ -140,8 +141,10 @@ func MsgToUser(pushMsg *pbPush.PushMsgReq) { } pushResult, err := offlinePusher.Push(UIDList, title, detailContent, pushMsg.OperationID, opts) if err != nil { + promePkg.PromeInc(promePkg.MsgOfflinePushFailedCounter) log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error()) } else { + promePkg.PromeInc(promePkg.MsgOfflinePushSuccessCounter) log.NewDebug(pushMsg.OperationID, "offline push return result is ", pushResult, pushMsg.MsgData) } } @@ -261,12 +264,13 @@ func MsgToSuperGroupUser(pushMsg *pbPush.PushMsgReq) { } pushResult, err := offlinePusher.Push(needOfflinePushUserIDList, title, detailContent, pushMsg.OperationID, opts) if err != nil { + promePkg.PromeInc(promePkg.MsgOfflinePushFailedCounter) log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error()) } else { + promePkg.PromeInc(promePkg.MsgOfflinePushSuccessCounter) log.NewDebug(pushMsg.OperationID, "offline push return result is ", pushResult, pushMsg.MsgData) } } - } } diff --git a/internal/rpc/msg/pull_message.go b/internal/rpc/msg/pull_message.go index 4fcf9f9f7..1a99a14e6 100644 --- a/internal/rpc/msg/pull_message.go +++ b/internal/rpc/msg/pull_message.go @@ -8,6 +8,8 @@ import ( commonDB "Open_IM/pkg/common/db" "Open_IM/pkg/common/log" open_im_sdk "Open_IM/pkg/proto/sdk_ws" + + promePkg "Open_IM/pkg/common/prometheus" ) func (rpc *rpcChat) GetMaxAndMinSeq(_ context.Context, in *open_im_sdk.GetMaxAndMinSeqReq) (*open_im_sdk.GetMaxAndMinSeqResp, error) { @@ -48,57 +50,62 @@ func (rpc *rpcChat) PullMessageBySeqList(_ context.Context, in *open_im_sdk.Pull log.NewInfo(in.OperationID, "rpc PullMessageBySeqList is arriving", in.String()) resp := new(open_im_sdk.PullMessageBySeqListResp) m := make(map[string]*open_im_sdk.MsgDataList) - //msgList, err := commonDB.DB.GetMsgBySeqList(in.UserID, in.SeqList, in.OperationID) redisMsgList, failedSeqList, err := commonDB.DB.GetMessageListBySeq(in.UserID, in.SeqList, in.OperationID) if err != nil { if err != go_redis.Nil { + promePkg.PromeAdd(promePkg.MsgPullFromRedisFailedCounter, len(failedSeqList)) log.Error(in.OperationID, "get message from redis exception", err.Error(), failedSeqList) } else { log.Debug(in.OperationID, "get message from redis is nil", failedSeqList) } msgList, err1 := commonDB.DB.GetMsgBySeqListMongo2(in.UserID, failedSeqList, in.OperationID) if err1 != nil { + promePkg.PromeAdd(promePkg.MsgPullFromMongoFailedCounter, len(failedSeqList)) log.Error(in.OperationID, "PullMessageBySeqList data error", in.String(), err.Error()) resp.ErrCode = 201 resp.ErrMsg = err.Error() return resp, nil } else { + promePkg.PromeAdd(promePkg.MsgPullFromMongoSuccessCounter, len(msgList)) redisMsgList = append(redisMsgList, msgList...) resp.List = redisMsgList } } else { + promePkg.PromeAdd(promePkg.MsgPullFromRedisSuccessCounter, len(redisMsgList)) resp.List = redisMsgList } + for k, v := range in.GroupSeqList { x := new(open_im_sdk.MsgDataList) redisMsgList, failedSeqList, err := commonDB.DB.GetMessageListBySeq(k, v.SeqList, in.OperationID) if err != nil { if err != go_redis.Nil { + promePkg.PromeAdd(promePkg.MsgPullFromRedisFailedCounter, len(failedSeqList)) log.Error(in.OperationID, "get message from redis exception", err.Error(), failedSeqList) } else { log.Debug(in.OperationID, "get message from redis is nil", failedSeqList) } msgList, err1 := commonDB.DB.GetSuperGroupMsgBySeqListMongo(k, failedSeqList, in.OperationID) if err1 != nil { + promePkg.PromeAdd(promePkg.MsgPullFromMongoFailedCounter, len(failedSeqList)) log.Error(in.OperationID, "PullMessageBySeqList data error", in.String(), err.Error()) resp.ErrCode = 201 resp.ErrMsg = err.Error() return resp, nil } else { + promePkg.PromeAdd(promePkg.MsgPullFromMongoSuccessCounter, len(msgList)) redisMsgList = append(redisMsgList, msgList...) x.MsgDataList = redisMsgList m[k] = x } } else { + promePkg.PromeAdd(promePkg.MsgPullFromRedisSuccessCounter, len(redisMsgList)) x.MsgDataList = redisMsgList m[k] = x } } resp.GroupMsgDataList = m - //respSingleMsgFormat = singleMsgHandleByUser(SingleMsgFormat, in.UserID) - //respGroupMsgFormat = groupMsgHandleByUser(GroupMsgFormat) return resp, nil - } type MsgFormats []*open_im_sdk.MsgData diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index 2c4c6270c..536a5897b 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -13,15 +13,14 @@ import ( "strconv" "strings" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" + promePkg "Open_IM/pkg/common/prometheus" "google.golang.org/grpc" ) -var ( - sendMsgSuccessCounter prometheus.Counter - sendMsgFailedCounter prometheus.Counter -) +//var ( +// sendMsgSuccessCounter prometheus.Counter +// sendMsgFailedCounter prometheus.Counter +//) type rpcChat struct { rpcPort int @@ -55,14 +54,29 @@ func NewRpcChatServer(port int) *rpcChat { } func (rpc *rpcChat) initPrometheus() { - sendMsgSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "send_msg_success", - Help: "The number of send msg success", - }) - sendMsgFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "send_msg_failed", - Help: "The number of send msg failed", - }) + //sendMsgSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + // Name: "send_msg_success", + // Help: "The number of send msg success", + //}) + //sendMsgFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + // Name: "send_msg_failed", + // Help: "The number of send msg failed", + //}) + promePkg.NewMsgPullFromRedisSuccessCounter() + promePkg.NewMsgPullFromRedisFailedCounter() + promePkg.NewMsgPullFromMongoSuccessCounter() + promePkg.NewMsgPullFromMongoFailedCounter() + + promePkg.NewSingleChatMsgRecvSuccessCounter() + promePkg.NewGroupChatMsgRecvSuccessCounter() + promePkg.NewWorkSuperGroupChatMsgRecvSuccessCounter() + + promePkg.NewSingleChatMsgProcessSuccessCounter() + promePkg.NewSingleChatMsgProcessFailedCounter() + promePkg.NewGroupChatMsgProcessSuccessCounter() + promePkg.NewGroupChatMsgProcessFailedCounter() + promePkg.NewWorkSuperGroupChatMsgProcessSuccessCounter() + promePkg.NewWorkSuperGroupChatMsgProcessFailedCounter() } func (rpc *rpcChat) Run() { @@ -97,9 +111,7 @@ func (rpc *rpcChat) Run() { panic(utils.Wrap(err, "register chat module rpc to etcd err")) } go rpc.runCh() - if config.Config.Prometheus.Enable { - rpc.initPrometheus() - } + rpc.initPrometheus() err = srv.Serve(listener) if err != nil { log.Error("", "rpc rpcChat failed ", err.Error()) diff --git a/internal/rpc/msg/send_msg.go b/internal/rpc/msg/send_msg.go index 876f2cda7..dbc1ec6eb 100644 --- a/internal/rpc/msg/send_msg.go +++ b/internal/rpc/msg/send_msg.go @@ -23,6 +23,7 @@ import ( "sync" "time" + promePkg "Open_IM/pkg/common/prometheus" go_redis "github.com/go-redis/redis/v8" "github.com/golang/protobuf/proto" ) @@ -270,6 +271,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S } switch pb.MsgData.SessionType { case constant.SingleChatType: + promePkg.PromeInc(promePkg.SingleChatMsgRecvSuccessCounter) // callback t1 = time.Now() callbackResp := callbackBeforeSendSingleMsg(pb) @@ -282,6 +284,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S callbackResp.ErrCode = 201 } log.NewDebug(pb.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp) + promePkg.PromeInc(promePkg.SingleChatMsgProcessFailedCounter) return returnMsg(&replay, pb, int32(callbackResp.ErrCode), callbackResp.ErrMsg, "", 0) } t1 = time.Now() @@ -295,6 +298,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S log.Info(pb.OperationID, "sendMsgToKafka ", " cost time: ", time.Since(t1)) if err1 != nil { log.NewError(msgToMQSingle.OperationID, "kafka send msg err :RecvID", msgToMQSingle.MsgData.RecvID, msgToMQSingle.String(), err1.Error()) + promePkg.PromeInc(promePkg.SingleChatMsgProcessFailedCounter) return returnMsg(&replay, pb, 201, "kafka send msg err", "", 0) } } @@ -304,6 +308,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S log.Info(pb.OperationID, "sendMsgToKafka ", " cost time: ", time.Since(t1)) if err2 != nil { log.NewError(msgToMQSingle.OperationID, "kafka send msg err:SendID", msgToMQSingle.MsgData.SendID, msgToMQSingle.String()) + promePkg.PromeInc(promePkg.SingleChatMsgProcessFailedCounter) return returnMsg(&replay, pb, 201, "kafka send msg err", "", 0) } } @@ -315,9 +320,11 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S log.NewError(pb.OperationID, utils.GetSelfFuncName(), "callbackAfterSendSingleMsg resp: ", callbackResp) } log.Debug(pb.OperationID, "send msg cost time all: ", db.GetCurrentTimestampByMill()-newTime, pb.MsgData.ClientMsgID) + promePkg.PromeInc(promePkg.SingleChatMsgProcessSuccessCounter) return returnMsg(&replay, pb, 0, "", msgToMQSingle.MsgData.ServerMsgID, msgToMQSingle.MsgData.SendTime) case constant.GroupChatType: // callback + promePkg.PromeInc(promePkg.GroupChatMsgRecvSuccessCounter) callbackResp := callbackBeforeSendGroupMsg(pb) if callbackResp.ErrCode != 0 { log.NewError(pb.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendGroupMsg resp:", callbackResp) @@ -327,10 +334,12 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S callbackResp.ErrCode = 201 } log.NewDebug(pb.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSingleMsg result", "end rpc and return", callbackResp) + promePkg.PromeInc(promePkg.GroupChatMsgProcessFailedCounter) return returnMsg(&replay, pb, int32(callbackResp.ErrCode), callbackResp.ErrMsg, "", 0) } var memberUserIDList []string if flag, errCode, errMsg, memberUserIDList = messageVerification(pb); !flag { + promePkg.PromeInc(promePkg.GroupChatMsgProcessFailedCounter) return returnMsg(&replay, pb, errCode, errMsg, "", 0) } log.Debug(pb.OperationID, "GetGroupAllMember userID list", memberUserIDList, "len: ", len(memberUserIDList)) @@ -395,6 +404,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S } if !sendTag { log.NewWarn(pb.OperationID, "send tag is ", sendTag) + promePkg.PromeInc(promePkg.GroupChatMsgProcessFailedCounter) return returnMsg(&replay, pb, 201, "kafka send msg err", "", 0) } else { if pb.MsgData.ContentType == constant.AtText { @@ -459,6 +469,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S }() } log.Debug(pb.OperationID, "send msg cost time3 ", db.GetCurrentTimestampByMill()-newTime, pb.MsgData.ClientMsgID) + promePkg.PromeInc(promePkg.GroupChatMsgProcessSuccessCounter) return returnMsg(&replay, pb, 0, "", msgToMQSingle.MsgData.ServerMsgID, msgToMQSingle.MsgData.SendTime) } case constant.NotificationChatType: @@ -481,6 +492,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S log.Debug(pb.OperationID, "send msg cost time ", db.GetCurrentTimestampByMill()-newTime, pb.MsgData.ClientMsgID) return returnMsg(&replay, pb, 0, "", msgToMQSingle.MsgData.ServerMsgID, msgToMQSingle.MsgData.SendTime) case constant.SuperGroupChatType: + promePkg.PromeInc(promePkg.WorkSuperGroupChatMsgRecvSuccessCounter) // callback callbackResp := callbackBeforeSendGroupMsg(pb) if callbackResp.ErrCode != 0 { @@ -490,10 +502,12 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S if callbackResp.ErrCode == 0 { callbackResp.ErrCode = 201 } + promePkg.PromeInc(promePkg.WorkSuperGroupChatMsgProcessFailedCounter) log.NewDebug(pb.OperationID, utils.GetSelfFuncName(), "callbackBeforeSendSuperGroupMsg result", "end rpc and return", callbackResp) return returnMsg(&replay, pb, int32(callbackResp.ErrCode), callbackResp.ErrMsg, "", 0) } if flag, errCode, errMsg, _ = messageVerification(pb); !flag { + promePkg.PromeInc(promePkg.WorkSuperGroupChatMsgProcessFailedCounter) return returnMsg(&replay, pb, errCode, errMsg, "", 0) } msgToMQSingle.MsgData = pb.MsgData @@ -501,6 +515,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S err1 := rpc.sendMsgToKafka(&msgToMQSingle, msgToMQSingle.MsgData.GroupID, constant.OnlineStatus) if err1 != nil { log.NewError(msgToMQSingle.OperationID, "kafka send msg err:RecvID", msgToMQSingle.MsgData.RecvID, msgToMQSingle.String()) + promePkg.PromeInc(promePkg.WorkSuperGroupChatMsgProcessFailedCounter) return returnMsg(&replay, pb, 201, "kafka send msg err", "", 0) } // callback @@ -508,6 +523,7 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S if callbackResp.ErrCode != 0 { log.NewError(pb.OperationID, utils.GetSelfFuncName(), "callbackAfterSendSuperGroupMsg resp: ", callbackResp) } + promePkg.PromeInc(promePkg.WorkSuperGroupChatMsgProcessSuccessCounter) return returnMsg(&replay, pb, 0, "", msgToMQSingle.MsgData.ServerMsgID, msgToMQSingle.MsgData.SendTime) default: diff --git a/pkg/common/db/RedisModel.go b/pkg/common/db/RedisModel.go index 63be03533..d36202367 100644 --- a/pkg/common/db/RedisModel.go +++ b/pkg/common/db/RedisModel.go @@ -182,7 +182,6 @@ func (d *DataBases) GetMessageListBySeq(userID string, seqList []uint32, operati for _, v := range seqList { //MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1 key := messageCache + userID + "_" + strconv.Itoa(int(v)) - result, err := d.RDB.Get(context.Background(), key).Result() if err != nil { errResult = err diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index 534a27d68..471de8d0f 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -9,16 +9,43 @@ var ( UserLoginCounter prometheus.Counter UserRegisterCounter prometheus.Counter + //seg SeqGetSuccessCounter prometheus.Counter SeqGetFailedCounter prometheus.Counter SeqSetSuccessCounter prometheus.Counter SeqSetFailedCounter prometheus.Counter - MsgInsertRedisSuccessCounter prometheus.Counter - MsgInsertRedisFailedCounter prometheus.Counter + //msg-db + MsgInsertRedisSuccessCounter prometheus.Counter + MsgInsertRedisFailedCounter prometheus.Counter + MsgInsertMongoSuccessCounter prometheus.Counter + MsgInsertMongoFailedCounter prometheus.Counter + MsgPullFromRedisSuccessCounter prometheus.Counter + MsgPullFromRedisFailedCounter prometheus.Counter + MsgPullFromMongoSuccessCounter prometheus.Counter + MsgPullFromMongoFailedCounter prometheus.Counter - MsgInsertMongoSuccessCounter prometheus.Counter - MsgInsertMongoFailedCounter prometheus.Counter + //msg-ws + MsgRecvTotalCounter prometheus.Counter + GetNewestSeqTotalCounter prometheus.Counter + PullMsgBySeqListTotalCounter prometheus.Counter + + SingleChatMsgRecvSuccessCounter prometheus.Counter + GroupChatMsgRecvSuccessCounter prometheus.Counter + WorkSuperGroupChatMsgRecvSuccessCounter prometheus.Counter + + //msg-msg + SingleChatMsgProcessSuccessCounter prometheus.Counter + SingleChatMsgProcessFailedCounter prometheus.Counter + GroupChatMsgProcessSuccessCounter prometheus.Counter + GroupChatMsgProcessFailedCounter prometheus.Counter + WorkSuperGroupChatMsgProcessSuccessCounter prometheus.Counter + WorkSuperGroupChatMsgProcessFailedCounter prometheus.Counter + + //msg-push + MsgOnlinePushSuccessCounter prometheus.Counter + MsgOfflinePushSuccessCounter prometheus.Counter + MsgOfflinePushFailedCounter prometheus.Counter ) func NewUserLoginCounter() { @@ -87,3 +114,133 @@ func NewMsgInsertMongoFailedCounter() { Help: "The number of failed insert msg to mongo", }) } + +func NewMsgPullFromRedisSuccessCounter() { + MsgPullFromRedisSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_pull_from_redis_success", + Help: "The number of successful pull msg from redis", + }) +} + +func NewMsgPullFromRedisFailedCounter() { + MsgPullFromRedisFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_pull_from_redis_failed", + Help: "The number of failed pull msg from redis", + }) +} + +func NewMsgPullFromMongoSuccessCounter() { + MsgPullFromMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_pull_from_redis_success", + Help: "The number of successful pull msg from mongo", + }) +} + +func NewMsgPullFromMongoFailedCounter() { + MsgPullFromMongoFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_pull_from_mongo_failed", + Help: "The number of failed pull msg from mongo", + }) +} + +func NewMsgRecvTotalCounter() { + MsgRecvTotalCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_recv_total", + Help: "The number of msg received", + }) +} + +func NewGetNewestSeqTotalCounter() { + GetNewestSeqTotalCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "get_newest_seq_total", + Help: "the number of get newest seq", + }) +} +func NewPullMsgBySeqListTotalCounter() { + PullMsgBySeqListTotalCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "pull_msg_by_seq_list_total", + Help: "The number of pull msg by seq list", + }) +} + +func NewSingleChatMsgRecvSuccessCounter() { + SingleChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "single_chat_msg_recv_success", + Help: "The number of single chat msg successful received ", + }) +} + +func NewGroupChatMsgRecvSuccessCounter() { + GroupChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "group_chat_msg_recv_success", + Help: "The number of group chat msg successful received", + }) +} + +func NewWorkSuperGroupChatMsgRecvSuccessCounter() { + WorkSuperGroupChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "work_super_group_chat_msg_recv_success", + Help: "The number of work/super group chat msg successful received", + }) +} + +func NewSingleChatMsgProcessSuccessCounter() { + SingleChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "single_chat_msg_process_success", + Help: "The number of single chat msg successful processed", + }) +} + +func NewSingleChatMsgProcessFailedCounter() { + SingleChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "single_chat_msg_process_failed", + Help: "The number of single chat msg failed processed", + }) +} + +func NewGroupChatMsgProcessSuccessCounter() { + GroupChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "group_chat_msg_process_success", + Help: "The number of group chat msg successful processed", + }) +} + +func NewGroupChatMsgProcessFailedCounter() { + GroupChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "group_chat_msg_process_failed", + Help: "The number of group chat msg failed processed", + }) +} + +func NewWorkSuperGroupChatMsgProcessSuccessCounter() { + WorkSuperGroupChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "work_super_group_chat_msg_process_success", + Help: "The number of work/super group chat msg successful processed", + }) +} +func NewWorkSuperGroupChatMsgProcessFailedCounter() { + WorkSuperGroupChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "work_super_group_chat_msg_process_failed", + Help: "The number of work/super group chat msg failed processed", + }) +} + +func NewMsgOnlinePushSuccessCounter() { + MsgOnlinePushSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_online_push_success", + Help: "The number of msg successful online pushed", + }) +} + +func NewMsgOfflinePushSuccessCounter() { + MsgOfflinePushSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_offline_push_success", + Help: "The number of msg successful offline pushed", + }) +} +func NewMsgOfflinePushFailedCounter() { + MsgOfflinePushFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "msg_offline_push_failed", + Help: "The number of msg failed offline pushed", + }) +} diff --git a/pkg/common/prometheus/prometheus.go b/pkg/common/prometheus/prometheus.go index 2a0d9fe1c..603ac9564 100644 --- a/pkg/common/prometheus/prometheus.go +++ b/pkg/common/prometheus/prometheus.go @@ -31,7 +31,6 @@ func PromeInc(counter prometheus.Counter) { if counter != nil { counter.Inc() } - } } From 9d73fc99323833131c3e2dde4f4531f98b7fa185 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 15 Sep 2022 12:55:40 +0800 Subject: [PATCH 45/69] Remove duplicate messageVerification call in sendMsg --- internal/rpc/msg/send_msg.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/internal/rpc/msg/send_msg.go b/internal/rpc/msg/send_msg.go index dbc1ec6eb..4be38cee7 100644 --- a/internal/rpc/msg/send_msg.go +++ b/internal/rpc/msg/send_msg.go @@ -245,11 +245,11 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S if !flag { return returnMsg(&replay, pb, errCode, errMsg, "", 0) } - flag, errCode, errMsg, _ = messageVerification(pb) - log.Info(pb.OperationID, "messageVerification ", flag, " cost time: ", time.Since(t1)) - if !flag { - return returnMsg(&replay, pb, errCode, errMsg, "", 0) - } + //flag, errCode, errMsg, _ = messageVerification(pb) + //log.Info(pb.OperationID, "messageVerification ", flag, " cost time: ", time.Since(t1)) + //if !flag { + // return returnMsg(&replay, pb, errCode, errMsg, "", 0) + //} t1 = time.Now() rpc.encapsulateMsgData(pb.MsgData) log.Info(pb.OperationID, "encapsulateMsgData ", " cost time: ", time.Since(t1)) @@ -287,6 +287,11 @@ func (rpc *rpcChat) SendMsg(_ context.Context, pb *pbChat.SendMsgReq) (*pbChat.S promePkg.PromeInc(promePkg.SingleChatMsgProcessFailedCounter) return returnMsg(&replay, pb, int32(callbackResp.ErrCode), callbackResp.ErrMsg, "", 0) } + flag, errCode, errMsg, _ = messageVerification(pb) + log.Info(pb.OperationID, "messageVerification ", flag, " cost time: ", time.Since(t1)) + if !flag { + return returnMsg(&replay, pb, errCode, errMsg, "", 0) + } t1 = time.Now() isSend := modifyMessageByUserMessageReceiveOpt(pb.MsgData.RecvID, pb.MsgData.SendID, constant.SingleChatType, pb) log.Info(pb.OperationID, "modifyMessageByUserMessageReceiveOpt ", " cost time: ", time.Since(t1)) From ccc65c846f7d879818cd76b1bbce30cc5bcd56b6 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 15 Sep 2022 13:17:53 +0800 Subject: [PATCH 46/69] prometheus for statistics --- pkg/common/prometheus/gather.go | 111 +++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index af47db1a6..dd2aadb37 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -57,17 +57,22 @@ var ( GrpcRequestSuccessCounter prometheus.Counter GrpcRequestFailedCounter prometheus.Counter - SendMsgCounter prometheus.Counter - + SendMsgCounter prometheus.Counter ) func NewUserLoginCounter() { + if UserLoginCounter != nil { + return + } UserLoginCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "user_login", Help: "The number of user login", }) } func NewUserRegisterCounter() { + if UserRegisterCounter != nil { + return + } UserRegisterCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "user_register", Help: "The number of user register", @@ -75,12 +80,18 @@ func NewUserRegisterCounter() { } func NewSeqGetSuccessCounter() { + if SeqGetSuccessCounter != nil { + return + } SeqGetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "seq_get_success", Help: "The number of successful get seq", }) } func NewSeqGetFailedCounter() { + if SeqGetFailedCounter != nil { + return + } SeqGetFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "seq_get_failed", Help: "The number of failed get seq", @@ -88,12 +99,18 @@ func NewSeqGetFailedCounter() { } func NewSeqSetSuccessCounter() { + if SeqSetSuccessCounter != nil { + return + } SeqSetSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "seq_set_success", Help: "The number of successful set seq", }) } func NewSeqSetFailedCounter() { + if SeqSetFailedCounter != nil { + return + } SeqSetFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "seq_set_failed", Help: "The number of failed set seq", @@ -101,6 +118,9 @@ func NewSeqSetFailedCounter() { } func NewApiRequestCounter() { + if ApiRequestCounter != nil { + return + } ApiRequestCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "api_request", Help: "The number of api request", @@ -108,6 +128,9 @@ func NewApiRequestCounter() { } func NewApiRequestSuccessCounter() { + if ApiRequestSuccessCounter != nil { + return + } ApiRequestSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "api_request_success", Help: "The number of api request success", @@ -115,6 +138,9 @@ func NewApiRequestSuccessCounter() { } func NewApiRequestFailedCounter() { + if ApiRequestFailedCounter != nil { + return + } ApiRequestFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "api_request_failed", Help: "The number of api request failed", @@ -122,6 +148,9 @@ func NewApiRequestFailedCounter() { } func NewGrpcRequestCounter() { + if GrpcRequestCounter != nil { + return + } GrpcRequestCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "grpc_request", Help: "The number of api request", @@ -129,6 +158,9 @@ func NewGrpcRequestCounter() { } func NewGrpcRequestSuccessCounter() { + if GrpcRequestSuccessCounter != nil { + return + } GrpcRequestSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "grpc_request_success", Help: "The number of grpc request success", @@ -136,6 +168,9 @@ func NewGrpcRequestSuccessCounter() { } func NewGrpcRequestFailedCounter() { + if GrpcRequestFailedCounter != nil { + return + } GrpcRequestFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "grpc_request_failed", Help: "The number of grpc request failed", @@ -143,6 +178,9 @@ func NewGrpcRequestFailedCounter() { } func NewSendMsgCount() { + if SendMsgCounter != nil { + return + } SendMsgCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "send_msg", Help: "The number of send msg", @@ -150,6 +188,9 @@ func NewSendMsgCount() { } func NewMsgInsertRedisSuccessCounter() { + if MsgInsertRedisSuccessCounter != nil { + return + } MsgInsertRedisSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_insert_redis_success", Help: "The number of successful insert msg to redis", @@ -157,6 +198,9 @@ func NewMsgInsertRedisSuccessCounter() { } func NewMsgInsertRedisFailedCounter() { + if MsgInsertRedisFailedCounter != nil { + return + } MsgInsertRedisFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_insert_redis_failed", Help: "The number of failed insert msg to redis", @@ -164,6 +208,9 @@ func NewMsgInsertRedisFailedCounter() { } func NewMsgInsertMongoSuccessCounter() { + if MsgInsertMongoSuccessCounter != nil { + return + } MsgInsertMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_insert_mongo_success", Help: "The number of successful insert msg to mongo", @@ -171,6 +218,9 @@ func NewMsgInsertMongoSuccessCounter() { } func NewMsgInsertMongoFailedCounter() { + if MsgInsertMongoFailedCounter != nil { + return + } MsgInsertMongoFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_insert_mongo_failed", Help: "The number of failed insert msg to mongo", @@ -178,6 +228,9 @@ func NewMsgInsertMongoFailedCounter() { } func NewMsgPullFromRedisSuccessCounter() { + if MsgPullFromRedisSuccessCounter != nil { + return + } MsgPullFromRedisSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_pull_from_redis_success", Help: "The number of successful pull msg from redis", @@ -185,6 +238,9 @@ func NewMsgPullFromRedisSuccessCounter() { } func NewMsgPullFromRedisFailedCounter() { + if MsgPullFromRedisFailedCounter != nil { + return + } MsgPullFromRedisFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_pull_from_redis_failed", Help: "The number of failed pull msg from redis", @@ -192,6 +248,9 @@ func NewMsgPullFromRedisFailedCounter() { } func NewMsgPullFromMongoSuccessCounter() { + if MsgPullFromMongoSuccessCounter != nil { + return + } MsgPullFromMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_pull_from_redis_success", Help: "The number of successful pull msg from mongo", @@ -199,6 +258,9 @@ func NewMsgPullFromMongoSuccessCounter() { } func NewMsgPullFromMongoFailedCounter() { + if MsgPullFromMongoFailedCounter != nil { + return + } MsgPullFromMongoFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_pull_from_mongo_failed", Help: "The number of failed pull msg from mongo", @@ -206,6 +268,9 @@ func NewMsgPullFromMongoFailedCounter() { } func NewMsgRecvTotalCounter() { + if MsgRecvTotalCounter != nil { + return + } MsgRecvTotalCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_recv_total", Help: "The number of msg received", @@ -213,12 +278,18 @@ func NewMsgRecvTotalCounter() { } func NewGetNewestSeqTotalCounter() { + if GetNewestSeqTotalCounter != nil { + return + } GetNewestSeqTotalCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "get_newest_seq_total", Help: "the number of get newest seq", }) } func NewPullMsgBySeqListTotalCounter() { + if PullMsgBySeqListTotalCounter != nil { + return + } PullMsgBySeqListTotalCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "pull_msg_by_seq_list_total", Help: "The number of pull msg by seq list", @@ -226,6 +297,9 @@ func NewPullMsgBySeqListTotalCounter() { } func NewSingleChatMsgRecvSuccessCounter() { + if SingleChatMsgRecvSuccessCounter != nil { + return + } SingleChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "single_chat_msg_recv_success", Help: "The number of single chat msg successful received ", @@ -233,6 +307,9 @@ func NewSingleChatMsgRecvSuccessCounter() { } func NewGroupChatMsgRecvSuccessCounter() { + if GroupChatMsgRecvSuccessCounter != nil { + return + } GroupChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "group_chat_msg_recv_success", Help: "The number of group chat msg successful received", @@ -240,6 +317,9 @@ func NewGroupChatMsgRecvSuccessCounter() { } func NewWorkSuperGroupChatMsgRecvSuccessCounter() { + if WorkSuperGroupChatMsgRecvSuccessCounter != nil { + return + } WorkSuperGroupChatMsgRecvSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "work_super_group_chat_msg_recv_success", Help: "The number of work/super group chat msg successful received", @@ -247,6 +327,9 @@ func NewWorkSuperGroupChatMsgRecvSuccessCounter() { } func NewSingleChatMsgProcessSuccessCounter() { + if SingleChatMsgProcessSuccessCounter != nil { + return + } SingleChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "single_chat_msg_process_success", Help: "The number of single chat msg successful processed", @@ -254,6 +337,9 @@ func NewSingleChatMsgProcessSuccessCounter() { } func NewSingleChatMsgProcessFailedCounter() { + if SingleChatMsgProcessFailedCounter != nil { + return + } SingleChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "single_chat_msg_process_failed", Help: "The number of single chat msg failed processed", @@ -261,6 +347,9 @@ func NewSingleChatMsgProcessFailedCounter() { } func NewGroupChatMsgProcessSuccessCounter() { + if GroupChatMsgProcessSuccessCounter != nil { + return + } GroupChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "group_chat_msg_process_success", Help: "The number of group chat msg successful processed", @@ -268,6 +357,9 @@ func NewGroupChatMsgProcessSuccessCounter() { } func NewGroupChatMsgProcessFailedCounter() { + if GroupChatMsgProcessFailedCounter != nil { + return + } GroupChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "group_chat_msg_process_failed", Help: "The number of group chat msg failed processed", @@ -275,12 +367,18 @@ func NewGroupChatMsgProcessFailedCounter() { } func NewWorkSuperGroupChatMsgProcessSuccessCounter() { + if WorkSuperGroupChatMsgProcessSuccessCounter != nil { + return + } WorkSuperGroupChatMsgProcessSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "work_super_group_chat_msg_process_success", Help: "The number of work/super group chat msg successful processed", }) } func NewWorkSuperGroupChatMsgProcessFailedCounter() { + if WorkSuperGroupChatMsgProcessFailedCounter != nil { + return + } WorkSuperGroupChatMsgProcessFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "work_super_group_chat_msg_process_failed", Help: "The number of work/super group chat msg failed processed", @@ -288,6 +386,9 @@ func NewWorkSuperGroupChatMsgProcessFailedCounter() { } func NewMsgOnlinePushSuccessCounter() { + if MsgOnlinePushSuccessCounter != nil { + return + } MsgOnlinePushSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_online_push_success", Help: "The number of msg successful online pushed", @@ -295,12 +396,18 @@ func NewMsgOnlinePushSuccessCounter() { } func NewMsgOfflinePushSuccessCounter() { + if MsgOfflinePushSuccessCounter != nil { + return + } MsgOfflinePushSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_offline_push_success", Help: "The number of msg successful offline pushed", }) } func NewMsgOfflinePushFailedCounter() { + if MsgOfflinePushFailedCounter != nil { + return + } MsgOfflinePushFailedCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "msg_offline_push_failed", Help: "The number of msg failed offline pushed", From 1b31de18e4ceb6b5cae6779336ae245231044a9d Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 15 Sep 2022 15:03:57 +0800 Subject: [PATCH 47/69] Remove duplicate messageVerification call in sendMsg --- pkg/common/prometheus/gather.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index dd2aadb37..1d6b71ebb 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -252,7 +252,7 @@ func NewMsgPullFromMongoSuccessCounter() { return } MsgPullFromMongoSuccessCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "msg_pull_from_redis_success", + Name: "msg_pull_from_mongo_success", Help: "The number of successful pull msg from mongo", }) } From 6759e0c25b54c597e4123dfa3226e5a5bac8c63f Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 15 Sep 2022 15:52:48 +0800 Subject: [PATCH 48/69] fix bug: invited/kick failed due to json tag validation --- cmd/open_im_demo/main.go | 1 - internal/api/group/group.go | 14 ++++++++++++-- pkg/base_info/group_api_struct.go | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/cmd/open_im_demo/main.go b/cmd/open_im_demo/main.go index 0e2dbaea6..9d8152218 100644 --- a/cmd/open_im_demo/main.go +++ b/cmd/open_im_demo/main.go @@ -65,7 +65,6 @@ func main() { defaultPorts := config.Config.Demo.Port ginPort := flag.Int("port", defaultPorts[0], "get ginServerPort from cmd,default 10004 as port") flag.Parse() - fmt.Println("start demo api server, port: ", *ginPort) address := "0.0.0.0:" + strconv.Itoa(*ginPort) if config.Config.Api.ListenIP != "" { address = config.Config.Api.ListenIP + ":" + strconv.Itoa(*ginPort) diff --git a/internal/api/group/group.go b/internal/api/group/group.go index 5c4427875..1cddd7ede 100644 --- a/internal/api/group/group.go +++ b/internal/api/group/group.go @@ -42,10 +42,14 @@ func KickGroupMember(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) return } - + if len(params.KickedUserIDList) > constant.MaxNotificationNum { + errMsg := params.OperationID + " too many members " + utils.Int32ToString(int32(len(params.KickedUserIDList))) + log.Error(params.OperationID, errMsg) + c.JSON(http.StatusOK, gin.H{"errCode": 400, "errMsg": errMsg}) + return + } req := &rpc.KickGroupMemberReq{} utils.CopyStructFields(req, ¶ms) - var ok bool var errInfo string ok, req.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID) @@ -318,6 +322,12 @@ func InviteUserToGroup(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) return } + if len(params.InvitedUserIDList) > constant.MaxNotificationNum { + errMsg := params.OperationID + " too many members " + utils.Int32ToString(int32(len(params.InvitedUserIDList))) + log.Error(params.OperationID, errMsg) + c.JSON(http.StatusOK, gin.H{"errCode": 400, "errMsg": errMsg}) + return + } req := &rpc.InviteUserToGroupReq{} utils.CopyStructFields(req, ¶ms) diff --git a/pkg/base_info/group_api_struct.go b/pkg/base_info/group_api_struct.go index f2703bba2..8f2eaccd4 100644 --- a/pkg/base_info/group_api_struct.go +++ b/pkg/base_info/group_api_struct.go @@ -16,7 +16,7 @@ type CommDataResp struct { type KickGroupMemberReq struct { GroupID string `json:"groupID" binding:"required"` - KickedUserIDList []string `json:"kickedUserIDList" binding:"required, min=1, max=100"` + KickedUserIDList []string `json:"kickedUserIDList" binding:"required"` Reason string `json:"reason"` OperationID string `json:"operationID" binding:"required"` } @@ -38,7 +38,7 @@ type GetGroupMembersInfoResp struct { type InviteUserToGroupReq struct { GroupID string `json:"groupID" binding:"required"` - InvitedUserIDList []string `json:"invitedUserIDList" binding:"required, min=1, max=100"` + InvitedUserIDList []string `json:"invitedUserIDList" binding:"required"` Reason string `json:"reason"` OperationID string `json:"operationID" binding:"required"` } From 02fa9142feccb6cc52bf594548a0768eac18e222 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 16:27:36 +0800 Subject: [PATCH 49/69] prometheus --- go.mod | 1 + go.sum | 1 + internal/msg_gateway/gate/relay_rpc_server.go | 7 ++++++- internal/push/logic/push_rpc_server.go | 8 +++++++- internal/rpc/admin_cms/admin_cms.go | 9 ++++++++- internal/rpc/auth/auth.go | 8 +++++++- internal/rpc/cache/cache.go | 16 ++++++++++++++-- internal/rpc/conversation/conversaion.go | 8 +++++++- internal/rpc/friend/friend.go | 8 +++++++- internal/rpc/group/group.go | 8 +++++++- internal/rpc/msg/rpcChat.go | 8 +++++++- internal/rpc/office/office.go | 8 +++++++- internal/rpc/organization/organization.go | 8 +++++++- internal/rpc/user/user.go | 8 +++++++- 14 files changed, 93 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 6bb3ab4c0..6a51cfc08 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/golang-jwt/jwt/v4 v4.1.0 github.com/golang/protobuf v1.5.2 github.com/gorilla/websocket v1.4.2 + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/jinzhu/copier v0.3.4 github.com/jinzhu/gorm v1.9.16 github.com/jonboulle/clockwork v0.2.2 // indirect diff --git a/go.sum b/go.sum index 945c71ab3..e1f5a8e7f 100644 --- a/go.sum +++ b/go.sum @@ -344,6 +344,7 @@ github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7Fsg github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= 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/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index 35623d17d..f0ba76a3a 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -18,6 +18,7 @@ import ( "strings" "github.com/golang/protobuf/proto" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/gorilla/websocket" "google.golang.org/grpc" @@ -59,7 +60,11 @@ func (r *RPCServer) run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/push/logic/push_rpc_server.go b/internal/push/logic/push_rpc_server.go index 44269d504..99962559d 100644 --- a/internal/push/logic/push_rpc_server.go +++ b/internal/push/logic/push_rpc_server.go @@ -10,9 +10,11 @@ import ( "Open_IM/pkg/utils" "context" "net" + "strconv" "strings" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "google.golang.org/grpc" ) @@ -48,7 +50,11 @@ func (r *RPCServer) run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/admin_cms/admin_cms.go b/internal/rpc/admin_cms/admin_cms.go index bde6d421b..aa82c0e74 100644 --- a/internal/rpc/admin_cms/admin_cms.go +++ b/internal/rpc/admin_cms/admin_cms.go @@ -11,6 +11,9 @@ import ( "Open_IM/pkg/grpc-etcdv3/getcdv3" pbAdminCMS "Open_IM/pkg/proto/admin_cms" server_api_params "Open_IM/pkg/proto/sdk_ws" + + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "Open_IM/pkg/utils" "context" "errors" @@ -63,7 +66,11 @@ func (s *adminCMSServer) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 498edf609..16ac9c117 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -17,6 +17,8 @@ import ( "strconv" "strings" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "Open_IM/pkg/common/config" "google.golang.org/grpc" @@ -128,7 +130,11 @@ func (rpc *rpcAuth) Run() { promePkg.NewGrpcRequestSuccessCounter() promePkg.NewUserRegisterCounter() promePkg.NewUserLoginCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/cache/cache.go b/internal/rpc/cache/cache.go index 117f3384c..9f0ae8022 100644 --- a/internal/rpc/cache/cache.go +++ b/internal/rpc/cache/cache.go @@ -5,6 +5,7 @@ import ( "Open_IM/pkg/common/constant" rocksCache "Open_IM/pkg/common/db/rocks_cache" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbCache "Open_IM/pkg/proto/cache" "Open_IM/pkg/utils" @@ -13,6 +14,7 @@ import ( "strconv" "strings" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "google.golang.org/grpc" ) @@ -50,8 +52,18 @@ func (s *cacheServer) Run() { log.NewInfo("0", "listen network success, ", address, listener) defer listener.Close() //grpc server - - srv := grpc.NewServer() + var grpcOpts []grpc.ServerOption + if config.Config.Prometheus.Enable { + promePkg.NewGrpcRequestCounter() + promePkg.NewGrpcRequestFailedCounter() + promePkg.NewGrpcRequestSuccessCounter() + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) + } + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() pbCache.RegisterCacheServer(srv, s) diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index ee04b1974..b9fbc9452 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -16,6 +16,8 @@ import ( "strconv" "strings" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "Open_IM/pkg/common/config" "google.golang.org/grpc" @@ -190,7 +192,11 @@ func (rpc *rpcConversation) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index 696217cb8..379f29eda 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -22,6 +22,8 @@ import ( "strings" "time" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "google.golang.org/grpc" ) @@ -66,7 +68,11 @@ func (s *friendServer) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 2193cd89c..70006b5a2 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -26,6 +26,8 @@ import ( "strings" "time" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "google.golang.org/grpc" "gorm.io/gorm" ) @@ -75,7 +77,11 @@ func (s *groupServer) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(options...) defer srv.GracefulStop() diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index 22bd3840e..cf50b3f9a 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -14,6 +14,8 @@ import ( "strconv" "strings" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "google.golang.org/grpc" ) @@ -72,7 +74,11 @@ func (rpc *rpcChat) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/office/office.go b/internal/rpc/office/office.go index 4d12267e5..f0692f3cc 100644 --- a/internal/rpc/office/office.go +++ b/internal/rpc/office/office.go @@ -22,6 +22,8 @@ import ( "time" "unsafe" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "google.golang.org/grpc" ) @@ -72,7 +74,11 @@ func (s *officeServer) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/organization/organization.go b/internal/rpc/organization/organization.go index 327e40003..ea78ad85b 100644 --- a/internal/rpc/organization/organization.go +++ b/internal/rpc/organization/organization.go @@ -22,6 +22,8 @@ import ( "strings" "time" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "google.golang.org/grpc" ) @@ -64,7 +66,11 @@ func (s *organizationServer) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 080a50b7f..0ae46e5e4 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -22,6 +22,8 @@ import ( "strconv" "strings" + grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "google.golang.org/grpc" "gorm.io/gorm" ) @@ -67,7 +69,11 @@ func (s *userServer) Run() { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() - grpcOpts = append(grpcOpts, grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme)) + grpcOpts = append(grpcOpts, []grpc.ServerOption{ + grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), + grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), + }...) } srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() From d26076c0e4b0e5c334f12640b273ac297e9d4abb Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Thu, 15 Sep 2022 16:28:19 +0800 Subject: [PATCH 50/69] prometheus for statistics --- pkg/common/db/batch_insert_chat.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/common/db/batch_insert_chat.go b/pkg/common/db/batch_insert_chat.go index 9be8f0874..020d9c1d9 100644 --- a/pkg/common/db/batch_insert_chat.go +++ b/pkg/common/db/batch_insert_chat.go @@ -135,7 +135,6 @@ func (d *DataBases) BatchInsertChat2Cache(insertID string, msgList []*pbMsg.MsgD return utils.Wrap(err, ""), 0 } promePkg.PromeInc(promePkg.SeqGetSuccessCounter) - promePkg.SeqGetSuccessCounter.Inc() lastMaxSeq := currentMaxSeq for _, m := range msgList { From 78ce5c3f69835341a90084a1ff6d6a10e25b14d3 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 16:39:49 +0800 Subject: [PATCH 51/69] prometheus --- internal/msg_gateway/gate/relay_rpc_server.go | 2 +- internal/push/logic/push_rpc_server.go | 2 +- internal/rpc/admin_cms/admin_cms.go | 2 +- internal/rpc/auth/auth.go | 2 +- internal/rpc/cache/cache.go | 2 +- internal/rpc/conversation/conversaion.go | 2 +- internal/rpc/friend/friend.go | 2 +- internal/rpc/group/group.go | 2 +- internal/rpc/msg/rpcChat.go | 2 +- internal/rpc/office/office.go | 2 +- internal/rpc/organization/organization.go | 2 +- internal/rpc/user/user.go | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index 0dc41864f..830a6cb80 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -71,7 +71,7 @@ func (r *RPCServer) run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/push/logic/push_rpc_server.go b/internal/push/logic/push_rpc_server.go index 99962559d..e48906c00 100644 --- a/internal/push/logic/push_rpc_server.go +++ b/internal/push/logic/push_rpc_server.go @@ -51,7 +51,7 @@ func (r *RPCServer) run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/admin_cms/admin_cms.go b/internal/rpc/admin_cms/admin_cms.go index aa82c0e74..6a9d2b25b 100644 --- a/internal/rpc/admin_cms/admin_cms.go +++ b/internal/rpc/admin_cms/admin_cms.go @@ -67,7 +67,7 @@ func (s *adminCMSServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 16ac9c117..8a720e3e5 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -131,7 +131,7 @@ func (rpc *rpcAuth) Run() { promePkg.NewUserRegisterCounter() promePkg.NewUserLoginCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/cache/cache.go b/internal/rpc/cache/cache.go index 9f0ae8022..6e1eed5aa 100644 --- a/internal/rpc/cache/cache.go +++ b/internal/rpc/cache/cache.go @@ -58,7 +58,7 @@ func (s *cacheServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index b9fbc9452..be51e770f 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -193,7 +193,7 @@ func (rpc *rpcConversation) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/friend/friend.go b/internal/rpc/friend/friend.go index 379f29eda..abdcaa6c1 100644 --- a/internal/rpc/friend/friend.go +++ b/internal/rpc/friend/friend.go @@ -69,7 +69,7 @@ func (s *friendServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 70006b5a2..740919ee2 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -78,7 +78,7 @@ func (s *groupServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/msg/rpcChat.go b/internal/rpc/msg/rpcChat.go index e5cd0ed97..c20a613db 100644 --- a/internal/rpc/msg/rpcChat.go +++ b/internal/rpc/msg/rpcChat.go @@ -102,7 +102,7 @@ func (rpc *rpcChat) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/office/office.go b/internal/rpc/office/office.go index f0692f3cc..18b8e70f5 100644 --- a/internal/rpc/office/office.go +++ b/internal/rpc/office/office.go @@ -75,7 +75,7 @@ func (s *officeServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/organization/organization.go b/internal/rpc/organization/organization.go index ea78ad85b..50d4c2ab5 100644 --- a/internal/rpc/organization/organization.go +++ b/internal/rpc/organization/organization.go @@ -67,7 +67,7 @@ func (s *organizationServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index 0ae46e5e4..80bf1ca89 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -70,7 +70,7 @@ func (s *userServer) Run() { promePkg.NewGrpcRequestFailedCounter() promePkg.NewGrpcRequestSuccessCounter() grpcOpts = append(grpcOpts, []grpc.ServerOption{ - grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), + // grpc.UnaryInterceptor(promePkg.UnaryServerInterceptorProme), grpc.StreamInterceptor(grpcPrometheus.StreamServerInterceptor), grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) From 1cfa55817ad5cc188ec0c87efd51d4c151c87c4d Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 17:50:45 +0800 Subject: [PATCH 52/69] prometheus --- internal/msg_gateway/gate/relay_rpc_server.go | 1 + internal/msg_gateway/gate/ws_server.go | 3 +++ pkg/common/prometheus/gather.go | 11 +++++++++++ pkg/common/prometheus/prometheus.go | 16 ++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index 830a6cb80..f5573eefa 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -39,6 +39,7 @@ func initPrometheus() { promePkg.NewGetNewestSeqTotalCounter() promePkg.NewPullMsgBySeqListTotalCounter() promePkg.NewMsgOnlinePushSuccessCounter() + promePkg.NewOnlineUserCounter() //promePkg.NewSingleChatMsgRecvSuccessCounter() //promePkg.NewGroupChatMsgRecvSuccessCounter() //promePkg.NewWorkSuperGroupChatMsgRecvSuccessCounter() diff --git a/internal/msg_gateway/gate/ws_server.go b/internal/msg_gateway/gate/ws_server.go index 9b61318b3..aac99a768 100644 --- a/internal/msg_gateway/gate/ws_server.go +++ b/internal/msg_gateway/gate/ws_server.go @@ -5,6 +5,7 @@ import ( "Open_IM/pkg/common/constant" "Open_IM/pkg/common/db" "Open_IM/pkg/common/log" + promePkg "Open_IM/pkg/common/prometheus" "Open_IM/pkg/common/token_verify" "Open_IM/pkg/grpc-etcdv3/getcdv3" pbRelay "Open_IM/pkg/proto/relay" @@ -313,6 +314,7 @@ func (ws *WServer) addUserConn(uid string, platformID int, conn *UserConn, token for _, v := range ws.wsUserToConn { count = count + len(v) } + promePkg.PromeGaugeInc(promePkg.OnlineUserGauge) log.Debug(operationID, "WS Add operation", "", "wsUser added", ws.wsUserToConn, "connection_uid", uid, "connection_platform", constant.PlatformIDToName(platformID), "online_user_num", len(ws.wsUserToConn), "online_conn_num", count) } @@ -352,6 +354,7 @@ func (ws *WServer) delUserConn(conn *UserConn) { if callbackResp.ErrCode != 0 { log.NewError(operationID, utils.GetSelfFuncName(), "callbackUserOffline failed", callbackResp) } + promePkg.PromeGaugeDec(promePkg.OnlineUserGauge) } func (ws *WServer) getUserConn(uid string, platform int) *UserConn { diff --git a/pkg/common/prometheus/gather.go b/pkg/common/prometheus/gather.go index 1d6b71ebb..3dd7d05a2 100644 --- a/pkg/common/prometheus/gather.go +++ b/pkg/common/prometheus/gather.go @@ -34,6 +34,7 @@ var ( SingleChatMsgRecvSuccessCounter prometheus.Counter GroupChatMsgRecvSuccessCounter prometheus.Counter WorkSuperGroupChatMsgRecvSuccessCounter prometheus.Counter + OnlineUserGauge prometheus.Gauge //msg-msg SingleChatMsgProcessSuccessCounter prometheus.Counter @@ -326,6 +327,16 @@ func NewWorkSuperGroupChatMsgRecvSuccessCounter() { }) } +func NewOnlineUserGauges() { + if OnlineUserGauge != nil { + return + } + OnlineUserGauge = promauto.NewGauge(prometheus.GaugeOpts{ + Name: "online_user_num", + Help: "The number of online user num", + }) +} + func NewSingleChatMsgProcessSuccessCounter() { if SingleChatMsgProcessSuccessCounter != nil { return diff --git a/pkg/common/prometheus/prometheus.go b/pkg/common/prometheus/prometheus.go index e8bc87b47..7c497a78c 100644 --- a/pkg/common/prometheus/prometheus.go +++ b/pkg/common/prometheus/prometheus.go @@ -64,3 +64,19 @@ func PromeAdd(counter prometheus.Counter, add int) { } } } + +func PromeGaugeInc(gauges prometheus.Gauge) { + if config.Config.Prometheus.Enable { + if gauges != nil { + gauges.Inc() + } + } +} + +func PromeGaugeDec(gauges prometheus.Gauge) { + if config.Config.Prometheus.Enable { + if gauges != nil { + gauges.Dec() + } + } +} From 3a878f842629d6cbabbe215cd230d698e84e78e8 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 17:58:51 +0800 Subject: [PATCH 53/69] prometheus --- internal/msg_gateway/gate/relay_rpc_server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/msg_gateway/gate/relay_rpc_server.go b/internal/msg_gateway/gate/relay_rpc_server.go index f5573eefa..bb8958680 100644 --- a/internal/msg_gateway/gate/relay_rpc_server.go +++ b/internal/msg_gateway/gate/relay_rpc_server.go @@ -39,7 +39,7 @@ func initPrometheus() { promePkg.NewGetNewestSeqTotalCounter() promePkg.NewPullMsgBySeqListTotalCounter() promePkg.NewMsgOnlinePushSuccessCounter() - promePkg.NewOnlineUserCounter() + promePkg.NewOnlineUserGauges() //promePkg.NewSingleChatMsgRecvSuccessCounter() //promePkg.NewGroupChatMsgRecvSuccessCounter() //promePkg.NewWorkSuperGroupChatMsgRecvSuccessCounter() From 07a038503e89e6d58a2be8eaf1e6ee891c10e1a2 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 19:22:36 +0800 Subject: [PATCH 54/69] grafana --- docker-compose_cfg/grafana.db | Bin 0 -> 888832 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 docker-compose_cfg/grafana.db diff --git a/docker-compose_cfg/grafana.db b/docker-compose_cfg/grafana.db new file mode 100755 index 0000000000000000000000000000000000000000..362adfe67e166b5754167190ff762fbab2f0b73c GIT binary patch literal 888832 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 IhU@?TKcFHhg8%>k literal 0 HcmV?d00001 From 5d326275533304aa38308b14485fc437f50cdcbd Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 19:46:13 +0800 Subject: [PATCH 55/69] grafana --- docker-compose.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index 8692c7ba0..654a94982 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -164,6 +164,8 @@ services: depends_on: - prometheus network_mode: "host" + privileged: true + user: root # -rw-r----- node-exporter: From eeb5ba4c7bb6a56b7a85e3dda34b884040a5f1ae Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 19:55:24 +0800 Subject: [PATCH 56/69] prome --- internal/rpc/group/group.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 740919ee2..27838b4e2 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -68,11 +68,10 @@ func (s *groupServer) Run() { //grpc server recvSize := 1024 * 1024 * constant.GroupRPCRecvSize sendSize := 1024 * 1024 * constant.GroupRPCSendSize - var options = []grpc.ServerOption{ + var grpcOpts = []grpc.ServerOption{ grpc.MaxRecvMsgSize(recvSize), grpc.MaxSendMsgSize(sendSize), } - var grpcOpts []grpc.ServerOption if config.Config.Prometheus.Enable { promePkg.NewGrpcRequestCounter() promePkg.NewGrpcRequestFailedCounter() @@ -83,7 +82,7 @@ func (s *groupServer) Run() { grpc.UnaryInterceptor(grpcPrometheus.UnaryServerInterceptor), }...) } - srv := grpc.NewServer(options...) + srv := grpc.NewServer(grpcOpts...) defer srv.GracefulStop() //Service registers with etcd pbGroup.RegisterGroupServer(srv, s) From 7c79d10f5de981912d90eb6b2d6704d882c01535 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 20:07:29 +0800 Subject: [PATCH 57/69] add mysql --- pkg/common/db/mysql.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/common/db/mysql.go b/pkg/common/db/mysql.go index 75d3e6887..2da7add65 100644 --- a/pkg/common/db/mysql.go +++ b/pkg/common/db/mysql.go @@ -90,7 +90,7 @@ func initMysqlDB() { &GroupRequest{}, &User{}, &Black{}, &ChatLog{}, &Register{}, &Conversation{}, &AppVersion{}, &Department{}, &BlackList{}, &IpLimit{}, &UserIpLimit{}, &Invitation{}, &RegisterAddFriend{}, - &ClientInitConfig{}) + &ClientInitConfig{}, &UserIpRecord{}) db.Set("gorm:table_options", "CHARSET=utf8") db.Set("gorm:table_options", "collation=utf8_unicode_ci") @@ -181,6 +181,11 @@ func initMysqlDB() { db.Migrator().CreateTable(&ClientInitConfig{}) } + if !db.Migrator().HasTable(&UserIpRecord{}) { + fmt.Println("CreateTable Friend") + db.Migrator().CreateTable(&UserIpRecord{}) + } + DB.MysqlDB.db = db return } From 1ce0a3b5d35d41fd8f4f743c983067b0357be8bb Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 20:12:18 +0800 Subject: [PATCH 58/69] add mysql --- pkg/common/db/mysql_model/im_mysql_model/ip_model.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/common/db/mysql_model/im_mysql_model/ip_model.go b/pkg/common/db/mysql_model/im_mysql_model/ip_model.go index 4e1ae6f4a..0e181721d 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/ip_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/ip_model.go @@ -2,6 +2,7 @@ package im_mysql_model import ( "Open_IM/pkg/common/db" + "Open_IM/pkg/utils" "time" ) @@ -85,10 +86,10 @@ func UpdateIpReocord(userID, ip string) (err error) { record := &db.UserIpRecord{UserID: userID, LastLoginIp: ip, LastLoginTime: time.Now()} result := db.DB.MysqlDB.DefaultGormDB().Model(&db.UserIpRecord{}).Where("user_id=?", userID).Updates(record).Updates("login_times = login_times + 1") if result.Error != nil { - return result.Error + return utils.Wrap(result.Error, "") } if result.RowsAffected == 0 { err = InsertIpRecord(userID, ip) } - return err + return utils.Wrap(err, "") } From c025d0d0301005680c89f4bab9b107cbe7c76018 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Thu, 15 Sep 2022 20:17:09 +0800 Subject: [PATCH 59/69] add mysql --- pkg/common/db/mysql_model/im_mysql_model/ip_model.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/common/db/mysql_model/im_mysql_model/ip_model.go b/pkg/common/db/mysql_model/im_mysql_model/ip_model.go index 0e181721d..d9ff1bfcb 100644 --- a/pkg/common/db/mysql_model/im_mysql_model/ip_model.go +++ b/pkg/common/db/mysql_model/im_mysql_model/ip_model.go @@ -4,6 +4,8 @@ import ( "Open_IM/pkg/common/db" "Open_IM/pkg/utils" "time" + + "gorm.io/gorm" ) func IsLimitRegisterIp(RegisterIp string) (bool, error) { @@ -84,7 +86,7 @@ func InsertIpRecord(userID, createIp string) error { func UpdateIpReocord(userID, ip string) (err error) { record := &db.UserIpRecord{UserID: userID, LastLoginIp: ip, LastLoginTime: time.Now()} - result := db.DB.MysqlDB.DefaultGormDB().Model(&db.UserIpRecord{}).Where("user_id=?", userID).Updates(record).Updates("login_times = login_times + 1") + result := db.DB.MysqlDB.DefaultGormDB().Model(&db.UserIpRecord{}).Where("user_id=?", userID).Updates(record).Update("login_times", gorm.Expr("login_times+?", 1)) if result.Error != nil { return utils.Wrap(result.Error, "") } From 665e2e3e831fff0c00533b03267c417666e1f2c0 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Fri, 16 Sep 2022 11:57:01 +0800 Subject: [PATCH 60/69] add mysql --- config/config.yaml | 4 ++++ pkg/common/config/config.go | 4 ++++ pkg/common/kafka/consumer.go | 13 ++++++++++--- pkg/common/kafka/producer.go | 7 ++++++- pkg/grpc-etcdv3/getcdv3/resolver.go | 2 ++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 2224e914f..f474fc06a 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -7,6 +7,8 @@ serverversion: 2.3.1 etcd: etcdSchema: openim #默认即可 etcdAddr: [ 127.0.0.1:2379 ] #单机部署时,默认即可 + userName: + password: k8sMod: false #开启k8s模式 使用pod里面环境变量请求services调用服务 而并非etcd @@ -46,6 +48,8 @@ redis: enableCluster: false #如果外部redis以集群方式启动,需要打开此开关 kafka: + userName: + password: ws2mschat: addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可 topic: "ws2ms_chat" #用于mongo和mysql保存消息 diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 56cc66bb7..e246c76bf 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -158,6 +158,8 @@ type config struct { Etcd struct { EtcdSchema string `yaml:"etcdSchema"` EtcdAddr []string `yaml:"etcdAddr"` + UserName string `yaml:"userName"` + Password string `yaml:"password"` } Log struct { StorageLocation string `yaml:"storageLocation"` @@ -219,6 +221,8 @@ type config struct { } Kafka struct { + UserName string `yaml:"userName"` + Password string `yaml:"password"` Ws2mschat struct { Addr []string `yaml:"addr"` Topic string `yaml:"topic"` diff --git a/pkg/common/kafka/consumer.go b/pkg/common/kafka/consumer.go index 771145906..dd3182fad 100644 --- a/pkg/common/kafka/consumer.go +++ b/pkg/common/kafka/consumer.go @@ -1,8 +1,10 @@ package kafka import ( - "github.com/Shopify/sarama" + "Open_IM/pkg/common/config" "sync" + + "github.com/Shopify/sarama" ) type Consumer struct { @@ -17,8 +19,13 @@ func NewKafkaConsumer(addr []string, topic string) *Consumer { p := Consumer{} p.Topic = topic p.addr = addr - - consumer, err := sarama.NewConsumer(p.addr, nil) + consumerConfig := sarama.NewConfig() + if config.Config.Kafka.UserName != "" && config.Config.Kafka.Password != "" { + consumerConfig.Net.SASL.Enable = true + consumerConfig.Net.SASL.User = config.Config.Kafka.UserName + consumerConfig.Net.SASL.Password = config.Config.Kafka.Password + } + consumer, err := sarama.NewConsumer(p.addr, consumerConfig) if err != nil { panic(err.Error()) return nil diff --git a/pkg/common/kafka/producer.go b/pkg/common/kafka/producer.go index 15c08ac04..23dfc3085 100644 --- a/pkg/common/kafka/producer.go +++ b/pkg/common/kafka/producer.go @@ -1,6 +1,7 @@ package kafka import ( + "Open_IM/pkg/common/config" log "Open_IM/pkg/common/log" "Open_IM/pkg/utils" "errors" @@ -25,7 +26,11 @@ func NewKafkaProducer(addr []string, topic string) *Producer { p.config.Producer.Return.Errors = true p.config.Producer.RequiredAcks = sarama.WaitForAll //Set producer Message Reply level 0 1 all p.config.Producer.Partitioner = sarama.NewHashPartitioner //Set the hash-key automatic hash partition. When sending a message, you must specify the key value of the message. If there is no key, the partition will be selected randomly - + if config.Config.Kafka.UserName != "" && config.Config.Kafka.Password != "" { + p.config.Net.SASL.Enable = true + p.config.Net.SASL.User = config.Config.Kafka.UserName + p.config.Net.SASL.Password = config.Config.Kafka.Password + } p.addr = addr p.topic = topic diff --git a/pkg/grpc-etcdv3/getcdv3/resolver.go b/pkg/grpc-etcdv3/getcdv3/resolver.go index db280e040..8f6a383d6 100644 --- a/pkg/grpc-etcdv3/getcdv3/resolver.go +++ b/pkg/grpc-etcdv3/getcdv3/resolver.go @@ -39,6 +39,8 @@ var ( func NewResolver(schema, etcdAddr, serviceName string, operationID string) (*Resolver, error) { etcdCli, err := clientv3.New(clientv3.Config{ Endpoints: strings.Split(etcdAddr, ","), + Username: config.Config.Etcd.UserName, + Password: config.Config.Etcd.Password, }) if err != nil { log.Error(operationID, "etcd client v3 failed") From eb2a9d540e1e3fc36bd5bba788b8218b8318998b Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 15:06:49 +0800 Subject: [PATCH 61/69] Support mongodb cluster --- internal/msg_gateway/gate/ws_server.go | 2 +- pkg/common/config/config.go | 22 +++++++++++----------- pkg/common/constant/constant.go | 2 +- pkg/common/db/model.go | 20 +++++++++++++++++--- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/internal/msg_gateway/gate/ws_server.go b/internal/msg_gateway/gate/ws_server.go index 9b61318b3..09af4a4ea 100644 --- a/internal/msg_gateway/gate/ws_server.go +++ b/internal/msg_gateway/gate/ws_server.go @@ -90,7 +90,7 @@ func (ws *WServer) readMsg(conn *UserConn) { log.NewInfo("", "this is a pingMessage") } if err != nil { - log.Error("", "WS ReadMsg error ", " userIP", conn.RemoteAddr().String(), "userUid", "platform", "error", err.Error()) + log.NewWarn("", "WS ReadMsg error ", " userIP", conn.RemoteAddr().String(), "userUid", "platform", "error", err.Error()) userCount-- ws.delUserConn(conn) return diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index 56cc66bb7..5714dff2e 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -103,17 +103,17 @@ type config struct { SlowThreshold int `yaml:"slowThreshold"` } Mongo struct { - DBUri string `yaml:"dbUri"` - DBAddress string `yaml:"dbAddress"` - DBDirect bool `yaml:"dbDirect"` - DBTimeout int `yaml:"dbTimeout"` - DBDatabase string `yaml:"dbDatabase"` - DBSource string `yaml:"dbSource"` - DBUserName string `yaml:"dbUserName"` - DBPassword string `yaml:"dbPassword"` - DBMaxPoolSize int `yaml:"dbMaxPoolSize"` - DBRetainChatRecords int `yaml:"dbRetainChatRecords"` - ChatRecordsClearTime string `yaml:"chatRecordsClearTime"` + DBUri string `yaml:"dbUri"` + DBAddress []string `yaml:"dbAddress"` + DBDirect bool `yaml:"dbDirect"` + DBTimeout int `yaml:"dbTimeout"` + DBDatabase string `yaml:"dbDatabase"` + DBSource string `yaml:"dbSource"` + DBUserName string `yaml:"dbUserName"` + DBPassword string `yaml:"dbPassword"` + DBMaxPoolSize int `yaml:"dbMaxPoolSize"` + DBRetainChatRecords int `yaml:"dbRetainChatRecords"` + ChatRecordsClearTime string `yaml:"chatRecordsClearTime"` } Redis struct { DBAddress []string `yaml:"dbAddress"` diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go index 3642b31c3..aa7a747cf 100644 --- a/pkg/common/constant/constant.go +++ b/pkg/common/constant/constant.go @@ -337,4 +337,4 @@ const StatisticsTimeInterval = 60 const MaxNotificationNum = 100 -const CurrentVersion = "v2.3.3" +const CurrentVersion = "v2.3.3-rc0" diff --git a/pkg/common/db/model.go b/pkg/common/db/model.go index 7fe53b77a..88236f4a4 100644 --- a/pkg/common/db/model.go +++ b/pkg/common/db/model.go @@ -58,15 +58,29 @@ func init() { // example: mongodb://$user:$password@mongo1.mongo:27017,mongo2.mongo:27017,mongo3.mongo:27017/$DBDatabase/?replicaSet=rs0&readPreference=secondary&authSource=admin&maxPoolSize=$DBMaxPoolSize uri = config.Config.Mongo.DBUri } else { + //mongodb://mongodb1.example.com:27317,mongodb2.example.com:27017/?replicaSet=mySet&authSource=authDB + mongodbHosts := "" + for i, v := range config.Config.Mongo.DBAddress { + if i == len(config.Config.Mongo.DBAddress)-1 { + mongodbHosts += v + } else { + mongodbHosts += v + "," + } + } + if config.Config.Mongo.DBPassword != "" && config.Config.Mongo.DBUserName != "" { - uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin", config.Config.Mongo.DBUserName, config.Config.Mongo.DBPassword, config.Config.Mongo.DBAddress, + // clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018/?replicaSet=replset") + //mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]] + uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", + config.Config.Mongo.DBUserName, config.Config.Mongo.DBPassword, mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } else { - uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin", - config.Config.Mongo.DBAddress, config.Config.Mongo.DBDatabase, + uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin&replicaSet=replset", + mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } } + mongoClient, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) if err != nil { fmt.Println(" mongo.Connect failed, try ", utils.GetSelfFuncName(), err.Error(), uri) From 3c4227696c2d4837b9c4d1b044301bdb28361a1f Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 15:08:48 +0800 Subject: [PATCH 62/69] Support mongodb cluster --- config/config.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index f474fc06a..3addfa849 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -27,13 +27,14 @@ mysql: mongo: dbUri: ""#当dbUri值不为空则直接使用该值 - dbAddress: 127.0.0.1:37017 #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可 + #dbAddress: 127.0.0.1:37017 #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可 + dbAddress: [127.0.0.1:37017] #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可 dbDirect: false dbTimeout: 60 dbDatabase: openIM #mongo db 默认即可 dbSource: admin - dbUserName: #mongo用户名,建议先不设置 - dbPassword: #mongo密码,建议先不设置 + dbUserName: openIM #mongo用户名,建议先不设置 + dbPassword: openIM== #mongo密码,建议先不设置 dbMaxPoolSize: 100 dbRetainChatRecords: 3650 #mongo保存离线消息时间(天),根据需求修改 chatRecordsClearTime: "* * * * *" # 每天凌晨3点清除消息,该配置和linux定时任务一样, 清理操作建议设置在用户活跃少的时候 # 0 3 * * * @@ -122,7 +123,7 @@ credential: #腾讯cos,发送图片、视频、文件时需要,请自行申 appBucket: app # 存储app的桶 location: us-east-1 endpoint: http://127.0.0.1:10005 #minio外网ip 这个ip是给客户端访问的 - endpointInner: http://127.0.0.1:10005 #minio内网地址 如果im server 可以通过内网访问到 minio就可以填写 + endpointInner: http://127.0.0.1:10005 #minio内网地址 如果im server 可以通过内网访问到 minio就可以 endpointInnerEnable: true #是否启用minio内网地址 启用可以让桶初始化,IM server连接minio走内网地址访问 accessKeyID: user12345 secretAccessKey: key12345 From 3bdafc2a11257566bef90740da77149a8fe23482 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 15:11:13 +0800 Subject: [PATCH 63/69] Support mongodb cluster --- config/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.yaml b/config/config.yaml index 3addfa849..8b8b3225d 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -8,7 +8,7 @@ etcd: etcdSchema: openim #默认即可 etcdAddr: [ 127.0.0.1:2379 ] #单机部署时,默认即可 userName: - password: + password: k8sMod: false #开启k8s模式 使用pod里面环境变量请求services调用服务 而并非etcd From 98fe00a171b29c6550a3e0bea4854b76e5e28f02 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 15:14:02 +0800 Subject: [PATCH 64/69] Support mongodb cluster --- pkg/common/db/model.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/common/db/model.go b/pkg/common/db/model.go index 88236f4a4..c5b1fb6be 100644 --- a/pkg/common/db/model.go +++ b/pkg/common/db/model.go @@ -71,7 +71,8 @@ func init() { if config.Config.Mongo.DBPassword != "" && config.Config.Mongo.DBUserName != "" { // clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018/?replicaSet=replset") //mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]] - uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", + //uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", + uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin", config.Config.Mongo.DBUserName, config.Config.Mongo.DBPassword, mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } else { From aa41dc3650d1ce3b1dfc1c86f956613988799744 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 15:54:26 +0800 Subject: [PATCH 65/69] Support mongodb cluster --- pkg/common/db/model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/db/model.go b/pkg/common/db/model.go index c5b1fb6be..c5e2349fe 100644 --- a/pkg/common/db/model.go +++ b/pkg/common/db/model.go @@ -76,7 +76,7 @@ func init() { config.Config.Mongo.DBUserName, config.Config.Mongo.DBPassword, mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } else { - uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin&replicaSet=replset", + uri = fmt.Sprintf("mongodb://%s/%s/?maxPoolSize=%d&authSource=admin", mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } From 06117c98b192b496b2b914264c4c59963dcdc83e Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 16:17:21 +0800 Subject: [PATCH 66/69] Support mongodb cluster --- config/config.yaml | 2 +- pkg/common/db/model.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 8b8b3225d..43421630d 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -28,7 +28,7 @@ mysql: mongo: dbUri: ""#当dbUri值不为空则直接使用该值 #dbAddress: 127.0.0.1:37017 #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可 - dbAddress: [127.0.0.1:37017] #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可 + dbAddress: [ 127.0.0.1:37017 ] #单机时为mongo地址,使用分片集群时,为mongos地址 默认即可 dbDirect: false dbTimeout: 60 dbDatabase: openIM #mongo db 默认即可 diff --git a/pkg/common/db/model.go b/pkg/common/db/model.go index c5e2349fe..979609325 100644 --- a/pkg/common/db/model.go +++ b/pkg/common/db/model.go @@ -72,7 +72,7 @@ func init() { // clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018/?replicaSet=replset") //mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]] //uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", - uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin", + uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", config.Config.Mongo.DBUserName, config.Config.Mongo.DBPassword, mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } else { From 82cd3fd9f1d527e1434a2d33e08565e2171a5f0e Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 16:29:37 +0800 Subject: [PATCH 67/69] Support mongodb cluster --- pkg/common/db/model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/db/model.go b/pkg/common/db/model.go index 979609325..c5e2349fe 100644 --- a/pkg/common/db/model.go +++ b/pkg/common/db/model.go @@ -72,7 +72,7 @@ func init() { // clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018/?replicaSet=replset") //mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]] //uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", - uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin&replicaSet=replset", + uri = fmt.Sprintf("mongodb://%s:%s@%s/%s?maxPoolSize=%d&authSource=admin", config.Config.Mongo.DBUserName, config.Config.Mongo.DBPassword, mongodbHosts, config.Config.Mongo.DBDatabase, config.Config.Mongo.DBMaxPoolSize) } else { From bb0f5e97a2a6f0c2c0236032b1c46aa9b06e5d44 Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Fri, 16 Sep 2022 16:51:12 +0800 Subject: [PATCH 68/69] kafka --- config/config.yaml | 4 ++-- pkg/common/config/config.go | 6 +++--- pkg/common/kafka/consumer.go | 6 +++--- pkg/common/kafka/producer.go | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index f474fc06a..0385c8831 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -48,8 +48,8 @@ redis: enableCluster: false #如果外部redis以集群方式启动,需要打开此开关 kafka: - userName: - password: + SASLUserName: + SASLPassword: ws2mschat: addr: [ 127.0.0.1:9092 ] #kafka配置,默认即可 topic: "ws2ms_chat" #用于mongo和mysql保存消息 diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index e246c76bf..62b3eb373 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -221,9 +221,9 @@ type config struct { } Kafka struct { - UserName string `yaml:"userName"` - Password string `yaml:"password"` - Ws2mschat struct { + SASLUserName string `yaml:"SASLUserName"` + SASLPassword string `yaml:"SASLPassword"` + Ws2mschat struct { Addr []string `yaml:"addr"` Topic string `yaml:"topic"` } diff --git a/pkg/common/kafka/consumer.go b/pkg/common/kafka/consumer.go index dd3182fad..f794a244c 100644 --- a/pkg/common/kafka/consumer.go +++ b/pkg/common/kafka/consumer.go @@ -20,10 +20,10 @@ func NewKafkaConsumer(addr []string, topic string) *Consumer { p.Topic = topic p.addr = addr consumerConfig := sarama.NewConfig() - if config.Config.Kafka.UserName != "" && config.Config.Kafka.Password != "" { + if config.Config.Kafka.SASLUserName != "" && config.Config.Kafka.SASLPassword != "" { consumerConfig.Net.SASL.Enable = true - consumerConfig.Net.SASL.User = config.Config.Kafka.UserName - consumerConfig.Net.SASL.Password = config.Config.Kafka.Password + consumerConfig.Net.SASL.User = config.Config.Kafka.SASLUserName + consumerConfig.Net.SASL.Password = config.Config.Kafka.SASLPassword } consumer, err := sarama.NewConsumer(p.addr, consumerConfig) if err != nil { diff --git a/pkg/common/kafka/producer.go b/pkg/common/kafka/producer.go index 23dfc3085..1df0e0ed8 100644 --- a/pkg/common/kafka/producer.go +++ b/pkg/common/kafka/producer.go @@ -26,10 +26,10 @@ func NewKafkaProducer(addr []string, topic string) *Producer { p.config.Producer.Return.Errors = true p.config.Producer.RequiredAcks = sarama.WaitForAll //Set producer Message Reply level 0 1 all p.config.Producer.Partitioner = sarama.NewHashPartitioner //Set the hash-key automatic hash partition. When sending a message, you must specify the key value of the message. If there is no key, the partition will be selected randomly - if config.Config.Kafka.UserName != "" && config.Config.Kafka.Password != "" { + if config.Config.Kafka.SASLUserName != "" && config.Config.Kafka.SASLPassword != "" { p.config.Net.SASL.Enable = true - p.config.Net.SASL.User = config.Config.Kafka.UserName - p.config.Net.SASL.Password = config.Config.Kafka.Password + p.config.Net.SASL.User = config.Config.Kafka.SASLUserName + p.config.Net.SASL.Password = config.Config.Kafka.SASLPassword } p.addr = addr p.topic = topic From 139285c46a8879228d4dff3562f5b1a46af83465 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Fri, 16 Sep 2022 16:52:03 +0800 Subject: [PATCH 69/69] Support mongodb cluster --- config/config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.yaml b/config/config.yaml index 43421630d..2b7fd079f 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -33,8 +33,8 @@ mongo: dbTimeout: 60 dbDatabase: openIM #mongo db 默认即可 dbSource: admin - dbUserName: openIM #mongo用户名,建议先不设置 - dbPassword: openIM== #mongo密码,建议先不设置 + dbUserName: #mongo用户名,建议先不设置 + dbPassword: #mongo密码,建议先不设置 dbMaxPoolSize: 100 dbRetainChatRecords: 3650 #mongo保存离线消息时间(天),根据需求修改 chatRecordsClearTime: "* * * * *" # 每天凌晨3点清除消息,该配置和linux定时任务一样, 清理操作建议设置在用户活跃少的时候 # 0 3 * * *