From 54b5b116dca671d05588908512a8ec0473821466 Mon Sep 17 00:00:00 2001 From: "chao.chen" Date: Sun, 5 Mar 2023 01:11:25 +0800 Subject: [PATCH 01/16] feat:support tars protocol async push feat:mark client with uuid in server-end --- examples/TarsPushServer/client/DemoClient.go | 80 ++ examples/TarsPushServer/demo.tars | 18 + examples/TarsPushServer/demo/DemoObj.tars.go | 949 ++++++++++++++++++ examples/TarsPushServer/demo/demo.go | 200 ++++ examples/TarsPushServer/server/DemoServer.go | 29 + .../TarsPushServer/server/Impl/DemoImp.go | 53 + .../server/conf/Base.DemoServer.servant.conf | 37 + tars/adapter.go | 54 +- tars/model/Servant.go | 8 + tars/servant.go | 60 +- tars/tools/tars2go/gen_go.go | 249 +++++ tars/transport/common.go | 2 + tars/transport/tarsclient.go | 3 + tars/transport/tcphandler.go | 8 +- tars/util/current/tarscurrent.go | 18 + 15 files changed, 1749 insertions(+), 19 deletions(-) create mode 100644 examples/TarsPushServer/client/DemoClient.go create mode 100644 examples/TarsPushServer/demo.tars create mode 100644 examples/TarsPushServer/demo/DemoObj.tars.go create mode 100644 examples/TarsPushServer/demo/demo.go create mode 100644 examples/TarsPushServer/server/DemoServer.go create mode 100644 examples/TarsPushServer/server/Impl/DemoImp.go create mode 100644 examples/TarsPushServer/server/conf/Base.DemoServer.servant.conf diff --git a/examples/TarsPushServer/client/DemoClient.go b/examples/TarsPushServer/client/DemoClient.go new file mode 100644 index 00000000..a6c394b3 --- /dev/null +++ b/examples/TarsPushServer/client/DemoClient.go @@ -0,0 +1,80 @@ +package main + +import ( + "TarPushServer/demo" + "fmt" + "github.com/TarsCloud/TarsGo/tars" + "time" +) + +type Callback struct { + start int64 + cost int64 + count int64 +} + +func (c *Callback) Push_Callback(msg *string, opt ...map[string]string) { + /* if c.count == 0 { + c.start = time.Now().UnixMicro() + } + c.count++ + if c.count == 500000 { + c.cost = time.Now().UnixMicro() - c.start + fmt.Printf("cost--->%vus\n", c.cost) + }*/ + + //if c.start == 0 { + // c.start = time.Now().UnixMicro() + //} else { + // c.cost = time.Now().UnixMicro() - c.start + //} + //fmt.Printf("cost--->%vus|Push---->:%s======%v\n", c.cost, *msg, opt) + fmt.Printf("%v|Push---->:%s======%v\n", time.Now().UnixMilli(), *msg, opt) +} + +func (c Callback) Push_ExceptionCallback(err error) { + panic("implement me") +} + +func (c Callback) Reg_Callback(rsp *demo.RegRsp, opt ...map[string]string) { + //TODO implement me + panic("implement me") +} + +func (c Callback) Reg_ExceptionCallback(err error) { + //TODO implement me + panic("implement me") +} + +func main() { + com := tars.GetCommunicator() + obj := "Base.DemoServer.DemoObj@tcp -h 127.0.0.1 -p 8888 -t 60000" + prx := &demo.DemoObj{} + com.StringToProxy(obj, prx) + prx.SetOnConnectCallback(func(s string) { + fmt.Println("<-----------onConnect--------->") + }) + prx.SetOnCloseCallback(func(s string) { + fmt.Println("<-----------onClose----------->") + }) + TarsCb := new(Callback) + prx.SetTarsCallback(TarsCb) + go func() { + ticker := time.NewTicker(time.Second * 10) + defer ticker.Stop() + for { + select { + case <-ticker.C: + prx.TarsPing() + } + } + }() + { + req := &demo.RegReq{Msg: "reg"} + rsp := &demo.RegRsp{} + prx.Reg(req, rsp) + } + for true { + time.Sleep(time.Second * 10) + } +} diff --git a/examples/TarsPushServer/demo.tars b/examples/TarsPushServer/demo.tars new file mode 100644 index 00000000..87ddcb92 --- /dev/null +++ b/examples/TarsPushServer/demo.tars @@ -0,0 +1,18 @@ +module demo +{ + struct RegReq + { + 0 optional string msg; + }; + + struct RegRsp + { + 0 optional string msg; + }; + + interface DemoObj + { + void Push(out string msg); + void Reg(RegReq req, out RegRsp rsp); + }; +}; \ No newline at end of file diff --git a/examples/TarsPushServer/demo/DemoObj.tars.go b/examples/TarsPushServer/demo/DemoObj.tars.go new file mode 100644 index 00000000..0da92b41 --- /dev/null +++ b/examples/TarsPushServer/demo/DemoObj.tars.go @@ -0,0 +1,949 @@ +// Package demo comment +// This file was generated by tars2go 1.1.10 +// Generated from demo.tars +package demo + +import ( + "bytes" + "context" + "encoding/binary" + "encoding/json" + "fmt" + "github.com/TarsCloud/TarsGo/tars" + m "github.com/TarsCloud/TarsGo/tars/model" + "github.com/TarsCloud/TarsGo/tars/protocol/codec" + "github.com/TarsCloud/TarsGo/tars/protocol/res/basef" + "github.com/TarsCloud/TarsGo/tars/protocol/res/requestf" + "github.com/TarsCloud/TarsGo/tars/protocol/tup" + "github.com/TarsCloud/TarsGo/tars/util/current" + "github.com/TarsCloud/TarsGo/tars/util/tools" + "github.com/TarsCloud/TarsGo/tars/util/trace" + "net" + "unsafe" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = fmt.Errorf + _ = codec.FromInt8 + _ = unsafe.Pointer(nil) + _ = bytes.ErrTooLarge +) + +// DemoObj struct +type DemoObj struct { + servant m.Servant +} + +// Push is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) Push(msg *string, opts ...map[string]string) (err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = buf.WriteString(*msg, 1) + if err != nil { + return err + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + tarsResp := new(requestf.ResponsePacket) + tarsCtx := context.Background() + + err = obj.servant.TarsInvoke(tarsCtx, 0, "Push", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return err + } + + readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = readBuf.ReadString(&(*msg), 1, true) + if err != nil { + return err + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return nil +} + +// PushWithContext is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) PushWithContext(tarsCtx context.Context, msg *string, opts ...map[string]string) (err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = buf.WriteString(*msg, 1) + if err != nil { + return err + } + + traceData, ok := current.GetTraceData(tarsCtx) + if ok && traceData.TraceCall { + traceData.NewSpan() + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstCS, uint(buf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstCS), trace.TraceAnnotationCS, tars.GetClientConfig().ModuleName, obj.servant.Name(), "Push", 0, traceParam, "") + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + + tarsResp := new(requestf.ResponsePacket) + err = obj.servant.TarsInvoke(tarsCtx, 0, "Push", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return err + } + + readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = readBuf.ReadString(&(*msg), 1, true) + if err != nil { + return err + } + + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstCR, uint(readBuf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["msg"] = *msg + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstCR), trace.TraceAnnotationCR, tars.GetClientConfig().ModuleName, obj.servant.Name(), "Push", int(tarsResp.IRet), traceParam, "") + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return nil +} + +// PushOneWayWithContext is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) PushOneWayWithContext(tarsCtx context.Context, msg *string, opts ...map[string]string) (err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = buf.WriteString(*msg, 1) + if err != nil { + return err + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + + tarsResp := new(requestf.ResponsePacket) + err = obj.servant.TarsInvoke(tarsCtx, 1, "Push", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return err + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return nil +} + +// Reg is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) Reg(req *RegReq, rsp *RegRsp, opts ...map[string]string) (err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = req.WriteBlock(buf, 1) + if err != nil { + return err + } + + err = (*rsp).WriteBlock(buf, 2) + if err != nil { + return err + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + tarsResp := new(requestf.ResponsePacket) + tarsCtx := context.Background() + + err = obj.servant.TarsInvoke(tarsCtx, 0, "Reg", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return err + } + + readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = (*rsp).ReadBlock(readBuf, 2, true) + if err != nil { + return err + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return nil +} + +// RegWithContext is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *RegRsp, opts ...map[string]string) (err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = req.WriteBlock(buf, 1) + if err != nil { + return err + } + + err = (*rsp).WriteBlock(buf, 2) + if err != nil { + return err + } + + traceData, ok := current.GetTraceData(tarsCtx) + if ok && traceData.TraceCall { + traceData.NewSpan() + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstCS, uint(buf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["req"] = req + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstCS), trace.TraceAnnotationCS, tars.GetClientConfig().ModuleName, obj.servant.Name(), "Reg", 0, traceParam, "") + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + + tarsResp := new(requestf.ResponsePacket) + err = obj.servant.TarsInvoke(tarsCtx, 0, "Reg", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return err + } + + readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = (*rsp).ReadBlock(readBuf, 2, true) + if err != nil { + return err + } + + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstCR, uint(readBuf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["rsp"] = *rsp + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstCR), trace.TraceAnnotationCR, tars.GetClientConfig().ModuleName, obj.servant.Name(), "Reg", int(tarsResp.IRet), traceParam, "") + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return nil +} + +// RegOneWayWithContext is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) RegOneWayWithContext(tarsCtx context.Context, req *RegReq, rsp *RegRsp, opts ...map[string]string) (err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = req.WriteBlock(buf, 1) + if err != nil { + return err + } + + err = (*rsp).WriteBlock(buf, 2) + if err != nil { + return err + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + + tarsResp := new(requestf.ResponsePacket) + err = obj.servant.TarsInvoke(tarsCtx, 1, "Reg", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return err + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return nil +} + +// SetServant sets servant for the service. +func (obj *DemoObj) SetServant(servant m.Servant) { + obj.servant = servant +} + +// GetServant gets servant for the service. +func (obj *DemoObj) GetServant() (servant *m.Servant) { + return &obj.servant +} + +// SetOnConnectCallback +func (obj *DemoObj) SetOnConnectCallback(callback func(string)) { + obj.servant.SetOnConnectCallback(callback) +} + +// SetOnCloseCallback +func (obj *DemoObj) SetOnCloseCallback(callback func(string)) { + obj.servant.SetOnCloseCallback(callback) +} + +// SetTarsCallback +func (obj *DemoObj) SetTarsCallback(callback DemoObjTarsCallback) { + var push DemoObjPushCallback + push.Cb = callback + obj.servant.SetTarsCallback(&push) +} + +// SetPushCallback +func (obj *DemoObj) SetPushCallback(callback func([]byte)) { + obj.servant.SetPushCallback(callback) +} +func (obj *DemoObj) req2Byte(rsp *requestf.ResponsePacket) []byte { + req := requestf.RequestPacket{} + req.IVersion = rsp.IVersion + req.IRequestId = rsp.IRequestId + req.IMessageType = rsp.IMessageType + req.CPacketType = rsp.CPacketType + req.Context = rsp.Context + req.Status = rsp.Status + req.SBuffer = rsp.SBuffer + + os := codec.NewBuffer() + req.WriteTo(os) + bs := os.ToBytes() + sbuf := bytes.NewBuffer(nil) + sbuf.Write(make([]byte, 4)) + sbuf.Write(bs) + length := sbuf.Len() + binary.BigEndian.PutUint32(sbuf.Bytes(), uint32(length)) + return sbuf.Bytes() +} + +func (obj *DemoObj) rsp2Byte(rsp *requestf.ResponsePacket) []byte { + if rsp.IVersion == basef.TUPVERSION { + return obj.req2Byte(rsp) + } + os := codec.NewBuffer() + rsp.WriteTo(os) + bs := os.ToBytes() + sbuf := bytes.NewBuffer(nil) + sbuf.Write(make([]byte, 4)) + sbuf.Write(bs) + length := sbuf.Len() + binary.BigEndian.PutUint32(sbuf.Bytes(), uint32(length)) + return sbuf.Bytes() +} + +// TarsPing +func (obj *DemoObj) TarsPing() { + ctx := context.Background() + obj.servant.TarsPing(ctx) +} + +// TarsSetTimeout sets the timeout for the servant which is in ms. +func (obj *DemoObj) TarsSetTimeout(timeout int) { + obj.servant.TarsSetTimeout(timeout) +} + +// TarsSetProtocol sets the protocol for the servant. +func (obj *DemoObj) TarsSetProtocol(p m.Protocol) { + obj.servant.TarsSetProtocol(p) +} + +// AddServant adds servant for the service. +func (obj *DemoObj) AddServant(imp DemoObjServant, servantObj string) { + tars.AddServant(obj, imp, servantObj) +} + +// AddServantWithContext adds servant for the service with context. +func (obj *DemoObj) AddServantWithContext(imp DemoObjServantWithContext, servantObj string) { + tars.AddServantWithContext(obj, imp, servantObj) +} + +type DemoObjServant interface { + Push(msg *string) (err error) + Reg(req *RegReq, rsp *RegRsp) (err error) +} +type DemoObjServantWithContext interface { + Push(tarsCtx context.Context, msg *string) (err error) + Reg(tarsCtx context.Context, req *RegReq, rsp *RegRsp) (err error) +} + +// Dispatch is used to call the server side implement for the method defined in the tars file. withContext shows using context or not. +func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq *requestf.RequestPacket, tarsResp *requestf.ResponsePacket, withContext bool) (err error) { + var ( + length int32 + have bool + ty byte + ) + readBuf := codec.NewReader(tools.Int8ToByte(tarsReq.SBuffer)) + buf := codec.NewBuffer() + switch tarsReq.SFuncName { + case "Push": + var msg string + + traceData, ok := current.GetTraceData(tarsCtx) + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstSR, uint(readBuf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstSR), trace.TraceAnnotationSR, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Push", 0, traceParam, "") + } + + if !withContext { + imp := val.(DemoObjServant) + err = imp.Push(&msg) + } else { + imp := val.(DemoObjServantWithContext) + err = imp.Push(tarsCtx, &msg) + } + + if err != nil { + return err + } + + if tarsReq.IVersion == basef.TARSVERSION { + buf.Reset() + + err = buf.WriteString(msg, 1) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.TUPVERSION { + rspTup := tup.NewUniAttribute() + + buf.Reset() + err = buf.WriteString(msg, 0) + if err != nil { + return err + } + + rspTup.PutBuffer("msg", buf.ToBytes()) + + buf.Reset() + err = rspTup.Encode(buf) + if err != nil { + return err + } + } else if tarsReq.IVersion == basef.JSONVERSION { + rspJson := map[string]interface{}{} + rspJson["msg"] = msg + + var rspByte []byte + if rspByte, err = json.Marshal(rspJson); err != nil { + return err + } + + buf.Reset() + err = buf.WriteSliceUint8(rspByte) + if err != nil { + return err + } + } + + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstSS, uint(buf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["msg"] = msg + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstSS), trace.TraceAnnotationSS, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Push", 0, traceParam, "") + } + + case "Reg": + var req RegReq + var rsp RegRsp + + if tarsReq.IVersion == basef.TARSVERSION { + + err = req.ReadBlock(readBuf, 1, true) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.TUPVERSION { + reqTup := tup.NewUniAttribute() + reqTup.Decode(readBuf) + + var tupBuffer []byte + + reqTup.GetBuffer("req", &tupBuffer) + readBuf.Reset(tupBuffer) + err = req.ReadBlock(readBuf, 0, true) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.JSONVERSION { + var jsonData map[string]interface{} + decoder := json.NewDecoder(bytes.NewReader(readBuf.ToBytes())) + decoder.UseNumber() + err = decoder.Decode(&jsonData) + if err != nil { + return fmt.Errorf("decode reqpacket failed, error: %+v", err) + } + { + jsonStr, _ := json.Marshal(jsonData["req"]) + req.ResetDefault() + if err = json.Unmarshal(jsonStr, &req); err != nil { + return err + } + } + + } else { + err = fmt.Errorf("decode reqpacket fail, error version: %d", tarsReq.IVersion) + return err + } + + traceData, ok := current.GetTraceData(tarsCtx) + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstSR, uint(readBuf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["req"] = req + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstSR), trace.TraceAnnotationSR, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Reg", 0, traceParam, "") + } + + if !withContext { + imp := val.(DemoObjServant) + err = imp.Reg(&req, &rsp) + } else { + imp := val.(DemoObjServantWithContext) + err = imp.Reg(tarsCtx, &req, &rsp) + } + + if err != nil { + return err + } + + if tarsReq.IVersion == basef.TARSVERSION { + buf.Reset() + + err = rsp.WriteBlock(buf, 2) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.TUPVERSION { + rspTup := tup.NewUniAttribute() + + buf.Reset() + err = rsp.WriteBlock(buf, 0) + if err != nil { + return err + } + + rspTup.PutBuffer("rsp", buf.ToBytes()) + + buf.Reset() + err = rspTup.Encode(buf) + if err != nil { + return err + } + } else if tarsReq.IVersion == basef.JSONVERSION { + rspJson := map[string]interface{}{} + rspJson["rsp"] = rsp + + var rspByte []byte + if rspByte, err = json.Marshal(rspJson); err != nil { + return err + } + + buf.Reset() + err = buf.WriteSliceUint8(rspByte) + if err != nil { + return err + } + } + + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstSS, uint(buf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["rsp"] = rsp + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstSS), trace.TraceAnnotationSS, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Reg", 0, traceParam, "") + } + + default: + return fmt.Errorf("func mismatch") + } + var statusMap map[string]string + if status, ok := current.GetResponseStatus(tarsCtx); ok && status != nil { + statusMap = status + } + var contextMap map[string]string + if ctx, ok := current.GetResponseContext(tarsCtx); ok && ctx != nil { + contextMap = ctx + } + *tarsResp = requestf.ResponsePacket{ + IVersion: tarsReq.IVersion, + CPacketType: 0, + IRequestId: tarsReq.IRequestId, + IMessageType: 0, + IRet: 0, + SBuffer: tools.ByteToInt8(buf.ToBytes()), + Status: statusMap, + SResultDesc: "", + Context: contextMap, + } + + _ = readBuf + _ = buf + _ = length + _ = have + _ = ty + return nil +} + +type DemoObjTarsCallback interface { + Push_Callback(msg *string, opt ...map[string]string) + Push_ExceptionCallback(err error) + Reg_Callback(rsp *RegRsp, opt ...map[string]string) + Reg_ExceptionCallback(err error) +} + +// DemoObjPushCallback struct +type DemoObjPushCallback struct { + Cb DemoObjTarsCallback +} + +func (cb *DemoObjPushCallback) Ondispatch(resp *requestf.ResponsePacket) { + switch resp.SResultDesc { + case "Push": + err := func() error { + readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) + var err error + var msg = new(string) + + err = readBuf.ReadString(&(*msg), 1, true) + if err != nil { + return err + } + + if resp.Context != nil { + cb.Cb.Push_Callback(msg, resp.Context) + return nil + } else { + cb.Cb.Push_Callback(msg) + return nil + } + }() + if err != nil { + cb.Cb.Push_ExceptionCallback(err) + } + case "Reg": + err := func() error { + readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) + var err error + var rsp = new(RegRsp) + + err = (*rsp).ReadBlock(readBuf, 2, true) + if err != nil { + return err + } + + if resp.Context != nil { + cb.Cb.Reg_Callback(rsp, resp.Context) + return nil + } else { + cb.Cb.Reg_Callback(rsp) + return nil + } + }() + if err != nil { + cb.Cb.Reg_ExceptionCallback(err) + } + } +} +func (obj *DemoObj) AsyncSendResponse_Push(ctx context.Context, msg *string, opt ...map[string]string) (err error) { + + conn, udpAddr, ok := current.GetRawConn(ctx) + if !ok { + return fmt.Errorf("connection not found") + } + buf := codec.NewBuffer() + err = buf.WriteString(*msg, 1) + if err != nil { + return err + } + + resp := &requestf.ResponsePacket{ + SBuffer: tools.ByteToInt8(buf.ToBytes()), + } + resp.IVersion = basef.TARSVERSION + if resp.Status == nil { + resp.Status = make(map[string]string) + } + resp.Status["TARS_FUNC"] = "Push" + resp.SResultDesc = "Push" + if len(opt) > 0 { + if opt[0] != nil { + resp.Context = opt[0] + } + } + rspData := obj.rsp2Byte(resp) + if udpAddr != nil { + udpConn, _ := conn.(*net.UDPConn) + _, err = udpConn.WriteToUDP(rspData, udpAddr) + } else { + _, err = conn.Write(rspData) + } + return err +} +func (obj *DemoObj) AsyncSendResponse_Reg(ctx context.Context, rsp *RegRsp, opt ...map[string]string) (err error) { + + conn, udpAddr, ok := current.GetRawConn(ctx) + if !ok { + return fmt.Errorf("connection not found") + } + buf := codec.NewBuffer() + err = (*rsp).WriteBlock(buf, 2) + if err != nil { + return err + } + + resp := &requestf.ResponsePacket{ + SBuffer: tools.ByteToInt8(buf.ToBytes()), + } + resp.IVersion = basef.TARSVERSION + if resp.Status == nil { + resp.Status = make(map[string]string) + } + resp.Status["TARS_FUNC"] = "Reg" + resp.SResultDesc = "Reg" + if len(opt) > 0 { + if opt[0] != nil { + resp.Context = opt[0] + } + } + rspData := obj.rsp2Byte(resp) + if udpAddr != nil { + udpConn, _ := conn.(*net.UDPConn) + _, err = udpConn.WriteToUDP(rspData, udpAddr) + } else { + _, err = conn.Write(rspData) + } + return err +} diff --git a/examples/TarsPushServer/demo/demo.go b/examples/TarsPushServer/demo/demo.go new file mode 100644 index 00000000..b036db1f --- /dev/null +++ b/examples/TarsPushServer/demo/demo.go @@ -0,0 +1,200 @@ +// Package demo comment +// This file was generated by tars2go 1.1.10 +// Generated from demo.tars +package demo + +import ( + "fmt" + + "github.com/TarsCloud/TarsGo/tars/protocol/codec" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = fmt.Errorf +var _ = codec.FromInt8 + +// RegReq struct implement +type RegReq struct { + Msg string `json:"msg"` +} + +func (st *RegReq) ResetDefault() { +} + +// ReadFrom reads from readBuf and put into struct. +func (st *RegReq) ReadFrom(readBuf *codec.Reader) error { + var ( + err error + length int32 + have bool + ty byte + ) + st.ResetDefault() + + err = readBuf.ReadString(&st.Msg, 0, false) + if err != nil { + return err + } + + _ = err + _ = length + _ = have + _ = ty + return nil +} + +// ReadBlock reads struct from the given tag , require or optional. +func (st *RegReq) ReadBlock(readBuf *codec.Reader, tag byte, require bool) error { + var ( + err error + have bool + ) + st.ResetDefault() + + have, err = readBuf.SkipTo(codec.StructBegin, tag, require) + if err != nil { + return err + } + if !have { + if require { + return fmt.Errorf("require RegReq, but not exist. tag %d", tag) + } + return nil + } + + err = st.ReadFrom(readBuf) + if err != nil { + return err + } + + err = readBuf.SkipToStructEnd() + if err != nil { + return err + } + _ = have + return nil +} + +// WriteTo encode struct to buffer +func (st *RegReq) WriteTo(buf *codec.Buffer) (err error) { + + err = buf.WriteString(st.Msg, 0) + if err != nil { + return err + } + + return err +} + +// WriteBlock encode struct +func (st *RegReq) WriteBlock(buf *codec.Buffer, tag byte) error { + var err error + err = buf.WriteHead(codec.StructBegin, tag) + if err != nil { + return err + } + + err = st.WriteTo(buf) + if err != nil { + return err + } + + err = buf.WriteHead(codec.StructEnd, 0) + if err != nil { + return err + } + return nil +} + +// RegRsp struct implement +type RegRsp struct { + Msg string `json:"msg"` +} + +func (st *RegRsp) ResetDefault() { +} + +// ReadFrom reads from readBuf and put into struct. +func (st *RegRsp) ReadFrom(readBuf *codec.Reader) error { + var ( + err error + length int32 + have bool + ty byte + ) + st.ResetDefault() + + err = readBuf.ReadString(&st.Msg, 0, false) + if err != nil { + return err + } + + _ = err + _ = length + _ = have + _ = ty + return nil +} + +// ReadBlock reads struct from the given tag , require or optional. +func (st *RegRsp) ReadBlock(readBuf *codec.Reader, tag byte, require bool) error { + var ( + err error + have bool + ) + st.ResetDefault() + + have, err = readBuf.SkipTo(codec.StructBegin, tag, require) + if err != nil { + return err + } + if !have { + if require { + return fmt.Errorf("require RegRsp, but not exist. tag %d", tag) + } + return nil + } + + err = st.ReadFrom(readBuf) + if err != nil { + return err + } + + err = readBuf.SkipToStructEnd() + if err != nil { + return err + } + _ = have + return nil +} + +// WriteTo encode struct to buffer +func (st *RegRsp) WriteTo(buf *codec.Buffer) (err error) { + + err = buf.WriteString(st.Msg, 0) + if err != nil { + return err + } + + return err +} + +// WriteBlock encode struct +func (st *RegRsp) WriteBlock(buf *codec.Buffer, tag byte) error { + var err error + err = buf.WriteHead(codec.StructBegin, tag) + if err != nil { + return err + } + + err = st.WriteTo(buf) + if err != nil { + return err + } + + err = buf.WriteHead(codec.StructEnd, 0) + if err != nil { + return err + } + return nil +} diff --git a/examples/TarsPushServer/server/DemoServer.go b/examples/TarsPushServer/server/DemoServer.go new file mode 100644 index 00000000..e4a7a058 --- /dev/null +++ b/examples/TarsPushServer/server/DemoServer.go @@ -0,0 +1,29 @@ +package main + +import ( + "TarPushServer/server/Impl" + "flag" + "fmt" + "github.com/TarsCloud/TarsGo/tars" +) + +func main() { + SrvConfig := "" // tars服务配置 + + flag.StringVar(&SrvConfig, "config", "", "path to server config file") + flag.Parse() + + fmt.Println("srv_conf: ", SrvConfig) + + // 这里赋值为了避免tars解析命令行参数导致二次解析报错 + tars.ServerConfigPath = SrvConfig + + cfg := tars.GetServerConfig() + imp := &Impl.DemoImp{} + Impl.GetApp().AddServantWithContext(imp, cfg.App+"."+cfg.Server+".DemoObj") + + //klog.Init(cfg.App, cfg.Server, cfg.LogPath, int(cfg.LogNum)) + + //klog.CONSOLE.Info("server running...") + tars.Run() +} diff --git a/examples/TarsPushServer/server/Impl/DemoImp.go b/examples/TarsPushServer/server/Impl/DemoImp.go new file mode 100644 index 00000000..92ddd6dd --- /dev/null +++ b/examples/TarsPushServer/server/Impl/DemoImp.go @@ -0,0 +1,53 @@ +package Impl + +import ( + "TarPushServer/demo" + "context" + "fmt" + "github.com/TarsCloud/TarsGo/tars/util/current" + "strconv" +) + +var app = &demo.DemoObj{} + +type DemoImp struct { +} + +func GetApp() *demo.DemoObj { + return app +} +func (d DemoImp) Reg(ctx context.Context, req *demo.RegReq, rsp *demo.RegRsp) (err error) { + rsp.Msg = req.Msg + go func() { + for i := 0; i < 10; i++ { + msg := fmt.Sprintf("push msg %d", i) + context := make(map[string]string, 1) + context["msg"] = "******" + strconv.Itoa(i) + uuid, _ := current.GetUUID(ctx) + context["uuid"] = uuid + GetApp().AsyncSendResponse_Push(ctx, &msg, context) + } + }() + return nil +} + +func (d DemoImp) Push(ctx context.Context, msg *string) (err error) { + return nil +} + +func (d DemoImp) Invoke(ctx context.Context, pkg []byte) []byte { + //TODO implement me + fmt.Println("implement me") + return []byte{} +} + +func (d DemoImp) GetCloseMsg() []byte { + //TODO implement me + fmt.Println("implement me") + return nil +} + +func (d DemoImp) DoClose(ctx context.Context) { + //TODO implement me + fmt.Println("implement me") +} diff --git a/examples/TarsPushServer/server/conf/Base.DemoServer.servant.conf b/examples/TarsPushServer/server/conf/Base.DemoServer.servant.conf new file mode 100644 index 00000000..9cec252b --- /dev/null +++ b/examples/TarsPushServer/server/conf/Base.DemoServer.servant.conf @@ -0,0 +1,37 @@ + + + enableset=n + setdivision=NULL + + app=Base + server=DemoServer + basepath=./ + datapath=./ + logpath=./ + logsize=10M + lognum=10 + logLevel=DEBUG + + allow + endpoint=tcp -h 0.0.0.0 -p 8888 -t 60000 + maxconns=100000 + protocol=tars + queuecap=500000 + queuetimeout=20000 + servant=Base.DemoServer.DemoObj + threads=1 + + + + locator=tars.tarsregistry.QueryObj@tcp -h 10.253.50.57 -p 17890 + sync-invoke-timeout=3000 + async-invoke-timeout=5000 + refresh-endpoint-interval=60000 + stat=tars.tarsstat.StatObj + property=tars.tarsproperty.PropertyObj + report-interval=60000 + asyncthread=3 + modulename=Base.DemoServer + + + diff --git a/tars/adapter.go b/tars/adapter.go index c1657f3f..34a494a4 100755 --- a/tars/adapter.go +++ b/tars/adapter.go @@ -7,6 +7,7 @@ import ( "sync/atomic" "time" + "github.com/TarsCloud/TarsGo/tars/model" "github.com/TarsCloud/TarsGo/tars/protocol/res/basef" "github.com/TarsCloud/TarsGo/tars/protocol/res/endpointf" "github.com/TarsCloud/TarsGo/tars/protocol/res/requestf" @@ -37,13 +38,17 @@ type AdapterProxy struct { lastKeepAliveTime int64 pushCallback func([]byte) onceKeepAlive sync.Once - - closed bool + onDispatch model.Ondispatch + asyncPushCh chan *requestf.ResponsePacket // + closed bool } // NewAdapterProxy : Construct an adapter proxy func NewAdapterProxy(objName string, point *endpointf.EndpointF, comm *Communicator) *AdapterProxy { c := &AdapterProxy{} + if c.asyncPushCh == nil { + c.asyncPushCh = make(chan *requestf.ResponsePacket) + } c.comm = comm c.point = point proto := "tcp" @@ -71,6 +76,16 @@ func NewAdapterProxy(objName string, point *endpointf.EndpointF, comm *Communica c.conf = conf c.tarsClient = transport.NewTarsClient(fmt.Sprintf("%s:%d", point.Host, point.Port), c, conf) c.status = true + + // push queue listenning + go func() { + for { + select { + case resp := <-c.asyncPushCh: + c.onPush(resp) + } + } + }() return c } @@ -94,7 +109,7 @@ func (c *AdapterProxy) Recv(pkg []byte) { return } if packet.IRequestId == 0 { - c.onPush(packet) + c.asyncPushCh <- packet return } if packet.CPacketType == basef.TARSONEWAY { @@ -215,12 +230,23 @@ func (c *AdapterProxy) onPush(pkg *requestf.ResponsePacket) { oldClient.GraceClose(ctx) // grace shutdown return } - // Support push msg - if c.pushCallback == nil { - return + + switch pkg.IVersion { + case 0: + // raw socket push + if c.pushCallback == nil { + return + } + data := tools.Int8ToByte(pkg.SBuffer) + c.pushCallback(data) + + case basef.TARSVERSION: + if c.onDispatch == nil { + return + } + // tars proto push + c.onDispatch.Ondispatch(pkg) } - data := tools.Int8ToByte(pkg.SBuffer) - c.pushCallback(data) } func (c *AdapterProxy) autoKeepAlive() { @@ -236,6 +262,18 @@ func (c *AdapterProxy) autoKeepAlive() { } } +func (c *AdapterProxy) OnConnect(address string) { + if c.obj.onConnectCallback != nil { + c.obj.onConnectCallback(address) + } +} + +func (c *AdapterProxy) OnClose(address string) { + if c.obj.onCloseCallback != nil { + c.obj.onCloseCallback(address) + } +} + func (c *AdapterProxy) doKeepAlive() { if c.closed { return diff --git a/tars/model/Servant.go b/tars/model/Servant.go index 5d6eedc0..57f435a6 100755 --- a/tars/model/Servant.go +++ b/tars/model/Servant.go @@ -6,6 +6,10 @@ import ( "github.com/TarsCloud/TarsGo/tars/protocol/res/requestf" ) +type Ondispatch interface { + Ondispatch(resp *requestf.ResponsePacket) +} + // Servant is interface for call the remote server. type Servant interface { TarsInvoke(ctx context.Context, cType byte, @@ -16,8 +20,12 @@ type Servant interface { resp *requestf.ResponsePacket) error TarsSetTimeout(t int) TarsSetProtocol(Protocol) + TarsPing(ctx context.Context) Name() string SetPushCallback(callback func([]byte)) + SetTarsCallback(callback Ondispatch) + SetOnCloseCallback(callback func(string)) + SetOnConnectCallback(callback func(string)) } type Protocol interface { diff --git a/tars/servant.go b/tars/servant.go index 14849324..3bb45948 100755 --- a/tars/servant.go +++ b/tars/servant.go @@ -31,15 +31,17 @@ const ( // ServantProxy tars servant proxy instance type ServantProxy struct { - name string - comm *Communicator - manager EndpointManager - timeout int - version int16 - proto model.Protocol - queueLen int32 - - pushCallback func([]byte) + name string + comm *Communicator + manager EndpointManager + timeout int + version int16 + proto model.Protocol + queueLen int32 + ondispatch model.Ondispatch + pushCallback func([]byte) + onCloseCallback func(string) + onConnectCallback func(string) } // NewServantProxy creates and initializes a servant proxy @@ -102,11 +104,46 @@ func (s *ServantProxy) genRequestID() int32 { } } +func (s *ServantProxy) TarsPing(ctx context.Context) { + req := requestf.RequestPacket{ + IVersion: s.version, + CPacketType: int8(basef.TARSONEWAY), + IRequestId: s.genRequestID(), + SServantName: s.name, + SFuncName: "tars_ping", + ITimeout: int32(s.timeout), + } + msg := &Message{Req: &req, Ser: s} + msg.Init() + timeout := time.Duration(s.timeout) * time.Millisecond + s.manager.preInvoke() + err := s.doInvoke(ctx, msg, timeout) + s.manager.postInvoke() + if err != nil { + TLOG.Errorf("KsfPing err: %v", err) + } + msg.End() +} + +func (s *ServantProxy) SetTarsCallback(ondispatch model.Ondispatch) { + s.ondispatch = ondispatch +} + // SetPushCallback set callback function for pushing func (s *ServantProxy) SetPushCallback(callback func([]byte)) { s.pushCallback = callback } +// SetPushCallback set callback function for pushing +func (s *ServantProxy) SetOnConnectCallback(callback func(string)) { + s.onConnectCallback = callback +} + +// SetPushCallback set callback function for pushing +func (s *ServantProxy) SetOnCloseCallback(callback func(string)) { + s.onCloseCallback = callback +} + // TarsInvoke is used for client invoking server. func (s *ServantProxy) TarsInvoke(ctx context.Context, cType byte, sFuncName string, @@ -229,6 +266,11 @@ func (s *ServantProxy) doInvoke(ctx context.Context, msg *Message, timeout time. adp.pushCallback = s.pushCallback } + if s.ondispatch != nil { + go adp.onceKeepAlive.Do(adp.autoKeepAlive) + adp.onDispatch = s.ondispatch + } + atomic.AddInt32(&s.queueLen, 1) readCh := make(chan *requestf.ResponsePacket) adp.resp.Store(msg.Req.IRequestId, readCh) diff --git a/tars/tools/tars2go/gen_go.go b/tars/tools/tars2go/gen_go.go index a3687ee5..f4e89d87 100755 --- a/tars/tools/tars2go/gen_go.go +++ b/tars/tools/tars2go/gen_go.go @@ -356,6 +356,7 @@ import ( "context" "fmt" "unsafe" + "net" "encoding/json" `) if *gAddServant { @@ -1127,6 +1128,10 @@ func (gen *GenGo) genInterface(itf *InterfaceInfo) { gen.genIFDispatch(itf) + gen.genTarsCallback(itf) + + gen.genSendPushResponse(itf) + gen.saveToSourceFile(itf.Name + ".tars.go") } @@ -1148,6 +1153,80 @@ func (obj *` + itf.Name + `) SetServant(servant m.Servant) { obj.servant = servant } `) + c.WriteString(`// GetServant gets servant for the service. +func (obj *` + itf.Name + `) GetServant()(servant *m.Servant) { + return &obj.servant +} +`) + c.WriteString(` // SetOnConnectCallback +func (obj *` + itf.Name + `) SetOnConnectCallback(callback func(string)) { + obj.servant.SetOnConnectCallback(callback) +} +`) + + c.WriteString(` // SetOnCloseCallback +func (obj *` + itf.Name + `) SetOnCloseCallback(callback func(string)) { + obj.servant.SetOnCloseCallback(callback) +} +`) + c.WriteString(` // SetTarsCallback +func (obj *` + itf.Name + `) SetTarsCallback(callback ` + itf.Name + `TarsCallback) { + var push ` + itf.Name + `PushCallback + push.Cb = callback + obj.servant.SetTarsCallback(&push) +} +`) + + c.WriteString(` // SetPushCallback +func (obj *` + itf.Name + `) SetPushCallback(callback func([]byte)) { + obj.servant.SetPushCallback(callback) +} +`) + + c.WriteString(`func (obj *` + itf.Name + `) req2Byte(rsp *requestf.ResponsePacket) []byte { + req := requestf.RequestPacket{} + req.IVersion = rsp.IVersion + req.IRequestId = rsp.IRequestId + req.IMessageType = rsp.IMessageType + req.CPacketType = rsp.CPacketType + req.Context = rsp.Context + req.Status = rsp.Status + req.SBuffer = rsp.SBuffer + + os := codec.NewBuffer() + req.WriteTo(os) + bs := os.ToBytes() + sbuf := bytes.NewBuffer(nil) + sbuf.Write(make([]byte, 4)) + sbuf.Write(bs) + length := sbuf.Len() + binary.BigEndian.PutUint32(sbuf.Bytes(), uint32(length)) + return sbuf.Bytes() +} + +func (obj * ` + itf.Name + `) rsp2Byte(rsp *requestf.ResponsePacket) []byte { + if rsp.IVersion == basef.TUPVERSION { + return obj.req2Byte(rsp) + } + os := codec.NewBuffer() + rsp.WriteTo(os) + bs := os.ToBytes() + sbuf := bytes.NewBuffer(nil) + sbuf.Write(make([]byte, 4)) + sbuf.Write(bs) + length := sbuf.Len() + binary.BigEndian.PutUint32(sbuf.Bytes(), uint32(length)) + return sbuf.Bytes() +} +`) + + c.WriteString(` // TarsPing +func (obj *` + itf.Name + `) TarsPing() { + ctx := context.Background() + obj.servant.TarsPing(ctx) +} +`) + c.WriteString(`// TarsSetTimeout sets the timeout for the servant which is in ms. func (obj *` + itf.Name + `) TarsSetTimeout(timeout int) { obj.servant.TarsSetTimeout(timeout) @@ -1847,3 +1926,173 @@ if ok && traceData.TraceCall { c.WriteString("\n\n") } } + +func (gen *GenGo) genArgsForPush(arg *ArgInfo) { + c := &gen.code + if arg.IsOut { + c.WriteString(arg.Name + " ") + c.WriteString("*") + c.WriteString(gen.genType(arg.Type) + ",") + } +} + +func (gen *GenGo) genTarsCallback(itf *InterfaceInfo) { + c := &gen.code + + c.WriteString("type " + itf.Name + "TarsCallback interface {" + "\n") + for _, v := range itf.Fun { + gen.genIFPushCallback(itf.Name, &v) + gen.genIFPushExceptionCallback(itf.Name, &v) + } + c.WriteString("}" + "\n") + + c.WriteString("// " + itf.Name + "PushCallback struct\n") + c.WriteString("type " + itf.Name + "PushCallback struct {" + "\n") + c.WriteString("Cb " + itf.Name + "TarsCallback" + "\n") + c.WriteString("}" + "\n") + + // 生成PushCallback 接口Ondispatch + c.WriteString("func (cb *" + itf.Name + "PushCallback) Ondispatch(resp *requestf.ResponsePacket) {" + "\n") + c.WriteString("switch resp.SResultDesc {" + "\n") + for _, v := range itf.Fun { + c.WriteString("case \"" + v.Name + "\":" + "\n") + c.WriteString("err := func() error {" + "\n") + c.WriteString("readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer))" + "\n") + if v.HasRet { + dummy := &StructMember{} + dummy.Type = v.RetType + dummy.Key = "ret" + dummy.Tag = 0 + dummy.Require = true + gen.genReadVar(dummy, "", false) + } + c.WriteString("var err error" + "\n") + for k, arg := range v.Args { + if arg.IsOut { + if len(arg.Type.TypeSt) == 0 { + c.WriteString("var " + arg.Name + "= new(" + gen.genType(arg.Type) + ")" + "\n") + } else { + c.WriteString("var " + arg.Name + "= new(" + arg.Type.TypeSt + ")" + "\n") + } + dummy := &StructMember{} + dummy.Type = arg.Type + dummy.Key = "(*" + arg.Name + ")" + dummy.Tag = int32(k + 1) + dummy.Require = true + gen.genReadVar(dummy, "", false) + } + } + c.WriteString(` if resp.Context != nil { + cb.Cb.` + v.Name + `_Callback(`) + { + k := 0 + for _, arg := range v.Args { + if arg.IsOut { + if k == 0 { + c.WriteString(arg.Name) + } else { + c.WriteString(`, ` + arg.Name) + } + k++ + } + } + } + c.WriteString(", resp.Context)" + "\n") + c.WriteString("return nil") + c.WriteString(`} else { `) + c.WriteString(`cb.Cb.` + v.Name + `_Callback(`) + { + k := 0 + for _, arg := range v.Args { + if arg.IsOut { + if k == 0 { + c.WriteString(arg.Name) + } else { + c.WriteString(`, ` + arg.Name) + } + k++ + } + } + } + c.WriteString(")" + "\n") + c.WriteString("return nil") + c.WriteString("}" + "\n") + c.WriteString("}()" + "\n") + c.WriteString(`if err != nil { + cb.Cb.` + v.Name + `_ExceptionCallback(err) +}` + "\n") + } + + c.WriteString("}" + "\n") + c.WriteString("}" + "\n") +} + +func (gen *GenGo) genIFPushCallback(name string, f *FunInfo) { + c := &gen.code + c.WriteString(f.Name + "_Callback(") + for _, v := range f.Args { + gen.genArgsForPush(&v) + } + + c.WriteString(" opt ...map[string]string)" + "\n") +} + +func (gen *GenGo) genIFPushExceptionCallback(name string, f *FunInfo) { + c := &gen.code + c.WriteString(f.Name + "_ExceptionCallback(err error)" + "\n") +} + +func (gen *GenGo) genSendPushResponse(itf *InterfaceInfo) { + c := &gen.code + for _, fun := range itf.Fun { + c.WriteString(`func (obj *` + itf.Name + `)AsyncSendResponse_` + fun.Name + `(ctx context.Context, `) + for _, arg := range fun.Args { + gen.genArgsForPush(&arg) + } + c.WriteString(" opt ... map[string]string") + c.WriteString(`)(err error) {` + "\n") + c.WriteString(` + conn, udpAddr, ok := current.GetRawConn(ctx) + if !ok { + return fmt.Errorf("connection not found") + } +`) + c.WriteString("buf := codec.NewBuffer()") + for k, v := range fun.Args { + if !v.IsOut { + continue + } + dummy := &StructMember{} + dummy.Type = v.Type + dummy.Key = v.Name + dummy.Tag = int32(k + 1) + if v.IsOut { + dummy.Key = "(*" + dummy.Key + ")" + } + gen.genWriteVar(dummy, "", fun.HasRet) + } + c.WriteString(`resp := &requestf.ResponsePacket{ + SBuffer: tools.ByteToInt8(buf.ToBytes()), + } + resp.IVersion = basef.TARSVERSION + if resp.Status == nil { + resp.Status = make(map[string]string) + } + resp.Status["TARS_FUNC"] = "` + fun.Name + `" + resp.SResultDesc = "` + fun.Name + `" + if len(opt) > 0 { + if opt[0] != nil{ + resp.Context= opt[0] + } + } + rspData := obj.rsp2Byte(resp) + if udpAddr != nil { + udpConn, _ := conn.(*net.UDPConn) + _, err = udpConn.WriteToUDP(rspData, udpAddr) + } else { + _, err = conn.Write(rspData) + } + return err`) + c.WriteString("}" + "\n") + } +} diff --git a/tars/transport/common.go b/tars/transport/common.go index 17e8d940..6b7b6abe 100755 --- a/tars/transport/common.go +++ b/tars/transport/common.go @@ -27,6 +27,8 @@ type ServerProtocol interface { type ClientProtocol interface { Recv(pkg []byte) ParsePackage(buff []byte) (int, int) + OnClose(address string) + OnConnect(address string) } func isNoDataError(err error) bool { diff --git a/tars/transport/tarsclient.go b/tars/transport/tarsclient.go index 67219518..0dafbb3d 100755 --- a/tars/transport/tarsclient.go +++ b/tars/transport/tarsclient.go @@ -221,6 +221,7 @@ func (c *connection) ReConnect() (err error) { if err != nil { c.connLock.Unlock() + go c.tc.cp.OnClose(c.tc.address) return err } if c.tc.conf.Proto == "tcp" { @@ -230,6 +231,7 @@ func (c *connection) ReConnect() (err error) { } c.idleTime = time.Now() c.isClosed = false + go c.tc.cp.OnConnect(c.tc.address) connDone := make(chan bool, 1) go c.recv(c.conn, connDone) go c.send(c.conn, connDone) @@ -244,5 +246,6 @@ func (c *connection) close(conn net.Conn) { if conn != nil { conn.Close() } + go c.tc.cp.OnClose(c.tc.address) c.connLock.Unlock() } diff --git a/tars/transport/tcphandler.go b/tars/transport/tcphandler.go index 32fce0ef..0e028081 100755 --- a/tars/transport/tcphandler.go +++ b/tars/transport/tcphandler.go @@ -3,6 +3,8 @@ package transport import ( "context" "crypto/tls" + "github.com/TarsCloud/TarsGo/tars/protocol/res/basef" + "github.com/google/uuid" "io" "net" "os" @@ -12,7 +14,6 @@ import ( "sync/atomic" "time" - "github.com/TarsCloud/TarsGo/tars/protocol/res/basef" "github.com/TarsCloud/TarsGo/tars/util/current" "github.com/TarsCloud/TarsGo/tars/util/gpool" "github.com/TarsCloud/TarsGo/tars/util/grace" @@ -34,12 +35,14 @@ type tcpHandler struct { } type connInfo struct { + uuid string conn net.Conn idleTime int64 numInvoke int32 } func (h *tcpHandler) Listen() (err error) { + uuid.EnableRandPool() cfg := h.conf ln, err := grace.CreateListener("tcp", cfg.Address) if err == nil { @@ -65,6 +68,7 @@ func (h *tcpHandler) Listen() (err error) { func (h *tcpHandler) getConnContext(connSt *connInfo) context.Context { ctx := current.ContextWithTarsCurrent(context.Background()) ipPort := strings.Split(connSt.conn.RemoteAddr().String(), ":") + current.SetUUIDWithContext(ctx, connSt.uuid) current.SetClientIPWithContext(ctx, ipPort[0]) current.SetClientPortWithContext(ctx, ipPort[1]) current.SetRecvPkgTsFromContext(ctx, time.Now().UnixNano()/1e6) @@ -136,7 +140,7 @@ func (h *tcpHandler) Handle() error { case *tls.Conn: TLOG.Debugf("TLS accept: %s, %d", conn.RemoteAddr(), os.Getpid()) } - cf := &connInfo{conn: conn} + cf := &connInfo{conn: conn, uuid: uuid.New().String()} h.conns.Store(key, cf) h.recv(cf) h.conns.Delete(key) diff --git a/tars/util/current/tarscurrent.go b/tars/util/current/tarscurrent.go index 62191657..7e8f6e8d 100644 --- a/tars/util/current/tarscurrent.go +++ b/tars/util/current/tarscurrent.go @@ -14,6 +14,7 @@ var tcKey = tarsCurrentKey(0x484900) // Current contains message for the specify request. // This current is used for server side. type Current struct { + uuid string clientIP string clientPort string recvPkgTs int64 @@ -84,6 +85,23 @@ func currentFromContext(ctx context.Context) (*Current, bool) { return tc, ok } +func SetUUIDWithContext(ctx context.Context, uid string) bool { + tc, ok := currentFromContext(ctx) + if ok { + tc.uuid = uid + } + return ok +} + +// GetUUID get current uuid using for connect uniqe mark +func GetUUID(ctx context.Context) (uuid string, ret bool) { + tc, ok := currentFromContext(ctx) + if ok { + return tc.uuid, true + } + return +} + // SetResponseStatus set the response package' status . func SetResponseStatus(ctx context.Context, s map[string]string) bool { tc, ok := currentFromContext(ctx) From c0d3cc2717de785696911ced7a453b2348c6e4a7 Mon Sep 17 00:00:00 2001 From: "chao.chen" Date: Sat, 18 Mar 2023 14:31:05 +0800 Subject: [PATCH 02/16] =?UTF-8?q?fix(ksf2go):=E9=80=82=E9=85=8D=E5=90=84?= =?UTF-8?q?=E7=A7=8D=E5=BD=A2=E5=BC=8F=E7=9A=84interface=20fix(ksfgo):?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=98=E9=87=8F=E5=90=8D=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E6=9C=AA=E5=8F=8A=E6=97=B6=E6=9B=B4=E6=96=B0=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/TarsPushServer/client/DemoClient.go | 35 +- examples/TarsPushServer/demo.tars | 14 +- examples/TarsPushServer/demo/DemoObj.tars.go | 489 +++++++++++++++++- examples/TarsPushServer/demo/demo.go | 197 +++++++ .../TarsPushServer/server/Impl/DemoImp.go | 13 +- tars/adapter.go | 8 +- tars/tools/tars2go/gen_go.go | 68 ++- 7 files changed, 765 insertions(+), 59 deletions(-) diff --git a/examples/TarsPushServer/client/DemoClient.go b/examples/TarsPushServer/client/DemoClient.go index a6c394b3..186bc155 100644 --- a/examples/TarsPushServer/client/DemoClient.go +++ b/examples/TarsPushServer/client/DemoClient.go @@ -7,12 +7,29 @@ import ( "time" ) +var prx *demo.DemoObj + type Callback struct { start int64 cost int64 count int64 } +func (c *Callback) Reg_Callback(ret *demo.Result, rsp *demo.RegRsp, opt ...map[string]string) { + //TODO implement me + panic("implement me") +} + +func (c *Callback) Notify_Callback(ret *demo.Result, opt ...map[string]string) { + //TODO implement me + panic("implement me") +} + +func (c *Callback) Notify_ExceptionCallback(err error) { + //TODO implement me + panic("implement me") +} + func (c *Callback) Push_Callback(msg *string, opt ...map[string]string) { /* if c.count == 0 { c.start = time.Now().UnixMicro() @@ -36,23 +53,25 @@ func (c Callback) Push_ExceptionCallback(err error) { panic("implement me") } -func (c Callback) Reg_Callback(rsp *demo.RegRsp, opt ...map[string]string) { +func (c Callback) Reg_ExceptionCallback(err error) { //TODO implement me panic("implement me") } -func (c Callback) Reg_ExceptionCallback(err error) { - //TODO implement me - panic("implement me") +func TestReg() { + req := &demo.RegReq{Msg: "reg"} + rsp := &demo.RegRsp{} + prx.Reg(req, rsp) } func main() { com := tars.GetCommunicator() obj := "Base.DemoServer.DemoObj@tcp -h 127.0.0.1 -p 8888 -t 60000" - prx := &demo.DemoObj{} + prx = &demo.DemoObj{} com.StringToProxy(obj, prx) prx.SetOnConnectCallback(func(s string) { fmt.Println("<-----------onConnect--------->") + TestReg() }) prx.SetOnCloseCallback(func(s string) { fmt.Println("<-----------onClose----------->") @@ -69,11 +88,7 @@ func main() { } } }() - { - req := &demo.RegReq{Msg: "reg"} - rsp := &demo.RegRsp{} - prx.Reg(req, rsp) - } + prx.TarsPing() for true { time.Sleep(time.Second * 10) } diff --git a/examples/TarsPushServer/demo.tars b/examples/TarsPushServer/demo.tars index 87ddcb92..91279455 100644 --- a/examples/TarsPushServer/demo.tars +++ b/examples/TarsPushServer/demo.tars @@ -1,5 +1,11 @@ module demo { + struct Result + { + 0 optional int code; + 1 optional string msg; + }; + struct RegReq { 0 optional string msg; @@ -10,9 +16,15 @@ module demo 0 optional string msg; }; + struct Notify + { + 0 optional string msg; + }; + interface DemoObj { void Push(out string msg); - void Reg(RegReq req, out RegRsp rsp); + Result Reg(RegReq req, out RegRsp rsp); + Result Notify(Notify notify); }; }; \ No newline at end of file diff --git a/examples/TarsPushServer/demo/DemoObj.tars.go b/examples/TarsPushServer/demo/DemoObj.tars.go index 0da92b41..f090c0e6 100644 --- a/examples/TarsPushServer/demo/DemoObj.tars.go +++ b/examples/TarsPushServer/demo/DemoObj.tars.go @@ -243,7 +243,7 @@ func (obj *DemoObj) PushOneWayWithContext(tarsCtx context.Context, msg *string, } // Reg is the proxy function for the method defined in the tars file, with the context -func (obj *DemoObj) Reg(req *RegReq, rsp *RegRsp, opts ...map[string]string) (err error) { +func (obj *DemoObj) Reg(req *RegReq, rsp *RegRsp, opts ...map[string]string) (ret Result, err error) { var ( length int32 have bool @@ -252,12 +252,12 @@ func (obj *DemoObj) Reg(req *RegReq, rsp *RegRsp, opts ...map[string]string) (er buf := codec.NewBuffer() err = req.WriteBlock(buf, 1) if err != nil { - return err + return ret, err } err = (*rsp).WriteBlock(buf, 2) if err != nil { - return err + return ret, err } var statusMap map[string]string @@ -273,13 +273,18 @@ func (obj *DemoObj) Reg(req *RegReq, rsp *RegRsp, opts ...map[string]string) (er err = obj.servant.TarsInvoke(tarsCtx, 0, "Reg", buf.ToBytes(), statusMap, contextMap, tarsResp) if err != nil { - return err + return ret, err } readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = ret.ReadBlock(readBuf, 0, true) + if err != nil { + return ret, err + } + err = (*rsp).ReadBlock(readBuf, 2, true) if err != nil { - return err + return ret, err } if len(opts) == 1 { @@ -306,11 +311,11 @@ func (obj *DemoObj) Reg(req *RegReq, rsp *RegRsp, opts ...map[string]string) (er _ = length _ = have _ = ty - return nil + return ret, nil } // RegWithContext is the proxy function for the method defined in the tars file, with the context -func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *RegRsp, opts ...map[string]string) (err error) { +func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *RegRsp, opts ...map[string]string) (ret Result, err error) { var ( length int32 have bool @@ -319,12 +324,12 @@ func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *Re buf := codec.NewBuffer() err = req.WriteBlock(buf, 1) if err != nil { - return err + return ret, err } err = (*rsp).WriteBlock(buf, 2) if err != nil { - return err + return ret, err } traceData, ok := current.GetTraceData(tarsCtx) @@ -355,13 +360,18 @@ func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *Re tarsResp := new(requestf.ResponsePacket) err = obj.servant.TarsInvoke(tarsCtx, 0, "Reg", buf.ToBytes(), statusMap, contextMap, tarsResp) if err != nil { - return err + return ret, err } readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = ret.ReadBlock(readBuf, 0, true) + if err != nil { + return ret, err + } + err = (*rsp).ReadBlock(readBuf, 2, true) if err != nil { - return err + return ret, err } if ok && traceData.TraceCall { @@ -369,6 +379,7 @@ func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *Re traceParamFlag := traceData.NeedTraceParam(trace.EstCR, uint(readBuf.Len())) if traceParamFlag == trace.EnpNormal { value := map[string]interface{}{} + value[""] = ret value["rsp"] = *rsp p, _ := json.Marshal(value) traceParam = string(p) @@ -402,11 +413,11 @@ func (obj *DemoObj) RegWithContext(tarsCtx context.Context, req *RegReq, rsp *Re _ = length _ = have _ = ty - return nil + return ret, nil } // RegOneWayWithContext is the proxy function for the method defined in the tars file, with the context -func (obj *DemoObj) RegOneWayWithContext(tarsCtx context.Context, req *RegReq, rsp *RegRsp, opts ...map[string]string) (err error) { +func (obj *DemoObj) RegOneWayWithContext(tarsCtx context.Context, req *RegReq, rsp *RegRsp, opts ...map[string]string) (ret Result, err error) { var ( length int32 have bool @@ -415,12 +426,12 @@ func (obj *DemoObj) RegOneWayWithContext(tarsCtx context.Context, req *RegReq, r buf := codec.NewBuffer() err = req.WriteBlock(buf, 1) if err != nil { - return err + return ret, err } err = (*rsp).WriteBlock(buf, 2) if err != nil { - return err + return ret, err } var statusMap map[string]string @@ -435,7 +446,7 @@ func (obj *DemoObj) RegOneWayWithContext(tarsCtx context.Context, req *RegReq, r tarsResp := new(requestf.ResponsePacket) err = obj.servant.TarsInvoke(tarsCtx, 1, "Reg", buf.ToBytes(), statusMap, contextMap, tarsResp) if err != nil { - return err + return ret, err } if len(opts) == 1 { @@ -462,7 +473,215 @@ func (obj *DemoObj) RegOneWayWithContext(tarsCtx context.Context, req *RegReq, r _ = length _ = have _ = ty - return nil + return ret, nil +} + +// Notify is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) Notify(notify *Notify, opts ...map[string]string) (ret Result, err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = notify.WriteBlock(buf, 1) + if err != nil { + return ret, err + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + tarsResp := new(requestf.ResponsePacket) + tarsCtx := context.Background() + + err = obj.servant.TarsInvoke(tarsCtx, 0, "Notify", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return ret, err + } + + readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = ret.ReadBlock(readBuf, 0, true) + if err != nil { + return ret, err + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return ret, nil +} + +// NotifyWithContext is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) NotifyWithContext(tarsCtx context.Context, notify *Notify, opts ...map[string]string) (ret Result, err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = notify.WriteBlock(buf, 1) + if err != nil { + return ret, err + } + + traceData, ok := current.GetTraceData(tarsCtx) + if ok && traceData.TraceCall { + traceData.NewSpan() + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstCS, uint(buf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["notify"] = notify + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstCS), trace.TraceAnnotationCS, tars.GetClientConfig().ModuleName, obj.servant.Name(), "Notify", 0, traceParam, "") + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + + tarsResp := new(requestf.ResponsePacket) + err = obj.servant.TarsInvoke(tarsCtx, 0, "Notify", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return ret, err + } + + readBuf := codec.NewReader(tools.Int8ToByte(tarsResp.SBuffer)) + err = ret.ReadBlock(readBuf, 0, true) + if err != nil { + return ret, err + } + + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstCR, uint(readBuf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value[""] = ret + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstCR), trace.TraceAnnotationCR, tars.GetClientConfig().ModuleName, obj.servant.Name(), "Notify", int(tarsResp.IRet), traceParam, "") + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return ret, nil +} + +// NotifyOneWayWithContext is the proxy function for the method defined in the tars file, with the context +func (obj *DemoObj) NotifyOneWayWithContext(tarsCtx context.Context, notify *Notify, opts ...map[string]string) (ret Result, err error) { + var ( + length int32 + have bool + ty byte + ) + buf := codec.NewBuffer() + err = notify.WriteBlock(buf, 1) + if err != nil { + return ret, err + } + + var statusMap map[string]string + var contextMap map[string]string + if len(opts) == 1 { + contextMap = opts[0] + } else if len(opts) == 2 { + contextMap = opts[0] + statusMap = opts[1] + } + + tarsResp := new(requestf.ResponsePacket) + err = obj.servant.TarsInvoke(tarsCtx, 1, "Notify", buf.ToBytes(), statusMap, contextMap, tarsResp) + if err != nil { + return ret, err + } + + if len(opts) == 1 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + } else if len(opts) == 2 { + for k := range contextMap { + delete(contextMap, k) + } + for k, v := range tarsResp.Context { + contextMap[k] = v + } + for k := range statusMap { + delete(statusMap, k) + } + for k, v := range tarsResp.Status { + statusMap[k] = v + } + } + _ = length + _ = have + _ = ty + return ret, nil } // SetServant sets servant for the service. @@ -560,11 +779,13 @@ func (obj *DemoObj) AddServantWithContext(imp DemoObjServantWithContext, servant type DemoObjServant interface { Push(msg *string) (err error) - Reg(req *RegReq, rsp *RegRsp) (err error) + Reg(req *RegReq, rsp *RegRsp) (ret Result, err error) + Notify(notify *Notify) (ret Result, err error) } type DemoObjServantWithContext interface { Push(tarsCtx context.Context, msg *string) (err error) - Reg(tarsCtx context.Context, req *RegReq, rsp *RegRsp) (err error) + Reg(tarsCtx context.Context, req *RegReq, rsp *RegRsp) (ret Result, err error) + Notify(tarsCtx context.Context, notify *Notify) (ret Result, err error) } // Dispatch is used to call the server side implement for the method defined in the tars file. withContext shows using context or not. @@ -720,12 +941,13 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * tars.Trace(traceData.GetTraceKey(trace.EstSR), trace.TraceAnnotationSR, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Reg", 0, traceParam, "") } + var funRet Result if !withContext { imp := val.(DemoObjServant) - err = imp.Reg(&req, &rsp) + funRet, err = imp.Reg(&req, &rsp) } else { imp := val.(DemoObjServantWithContext) - err = imp.Reg(tarsCtx, &req, &rsp) + funRet, err = imp.Reg(tarsCtx, &req, &rsp) } if err != nil { @@ -735,6 +957,11 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * if tarsReq.IVersion == basef.TARSVERSION { buf.Reset() + err = funRet.WriteBlock(buf, 0) + if err != nil { + return err + } + err = rsp.WriteBlock(buf, 2) if err != nil { return err @@ -743,6 +970,14 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * } else if tarsReq.IVersion == basef.TUPVERSION { rspTup := tup.NewUniAttribute() + err = funRet.WriteBlock(buf, 0) + if err != nil { + return err + } + + rspTup.PutBuffer("", buf.ToBytes()) + rspTup.PutBuffer("tars_ret", buf.ToBytes()) + buf.Reset() err = rsp.WriteBlock(buf, 0) if err != nil { @@ -758,6 +993,7 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * } } else if tarsReq.IVersion == basef.JSONVERSION { rspJson := map[string]interface{}{} + rspJson["tars_ret"] = funRet rspJson["rsp"] = rsp var rspByte []byte @@ -777,6 +1013,7 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * traceParamFlag := traceData.NeedTraceParam(trace.EstSS, uint(buf.Len())) if traceParamFlag == trace.EnpNormal { value := map[string]interface{}{} + value[""] = funRet value["rsp"] = rsp p, _ := json.Marshal(value) traceParam = string(p) @@ -786,6 +1023,132 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * tars.Trace(traceData.GetTraceKey(trace.EstSS), trace.TraceAnnotationSS, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Reg", 0, traceParam, "") } + case "Notify": + var notify Notify + + if tarsReq.IVersion == basef.TARSVERSION { + + err = notify.ReadBlock(readBuf, 1, true) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.TUPVERSION { + reqTup := tup.NewUniAttribute() + reqTup.Decode(readBuf) + + var tupBuffer []byte + + reqTup.GetBuffer("notify", &tupBuffer) + readBuf.Reset(tupBuffer) + err = notify.ReadBlock(readBuf, 0, true) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.JSONVERSION { + var jsonData map[string]interface{} + decoder := json.NewDecoder(bytes.NewReader(readBuf.ToBytes())) + decoder.UseNumber() + err = decoder.Decode(&jsonData) + if err != nil { + return fmt.Errorf("decode reqpacket failed, error: %+v", err) + } + { + jsonStr, _ := json.Marshal(jsonData["notify"]) + notify.ResetDefault() + if err = json.Unmarshal(jsonStr, ¬ify); err != nil { + return err + } + } + + } else { + err = fmt.Errorf("decode reqpacket fail, error version: %d", tarsReq.IVersion) + return err + } + + traceData, ok := current.GetTraceData(tarsCtx) + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstSR, uint(readBuf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value["notify"] = notify + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstSR), trace.TraceAnnotationSR, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Notify", 0, traceParam, "") + } + + var funRet Result + if !withContext { + imp := val.(DemoObjServant) + funRet, err = imp.Notify(¬ify) + } else { + imp := val.(DemoObjServantWithContext) + funRet, err = imp.Notify(tarsCtx, ¬ify) + } + + if err != nil { + return err + } + + if tarsReq.IVersion == basef.TARSVERSION { + buf.Reset() + + err = funRet.WriteBlock(buf, 0) + if err != nil { + return err + } + + } else if tarsReq.IVersion == basef.TUPVERSION { + rspTup := tup.NewUniAttribute() + + err = funRet.WriteBlock(buf, 0) + if err != nil { + return err + } + + rspTup.PutBuffer("", buf.ToBytes()) + rspTup.PutBuffer("tars_ret", buf.ToBytes()) + + buf.Reset() + err = rspTup.Encode(buf) + if err != nil { + return err + } + } else if tarsReq.IVersion == basef.JSONVERSION { + rspJson := map[string]interface{}{} + rspJson["tars_ret"] = funRet + + var rspByte []byte + if rspByte, err = json.Marshal(rspJson); err != nil { + return err + } + + buf.Reset() + err = buf.WriteSliceUint8(rspByte) + if err != nil { + return err + } + } + + if ok && traceData.TraceCall { + var traceParam string + traceParamFlag := traceData.NeedTraceParam(trace.EstSS, uint(buf.Len())) + if traceParamFlag == trace.EnpNormal { + value := map[string]interface{}{} + value[""] = funRet + p, _ := json.Marshal(value) + traceParam = string(p) + } else if traceParamFlag == trace.EnpOverMaxLen { + traceParam = "{\"trace_param_over_max_len\":true}" + } + tars.Trace(traceData.GetTraceKey(trace.EstSS), trace.TraceAnnotationSS, tars.GetClientConfig().ModuleName, tarsReq.SServantName, "Notify", 0, traceParam, "") + } + default: return fmt.Errorf("func mismatch") } @@ -820,8 +1183,10 @@ func (obj *DemoObj) Dispatch(tarsCtx context.Context, val interface{}, tarsReq * type DemoObjTarsCallback interface { Push_Callback(msg *string, opt ...map[string]string) Push_ExceptionCallback(err error) - Reg_Callback(rsp *RegRsp, opt ...map[string]string) + Reg_Callback(ret *Result, rsp *RegRsp, opt ...map[string]string) Reg_ExceptionCallback(err error) + Notify_Callback(ret *Result, opt ...map[string]string) + Notify_ExceptionCallback(err error) } // DemoObjPushCallback struct @@ -833,8 +1198,8 @@ func (cb *DemoObjPushCallback) Ondispatch(resp *requestf.ResponsePacket) { switch resp.SResultDesc { case "Push": err := func() error { - readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) var err error + readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) var msg = new(string) err = readBuf.ReadString(&(*msg), 1, true) @@ -855,8 +1220,14 @@ func (cb *DemoObjPushCallback) Ondispatch(resp *requestf.ResponsePacket) { } case "Reg": err := func() error { - readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) var err error + readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) + var ret = new(Result) + err = ret.ReadBlock(readBuf, 0, true) + if err != nil { + return err + } + var rsp = new(RegRsp) err = (*rsp).ReadBlock(readBuf, 2, true) @@ -865,16 +1236,37 @@ func (cb *DemoObjPushCallback) Ondispatch(resp *requestf.ResponsePacket) { } if resp.Context != nil { - cb.Cb.Reg_Callback(rsp, resp.Context) + cb.Cb.Reg_Callback(ret, rsp, resp.Context) return nil } else { - cb.Cb.Reg_Callback(rsp) + cb.Cb.Reg_Callback(ret, rsp) return nil } }() if err != nil { cb.Cb.Reg_ExceptionCallback(err) } + case "Notify": + err := func() error { + var err error + readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer)) + var ret = new(Result) + err = ret.ReadBlock(readBuf, 0, true) + if err != nil { + return err + } + + if resp.Context != nil { + cb.Cb.Notify_Callback(ret, resp.Context) + return nil + } else { + cb.Cb.Notify_Callback(ret) + return nil + } + }() + if err != nil { + cb.Cb.Notify_ExceptionCallback(err) + } } } func (obj *DemoObj) AsyncSendResponse_Push(ctx context.Context, msg *string, opt ...map[string]string) (err error) { @@ -884,6 +1276,7 @@ func (obj *DemoObj) AsyncSendResponse_Push(ctx context.Context, msg *string, opt return fmt.Errorf("connection not found") } buf := codec.NewBuffer() + err = buf.WriteString(*msg, 1) if err != nil { return err @@ -912,13 +1305,19 @@ func (obj *DemoObj) AsyncSendResponse_Push(ctx context.Context, msg *string, opt } return err } -func (obj *DemoObj) AsyncSendResponse_Reg(ctx context.Context, rsp *RegRsp, opt ...map[string]string) (err error) { +func (obj *DemoObj) AsyncSendResponse_Reg(ctx context.Context, ret *Result, rsp *RegRsp, opt ...map[string]string) (err error) { conn, udpAddr, ok := current.GetRawConn(ctx) if !ok { return fmt.Errorf("connection not found") } buf := codec.NewBuffer() + + err = ret.WriteBlock(buf, 0) + if err != nil { + return err + } + err = (*rsp).WriteBlock(buf, 2) if err != nil { return err @@ -947,3 +1346,39 @@ func (obj *DemoObj) AsyncSendResponse_Reg(ctx context.Context, rsp *RegRsp, opt } return err } +func (obj *DemoObj) AsyncSendResponse_Notify(ctx context.Context, ret *Result, opt ...map[string]string) (err error) { + + conn, udpAddr, ok := current.GetRawConn(ctx) + if !ok { + return fmt.Errorf("connection not found") + } + buf := codec.NewBuffer() + + err = ret.WriteBlock(buf, 0) + if err != nil { + return err + } + + resp := &requestf.ResponsePacket{ + SBuffer: tools.ByteToInt8(buf.ToBytes()), + } + resp.IVersion = basef.TARSVERSION + if resp.Status == nil { + resp.Status = make(map[string]string) + } + resp.Status["TARS_FUNC"] = "Notify" + resp.SResultDesc = "Notify" + if len(opt) > 0 { + if opt[0] != nil { + resp.Context = opt[0] + } + } + rspData := obj.rsp2Byte(resp) + if udpAddr != nil { + udpConn, _ := conn.(*net.UDPConn) + _, err = udpConn.WriteToUDP(rspData, udpAddr) + } else { + _, err = conn.Write(rspData) + } + return err +} diff --git a/examples/TarsPushServer/demo/demo.go b/examples/TarsPushServer/demo/demo.go index b036db1f..0a076ec2 100644 --- a/examples/TarsPushServer/demo/demo.go +++ b/examples/TarsPushServer/demo/demo.go @@ -13,6 +13,110 @@ import ( var _ = fmt.Errorf var _ = codec.FromInt8 +// Result struct implement +type Result struct { + Code int32 `json:"code"` + Msg string `json:"msg"` +} + +func (st *Result) ResetDefault() { +} + +// ReadFrom reads from readBuf and put into struct. +func (st *Result) ReadFrom(readBuf *codec.Reader) error { + var ( + err error + length int32 + have bool + ty byte + ) + st.ResetDefault() + + err = readBuf.ReadInt32(&st.Code, 0, false) + if err != nil { + return err + } + + err = readBuf.ReadString(&st.Msg, 1, false) + if err != nil { + return err + } + + _ = err + _ = length + _ = have + _ = ty + return nil +} + +// ReadBlock reads struct from the given tag , require or optional. +func (st *Result) ReadBlock(readBuf *codec.Reader, tag byte, require bool) error { + var ( + err error + have bool + ) + st.ResetDefault() + + have, err = readBuf.SkipTo(codec.StructBegin, tag, require) + if err != nil { + return err + } + if !have { + if require { + return fmt.Errorf("require Result, but not exist. tag %d", tag) + } + return nil + } + + err = st.ReadFrom(readBuf) + if err != nil { + return err + } + + err = readBuf.SkipToStructEnd() + if err != nil { + return err + } + _ = have + return nil +} + +// WriteTo encode struct to buffer +func (st *Result) WriteTo(buf *codec.Buffer) (err error) { + + err = buf.WriteInt32(st.Code, 0) + if err != nil { + return err + } + + err = buf.WriteString(st.Msg, 1) + if err != nil { + return err + } + + return err +} + +// WriteBlock encode struct +func (st *Result) WriteBlock(buf *codec.Buffer, tag byte) error { + var err error + err = buf.WriteHead(codec.StructBegin, tag) + if err != nil { + return err + } + + err = st.WriteTo(buf) + if err != nil { + return err + } + + err = buf.WriteHead(codec.StructEnd, 0) + if err != nil { + return err + } + return nil +} + // RegReq struct implement type RegReq struct { Msg string `json:"msg"` @@ -198,3 +302,96 @@ func (st *RegRsp) WriteBlock(buf *codec.Buffer, tag byte) error { } return nil } + +// Notify struct implement +type Notify struct { + Msg string `json:"msg"` +} + +func (st *Notify) ResetDefault() { +} + +// ReadFrom reads from readBuf and put into struct. +func (st *Notify) ReadFrom(readBuf *codec.Reader) error { + var ( + err error + length int32 + have bool + ty byte + ) + st.ResetDefault() + + err = readBuf.ReadString(&st.Msg, 0, false) + if err != nil { + return err + } + + _ = err + _ = length + _ = have + _ = ty + return nil +} + +// ReadBlock reads struct from the given tag , require or optional. +func (st *Notify) ReadBlock(readBuf *codec.Reader, tag byte, require bool) error { + var ( + err error + have bool + ) + st.ResetDefault() + + have, err = readBuf.SkipTo(codec.StructBegin, tag, require) + if err != nil { + return err + } + if !have { + if require { + return fmt.Errorf("require Notify, but not exist. tag %d", tag) + } + return nil + } + + err = st.ReadFrom(readBuf) + if err != nil { + return err + } + + err = readBuf.SkipToStructEnd() + if err != nil { + return err + } + _ = have + return nil +} + +// WriteTo encode struct to buffer +func (st *Notify) WriteTo(buf *codec.Buffer) (err error) { + + err = buf.WriteString(st.Msg, 0) + if err != nil { + return err + } + + return err +} + +// WriteBlock encode struct +func (st *Notify) WriteBlock(buf *codec.Buffer, tag byte) error { + var err error + err = buf.WriteHead(codec.StructBegin, tag) + if err != nil { + return err + } + + err = st.WriteTo(buf) + if err != nil { + return err + } + + err = buf.WriteHead(codec.StructEnd, 0) + if err != nil { + return err + } + return nil +} diff --git a/examples/TarsPushServer/server/Impl/DemoImp.go b/examples/TarsPushServer/server/Impl/DemoImp.go index 92ddd6dd..d1624312 100644 --- a/examples/TarsPushServer/server/Impl/DemoImp.go +++ b/examples/TarsPushServer/server/Impl/DemoImp.go @@ -13,22 +13,27 @@ var app = &demo.DemoObj{} type DemoImp struct { } +func (d DemoImp) Notify(tarsCtx context.Context, notify *demo.Notify) (ret demo.Result, err error) { + //TODO implement me + panic("implement me") +} + func GetApp() *demo.DemoObj { return app } -func (d DemoImp) Reg(ctx context.Context, req *demo.RegReq, rsp *demo.RegRsp) (err error) { +func (d DemoImp) Reg(tarsCtx context.Context, req *demo.RegReq, rsp *demo.RegRsp) (ret demo.Result, err error) { rsp.Msg = req.Msg go func() { for i := 0; i < 10; i++ { msg := fmt.Sprintf("push msg %d", i) context := make(map[string]string, 1) context["msg"] = "******" + strconv.Itoa(i) - uuid, _ := current.GetUUID(ctx) + uuid, _ := current.GetUUID(tarsCtx) context["uuid"] = uuid - GetApp().AsyncSendResponse_Push(ctx, &msg, context) + GetApp().AsyncSendResponse_Push(tarsCtx, &msg, context) } }() - return nil + return demo.Result{}, nil } func (d DemoImp) Push(ctx context.Context, msg *string) (err error) { diff --git a/tars/adapter.go b/tars/adapter.go index aa5f8e04..a0c7f028 100755 --- a/tars/adapter.go +++ b/tars/adapter.go @@ -264,14 +264,14 @@ func (c *AdapterProxy) autoKeepAlive() { } func (c *AdapterProxy) OnConnect(address string) { - if c.obj.onConnectCallback != nil { - c.obj.onConnectCallback(address) + if c.servantProxy.onConnectCallback != nil { + c.servantProxy.onConnectCallback(address) } } func (c *AdapterProxy) OnClose(address string) { - if c.obj.onCloseCallback != nil { - c.obj.onCloseCallback(address) + if c.servantProxy.onCloseCallback != nil { + c.servantProxy.onCloseCallback(address) } } diff --git a/tars/tools/tars2go/gen_go.go b/tars/tools/tars2go/gen_go.go index f4e89d87..9ee84427 100755 --- a/tars/tools/tars2go/gen_go.go +++ b/tars/tools/tars2go/gen_go.go @@ -358,6 +358,7 @@ import ( "unsafe" "net" "encoding/json" + "encoding/binary" `) if *gAddServant { gen.code.WriteString("\"" + gen.tarsPath + "\"\n") @@ -1955,10 +1956,21 @@ func (gen *GenGo) genTarsCallback(itf *InterfaceInfo) { c.WriteString("func (cb *" + itf.Name + "PushCallback) Ondispatch(resp *requestf.ResponsePacket) {" + "\n") c.WriteString("switch resp.SResultDesc {" + "\n") for _, v := range itf.Fun { + var hasOut bool + for _, v := range v.Args { + if v.IsOut { + hasOut = true + } + } + if !hasOut && !v.HasRet { + continue + } c.WriteString("case \"" + v.Name + "\":" + "\n") c.WriteString("err := func() error {" + "\n") + c.WriteString("var err error" + "\n") c.WriteString("readBuf := codec.NewReader(tools.Int8ToByte(resp.SBuffer))" + "\n") if v.HasRet { + c.WriteString(" var ret = new(" + gen.genType(v.RetType) + ")") dummy := &StructMember{} dummy.Type = v.RetType dummy.Key = "ret" @@ -1966,9 +1978,9 @@ func (gen *GenGo) genTarsCallback(itf *InterfaceInfo) { dummy.Require = true gen.genReadVar(dummy, "", false) } - c.WriteString("var err error" + "\n") for k, arg := range v.Args { if arg.IsOut { + hasOut = true if len(arg.Type.TypeSt) == 0 { c.WriteString("var " + arg.Name + "= new(" + gen.genType(arg.Type) + ")" + "\n") } else { @@ -1984,17 +1996,19 @@ func (gen *GenGo) genTarsCallback(itf *InterfaceInfo) { } c.WriteString(` if resp.Context != nil { cb.Cb.` + v.Name + `_Callback(`) - { - k := 0 - for _, arg := range v.Args { - if arg.IsOut { - if k == 0 { - c.WriteString(arg.Name) - } else { - c.WriteString(`, ` + arg.Name) - } - k++ + k := 0 + if v.HasRet { + c.WriteString("ret") + k++ + } + for _, arg := range v.Args { + if arg.IsOut { + if k == 0 { + c.WriteString(arg.Name) + } else { + c.WriteString(`, ` + arg.Name) } + k++ } } c.WriteString(", resp.Context)" + "\n") @@ -2003,6 +2017,10 @@ func (gen *GenGo) genTarsCallback(itf *InterfaceInfo) { c.WriteString(`cb.Cb.` + v.Name + `_Callback(`) { k := 0 + if v.HasRet { + c.WriteString("ret") + k++ + } for _, arg := range v.Args { if arg.IsOut { if k == 0 { @@ -2030,6 +2048,9 @@ func (gen *GenGo) genTarsCallback(itf *InterfaceInfo) { func (gen *GenGo) genIFPushCallback(name string, f *FunInfo) { c := &gen.code c.WriteString(f.Name + "_Callback(") + if f.HasRet { + c.WriteString("ret *" + gen.genType(f.RetType) + ", ") + } for _, v := range f.Args { gen.genArgsForPush(&v) } @@ -2045,7 +2066,20 @@ func (gen *GenGo) genIFPushExceptionCallback(name string, f *FunInfo) { func (gen *GenGo) genSendPushResponse(itf *InterfaceInfo) { c := &gen.code for _, fun := range itf.Fun { + var hasOut bool + for _, v := range fun.Args { + if v.IsOut { + hasOut = true + } + } + if !hasOut && !fun.HasRet { + continue + } + c.WriteString(`func (obj *` + itf.Name + `)AsyncSendResponse_` + fun.Name + `(ctx context.Context, `) + if fun.HasRet { + c.WriteString("ret *" + gen.genType(fun.RetType) + ", ") + } for _, arg := range fun.Args { gen.genArgsForPush(&arg) } @@ -2057,7 +2091,15 @@ func (gen *GenGo) genSendPushResponse(itf *InterfaceInfo) { return fmt.Errorf("connection not found") } `) - c.WriteString("buf := codec.NewBuffer()") + c.WriteString("buf := codec.NewBuffer()" + "\n") + if fun.HasRet { + dummy := &StructMember{} + dummy.Type = fun.RetType + dummy.Key = "ret" + dummy.Tag = 0 + dummy.Require = true + gen.genWriteVar(dummy, "", false) + } for k, v := range fun.Args { if !v.IsOut { continue @@ -2069,7 +2111,7 @@ func (gen *GenGo) genSendPushResponse(itf *InterfaceInfo) { if v.IsOut { dummy.Key = "(*" + dummy.Key + ")" } - gen.genWriteVar(dummy, "", fun.HasRet) + gen.genWriteVar(dummy, "", false) } c.WriteString(`resp := &requestf.ResponsePacket{ SBuffer: tools.ByteToInt8(buf.ToBytes()), From 9da4f52b73ab17411b5325cb655e5bdc54dbad1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 10:38:20 +0000 Subject: [PATCH 03/16] build(deps): bump golang.org/x/sys in /tars/tools/tarsgo Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.0.0-20211210111614-af8b64212486 to 0.1.0. - [Release notes](https://github.com/golang/sys/releases) - [Commits](https://github.com/golang/sys/commits/v0.1.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tars/tools/tarsgo/go.mod | 2 +- tars/tools/tarsgo/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tars/tools/tarsgo/go.mod b/tars/tools/tarsgo/go.mod index 59b0c62d..c529dfa3 100644 --- a/tars/tools/tarsgo/go.mod +++ b/tars/tools/tarsgo/go.mod @@ -8,5 +8,5 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/cobra v1.3.0 golang.org/x/mod v0.5.0 - golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect + golang.org/x/sys v0.1.0 // indirect ) diff --git a/tars/tools/tarsgo/go.sum b/tars/tools/tarsgo/go.sum index 912b6165..ed8483f3 100644 --- a/tars/tools/tarsgo/go.sum +++ b/tars/tools/tarsgo/go.sum @@ -540,8 +540,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= From e7522d08278637a30d14325a037b4e7a4dd650ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 5 Mar 2023 11:42:15 +0000 Subject: [PATCH 04/16] build(deps): bump golang.org/x/sys in /examples/GinHttpServer Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.0.0-20210806184541-e5e7981a1069 to 0.1.0. - [Release notes](https://github.com/golang/sys/releases) - [Commits](https://github.com/golang/sys/commits/v0.1.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/GinHttpServer/go.mod | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/GinHttpServer/go.mod b/examples/GinHttpServer/go.mod index f93875c2..180db429 100644 --- a/examples/GinHttpServer/go.mod +++ b/examples/GinHttpServer/go.mod @@ -21,9 +21,10 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.1 // indirect github.com/ugorji/go/codec v1.2.7 // indirect + go.uber.org/automaxprocs v1.5.1 // indirect golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect golang.org/x/net v0.0.0-20210917221730-978cfadd31cf // indirect - golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect + golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect From fad3437cf72e344599817974fa16dffa8a7b49aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 05:42:30 +0000 Subject: [PATCH 05/16] build(deps): bump golang.org/x/net in /examples/GinHttpServer Bumps [golang.org/x/net](https://github.com/golang/net) from 0.0.0-20210917221730-978cfadd31cf to 0.7.0. - [Release notes](https://github.com/golang/net/releases) - [Commits](https://github.com/golang/net/commits/v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/GinHttpServer/go.mod | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/GinHttpServer/go.mod b/examples/GinHttpServer/go.mod index 180db429..efccfe71 100644 --- a/examples/GinHttpServer/go.mod +++ b/examples/GinHttpServer/go.mod @@ -23,9 +23,9 @@ require ( github.com/ugorji/go/codec v1.2.7 // indirect go.uber.org/automaxprocs v1.5.1 // indirect golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect - golang.org/x/net v0.0.0-20210917221730-978cfadd31cf // indirect - golang.org/x/sys v0.1.0 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) From ec30f0ffed504cf4492cf4d3a436e2596679156d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Mar 2023 05:54:24 +0000 Subject: [PATCH 06/16] build(deps): bump golang.org/x/crypto in /examples/GinHttpServer Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20210920023735-84f357641f63 to 0.1.0. - [Release notes](https://github.com/golang/crypto/releases) - [Commits](https://github.com/golang/crypto/commits/v0.1.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/GinHttpServer/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/GinHttpServer/go.mod b/examples/GinHttpServer/go.mod index efccfe71..e838199e 100644 --- a/examples/GinHttpServer/go.mod +++ b/examples/GinHttpServer/go.mod @@ -22,7 +22,7 @@ require ( github.com/pelletier/go-toml/v2 v2.0.1 // indirect github.com/ugorji/go/codec v1.2.7 // indirect go.uber.org/automaxprocs v1.5.1 // indirect - golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect + golang.org/x/crypto v0.1.0 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect From 2aae5d4214938acd5bec8c484f063088bc0cfd98 Mon Sep 17 00:00:00 2001 From: lbbniu Date: Fri, 3 Mar 2023 16:14:23 +0800 Subject: [PATCH 07/16] pref(tars2go): gen_go.go optimize and remove invalid comment code --- tars/tools/tars2go/gen_go.go | 89 ++++++++++++------------------------ 1 file changed, 30 insertions(+), 59 deletions(-) diff --git a/tars/tools/tars2go/gen_go.go b/tars/tools/tars2go/gen_go.go index 9ee84427..7de4876a 100755 --- a/tars/tools/tars2go/gen_go.go +++ b/tars/tools/tars2go/gen_go.go @@ -746,20 +746,20 @@ func (gen *GenGo) genReadVector(mb *StructMember, prefix string, hasRet bool) { tag := strconv.Itoa(int(mb.Tag)) vc := strconv.Itoa(gen.vc) gen.vc++ - require := "false" if mb.Require { - require = "true" - } - if require == "false" { c.WriteString(` -have, ty, err = readBuf.SkipToNoCheck(` + tag + `,` + require + `) +_, ty, err = readBuf.SkipToNoCheck(` + tag + `, true) ` + errStr + ` -if have {`) +`) } else { c.WriteString(` -_, ty, err = readBuf.SkipToNoCheck(` + tag + `,` + require + `) +have, ty, err = readBuf.SkipToNoCheck(` + tag + `, false) ` + errStr + ` -`) +if have {`) + // 结束标记 + defer func() { + c.WriteString("}\n") + }() } c.WriteString(` @@ -790,10 +790,6 @@ if ty == codec.LIST { ` + errStr + ` } `) - - if require == "false" { - c.WriteString("}\n") - } } func (gen *GenGo) genReadArray(mb *StructMember, prefix string, hasRet bool) { @@ -804,21 +800,21 @@ func (gen *GenGo) genReadArray(mb *StructMember, prefix string, hasRet bool) { tag := strconv.Itoa(int(mb.Tag)) vc := strconv.Itoa(gen.vc) gen.vc++ - require := "false" - if mb.Require { - require = "true" - } - if require == "false" { + if mb.Require { c.WriteString(` -have, ty, err = readBuf.SkipToNoCheck(` + tag + `,` + require + `) +_, ty, err = readBuf.SkipToNoCheck(` + tag + `, true) ` + errStr + ` -if have {`) +`) } else { c.WriteString(` -_, ty, err = readBuf.SkipToNoCheck(` + tag + `,` + require + `) +have, ty, err = readBuf.SkipToNoCheck(` + tag + `, false) ` + errStr + ` -`) +if have {`) + // 结束标记 + defer func() { + c.WriteString("}\n") + }() } c.WriteString(` @@ -848,10 +844,6 @@ if ty == codec.LIST { ` + errStr + ` } `) - - if require == "false" { - c.WriteString("}\n") - } } func (gen *GenGo) genReadStruct(mb *StructMember, prefix string, hasRet bool) { @@ -873,21 +865,21 @@ func (gen *GenGo) genReadMap(mb *StructMember, prefix string, hasRet bool) { errStr := errString(hasRet) vc := strconv.Itoa(gen.vc) gen.vc++ - require := "false" - if mb.Require { - require = "true" - } - if require == "false" { + if mb.Require { c.WriteString(` -have, err = readBuf.SkipTo(codec.MAP, ` + tag + `, ` + require + `) +_, err = readBuf.SkipTo(codec.MAP, ` + tag + `, true) ` + errStr + ` -if have {`) +`) } else { c.WriteString(` -_, err = readBuf.SkipTo(codec.MAP, ` + tag + `, ` + require + `) +have, err = readBuf.SkipTo(codec.MAP, ` + tag + `, false) ` + errStr + ` -`) +if have {`) + // 结束标记 + defer func() { + c.WriteString("}\n") + }() } c.WriteString(` @@ -914,9 +906,6 @@ err = readBuf.ReadInt32(&length, 0, true) ` + prefix + mb.Key + `[k` + vc + `] = v` + vc + ` } `) - if require == "false" { - c.WriteString("}\n") - } } func (gen *GenGo) genReadVar(v *StructMember, prefix string, hasRet bool) { @@ -931,11 +920,11 @@ func (gen *GenGo) genReadVar(v *StructMember, prefix string, hasRet bool) { gen.genReadMap(v, prefix, hasRet) case tkName: if v.Type.CType == tkEnum { - tag := strconv.Itoa(int(v.Tag)) require := "false" if v.Require { require = "true" } + tag := strconv.Itoa(int(v.Tag)) c.WriteString(` err = readBuf.ReadInt32((*int32)(&` + prefix + v.Key + `),` + tag + `, ` + require + `) ` + errString(hasRet) + ` @@ -944,11 +933,11 @@ err = readBuf.ReadInt32((*int32)(&` + prefix + v.Key + `),` + tag + `, ` + requi gen.genReadStruct(v, prefix, hasRet) } default: - tag := strconv.Itoa(int(v.Tag)) require := "false" if v.Require { require = "true" } + tag := strconv.Itoa(int(v.Tag)) c.WriteString(` err = readBuf.Read` + upperFirstLetter(gen.genType(v.Type)) + `(&` + prefix + v.Key + `, ` + tag + `, ` + require + `) ` + errString(hasRet) + ` @@ -1608,7 +1597,7 @@ func (gen *GenGo) genSwitchCase(tname string, fun *FunInfo) { c.WriteString("if tarsReq.IVersion == basef.TARSVERSION {" + "\n") for k, v := range fun.Args { - //c.WriteString("var " + v.Name + " " + gen.genType(v.Type)) + if !v.IsOut { dummy := &StructMember{} dummy.Type = v.Type @@ -1617,11 +1606,7 @@ func (gen *GenGo) genSwitchCase(tname string, fun *FunInfo) { dummy.Require = true gen.genReadVar(dummy, "", false) } - //else { - // c.WriteString("\n") - //} } - //c.WriteString("}") c.WriteString(`} else if tarsReq.IVersion == basef.TUPVERSION { reqTup := tup.NewUniAttribute() @@ -1825,19 +1810,6 @@ if ok && traceData.TraceCall { } else if tarsReq.IVersion == basef.TUPVERSION { rspTup := tup.NewUniAttribute() `) - - // if fun.HasRet { - // c.WriteString(` - // buf.Reset() - // err = buf.WriteInt32(funRet, 0) - // if err != nil { - // return err - // } - // rspTup.PutBuffer("", buf.ToBytes()) - // rspTup.PutBuffer("tars_ret", buf.ToBytes()) - //`) - // } - if fun.HasRet { dummy := &StructMember{} dummy.Type = fun.RetType @@ -1874,10 +1846,9 @@ rspTup := tup.NewUniAttribute() return err } } else if tarsReq.IVersion == basef.JSONVERSION { - rspJson := map[string]interface{} {} + rspJson := map[string]interface{}{} `) if fun.HasRet { - //c.WriteString(`rspJson[""] = funRet` + "\n") c.WriteString(`rspJson["tars_ret"] = funRet` + "\n") } From 7b833bde426e60d81cb1c13c94ec22130ce10b27 Mon Sep 17 00:00:00 2001 From: lbbniu Date: Tue, 14 Mar 2023 13:45:25 +0800 Subject: [PATCH 08/16] perf(res): update tars protocol --- tars/protocol/res/adminf/AdminF.tars.go | 2 +- tars/protocol/res/basef/BaseF.go | 2 +- tars/protocol/res/configf/Config.tars.go | 2 +- tars/protocol/res/configf/ConfigF.go | 2 +- tars/protocol/res/endpointf/EndpointF.go | 2 +- tars/protocol/res/logf/Log.tars.go | 2 +- tars/protocol/res/logf/LogF.go | 2 +- tars/protocol/res/nodef/NodeF.go | 2 +- tars/protocol/res/nodef/ServerF.tars.go | 2 +- tars/protocol/res/notifyf/Notify.tars.go | 2 +- tars/protocol/res/notifyf/NotifyF.go | 2 +- tars/protocol/res/propertyf/PropertyF.go | 2 +- tars/protocol/res/propertyf/PropertyF.tars.go | 2 +- tars/protocol/res/queryf/QueryF.tars.go | 2 +- tars/protocol/res/requestf/RequestF.go | 2 +- tars/protocol/res/statf/StatF.go | 2 +- tars/protocol/res/statf/StatF.tars.go | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tars/protocol/res/adminf/AdminF.tars.go b/tars/protocol/res/adminf/AdminF.tars.go index 7d2d6c54..57164a40 100644 --- a/tars/protocol/res/adminf/AdminF.tars.go +++ b/tars/protocol/res/adminf/AdminF.tars.go @@ -1,5 +1,5 @@ // Package adminf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from AdminF.tars package adminf diff --git a/tars/protocol/res/basef/BaseF.go b/tars/protocol/res/basef/BaseF.go index 04fd4d1d..f8eef2d5 100644 --- a/tars/protocol/res/basef/BaseF.go +++ b/tars/protocol/res/basef/BaseF.go @@ -1,5 +1,5 @@ // Package basef comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from BaseF.tars package basef diff --git a/tars/protocol/res/configf/Config.tars.go b/tars/protocol/res/configf/Config.tars.go index 5fd7a512..4fcf25a4 100644 --- a/tars/protocol/res/configf/Config.tars.go +++ b/tars/protocol/res/configf/Config.tars.go @@ -1,5 +1,5 @@ // Package configf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from ConfigF.tars package configf diff --git a/tars/protocol/res/configf/ConfigF.go b/tars/protocol/res/configf/ConfigF.go index 6dc6f0c7..5b29a173 100644 --- a/tars/protocol/res/configf/ConfigF.go +++ b/tars/protocol/res/configf/ConfigF.go @@ -1,5 +1,5 @@ // Package configf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from ConfigF.tars package configf diff --git a/tars/protocol/res/endpointf/EndpointF.go b/tars/protocol/res/endpointf/EndpointF.go index 2d8dd876..21799dbf 100644 --- a/tars/protocol/res/endpointf/EndpointF.go +++ b/tars/protocol/res/endpointf/EndpointF.go @@ -1,5 +1,5 @@ // Package endpointf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from EndpointF.tars package endpointf diff --git a/tars/protocol/res/logf/Log.tars.go b/tars/protocol/res/logf/Log.tars.go index 27de24fb..ee986eb2 100644 --- a/tars/protocol/res/logf/Log.tars.go +++ b/tars/protocol/res/logf/Log.tars.go @@ -1,5 +1,5 @@ // Package logf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from LogF.tars package logf diff --git a/tars/protocol/res/logf/LogF.go b/tars/protocol/res/logf/LogF.go index 3d1b5d92..1b17e45c 100644 --- a/tars/protocol/res/logf/LogF.go +++ b/tars/protocol/res/logf/LogF.go @@ -1,5 +1,5 @@ // Package logf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from LogF.tars package logf diff --git a/tars/protocol/res/nodef/NodeF.go b/tars/protocol/res/nodef/NodeF.go index 3fc9c320..242e5524 100644 --- a/tars/protocol/res/nodef/NodeF.go +++ b/tars/protocol/res/nodef/NodeF.go @@ -1,5 +1,5 @@ // Package nodef comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from NodeF.tars package nodef diff --git a/tars/protocol/res/nodef/ServerF.tars.go b/tars/protocol/res/nodef/ServerF.tars.go index 30a342b8..ccc2b7a1 100644 --- a/tars/protocol/res/nodef/ServerF.tars.go +++ b/tars/protocol/res/nodef/ServerF.tars.go @@ -1,5 +1,5 @@ // Package nodef comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from NodeF.tars package nodef diff --git a/tars/protocol/res/notifyf/Notify.tars.go b/tars/protocol/res/notifyf/Notify.tars.go index c0d7c7c3..757bbc78 100644 --- a/tars/protocol/res/notifyf/Notify.tars.go +++ b/tars/protocol/res/notifyf/Notify.tars.go @@ -1,5 +1,5 @@ // Package notifyf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from NotifyF.tars package notifyf diff --git a/tars/protocol/res/notifyf/NotifyF.go b/tars/protocol/res/notifyf/NotifyF.go index 7a235576..946ff79e 100644 --- a/tars/protocol/res/notifyf/NotifyF.go +++ b/tars/protocol/res/notifyf/NotifyF.go @@ -1,5 +1,5 @@ // Package notifyf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from NotifyF.tars package notifyf diff --git a/tars/protocol/res/propertyf/PropertyF.go b/tars/protocol/res/propertyf/PropertyF.go index a19ccd38..f9d5c2b6 100644 --- a/tars/protocol/res/propertyf/PropertyF.go +++ b/tars/protocol/res/propertyf/PropertyF.go @@ -1,5 +1,5 @@ // Package propertyf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from PropertyF.tars package propertyf diff --git a/tars/protocol/res/propertyf/PropertyF.tars.go b/tars/protocol/res/propertyf/PropertyF.tars.go index 2a363221..390cc942 100644 --- a/tars/protocol/res/propertyf/PropertyF.tars.go +++ b/tars/protocol/res/propertyf/PropertyF.tars.go @@ -1,5 +1,5 @@ // Package propertyf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from PropertyF.tars package propertyf diff --git a/tars/protocol/res/queryf/QueryF.tars.go b/tars/protocol/res/queryf/QueryF.tars.go index 4069830a..ea82d7ea 100644 --- a/tars/protocol/res/queryf/QueryF.tars.go +++ b/tars/protocol/res/queryf/QueryF.tars.go @@ -1,5 +1,5 @@ // Package queryf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from QueryF.tars package queryf diff --git a/tars/protocol/res/requestf/RequestF.go b/tars/protocol/res/requestf/RequestF.go index 7886cf12..53295f71 100644 --- a/tars/protocol/res/requestf/RequestF.go +++ b/tars/protocol/res/requestf/RequestF.go @@ -1,5 +1,5 @@ // Package requestf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from RequestF.tars package requestf diff --git a/tars/protocol/res/statf/StatF.go b/tars/protocol/res/statf/StatF.go index c179ad89..1abd03ef 100644 --- a/tars/protocol/res/statf/StatF.go +++ b/tars/protocol/res/statf/StatF.go @@ -1,5 +1,5 @@ // Package statf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from StatF.tars package statf diff --git a/tars/protocol/res/statf/StatF.tars.go b/tars/protocol/res/statf/StatF.tars.go index 303204b0..c84f0cfe 100644 --- a/tars/protocol/res/statf/StatF.tars.go +++ b/tars/protocol/res/statf/StatF.tars.go @@ -1,5 +1,5 @@ // Package statf comment -// This file was generated by tars2go 1.1.7 +// This file was generated by tars2go 1.1.10 // Generated from StatF.tars package statf From 6606fb36e1a40455465afc8b82a4027922f13bd4 Mon Sep 17 00:00:00 2001 From: lbbniu Date: Tue, 14 Mar 2023 14:39:40 +0800 Subject: [PATCH 09/16] perf(zipkintracing): ZipkinClientFilter --- tars/plugin/zipkintracing/zipkintracing.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/tars/plugin/zipkintracing/zipkintracing.go b/tars/plugin/zipkintracing/zipkintracing.go index 4dbf1584..6fb49af6 100644 --- a/tars/plugin/zipkintracing/zipkintracing.go +++ b/tars/plugin/zipkintracing/zipkintracing.go @@ -192,26 +192,18 @@ func ZipkinClientFilter() tars.ClientFilter { cSpan.SetTag("tars.method", msg.Req.SFuncName) cSpan.SetTag("tars.protocol", "tars") cSpan.SetTag("tars.client.version", tars.Version) - if msg.Req.Status != nil { - err = tracer.Inject(cSpan.Context(), opentracing.TextMap, opentracing.TextMapCarrier(msg.Req.Status)) - if err != nil { - logger.Error("inject span to status error:", err) - } - } else { - s := make(map[string]string) - err = tracer.Inject(cSpan.Context(), opentracing.TextMap, opentracing.TextMapCarrier(s)) - if err != nil { - logger.Error("inject span to status error:", err) - } else { - msg.Req.Status = s - } + if msg.Req.Status == nil { + msg.Req.Status = make(map[string]string) + } + err = tracer.Inject(cSpan.Context(), opentracing.TextMap, opentracing.TextMapCarrier(msg.Req.Status)) + if err != nil { + logger.Error("inject span to status error:", err) } err = invoke(ctx, msg, timeout) if err != nil { ext.Error.Set(cSpan, true) cSpan.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) } - return err } } From 1e0c2ffe93637e19939e5c4613fb4c82ae4ff9dc Mon Sep 17 00:00:00 2001 From: lbbniu Date: Wed, 15 Mar 2023 10:54:37 +0800 Subject: [PATCH 10/16] style(zipkintracing): Code Readability Adjustments --- tars/plugin/zipkintracing/zipkintracing.go | 214 ++++++++++----------- 1 file changed, 102 insertions(+), 112 deletions(-) diff --git a/tars/plugin/zipkintracing/zipkintracing.go b/tars/plugin/zipkintracing/zipkintracing.go index 6fb49af6..5ed5d9bb 100644 --- a/tars/plugin/zipkintracing/zipkintracing.go +++ b/tars/plugin/zipkintracing/zipkintracing.go @@ -2,6 +2,7 @@ package zipkintracing import ( "context" + "fmt" "log" "net" "net/http" @@ -29,6 +30,7 @@ var tracerMap = map[string]opentracing.Tracer{} var isTrace = false // Init is used to init opentracing and zipkin +// Deprecated: v1.3.11 version removed func Init(zipkinHTTPEndpoint string, sameSpan bool, traceID128Bit bool, debug bool, hostPort, serviceName string) { // set up a span reporter @@ -56,10 +58,14 @@ func Init(zipkinHTTPEndpoint string, sameSpan bool, traceID128Bit bool, debug bo } // InitV2 is used to init opentracing and zipkin, all configs are loaded from server config +// /tars/application/server add the following config +// samplerate=0.5 +// sampleaddress=http://127.0.0.1:9411 +// sampletype=http +// sampleencoding=json func InitV2() { - serverConfig := tars.GetServerConfig() - isTrace = serverConfig.SampleRate > 0 - + cfg := tars.GetServerConfig() + isTrace = cfg.SampleRate > 0 if !isTrace { return } @@ -69,63 +75,58 @@ func InitV2() { serializer zipkinreporter.SpanSerializer err error ) - switch serverConfig.SampleEncoding { + switch cfg.SampleEncoding { case "json": serializer = zipkinreporter.JSONSerializer{} case "proto": serializer = zipkin_proto3.SpanSerializer{} default: - log.Fatalf("unsupported sample encoding: %s\n", serverConfig.SampleEncoding) + log.Fatalf("unsupported sample encoding: %s\n", cfg.SampleEncoding) } - switch serverConfig.SampleType { + switch cfg.SampleType { case "http": - url := strings.TrimRight(serverConfig.SampleAddress, "/") + "/api/v2/spans" + url := strings.TrimRight(cfg.SampleAddress, "/") + "/api/v2/spans" rpt = zipkinhttp.NewReporter(url, zipkinhttp.Serializer(serializer)) case "kafka": - rpt, err = zipkinkafka.NewReporter( - strings.Split(serverConfig.SampleAddress, ","), zipkinkafka.Serializer(serializer), - ) + brokers := strings.Split(cfg.SampleAddress, ",") + rpt, err = zipkinkafka.NewReporter(brokers, zipkinkafka.Serializer(serializer)) if err != nil { - log.Fatalf("unable to create tracer: %+v\n", err) + log.Fatalf("unable to create tracer: %v\n", err) } default: - log.Fatalf("unsupported sample type: %s\n", serverConfig.SampleType) + log.Fatalf("unsupported sample type: %s\n", cfg.SampleType) } - sampler, err := zipkin.NewCountingSampler(serverConfig.SampleRate) + sampler, err := zipkin.NewCountingSampler(cfg.SampleRate) if err != nil { - log.Fatalf("unable to create sampler: %+v\n", err) + log.Fatalf("unable to create sampler: %v\n", err) } - for _, config := range serverConfig.Adapters { - endpoint, err := zipkin.NewEndpoint( - config.Obj, config.Endpoint.Host+":"+strconv.FormatInt(int64(config.Endpoint.Port), 10), - ) - + for _, adapter := range cfg.Adapters { + endpoint, err := zipkin.NewEndpoint(adapter.Obj, fmt.Sprintf("%s:%d", adapter.Endpoint.Host, adapter.Endpoint.Port)) if err != nil { - log.Fatalf("unable to create local endpoint: %+v\n", err) + log.Fatalf("unable to create local endpoint: %v\n", err) } nativeTracer, err := zipkin.NewTracer(rpt, zipkin.WithLocalEndpoint(endpoint), zipkin.WithSampler(sampler)) if err != nil { - log.Fatalf("unable to create tracer: %+v\n", err) + log.Fatalf("unable to create tracer: %v\n", err) } // use zipkin-go-opentracing to wrap our tracer - tracer := zipkinot.Wrap(nativeTracer) - tracerMap[config.Obj] = tracer + tracerMap[adapter.Obj] = zipkinot.Wrap(nativeTracer) } // If the request is not called by any servant(such as job, queue, scheduler), use opentracing.GlobalTracer() - endpoint, err := zipkin.NewEndpoint(serverConfig.App+"."+serverConfig.Server, "") + endpoint, err := zipkin.NewEndpoint(fmt.Sprintf("%s.%s", cfg.App, cfg.Server), "") if err != nil { - log.Fatalf("unable to create local endpoint: %+v\n", err) + log.Fatalf("unable to create local endpoint: %v\n", err) } nativeTracer, err := zipkin.NewTracer(rpt, zipkin.WithLocalEndpoint(endpoint), zipkin.WithSampler(sampler)) if err != nil { - log.Fatalf("unable to create tracer: %+v\n", err) + log.Fatalf("unable to create tracer: %v\n", err) } opentracing.SetGlobalTracer(zipkinot.Wrap(nativeTracer)) @@ -162,9 +163,9 @@ func ZipkinClientFilter() tars.ClientFilter { return invoke(ctx, msg, timeout) } - var pCtx opentracing.SpanContext + var spanCtx opentracing.SpanContext if parent := opentracing.SpanFromContext(ctx); parent != nil { - pCtx = parent.Context() + spanCtx = parent.Context() } cfg := tars.GetServerConfig() @@ -179,30 +180,25 @@ func ZipkinClientFilter() tars.ClientFilter { tracer = opentracing.GlobalTracer() } - cSpan := tracer.StartSpan( - msg.Req.SFuncName, - opentracing.ChildOf(pCtx), - ext.SpanKindRPCClient, - ) - - defer cSpan.Finish() - cSpan.SetTag("client.ipv4", cfg.LocalIP) - cSpan.SetTag("client.port", port) - cSpan.SetTag("tars.interface", msg.Req.SServantName) - cSpan.SetTag("tars.method", msg.Req.SFuncName) - cSpan.SetTag("tars.protocol", "tars") - cSpan.SetTag("tars.client.version", tars.Version) + span := tracer.StartSpan(msg.Req.SFuncName, opentracing.ChildOf(spanCtx), ext.SpanKindRPCClient) + defer span.Finish() + span.SetTag("client.ipv4", cfg.LocalIP) + span.SetTag("client.port", port) + span.SetTag("tars.interface", msg.Req.SServantName) + span.SetTag("tars.method", msg.Req.SFuncName) + span.SetTag("tars.protocol", "tars") + span.SetTag("tars.client.version", tars.Version) if msg.Req.Status == nil { msg.Req.Status = make(map[string]string) } - err = tracer.Inject(cSpan.Context(), opentracing.TextMap, opentracing.TextMapCarrier(msg.Req.Status)) + err = tracer.Inject(span.Context(), opentracing.TextMap, opentracing.TextMapCarrier(msg.Req.Status)) if err != nil { logger.Error("inject span to status error:", err) } err = invoke(ctx, msg, timeout) if err != nil { - ext.Error.Set(cSpan, true) - cSpan.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) + ext.Error.Set(span, true) + span.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) } return err } @@ -210,8 +206,7 @@ func ZipkinClientFilter() tars.ClientFilter { // ZipkinServerFilter gets tars server filter for zipkin opentracing. func ZipkinServerFilter() tars.ServerFilter { - return func(ctx context.Context, d tars.Dispatch, f interface{}, - req *requestf.RequestPacket, resp *requestf.ResponsePacket, withContext bool) (err error) { + return func(ctx context.Context, d tars.Dispatch, f interface{}, req *requestf.RequestPacket, resp *requestf.ResponsePacket, withContext bool) (err error) { if !isTrace { return d(ctx, f, req, resp, withContext) } @@ -220,26 +215,26 @@ func ZipkinServerFilter() tars.ServerFilter { tracer = opentracing.GlobalTracer() } ctx = ContextWithServant(ctx, req.SServantName) - var serverSpan opentracing.Span - pCtx, err := tracer.Extract(opentracing.TextMap, opentracing.TextMapCarrier(req.Status)) + var span opentracing.Span + spanCtx, err := tracer.Extract(opentracing.TextMap, opentracing.TextMapCarrier(req.Status)) if err == nil { - serverSpan = tracer.StartSpan(req.SFuncName, ext.RPCServerOption(pCtx), ext.SpanKindRPCServer) + span = tracer.StartSpan(req.SFuncName, ext.RPCServerOption(spanCtx), ext.SpanKindRPCServer) } else { - serverSpan = tracer.StartSpan(req.SFuncName, ext.SpanKindRPCServer) + span = tracer.StartSpan(req.SFuncName, ext.SpanKindRPCServer) } - defer serverSpan.Finish() + defer span.Finish() cfg := tars.GetServerConfig() - serverSpan.SetTag("server.ipv4", cfg.LocalIP) - serverSpan.SetTag("server.port", strconv.Itoa(int(cfg.Adapters[req.SServantName+"Adapter"].Endpoint.Port))) + span.SetTag("server.ipv4", cfg.LocalIP) + span.SetTag("server.port", strconv.Itoa(int(cfg.Adapters[req.SServantName+"Adapter"].Endpoint.Port))) if cfg.Enableset { - serverSpan.SetTag("tars.set_division", cfg.Setdivision) + span.SetTag("tars.set_division", cfg.Setdivision) } - ctx = opentracing.ContextWithSpan(ctx, serverSpan) + ctx = opentracing.ContextWithSpan(ctx, span) err = d(ctx, f, req, resp, withContext) if err != nil { - ext.Error.Set(serverSpan, true) - serverSpan.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) + ext.Error.Set(span, true) + span.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) } return err } @@ -247,61 +242,56 @@ func ZipkinServerFilter() tars.ServerFilter { // ZipkinHttpMiddleware zipkin http server router middleware func ZipkinHttpMiddleware(next http.Handler) http.Handler { + cfg := tars.GetServerConfig() servantMap := make(map[string]string) - serverConfig := tars.GetServerConfig() - for _, adapterConfig := range serverConfig.Adapters { - servantMap[adapterConfig.Endpoint.Host+":"+strconv.FormatInt( - int64(adapterConfig.Endpoint.Port), 10, - )] = adapterConfig.Obj + for _, adapter := range cfg.Adapters { + servantMap[fmt.Sprintf("%s:%d", adapter.Endpoint.Host, adapter.Endpoint.Port)] = adapter.Obj } - return http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - addr, ok := r.Context().Value(http.LocalAddrContextKey).(net.Addr) - if !ok { - next.ServeHTTP(w, r) - return - } - - servant := servantMap[addr.String()] - tracer := GetTracer(servant) - if tracer == nil { - next.ServeHTTP(w, r) - return - } - - var serverSpan opentracing.Span - pCtx, err := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) - if err == nil { - serverSpan = tracer.StartSpan(r.URL.Path, ext.RPCServerOption(pCtx), ext.SpanKindRPCServer) - } else { - serverSpan = tracer.StartSpan(r.URL.Path, ext.SpanKindRPCServer) - } - - defer serverSpan.Finish() - cfg := tars.GetServerConfig() - ext.HTTPUrl.Set(serverSpan, r.RequestURI) - ext.HTTPMethod.Set(serverSpan, r.Method) - serverSpan.SetTag("server.ipv4", cfg.LocalIP) - serverSpan.SetTag("server.port", strconv.Itoa(int(cfg.Adapters[servant+"Adapter"].Endpoint.Port))) - if cfg.Enableset { - serverSpan.SetTag("tars.set_division", cfg.Setdivision) - } - ctx := opentracing.ContextWithSpan(r.Context(), serverSpan) - ctx = ContextWithServant(ctx, servant) - r = r.WithContext(ctx) - recorder := httptest.NewRecorder() - next.ServeHTTP(recorder, r) - for k, v := range recorder.Result().Header { - w.Header()[k] = v - } - w.WriteHeader(recorder.Code) - _, _ = w.Write(recorder.Body.Bytes()) - - ext.HTTPStatusCode.Set(serverSpan, uint16(recorder.Code)) - if err != nil { - ext.Error.Set(serverSpan, true) - serverSpan.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) - } - }, - ) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + addr, ok := r.Context().Value(http.LocalAddrContextKey).(net.Addr) + if !ok { + next.ServeHTTP(w, r) + return + } + + servant := servantMap[addr.String()] + tracer := GetTracer(servant) + if tracer == nil { + next.ServeHTTP(w, r) + return + } + + var span opentracing.Span + spanCtx, err := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) + if err == nil { + span = tracer.StartSpan(r.URL.Path, ext.RPCServerOption(spanCtx), ext.SpanKindRPCServer) + } else { + span = tracer.StartSpan(r.URL.Path, ext.SpanKindRPCServer) + } + + defer span.Finish() + ext.HTTPUrl.Set(span, r.RequestURI) + ext.HTTPMethod.Set(span, r.Method) + span.SetTag("server.ipv4", cfg.LocalIP) + span.SetTag("server.port", strconv.Itoa(int(cfg.Adapters[servant+"Adapter"].Endpoint.Port))) + if cfg.Enableset { + span.SetTag("tars.set_division", cfg.Setdivision) + } + ctx := opentracing.ContextWithSpan(r.Context(), span) + ctx = ContextWithServant(ctx, servant) + r = r.WithContext(ctx) + recorder := httptest.NewRecorder() + next.ServeHTTP(recorder, r) + for k, v := range recorder.Result().Header { + w.Header()[k] = v + } + w.WriteHeader(recorder.Code) + _, err = w.Write(recorder.Body.Bytes()) + + ext.HTTPStatusCode.Set(span, uint16(recorder.Code)) + if err != nil { + ext.Error.Set(span, true) + span.LogFields(oplog.String("event", "error"), oplog.String("message", err.Error())) + } + }) } From 6adadb53ecf08c99d720b9339dbc6cddcd68c64f Mon Sep 17 00:00:00 2001 From: lbbniu Date: Wed, 15 Mar 2023 16:04:52 +0800 Subject: [PATCH 11/16] update version v1.3.10 --- tars/setting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tars/setting.go b/tars/setting.go index dc38f74f..b8f71239 100755 --- a/tars/setting.go +++ b/tars/setting.go @@ -11,7 +11,7 @@ const ( // for now ,some option should update from remote config // Version is tars version - Version string = "1.3.9" + Version string = "1.3.10" // server From 172a286ca5816935e8070e0ea1eca4be7dbe76ce Mon Sep 17 00:00:00 2001 From: lbbniu Date: Tue, 14 Mar 2023 16:19:44 +0800 Subject: [PATCH 12/16] feat(opentelemetry): support opentelemetry traces --- .gitignore | 2 +- contrib/middleware/opentelemetry/go.mod | 36 +++ contrib/middleware/opentelemetry/go.sum | 305 ++++++++++++++++++ .../middleware/opentelemetry/opentelemetry.go | 208 ++++++++++++ examples/OpentelemetryServer/.gitignore | 1 + .../OpentelemetryServer/Opentelemetry.tars | 6 + .../OpentelemetryServer/OpentelemetryImp.go | 57 ++++ .../OpentelemetryServer.conf | 23 ++ .../OpentelemetryServer.go | 31 ++ examples/OpentelemetryServer/client/client.go | 54 ++++ .../debugtool/dumpstack.go | 21 ++ .../OpentelemetryServer/docker-compose.yaml | 38 +++ examples/OpentelemetryServer/go.mod | 16 + examples/OpentelemetryServer/makefile | 9 + .../otel-collector-config.yaml | 43 +++ examples/OpentelemetryServer/prometheus.yaml | 10 + examples/OpentelemetryServer/start.sh | 3 + examples/OpentelemetryServer/tracer/tracer.go | 92 ++++++ go.mod | 3 +- go.sum | 13 +- 20 files changed, 965 insertions(+), 6 deletions(-) create mode 100644 contrib/middleware/opentelemetry/go.mod create mode 100644 contrib/middleware/opentelemetry/go.sum create mode 100644 contrib/middleware/opentelemetry/opentelemetry.go create mode 100644 examples/OpentelemetryServer/.gitignore create mode 100644 examples/OpentelemetryServer/Opentelemetry.tars create mode 100644 examples/OpentelemetryServer/OpentelemetryImp.go create mode 100644 examples/OpentelemetryServer/OpentelemetryServer.conf create mode 100644 examples/OpentelemetryServer/OpentelemetryServer.go create mode 100644 examples/OpentelemetryServer/client/client.go create mode 100644 examples/OpentelemetryServer/debugtool/dumpstack.go create mode 100644 examples/OpentelemetryServer/docker-compose.yaml create mode 100644 examples/OpentelemetryServer/go.mod create mode 100644 examples/OpentelemetryServer/makefile create mode 100644 examples/OpentelemetryServer/otel-collector-config.yaml create mode 100644 examples/OpentelemetryServer/prometheus.yaml create mode 100755 examples/OpentelemetryServer/start.sh create mode 100644 examples/OpentelemetryServer/tracer/tracer.go diff --git a/.gitignore b/.gitignore index ac34c5dd..1e32c630 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ *.tar.gz *.tgz tars-protocol -*go.sum +examples/*/go.sum .DS_Store \ No newline at end of file diff --git a/contrib/middleware/opentelemetry/go.mod b/contrib/middleware/opentelemetry/go.mod new file mode 100644 index 00000000..4937d0f5 --- /dev/null +++ b/contrib/middleware/opentelemetry/go.mod @@ -0,0 +1,36 @@ +module github.com/TarsCloud/TarsGo/contrib/middleware/opentelemetry + +go 1.18 + +require ( + github.com/TarsCloud/TarsGo v1.3.9 + go.opentelemetry.io/otel v1.14.0 + go.opentelemetry.io/otel/metric v0.37.0 + go.opentelemetry.io/otel/trace v1.14.0 +) + +require ( + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.8.1 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.0 // indirect + github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-playground/validator/v10 v10.10.0 // indirect + github.com/goccy/go-json v0.9.7 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/leodido/go-urn v1.2.1 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.1 // indirect + github.com/ugorji/go/codec v1.2.7 // indirect + go.uber.org/automaxprocs v1.5.1 // indirect + golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect + golang.org/x/net v0.0.0-20210917221730-978cfadd31cf // indirect + golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/protobuf v1.28.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/contrib/middleware/opentelemetry/go.sum b/contrib/middleware/opentelemetry/go.sum new file mode 100644 index 00000000..d7f60560 --- /dev/null +++ b/contrib/middleware/opentelemetry/go.sum @@ -0,0 +1,305 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= +github.com/TarsCloud/TarsGo v1.3.9 h1:pjFPBfTx6ri5EVl266i5tq1pTEtUOFZpVLEZ9sCJnAE= +github.com/TarsCloud/TarsGo v1.3.9/go.mod h1:XQeXSuHUb1Butemy0RMqxFZbpvO40QnAIQkOmLJl93o= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.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/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +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/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= +go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel/metric v0.37.0 h1:pHDQuLQOZwYD+Km0eb657A25NaRzy0a+eLyKfDXedEs= +go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s= +go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= +go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= +go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8= +golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/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= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/contrib/middleware/opentelemetry/opentelemetry.go b/contrib/middleware/opentelemetry/opentelemetry.go new file mode 100644 index 00000000..2105ccab --- /dev/null +++ b/contrib/middleware/opentelemetry/opentelemetry.go @@ -0,0 +1,208 @@ +package opentelemetry + +import ( + "context" + "fmt" + "net" + "net/http" + "net/http/httptest" + "strings" + "time" + + "github.com/TarsCloud/TarsGo/tars" + "github.com/TarsCloud/TarsGo/tars/protocol/res/requestf" + "github.com/TarsCloud/TarsGo/tars/util/current" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/trace" +) + +const ( + instrumentationName = "github.com/TarsCloud/TarsGo/tars/middleware/opentelemetry" + TarsRpcRetKey = attribute.Key("tars.rpc.ret") +) + +type Opentelemetry struct { + Propagators propagation.TextMapPropagator + TracerProvider trace.TracerProvider + MeterProvider metric.MeterProvider +} + +type Option func(*Opentelemetry) + +func WithTracerProvider(tp trace.TracerProvider) Option { + return func(o *Opentelemetry) { + o.TracerProvider = tp + } +} + +func WithPropagators(p propagation.TextMapPropagator) Option { + return func(o *Opentelemetry) { + o.Propagators = p + } +} + +func New(opts ...Option) *Opentelemetry { + o := &Opentelemetry{ + TracerProvider: otel.GetTracerProvider(), + Propagators: otel.GetTextMapPropagator(), + } + for _, opt := range opts { + opt(o) + } + return o +} + +func (o *Opentelemetry) BuildServerFilter() tars.ServerFilterMiddleware { + localIp := getOutboundIP() + tracer := o.TracerProvider.Tracer(instrumentationName) + return func(next tars.ServerFilter) tars.ServerFilter { + return func(ctx context.Context, d tars.Dispatch, f interface{}, req *requestf.RequestPacket, resp *requestf.ResponsePacket, withContext bool) (err error) { + ip, _ := current.GetClientIPFromContext(ctx) + port, _ := current.GetClientPortFromContext(ctx) + var span trace.Span + ctx = o.extract(ctx, req) + servants := strings.Split(req.SServantName, ".") + ctx, span = tracer.Start( + ctx, + fmt.Sprintf("%s.%s", servants[2], req.SFuncName), + trace.WithSpanKind(trace.SpanKindServer), + trace.WithAttributes( + attribute.String("tars.interface", req.SServantName), + attribute.String("tars.method", req.SFuncName), + attribute.String("tars.local_ip", localIp), + attribute.Int("tars.request_id", int(req.IRequestId)), + attribute.String("tars.client.ipv4", ip), + attribute.String("tars.client.port", port), + attribute.String("tars.server.version", tars.Version), + ), + ) + defer span.End() + cfg := tars.GetServerConfig() + if cfg.Enableset { + span.SetAttributes(attribute.String("tars.set_division", cfg.Setdivision)) + } + err = next(ctx, d, f, req, resp, withContext) + if err != nil { + span.SetStatus(codes.Error, "server failed") + span.RecordError(err) + span.SetAttributes(TarsRpcRetKey.Int64(int64(codes.Error))) + } else { + span.SetAttributes(TarsRpcRetKey.Int64(int64(resp.IRet))) + } + return err + } + } +} + +func (o *Opentelemetry) extract(ctx context.Context, req *requestf.RequestPacket) context.Context { + if req.Status == nil { + req.Status = make(map[string]string) + } + return o.Propagators.Extract(ctx, propagation.MapCarrier(req.Status)) +} + +func (o *Opentelemetry) BuildHttpHandler() func(next http.Handler) http.Handler { + tracer := o.TracerProvider.Tracer(instrumentationName) + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var span trace.Span + reqCtx := r.Context() + reqCtx = o.Propagators.Extract(reqCtx, propagation.HeaderCarrier(r.Header)) + reqCtx, span = tracer.Start( + reqCtx, + r.URL.Path, + trace.WithSpanKind(trace.SpanKindServer), + trace.WithAttributes( + attribute.String("http.method", r.Method), + attribute.String("http.url", r.URL.String()), + attribute.String("http.scheme", r.URL.Scheme), + attribute.String("http.proto", r.Proto), + attribute.String("peer.hostname", r.Host), + attribute.String("peer.address", r.RemoteAddr), + attribute.String("component", "web"), + ), + ) + defer span.End() + + r = r.WithContext(reqCtx) + recorder := httptest.NewRecorder() + next.ServeHTTP(recorder, r) + span.SetAttributes(attribute.Int("http.status", recorder.Code)) + for k, v := range recorder.Result().Header { + w.Header()[k] = v + } + w.WriteHeader(recorder.Code) + _, err := w.Write(recorder.Body.Bytes()) + if err != nil { + span.SetStatus(codes.Error, "http server write failed") + span.RecordError(err) + } + }) + } +} + +func (o *Opentelemetry) BuildClientFilter() tars.ClientFilterMiddleware { + localIp := getOutboundIP() + tracer := o.TracerProvider.Tracer(instrumentationName) + return func(next tars.ClientFilter) tars.ClientFilter { + return func(ctx context.Context, msg *tars.Message, invoke tars.Invoke, timeout time.Duration) (err error) { + var span trace.Span + servants := strings.Split(msg.Req.SServantName, ".") + ctx, span = tracer.Start( + ctx, + fmt.Sprintf("%s.%s", servants[2], msg.Req.SFuncName), + trace.WithSpanKind(trace.SpanKindClient), + trace.WithAttributes( + attribute.String("tars.interface", msg.Req.SServantName), + attribute.String("tars.method", msg.Req.SFuncName), + attribute.Int("tars.request_id", int(msg.Req.IRequestId)), + attribute.String("tars.local_ip", localIp), + attribute.String("tars.protocol", "tars"), + attribute.String("tars.client.version", tars.Version), + ), + ) + ctx = o.inject(ctx, msg) + defer func() { + ip, _ := current.GetServerIPFromContext(ctx) + port, _ := current.GetServerPortFromContext(ctx) + span.SetAttributes(attribute.String("tars.server.ipv4", ip)) + span.SetAttributes(attribute.String("tars.server.port", port)) + span.End() + }() + + err = next(ctx, msg, invoke, timeout) + if err != nil { + span.SetStatus(codes.Error, "client failed") + span.RecordError(err) + span.SetAttributes(TarsRpcRetKey.Int64(int64(codes.Error))) + } else { + span.SetAttributes(TarsRpcRetKey.Int64(int64(msg.Resp.IRet))) + } + return err + } + } +} + +func (o *Opentelemetry) inject(ctx context.Context, msg *tars.Message) context.Context { + if msg.Req.Status == nil { + msg.Req.Status = make(map[string]string) + } + o.Propagators.Inject(ctx, propagation.MapCarrier(msg.Req.Status)) + return ctx +} + +func getOutboundIP() string { + conn, err := net.Dial("udp", "8.8.8.8:80") + if err != nil { + return "" + } + defer conn.Close() + + localAddr := conn.LocalAddr().(*net.UDPAddr) + return localAddr.IP.String() +} diff --git a/examples/OpentelemetryServer/.gitignore b/examples/OpentelemetryServer/.gitignore new file mode 100644 index 00000000..81d509e7 --- /dev/null +++ b/examples/OpentelemetryServer/.gitignore @@ -0,0 +1 @@ +OpentelemetryServer diff --git a/examples/OpentelemetryServer/Opentelemetry.tars b/examples/OpentelemetryServer/Opentelemetry.tars new file mode 100644 index 00000000..9603f14d --- /dev/null +++ b/examples/OpentelemetryServer/Opentelemetry.tars @@ -0,0 +1,6 @@ +module StressTest{ + interface Opentelemetry { + int Add(int a,int b,out int c); // Some example function + int Sub(int a,int b,out int c); // Some example function + }; +}; diff --git a/examples/OpentelemetryServer/OpentelemetryImp.go b/examples/OpentelemetryServer/OpentelemetryImp.go new file mode 100644 index 00000000..97ea8258 --- /dev/null +++ b/examples/OpentelemetryServer/OpentelemetryImp.go @@ -0,0 +1,57 @@ +package main + +import ( + "context" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" + + "github.com/TarsCloud/TarsGo/tars" + "github.com/TarsCloud/TarsGo/tars/util/current" +) + +var name = "OpentelemetryImp" + +type OpentelemetryImp struct { +} + +func (imp *OpentelemetryImp) Add(ctx context.Context, a int32, b int32, c *int32) (int32, error) { + span := trace.SpanContextFromContext(ctx) + logger := tars.GetLogger("context") + data, err := span.MarshalJSON() + if err != nil { + logger.Errorf("MarshalJSON err:%v", err) + } + logger.Info("span", string(data)) + ip, ok := current.GetClientIPFromContext(ctx) + if !ok { + logger.Error("Error getting ip from context") + } + logger.Infof("Get Client Ip : %s from context", ip) + reqContext, ok := current.GetRequestContext(ctx) + if !ok { + logger.Error("Error getting reqcontext from context") + } + logger.Infof("Get context from context: %v", reqContext) + k := make(map[string]string) + k["resp"] = "respform context" + ok = current.SetResponseContext(ctx, k) + if !ok { + logger.Error("error setting respose context") + } + imp.Sub(ctx, a, b, c) + //Doing something in your function + //... + *c = a * b + return 0, nil +} + +func (imp *OpentelemetryImp) Sub(ctx context.Context, a int32, b int32, c *int32) (int32, error) { + _, span := otel.Tracer(name).Start(ctx, "Sub") + defer span.End() + span.SetAttributes(attribute.Int64("request.a", int64(a))) + span.SetAttributes(attribute.Int64("request.b", int64(b))) + //... + return 0, nil +} diff --git a/examples/OpentelemetryServer/OpentelemetryServer.conf b/examples/OpentelemetryServer/OpentelemetryServer.conf new file mode 100644 index 00000000..a7a86334 --- /dev/null +++ b/examples/OpentelemetryServer/OpentelemetryServer.conf @@ -0,0 +1,23 @@ + + + + app=StressTest + server=OpentelemetryServer + local=tcp -h 127.0.0.1 -p 10027 -t 30000 + logpath=/tmp + + allow + endpoint=tcp -h 127.0.0.1 -p 10028 -t 60000 + handlegroup=StressTest.OpentelemetryServer.OpenTelemetryObjAdapter + maxconns=200000 + protocol=tars + queuecap=10000 + queuetimeout=60000 + servant=StressTest.OpentelemetryServer.OpenTelemetryObj + shmcap=0 + shmkey=0 + threads=1 + + + + diff --git a/examples/OpentelemetryServer/OpentelemetryServer.go b/examples/OpentelemetryServer/OpentelemetryServer.go new file mode 100644 index 00000000..ff9080e7 --- /dev/null +++ b/examples/OpentelemetryServer/OpentelemetryServer.go @@ -0,0 +1,31 @@ +package main + +import ( + "context" + "fmt" + "log" + + "OpentelemetryServer/tars-protocol/StressTest" + "OpentelemetryServer/tracer" + + "github.com/TarsCloud/TarsGo/contrib/middleware/opentelemetry" + "github.com/TarsCloud/TarsGo/tars" +) + +func main() { + cfg := tars.GetServerConfig() + serviceNameKey := fmt.Sprintf("%s.%s", cfg.App, cfg.Server) + tp := tracer.NewTracerProvider(serviceNameKey, "") + defer func() { + if err := tp.Shutdown(context.Background()); err != nil { + log.Printf("Error shutting down tracer provider: %v", err) + } + }() + filter := opentelemetry.New() + tars.UseServerFilterMiddleware(filter.BuildServerFilter()) + tars.UseClientFilterMiddleware(filter.BuildClientFilter()) + imp := new(OpentelemetryImp) //New Imp + app := new(StressTest.ContextTest) //New init the A Tars + app.AddServantWithContext(imp, cfg.App+"."+cfg.Server+".OpenTelemetryObj") //Register Servant + tars.Run() +} diff --git a/examples/OpentelemetryServer/client/client.go b/examples/OpentelemetryServer/client/client.go new file mode 100644 index 00000000..6cf39f62 --- /dev/null +++ b/examples/OpentelemetryServer/client/client.go @@ -0,0 +1,54 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + "OpentelemetryServer/tars-protocol/StressTest" + "OpentelemetryServer/tracer" + + "github.com/TarsCloud/TarsGo/contrib/middleware/opentelemetry" + "github.com/TarsCloud/TarsGo/tars" + "github.com/TarsCloud/TarsGo/tars/util/current" +) + +func main() { + serviceNameKey := fmt.Sprintf("%s.%s", "StressTest", "OpentelemetryClient") + tp := tracer.NewTracerProvider(serviceNameKey, "") + defer func() { + if err := tp.Shutdown(context.Background()); err != nil { + log.Printf("Error shutting down tracer provider: %v", err) + } + }() + filter := opentelemetry.New() + tars.UseClientFilterMiddleware(filter.BuildClientFilter()) + comm := tars.GetCommunicator() + obj := fmt.Sprintf("StressTest.OpentelemetryServer.OpenTelemetryObj@tcp -h 127.0.0.1 -p 10028 -t 60000") + app := new(StressTest.ContextTest) + comm.StringToProxy(obj, app) + var out, i int32 + i = 11111 + ctx := current.ContextWithClientCurrent(context.Background()) + c := make(map[string]string) + c["a"] = "b" + for { + ret, err := app.AddWithContext(ctx, i, i*2, &out, c) + if err != nil { + fmt.Printf("error: %v", err) + return + } + fmt.Println(c) + fmt.Println(ret, out) + + ret, err = app.SubWithContext(ctx, i, i*2, &out, c) + if err != nil { + fmt.Printf("error: %v", err) + return + } + fmt.Println(c) + fmt.Println(ret, out) + time.Sleep(time.Second * 30) + } +} diff --git a/examples/OpentelemetryServer/debugtool/dumpstack.go b/examples/OpentelemetryServer/debugtool/dumpstack.go new file mode 100644 index 00000000..54c0f4c6 --- /dev/null +++ b/examples/OpentelemetryServer/debugtool/dumpstack.go @@ -0,0 +1,21 @@ +package main + +import ( + "fmt" + + "github.com/TarsCloud/TarsGo/tars" + "github.com/TarsCloud/TarsGo/tars/protocol/res/adminf" +) + +func main() { + comm := tars.GetCommunicator() + obj := fmt.Sprintf("StressTest.OpentelemetryServer.OpentelemetryObj@tcp -h 127.0.0.1 -p 10014 -t 60000") + app := new(adminf.AdminF) + comm.StringToProxy(obj, app) + ret, err := app.Notify("tars.dumpstack") + if err != nil { + fmt.Println(err) + return + } + fmt.Println(ret) +} diff --git a/examples/OpentelemetryServer/docker-compose.yaml b/examples/OpentelemetryServer/docker-compose.yaml new file mode 100644 index 00000000..1fc5fb2a --- /dev/null +++ b/examples/OpentelemetryServer/docker-compose.yaml @@ -0,0 +1,38 @@ +services: + # Jaeger + jaeger-all-in-one: + image: jaegertracing/all-in-one:latest + ports: + - "16686:16686" + - "14268:14268" + - "14250:14250" + + # Zipkin + zipkin-all-in-one: + image: openzipkin/zipkin:latest + ports: + - "19411:9411" + + prometheus: + image: prom/prometheus:latest + volumes: + - ./prometheus.yaml:/etc/prometheus/prometheus.yml + ports: + - "9090:9090" + + otel-collector: + image: otel/opentelemetry-collector:0.55.0 + command: [ "--config=/etc/otel-collector-config.yaml" ] + volumes: + - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml + ports: + - "1888:1888" # pprof 扩展端口 + - "8888:8888" # otel 暴露的 Prometheus 端口 + - "8889:8889" # Prometheus exporter 端口 + - "13133:13133" # 健康检查扩展 + - "4317:4317" # OTLP gRPC 接收器端口 + - "4318:4318" # OTLP http 接收器端口 + - "55679:55679" # zpages 扩展端口 + depends_on: + - jaeger-all-in-one + - zipkin-all-in-one \ No newline at end of file diff --git a/examples/OpentelemetryServer/go.mod b/examples/OpentelemetryServer/go.mod new file mode 100644 index 00000000..9394269e --- /dev/null +++ b/examples/OpentelemetryServer/go.mod @@ -0,0 +1,16 @@ +module OpentelemetryServer + +go 1.14 + +require ( + github.com/TarsCloud/TarsGo v1.3.10 + go.opentelemetry.io/otel v1.14.0 + go.opentelemetry.io/otel/exporters/jaeger v1.11.2 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 + go.opentelemetry.io/otel/exporters/zipkin v1.11.2 + go.opentelemetry.io/otel/sdk v1.14.0 + go.opentelemetry.io/otel/trace v1.14.0 +) + +replace github.com/TarsCloud/TarsGo => ../../ diff --git a/examples/OpentelemetryServer/makefile b/examples/OpentelemetryServer/makefile new file mode 100644 index 00000000..195bf895 --- /dev/null +++ b/examples/OpentelemetryServer/makefile @@ -0,0 +1,9 @@ +APP := StressTest +TARGET := OpentelemetryServer +MFLAGS := +DFLAGS := +CONFIG := client +STRIP_FLAG:= N +J2GO_FLAG:= + +-include ../../hack/scripts/makefile.tars.gomod \ No newline at end of file diff --git a/examples/OpentelemetryServer/otel-collector-config.yaml b/examples/OpentelemetryServer/otel-collector-config.yaml new file mode 100644 index 00000000..a336378a --- /dev/null +++ b/examples/OpentelemetryServer/otel-collector-config.yaml @@ -0,0 +1,43 @@ +receivers: + otlp: + protocols: + grpc: + +exporters: + prometheus: + endpoint: "0.0.0.0:8889" + const_labels: + label1: value1 + + logging: + + zipkin: + endpoint: "http://zipkin-all-in-one:19411/api/v2/spans" + format: proto + + jaeger: + endpoint: jaeger-all-in-one:14250 + tls: + insecure: true + +processors: + batch: + +extensions: + health_check: + pprof: + endpoint: :1888 + zpages: + endpoint: :55679 + +service: + extensions: [pprof, zpages, health_check] + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [logging, zipkin, jaeger] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [logging, prometheus] \ No newline at end of file diff --git a/examples/OpentelemetryServer/prometheus.yaml b/examples/OpentelemetryServer/prometheus.yaml new file mode 100644 index 00000000..2567cbd9 --- /dev/null +++ b/examples/OpentelemetryServer/prometheus.yaml @@ -0,0 +1,10 @@ +scrape_configs: + - job_name: 'otel-collector' + scrape_interval: 10s + static_configs: + - targets: ['otel-collector:8889'] + - targets: ['otel-collector:8888'] + - job_name: 'observability-example' + scrape_interval: 10s + static_configs: + - targets: [ 'host.docker.internal:18081' ] \ No newline at end of file diff --git a/examples/OpentelemetryServer/start.sh b/examples/OpentelemetryServer/start.sh new file mode 100755 index 00000000..a153de18 --- /dev/null +++ b/examples/OpentelemetryServer/start.sh @@ -0,0 +1,3 @@ +#!/bin/bash +make +./OpentelemetryServer --config=OpentelemetryServer.conf diff --git a/examples/OpentelemetryServer/tracer/tracer.go b/examples/OpentelemetryServer/tracer/tracer.go new file mode 100644 index 00000000..b0e67c8e --- /dev/null +++ b/examples/OpentelemetryServer/tracer/tracer.go @@ -0,0 +1,92 @@ +package tracer + +import ( + "context" + "log" + "os" + "sync" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/jaeger" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + "go.opentelemetry.io/otel/exporters/zipkin" + "go.opentelemetry.io/otel/propagation" + sdkresource "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" +) + +var resource *sdkresource.Resource +var initResourcesOnce sync.Once + +func initResource(serviceName string) *sdkresource.Resource { + initResourcesOnce.Do(func() { + extraResources, _ := sdkresource.New( + context.Background(), + sdkresource.WithOS(), + sdkresource.WithProcess(), + sdkresource.WithContainer(), + sdkresource.WithHost(), + sdkresource.WithFromEnv(), + sdkresource.WithAttributes(semconv.ServiceName(serviceName)), + ) + resource, _ = sdkresource.Merge( + sdkresource.Default(), + extraResources, + ) + }) + return resource +} + +func newOtlpExporter() (sdktrace.SpanExporter, error) { + ctx := context.Background() + return otlptracegrpc.New(ctx, otlptracegrpc.WithInsecure()) +} + +func newStdoutExporter() (sdktrace.SpanExporter, error) { + return stdouttrace.New( + // Use human-readable output. + stdouttrace.WithPrettyPrint(), + // Do not print timestamps for the demo. + stdouttrace.WithoutTimestamps(), + ) +} + +func newZipkinExporter(serviceNameKey string) (sdktrace.SpanExporter, error) { + url := "http://localhost:19411/api/v2/spans" + return zipkin.New(url, zipkin.WithLogger(log.New(os.Stderr, serviceNameKey, log.Ldate|log.Ltime|log.Llongfile))) +} + +func newJaegerExporter() (sdktrace.SpanExporter, error) { + url := "http://localhost:14268/api/traces" + return jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url))) +} + +func NewTracerProvider(serviceName, exporterTyp string) *sdktrace.TracerProvider { + var ( + exporter sdktrace.SpanExporter + err error + ) + switch exporterTyp { + case "stdout": + exporter, err = newStdoutExporter() + case "zipkin": + exporter, err = newZipkinExporter(serviceName) + case "jaeger": + exporter, err = newJaegerExporter() + default: // otlp + exporter, err = newOtlpExporter() + } + if err != nil { + log.Fatal(err) + } + tp := sdktrace.NewTracerProvider( + //sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(0.5))), // 控制采样 + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(initResource(serviceName)), + ) + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + return tp +} diff --git a/go.mod b/go.mod index 505b976a..0642cce8 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,11 @@ go 1.13 require ( github.com/gin-gonic/gin v1.8.1 + github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 github.com/opentracing/opentracing-go v1.1.0 github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5 github.com/openzipkin/zipkin-go v0.4.0 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.8.2 go.uber.org/automaxprocs v1.5.1 ) diff --git a/go.sum b/go.sum index 55a2a5e4..384b77fe 100644 --- a/go.sum +++ b/go.sum @@ -82,8 +82,9 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -178,14 +179,18 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= @@ -267,7 +272,6 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -314,7 +318,8 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 89a28f049e9d6e65ad1f1a27e28689d4c17301b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 09:48:14 +0000 Subject: [PATCH 13/16] build(deps): bump golang.org/x/crypto Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20210920023735-84f357641f63 to 0.1.0. - [Release notes](https://github.com/golang/crypto/releases) - [Commits](https://github.com/golang/crypto/commits/v0.1.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- contrib/middleware/opentelemetry/go.mod | 8 ++++---- contrib/middleware/opentelemetry/go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/contrib/middleware/opentelemetry/go.mod b/contrib/middleware/opentelemetry/go.mod index 4937d0f5..c5fa85c9 100644 --- a/contrib/middleware/opentelemetry/go.mod +++ b/contrib/middleware/opentelemetry/go.mod @@ -27,10 +27,10 @@ require ( github.com/pelletier/go-toml/v2 v2.0.1 // indirect github.com/ugorji/go/codec v1.2.7 // indirect go.uber.org/automaxprocs v1.5.1 // indirect - golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 // indirect - golang.org/x/net v0.0.0-20210917221730-978cfadd31cf // indirect - golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/crypto v0.1.0 // indirect + golang.org/x/net v0.1.0 // indirect + golang.org/x/sys v0.1.0 // indirect + golang.org/x/text v0.4.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/contrib/middleware/opentelemetry/go.sum b/contrib/middleware/opentelemetry/go.sum index d7f60560..fae8b40a 100644 --- a/contrib/middleware/opentelemetry/go.sum +++ b/contrib/middleware/opentelemetry/go.sum @@ -190,8 +190,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -211,8 +212,9 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -235,15 +237,17 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= From 8049db8491006e217b81da005090fe0c20d07bb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 09:55:29 +0000 Subject: [PATCH 14/16] build(deps): bump golang.org/x/net in /contrib/middleware/opentelemetry Bumps [golang.org/x/net](https://github.com/golang/net) from 0.0.0-20210917221730-978cfadd31cf to 0.7.0. - [Release notes](https://github.com/golang/net/releases) - [Commits](https://github.com/golang/net/commits/v0.7.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: indirect ... Signed-off-by: dependabot[bot] --- contrib/middleware/opentelemetry/go.mod | 6 +++--- contrib/middleware/opentelemetry/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/contrib/middleware/opentelemetry/go.mod b/contrib/middleware/opentelemetry/go.mod index c5fa85c9..81d9a2b1 100644 --- a/contrib/middleware/opentelemetry/go.mod +++ b/contrib/middleware/opentelemetry/go.mod @@ -28,9 +28,9 @@ require ( github.com/ugorji/go/codec v1.2.7 // indirect go.uber.org/automaxprocs v1.5.1 // indirect golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.1.0 // indirect - golang.org/x/sys v0.1.0 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/contrib/middleware/opentelemetry/go.sum b/contrib/middleware/opentelemetry/go.sum index fae8b40a..151c9be9 100644 --- a/contrib/middleware/opentelemetry/go.sum +++ b/contrib/middleware/opentelemetry/go.sum @@ -213,8 +213,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -238,16 +238,16 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= From 41ee9aea3cb4fa5cb0d942c4663aa988e8a96168 Mon Sep 17 00:00:00 2001 From: "chao.chen" Date: Sat, 15 Jun 2024 15:32:25 +0800 Subject: [PATCH 15/16] update .gitignore --- .gitignore | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1e32c630..b8388ebf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,16 @@ *.tgz tars-protocol examples/*/go.sum -.DS_Store \ No newline at end of file +.DS_Store +/build/go_build_main_go.exe +/examples/Tars2Go/base/demo1.go +/examples/Tars2Go/DemoV1/demo.go +/examples/Tars2Go/DemoV2/demo.go +/examples/Tars2Go/DemoV3/V3Test.tars.go +/examples/TarsPushServer/server/Base/DemoServer/TLOG.log +/examples/TarsPushServer/server/DemoServer.tarsdat +/examples/TarsPushServer/go.mod +/examples/trace/TarsTraceBackServer/go.sum +/examples/trace/TarsTraceFrontServer/go.sum +/examples/zipkin/ZipkinTraceClient/go.sum +/examples/zipkin/ZipkinTraceServer/go.sum From 297ce3ed5e9cfdeb8989552c91e545dfc0d9e65e Mon Sep 17 00:00:00 2001 From: "chao.chen" Date: Sat, 15 Jun 2024 15:35:26 +0800 Subject: [PATCH 16/16] update .gitignore --- examples/OpentelemetryServer/go.mod | 4 ++-- examples/trace/TarsTraceBackServer/go.sum | 2 ++ examples/trace/TarsTraceFrontServer/go.sum | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/OpentelemetryServer/go.mod b/examples/OpentelemetryServer/go.mod index f08418ae..0104882d 100644 --- a/examples/OpentelemetryServer/go.mod +++ b/examples/OpentelemetryServer/go.mod @@ -3,7 +3,7 @@ module OpentelemetryServer go 1.19 require ( - github.com/TarsCloud/TarsGo v1.3.10 + github.com/TarsCloud/TarsGo v1.4.4 github.com/TarsCloud/TarsGo/contrib/middleware/opentelemetry v0.0.0 github.com/prometheus/client_golang v1.14.0 go.opentelemetry.io/otel v1.15.0-rc.1 @@ -52,7 +52,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.14.0 // indirect go.opentelemetry.io/otel/metric v1.15.0-rc.1 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect - go.uber.org/automaxprocs v1.5.1 // indirect + go.uber.org/automaxprocs v1.5.2 // indirect golang.org/x/crypto v0.1.0 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/sys v0.5.0 // indirect diff --git a/examples/trace/TarsTraceBackServer/go.sum b/examples/trace/TarsTraceBackServer/go.sum index 06bfcefb..701cc061 100644 --- a/examples/trace/TarsTraceBackServer/go.sum +++ b/examples/trace/TarsTraceBackServer/go.sum @@ -164,6 +164,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= @@ -176,6 +177,7 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= diff --git a/examples/trace/TarsTraceFrontServer/go.sum b/examples/trace/TarsTraceFrontServer/go.sum index 06bfcefb..701cc061 100644 --- a/examples/trace/TarsTraceFrontServer/go.sum +++ b/examples/trace/TarsTraceFrontServer/go.sum @@ -164,6 +164,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= @@ -176,6 +177,7 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=