// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 package internal // import "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal" import ( "strings" "go.opentelemetry.io/otel/attribute" semconv "go.opentelemetry.io/otel/semconv/v1.17.0" ) // ParseFullMethod returns a span name following the OpenTelemetry semantic // conventions as well as all applicable span attribute.KeyValue attributes based // on a gRPC's FullMethod. // // Parsing is consistent with grpc-go implementation: // https://github.com/grpc/grpc-go/blob/v1.57.0/internal/grpcutil/method.go#L26-L39 func ParseFullMethod(fullMethod string) (string, []attribute.KeyValue) { if !strings.HasPrefix(fullMethod, "/") { // Invalid format, does not follow `/package.service/method`. return fullMethod, nil } name := fullMethod[1:] pos := strings.LastIndex(name, "/") if pos < 0 { // Invalid format, does not follow `/package.service/method`. return name, nil } service, method := name[:pos], name[pos+1:] var attrs []attribute.KeyValue if service != "" { attrs = append(attrs, semconv.RPCService(service)) } if method != "" { attrs = append(attrs, semconv.RPCMethod(method)) } return name, attrs }