Application Insights - добавление свойств из промежуточного программного обеспечения ядра .net - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь получить дополнительную информацию о взглядах на приложения из нашего приложения MVC .net core.Я нашел следующее сообщение: Добавление пользовательских свойств для каждого запроса в метриках Application Insights

В ответе они используют собственный инициализатор телеметрии, и это работает, если вам нужны какие-то данные запроса или что-то.

Теперь у нас есть набор промежуточного программного обеспечения в нашем приложении.Они переводят некоторые заголовки в читаемый контент.

Конечно, мы могли бы регистрировать заголовки и искать по всем различным значениям, которые они могут иметь.Но мы бы хотели получить результат промежуточного программного обеспечения для свойств понимания приложения.

Кто-нибудь знает, как использовать некоторые результаты промежуточного программного обеспечения в свойствах телеметрии запроса Application Insights?

1 Ответ

0 голосов
/ 20 октября 2018

Получил правильную идею от @svoychik.Промежуточное программное обеспечение добавляет выходные значения в HttpContext.Items.См. Пример:

using Microsoft.AspNetCore.Http;
using System.Text;
using System.Threading.Tasks;

namespace Test.API.Middleware
{
    public class ValueMiddleware
    {
        private readonly RequestDelegate next;

        public ApiKeyMiddleware(RequestDelegate next)
        {
            this.next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            if (!context.Items.ContainsKey("ApplicationData"))
            {
                httpContext.Items["ApplicationData"] = "Important Data";
            }
        }
    }
}

Затем, когда вам нужно получить все эти элементы для понимания приложения, вы можете просто использовать следующий инициализатор:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Http;

namespace Test.API.TelemetryInitializers : ITelemetryInitializer
{
    public class HttpContextItemsTelemetryInitializer
    {
        private readonly IHttpContextAccessor httpContextAccessor;
        public HttpContextItemsTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
        {
            this.httpContextAccessor = httpContextAccessor;
        }

        public void Initialize(ITelemetry telemetry)
        {
            var context = httpContextAccessor.HttpContext;
            if (context == null)
            {
                return;
            }

            foreach (var item in context.Items)
            {
                var itemKey = item.Key.ToString();

                // Remove some pollution that Microsoft and the systems adds to the HttpContext Items.
                if (itemKey.Contains("Microsoft") || itemKey.Contains("System"))
                {
                    continue;
                }

                if (!telemetry.Context.GlobalProperties.ContainsKey(itemKey))
                {
                    telemetry.Context.GlobalProperties.Add(itemKey, item.Value.ToString());
                }
            }
        }
    }
}

Установить инициализатор и понимание приложения вваш файл Startup.cs как в следующем примере:

using Test.API.TelemetryInitializers;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;

namespace Test.API
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddSingleton<ITelemetryInitializer, HttpContextItemsTelemetryInitializer>();
            services.AddApplicationInsightsTelemetry();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMiddleware<ValueMiddleware>();
            app.UseMvc();
        }
    }
}

Затем он просто добавляет все значения HttpContext.Items к пониманию вашего приложения.

...