game_sync/dbproxy/svc/m_monitor.go

140 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package svc
import (
"encoding/gob"
"errors"
"fmt"
"net/rpc"
"strings"
"time"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson"
"mongo.games.com/game/dbproxy/mongo"
"mongo.games.com/game/mgrsrv/api"
"mongo.games.com/game/model"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/netlib"
"mongo.games.com/goserver/core/profile"
"mongo.games.com/goserver/core/schedule"
"mongo.games.com/goserver/core/transact"
"mongo.games.com/goserver/core/utils"
)
var (
MonitorErr = errors.New("monitor_data open failed.")
)
func MonitorDataCollection(cname string) *mongo.Collection {
s := mongo.MgoSessionMgrSington.GetGlobal(model.MonitorDBName)
if s != nil {
c, first := s.DB().C(fmt.Sprintf("%v_%v", model.MonitorPrefixName, strings.ToLower(cname)))
if first {
c.EnsureIndex(mgo.Index{Key: []string{"srvid"}, Background: true, Sparse: true})
c.EnsureIndex(mgo.Index{Key: []string{"srvtype"}, Background: true, Sparse: true})
c.EnsureIndex(mgo.Index{Key: []string{"key"}, Background: true, Sparse: true})
c.EnsureIndex(mgo.Index{Key: []string{"time"}, Background: true, Sparse: true})
}
return c
}
return nil
}
type MonitorDataSvc struct {
}
func (svc *MonitorDataSvc) InsertMonitorData(args *model.MonitorDataArg, ret *bool) (err error) {
clog := MonitorDataCollection(args.Name)
if clog == nil {
return
}
err = clog.Insert(args.Log)
if err != nil {
logger.Logger.Warnf("InsertMonitorData(%v) error:%v", args.Name, err)
return
}
*ret = true
return
}
func (svc *MonitorDataSvc) UpsertMonitorData(args *model.MonitorDataArg, ret *bool) (err error) {
clog := MonitorDataCollection(args.Name)
if clog == nil {
return
}
var existLog model.MonitorData
err = clog.Find(bson.M{"srvid": args.Log.SrvId, "srvtype": args.Log.SrvType, "key": args.Log.Key}).One(&existLog)
if err == nil {
args.Log.LogId = existLog.LogId
err = clog.Update(bson.M{"_id": args.Log.LogId}, args.Log)
if err != nil {
logger.Logger.Warnf("UpsertMonitorData(%v) Update error:%v", args.Name, err)
return
}
} else {
if err == mgo.ErrNotFound {
err = clog.Insert(args.Log)
if err != nil {
logger.Logger.Warnf("UpsertMonitorData(%v) Insert error:%v", args.Name, err)
return
}
}
}
*ret = true
return
}
func (svc *MonitorDataSvc) RemoveMonitorData(t time.Time, changes *[]*mgo.ChangeInfo) (err error) {
s := mongo.MgoSessionMgrSington.GetGlobal(model.MonitorDBName)
if s != nil {
db := s.DB()
if db != nil {
cnames, err := db.CollectionNames()
if err == nil {
if len(cnames) != 0 {
for _, name := range cnames {
c, _ := db.C(name)
if c != nil {
chginfo, err := c.RemoveAll(bson.M{"time": bson.M{"$lt": t}})
if err == nil {
*changes = append(*changes, chginfo)
}
}
}
}
}
}
}
return
}
func init() {
//gob registe
// gob:go语言特有的编解码工具Register需要在初始化时或提前调用
// rpc编解码依赖gob,rpc需要知道怎么编解码接口数据(客户端服务端都需要知道)以下结构体在rpc参数中被转成了interface,所以这里需要告诉gob接口类型的具体结构
gob.Register(model.PlayerOLStats{})
gob.Register(map[string]*model.APITransactStats{})
gob.Register(api.ApiStats{}) // 这里依赖了mgrsrv的结构体会导致mgrsrv初始化最好是把结构体放到一个公共包里不要两个不相关的程序有直接依赖
gob.Register(map[string]api.ApiStats{})
gob.Register(mgo.Stats{})
gob.Register(profile.TimeElement{})
gob.Register(map[string]profile.TimeElement{})
gob.Register(netlib.ServiceStats{})
gob.Register(map[int]netlib.ServiceStats{})
gob.Register(schedule.TaskStats{})
gob.Register(map[string]schedule.TaskStats{})
gob.Register(transact.TransStats{})
gob.Register(map[int]transact.TransStats{})
gob.Register(utils.PanicStackInfo{})
gob.Register(map[string]utils.PanicStackInfo{})
gob.Register(basic.CmdStats{})
gob.Register(map[string]basic.CmdStats{})
gob.Register(utils.RuntimeStats{})
//gob registe
rpc.Register(new(MonitorDataSvc))
}