func()

in pkg/rules/grpc/grpc_config.go [50:119]


func (c *grpcOtelConfig) handleRPC(ctx context.Context, rs stats.RPCStats, isServer bool) { // nolint: revive  // isServer is not a control flag.
	span := trace.SpanFromContext(ctx)
	if span == nil {
		return
	}
	var (
		messageId int64
	)
	gctx, _ := ctx.Value(gRPCContextKey{}).(*gRPCContext)
	switch rs := rs.(type) {
	case *stats.Begin:
	case *stats.InPayload:
		if c.ReceivedEvent {
			span.AddEvent("message",
				trace.WithAttributes(
					semconv.MessageTypeReceived,
					semconv.MessageIDKey.Int64(messageId),
					semconv.MessageUncompressedSizeKey.Int(rs.Length),
				),
			)
		}
	case *stats.OutPayload:
		if c.SentEvent {
			span.AddEvent("message",
				trace.WithAttributes(
					semconv.MessageTypeSent,
					semconv.MessageIDKey.Int64(messageId),
					//semconv.MessageCompressedSizeKey.Int(rs.CompressedLength),
					semconv.MessageUncompressedSizeKey.Int(rs.Length),
				),
			)
		}
	case *stats.OutTrailer:
	case *stats.End:
		if rs.Error != nil {
			s, _ := status.FromError(rs.Error)
			if isServer {
				grpcServerInstrument.End(ctx, grpcRequest{}, grpcResponse{
					statusCode: int(s.Code()),
				}, rs.Error)
			} else {
				grpcClientInstrument.End(ctx, grpcRequest{}, grpcResponse{
					statusCode: int(s.Code()),
				}, rs.Error)
			}

		} else {
			methodName := ""
			if gctx != nil {
				methodName = gctx.methodName
			}
			if isServer {
				grpcServerInstrument.End(ctx, grpcRequest{
					methodName: methodName,
				}, grpcResponse{
					statusCode: 200,
				}, nil)
			} else {
				grpcClientInstrument.End(ctx, grpcRequest{
					methodName: methodName,
				}, grpcResponse{
					statusCode: 200,
				}, nil)
			}

		}
	default:
		return
	}
}