/// <summary> /// Method that gets called in the final clause that captures data for each http request /// from the request and response context. /// </summary> protected static void CSMCallAttemptMetricsCapture(IRequestContext requestContext, IResponseContext responseContext) { requestContext.CSMCallAttempt.Service = requestContext.CSMCallEvent.Service; requestContext.CSMCallAttempt.Fqdn = requestContext.Request.GetHeaderValue(HeaderKeys.HostHeader); requestContext.CSMCallAttempt.UserAgent = requestContext.Request.GetHeaderValue(HeaderKeys.UserAgentHeader); requestContext.CSMCallAttempt.SessionToken = requestContext.Request.GetHeaderValue(HeaderKeys.XAmzSecurityTokenHeader); requestContext.CSMCallAttempt.Region = requestContext.Request.DeterminedSigningRegion; requestContext.CSMCallAttempt.Api = CSMUtilities. GetApiNameFromRequest(requestContext.Request.RequestName, requestContext.ServiceMetaData.OperationNameMapping, requestContext.CSMCallAttempt.Service); requestContext.CSMCallAttempt.AccessKey = requestContext.ImmutableCredentials.AccessKey; requestContext.CSMCallAttempt.AttemptLatency = AWSSDKUtils.ConvertTimeSpanToMilliseconds(requestContext .Metrics.StopEvent(Metric.CSMAttemptLatency) .ElapsedTime); if (responseContext.HttpResponse != null) { if ((int)responseContext.HttpResponse.StatusCode > 0) { requestContext.CSMCallAttempt.HttpStatusCode = (int)responseContext.HttpResponse.StatusCode; } requestContext.CSMCallAttempt.XAmznRequestId = responseContext.HttpResponse.GetHeaderValue(HeaderKeys.RequestIdHeader); requestContext.CSMCallAttempt.XAmzRequestId = responseContext.HttpResponse.GetHeaderValue(HeaderKeys.XAmzRequestIdHeader); requestContext.CSMCallAttempt.XAmzId2 = responseContext.HttpResponse.GetHeaderValue(HeaderKeys.XAmzId2Header); } }
/// <summary> /// Captures the overall execution time and logs final metrics. /// </summary> /// <param name="executionContext">The execution context which contains both the /// requests and response context.</param> public override void InvokeSync(IExecutionContext executionContext) { executionContext.RequestContext.Metrics.AddProperty(Metric.AsyncCall, false); try { executionContext.RequestContext.Metrics.StartEvent(Metric.ClientExecuteTime); base.InvokeSync(executionContext); } finally { var latency = AWSSDKUtils.ConvertTimeSpanToMilliseconds(executionContext.RequestContext.Metrics .StopEvent(Metric.ClientExecuteTime) .ElapsedTime); #if BCL || CORECLR // capture the latency for the entire SDK call if CSM is enabled if (executionContext.RequestContext.CSMEnabled) { executionContext.RequestContext.CSMCallEvent.Latency = latency; CSMUtilities.SerializetoJsonAndPostOverUDP(executionContext.RequestContext.CSMCallEvent); } #endif this.LogMetrics(executionContext); } }
/// <summary> /// Captures the overall execution time and logs final metrics. /// </summary> /// <typeparam name="T">The response type for the current request.</typeparam> /// <param name="executionContext"> /// The execution context, it contains the request and response context. /// </param> /// <returns>A task that represents the asynchronous operation.</returns> public override async System.Threading.Tasks.Task <T> InvokeAsync <T>(IExecutionContext executionContext) { executionContext.RequestContext.Metrics.AddProperty(Metric.AsyncCall, true); try { executionContext.RequestContext.Metrics.StartEvent(Metric.ClientExecuteTime); var response = await base.InvokeAsync <T>(executionContext).ConfigureAwait(false); return(response); } finally { var latency = AWSSDKUtils.ConvertTimeSpanToMilliseconds(executionContext.RequestContext.Metrics .StopEvent(Metric.ClientExecuteTime) .ElapsedTime); #if BCL || CORECLR // capture the latency for the entire SDK call if CSM is enabled if (executionContext.RequestContext.CSMEnabled) { executionContext.RequestContext.CSMCallEvent.Latency = latency; CSMUtilities.SerializetoJsonAndPostOverUDPAsync(executionContext.RequestContext.CSMCallEvent).ConfigureAwait(false); } #endif this.LogMetrics(executionContext); } }
/// <summary> /// Captures the overall execution time and logs final metrics. /// </summary> /// <param name="executionContext">The execution context, it contains the /// request and response context.</param> protected override void InvokeAsyncCallback(IAsyncExecutionContext executionContext) { var latency = AWSSDKUtils.ConvertTimeSpanToMilliseconds(executionContext.RequestContext.Metrics .StopEvent(Metric.ClientExecuteTime) .ElapsedTime); #if BCL // capture the latency for the entire SDK call if CSM is enabled if (executionContext.RequestContext.CSMEnabled) { executionContext.RequestContext.CSMCallEvent.Latency = latency; CSMUtilities.BeginSerializetoJsonAndPostOverUDP(executionContext.RequestContext.CSMCallEvent); } #endif this.LogMetrics(ExecutionContext.CreateFromAsyncContext(executionContext)); base.InvokeAsyncCallback(executionContext); }