【问题标题】:Logging Request and response to Application Insight记录对 Application Insight 的请求和响应
【发布时间】:2022-03-21 16:57:29
【问题描述】:

我正在尝试将 API 请求负载和响应数据记录到 Azure Application Insight。使用跟踪我可以记录。但我想知道将请求和响应数据记录到应用程序洞察力的最佳方式是什么。因为数据量很大,所以 API 调用次数会更多。我不能只使用跟踪来跟踪数十万个请求和响应数据。我尝试了一些博客,例如使用 ITelemetryInitializer/ httpcontext.feature,get,但没有运气。

我想从 c# .Net 框架、Web API 而非 .NET Core 登录。

我尝试过的示例代码。

public class AzureRequestResponseInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        
        if (requestTelemetry != null && (HttpContext.Current.Request.HttpMethod == HttpMethod.Post.ToString() || HttpContext.Current.Request.HttpMethod == HttpMethod.Get.ToString()))
        {
            using (var reader = new StreamReader(HttpContext.Current.Request.InputStream))
            {
                string requestBody = reader.ReadToEnd();
                requestTelemetry.Properties.Add("body", requestBody);
            }
        } 

【问题讨论】:

  • 你可以参考这个article。如果您有任何更新,请告诉我。
  • 请注意,由于要记录大量数据,这可能会导致高成本。您确定要为每个请求记录此信息吗?您不妨使用生成的 id 将正文存储在 azure blob 存储中,并将该 id 存储为自定义属性,以便您可以将遥测与保存请求和响应正文的 blob 相关联

标签: azure-application-insights


【解决方案1】:
【解决方案2】:

您可以通过使用 Application Insight 的 TelemtryClient 实现 IHttpModule 来实现,请参见以下代码:

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Contoso.Services.Logging.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace Contoso.Services.Logging.Modules
{
    public class CaptureTrafficModule : IHttpModule
    {
        public TelemetryClient Telemetry { get; set; }
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
            context.EndRequest += new EventHandler(context_EndRequest);

            Telemetry = new TelemetryClient();
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;

            HttpResponse response = HttpContext.Current.Response;
            OutputFilterStream filter = new OutputFilterStream(response.Filter);
            response.Filter = filter;
            app.Context.Items["Filter"] = filter;


            StringBuilder request = new StringBuilder();
            // Write All The Headers too :
            //foreach (string key in app.Request.Headers.Keys)
            //{
            //    request.Append(key);
            //    request.Append(": ");
            //    request.Append(app.Request.Headers[key]);
            //    request.Append("\n");
            //}
            //request.Append("\n");

            byte[] bytes = app.Request.BinaryRead(app.Request.ContentLength);
            if (bytes.Count() > 0)
                request.Append(Encoding.ASCII.GetString(bytes));
            app.Request.InputStream.Position = 0;

            string operationName = $"{app.Request.HttpMethod} {app.Request.FilePath}";
            string activityId = System.Diagnostics.Activity.Current.RootId;
            app.Context.Items["OperationName"] = operationName;
            app.Context.Items["ActivityId"] = activityId;
            using (var logRequest = Telemetry.StartOperation<RequestTelemetry>(operationName, System.Diagnostics.Activity.Current.RootId, System.Diagnostics.Activity.Current.RootId))
            {
                try
                {
                    //logRequest.Telemetry.Id = $"10-{activityId}";
                    logRequest.Telemetry.Url = app.Request.Url;
                    logRequest.Telemetry.Properties["RequestBody"] = request.ToString();
                }
                catch (Exception ex)
                {
                    logRequest.Telemetry.Success = false;

                    Telemetry.TrackException(ex);
                    //throw;
                }
            }
        }

        void context_EndRequest(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            OutputFilterStream filter = null;
            string operationName = "", activityId = Guid.Empty.ToString(), responseStr = "NONE";

            if (app.Context.Items.Contains("OperationName"))
                operationName = app.Context.Items["OperationName"].ToString();

            if (app.Context.Items.Contains("ActivityId"))
                activityId = app.Context.Items["ActivityId"].ToString();

            if (app.Context.Items.Contains("Filter"))
            {
                filter = (OutputFilterStream)app.Context.Items["Filter"];
                responseStr = filter.ReadStream();
            }

            using (var logResponse = Telemetry.StartOperation<RequestTelemetry>(operationName, activityId, activityId))
            {
                try
                {
                    //logResponse.Telemetry.Id = $"20-{activityId}";
                    logResponse.Telemetry.Url = app.Request.Url;
                    logResponse.Telemetry.Properties["ResponseBody"] = responseStr.ToString();
                }
                catch (Exception ex)
                {
                    logResponse.Telemetry.Success = false;

                    Telemetry.TrackException(ex);
                    //throw;
                }
            }
        }



        public void Dispose()
        {
            //Does nothing
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2019-01-10
    • 2023-04-02
    • 2019-12-06
    • 2020-03-13
    • 2016-05-01
    相关资源
    最近更新 更多