// traceReq decides if we want to trigger a trace event (when sending a request) and if so deals with it func (c *client) traceReq(req *Request) { if req.shouldTrace() { trace.Send(&traceproto.Event{ Timestamp: proto.Int64(time.Now().UnixNano()), TraceId: proto.String(req.TraceID()), Type: traceproto.Event_REQ.Enum(), MessageId: proto.String(req.MessageID()), ParentMessageId: proto.String(req.ParentMessageID()), From: proto.String(req.From()), FromEndpoint: proto.String(req.FromEndpoint()), To: proto.String(fmt.Sprintf("%v.%v", req.Service(), req.Endpoint())), Hostname: proto.String(c.hostname), Az: proto.String(c.az), Payload: proto.String(""), // @todo PersistentTrace: proto.Bool(req.TraceShouldPersist()), }) } }
// traceAttemptTimeout decides if we want to trigger a trace event for an attempt timeout, and processes it func (c *client) traceAttemptTimeout(req *Request, attemptNum int, timeout time.Duration) { if req.shouldTrace() { desc := fmt.Sprintf("Attempt %v timeout talking to '%s.%s' after '%v' for '%s'", attemptNum, req.Service(), req.Endpoint(), timeout, req.MessageID()) trace.Send(&traceproto.Event{ Timestamp: proto.Int64(time.Now().UnixNano()), TraceId: proto.String(req.TraceID()), Type: traceproto.Event_ATTEMPT_TIMEOUT.Enum(), MessageId: proto.String(req.MessageID()), From: proto.String(req.From()), FromEndpoint: proto.String(req.FromEndpoint()), To: proto.String(fmt.Sprintf("%v.%v", req.Service(), req.Endpoint())), ParentMessageId: proto.String(req.ParentMessageID()), Hostname: proto.String(c.hostname), Az: proto.String(c.az), Payload: proto.String(""), // @todo ErrorCode: proto.String("com.hailocab.kernel.platform.attemptTimeout"), ErrorDescription: proto.String(desc), Duration: proto.Int64(int64(timeout)), PersistentTrace: proto.Bool(req.TraceShouldPersist()), }) } }
// traceRsp decides if we want to trigger a trace event (when processing response) and if so deals with it func (c *client) traceRsp(req *Request, rsp *Response, err errors.Error, d time.Duration) { if req.shouldTrace() { e := &traceproto.Event{ Timestamp: proto.Int64(time.Now().UnixNano()), TraceId: proto.String(req.TraceID()), Type: traceproto.Event_REP.Enum(), MessageId: proto.String(req.MessageID()), From: proto.String(req.From()), FromEndpoint: proto.String(req.FromEndpoint()), To: proto.String(fmt.Sprintf("%v.%v", req.Service(), req.Endpoint())), ParentMessageId: proto.String(req.ParentMessageID()), Hostname: proto.String(c.hostname), Az: proto.String(c.az), Payload: proto.String(""), // @todo Duration: proto.Int64(int64(d)), PersistentTrace: proto.Bool(req.TraceShouldPersist()), } if err != nil { e.ErrorCode = proto.String(err.Code()) e.ErrorDescription = proto.String(err.Description()) } trace.Send(e) } }
// traceOut traces a request outbound from a service handler func traceOut(req *Request, msg proto.Message, err perrors.Error, d time.Duration) { if req.shouldTrace() { e := &traceproto.Event{ Timestamp: proto.Int64(time.Now().UnixNano()), TraceId: proto.String(req.TraceID()), Type: traceproto.Event_OUT.Enum(), MessageId: proto.String(req.MessageID()), ParentMessageId: proto.String(req.ParentMessageID()), From: proto.String(req.From()), To: proto.String(fmt.Sprintf("%v.%v", req.Service(), req.Endpoint())), Hostname: proto.String(hostname), Az: proto.String(az), Payload: proto.String(""), // @todo HandlerInstanceId: proto.String(InstanceID), Duration: proto.Int64(int64(d)), PersistentTrace: proto.Bool(req.TraceShouldPersist()), } if err != nil { e.ErrorCode = proto.String(err.Code()) e.ErrorDescription = proto.String(err.Description()) } trace.Send(e) } }