github.com/lingyao2333/mo-zero@v1.4.1/core/trace/utils.go (about)

     1  package trace
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"strings"
     7  
     8  	"go.opentelemetry.io/otel/attribute"
     9  	semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
    10  	"google.golang.org/grpc/peer"
    11  )
    12  
    13  const localhost = "127.0.0.1"
    14  
    15  // PeerFromCtx returns the peer from ctx.
    16  func PeerFromCtx(ctx context.Context) string {
    17  	p, ok := peer.FromContext(ctx)
    18  	if !ok || p == nil {
    19  		return ""
    20  	}
    21  
    22  	return p.Addr.String()
    23  }
    24  
    25  // SpanInfo returns the span info.
    26  func SpanInfo(fullMethod, peerAddress string) (string, []attribute.KeyValue) {
    27  	attrs := []attribute.KeyValue{RPCSystemGRPC}
    28  	name, mAttrs := ParseFullMethod(fullMethod)
    29  	attrs = append(attrs, mAttrs...)
    30  	attrs = append(attrs, PeerAttr(peerAddress)...)
    31  	return name, attrs
    32  }
    33  
    34  // ParseFullMethod returns the method name and attributes.
    35  func ParseFullMethod(fullMethod string) (string, []attribute.KeyValue) {
    36  	name := strings.TrimLeft(fullMethod, "/")
    37  	parts := strings.SplitN(name, "/", 2)
    38  	if len(parts) != 2 {
    39  		// Invalid format, does not follow `/package.service/method`.
    40  		return name, []attribute.KeyValue(nil)
    41  	}
    42  
    43  	var attrs []attribute.KeyValue
    44  	if service := parts[0]; service != "" {
    45  		attrs = append(attrs, semconv.RPCServiceKey.String(service))
    46  	}
    47  	if method := parts[1]; method != "" {
    48  		attrs = append(attrs, semconv.RPCMethodKey.String(method))
    49  	}
    50  
    51  	return name, attrs
    52  }
    53  
    54  // PeerAttr returns the peer attributes.
    55  func PeerAttr(addr string) []attribute.KeyValue {
    56  	host, port, err := net.SplitHostPort(addr)
    57  	if err != nil {
    58  		return nil
    59  	}
    60  
    61  	if len(host) == 0 {
    62  		host = localhost
    63  	}
    64  
    65  	return []attribute.KeyValue{
    66  		semconv.NetPeerIPKey.String(host),
    67  		semconv.NetPeerPortKey.String(port),
    68  	}
    69  }