in pkg/client/dubbo/dubbo.go [164:221]
func (dc *Client) Call(req *client.Request) (res any, err error) {
// if GET with no args, values would be nil
values, err := dc.genericArgs(req)
if err != nil {
return nil, err
}
target, ok := values.(*dubboTarget)
if !ok {
return nil, errors.New("map parameters failed")
}
dm := req.API.Method.IntegrationRequest
method := dm.Method
types := []string{}
vals := []hessian.Object{}
finalValues := []byte{}
if target != nil {
logger.Debugf("[dubbo-go-pixiu] dubbo invoke, method:%s, types:%s, reqData:%v", method, target.Types, target.Values)
types = target.Types
vals = make([]hessian.Object, len(target.Values))
for i, v := range target.Values {
vals[i] = v
}
var err error
finalValues, err = json.Marshal(vals)
if err != nil {
logger.Warnf("[dubbo-go-pixiu] reqData convert to string failed: %v", err)
}
} else {
logger.Debugf("[dubbo-go-pixiu] dubbo invoke, method:%s, types:%s, reqData:%v", method, nil, nil)
}
gs := dc.Get(dm)
tr := otel.Tracer(traceNameDubbogoClient)
ctx, span := tr.Start(req.Context, spanNameDubbogoClient)
trace.SpanFromContext(req.Context).SpanContext()
span.SetAttributes(attribute.Key(spanTagMethod).String(method))
span.SetAttributes(attribute.Key(spanTagType).StringSlice(types))
span.SetAttributes(attribute.Key(spanTagValues).String(string(finalValues)))
defer span.End()
// tracing inject manually;
carrier := propagation.MapCarrier{}
otel.GetTextMapPropagator().Inject(ctx, carrier)
ctxWithAttachment := context.WithValue(ctx, constant.AttachmentKey, map[string]string(carrier))
rst, err := gs.Invoke(ctxWithAttachment, method, types, vals)
if err != nil {
// TODO statusCode I don’t know what dubbo will return when it times out, so I will return it directly. I will judge it when I call it.
span.RecordError(err)
return nil, err
}
logger.Debugf("[dubbo-go-pixiu] dubbo client resp:%v", rst)
return rst, nil
}