public void GivenAGRPCTransactionWithStatus(string responseCode)
        {
            var transaction = _agent.Tracer.StartTransaction("GRPCTransaction", "Test");

            transaction.Outcome = GrpcHelper.GrpcServerReturnCodeToOutcome(responseCode);
            _lastTransaction    = transaction;
        }
示例#2
0
        internal static void StopTransaction(Transaction transaction, HttpContext context, IApmLogger logger)
        {
            if (transaction == null)
            {
                return;
            }

            var grpcCallInfo = CollectGrpcInfo();

            try
            {
                if (!transaction.HasCustomName)
                {
                    //fixup Transaction.Name - e.g. /user/profile/1 -> /user/profile/{id}
                    var routeData = context.GetRouteData()?.Values;

                    if (routeData != null && context.Response.StatusCode != StatusCodes.Status404NotFound)
                    {
                        logger?.Trace()?.Log("Calculating transaction name based on route data");
                        var name = Transaction.GetNameFromRouteContext(routeData);

                        if (!string.IsNullOrWhiteSpace(name))
                        {
                            transaction.Name = $"{context.Request.Method} {name}";
                        }
                    }
                    else if (context.Response.StatusCode == StatusCodes.Status404NotFound)
                    {
                        logger?.Trace()
                                                        ?
                        .Log("No route data found or status code is 404 - setting transaction name to 'unknown route");
                        transaction.Name = $"{context.Request.Method} unknown route";
                    }
                }

                if (grpcCallInfo == default)
                {
                    transaction.Result = Transaction.StatusCodeToResult(GetProtocolName(context.Request.Protocol), context.Response.StatusCode);
                    SetOutcomeForHttpResult(transaction, context.Response.StatusCode);
                }
                else
                {
                    transaction.Name    = grpcCallInfo.methodname;
                    transaction.Result  = GrpcHelper.GrpcReturnCodeToString(grpcCallInfo.result);
                    transaction.Outcome = GrpcHelper.GrpcServerReturnCodeToOutcome(transaction.Result);
                }

                if (transaction.IsSampled)
                {
                    FillSampledTransactionContextResponse(context, transaction, logger);
                    FillSampledTransactionContextUser(context, transaction, logger);
                }
            }
            catch (Exception ex)
            {
                logger?.Error()?.LogException(ex, "Exception thrown while trying to stop transaction");
            }
            finally
            {
                transaction.End();
            }
        }