Application Insights Request Телеметрия отсутствует базовый путь - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть ASP. NET Core 2.1 WebApi, работающий на узле Service Fabri c за обратным прокси-сервером (Azure Application Gateway).

URL-адреса выглядят следующим образом:

Информация о приложении добавляется как обычно.

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry();
                new ServiceInstanceListener(serviceContext => new HttpSysCommunicationListener(serviceContext, "ServerServiceEndpoint",
                    (url, listener) =>
                    {
                        var endpointConfig = serviceContext.CodePackageActivationContext.GetEndpoint("ServerServiceEndpoint");

                        return new WebHostBuilder()
                            .UseHttpSys()
                            .ConfigureServices(services => services.AddSingleton(serviceContext))
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                            .UseStartup<Startup>()
                            .UseUrls($"{url}{endpointConfig.PathSuffix}") // "/product/api"
                            .Build();
                    }))

Так что endpointConfig.PathSuffix не добавляется в запрос телеметрии. Что я могу сделать, чтобы это исправить? Я бы предпочел написать собственный инициализатор или процессор телеметрии.

Я попытался добавить эту строку в мой WebHostBuilder без каких-либо изменений в поведении:

                            .Configure(app => app.UsePathBase(endpointConfig.PathSuffix))

Редактировать: PathBase правильно идентифицируется ASP. NET Core, но отсутствует в запросе телеметрии. Если я настрою автономный проект без Service Fabri c, PathBase будет добавлен в Request Telemetry, как и ожидалось.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Согласно документам , вам необходимо зарегистрировать TelemetryInitializer и вызов UseApplicationInsights:

.UseKestrel()
    .ConfigureServices(
        services => services
            .AddSingleton<HttpClient>(new HttpClient())
            .AddSingleton<FabricClient>(new FabricClient())
            .AddSingleton<StatelessServiceContext>(serviceContext)
            .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
    .UseUrls(url)
    .Build();
    ...

Чтобы обойти проблему, вы можете создать пользовательский инициализатор телеметрии, например:

class RewriteUriInitializer : ITelemetryInitializer
{
    private const int SegmentsToSkip = 3;

    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        if (requestTelemetry != null)
        {
            //change requestTelemetry.Url and requestTelemetry.Name 
        }

(Вдохновение из этого выпуска .)

0 голосов
/ 28 апреля 2020

Ради полноты, это то, что я реализовал в качестве обходного пути на основе информации LoekD:

new ServiceInstanceListener(serviceContext => new HttpSysCommunicationListener(serviceContext, "ServerServiceEndpoint",
    (url, listener) =>
    {
        var endpointConfig = serviceContext.CodePackageActivationContext.GetEndpoint("ServerServiceEndpoint");

        return new WebHostBuilder()
            .UseHttpSys()
            .ConfigureServices(services => services
                .AddSingleton(serviceContext)
                .AddSingleton<ITelemetryInitializer>(c => new RewriteUriInitializer(endpointConfig.PathSuffix)))
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
            .UseStartup<Startup>()
            .UseUrls($"{url}{endpointConfig.PathSuffix}") // "/product/api"
            .Build();
    }))
class RewriteUriInitializer : ITelemetryInitializer
{
    private readonly string _EndpointConfigPathSuffix;

    public RewriteUriInitializer(string endpointConfigPathSuffix)
    {
        _EndpointConfigPathSuffix = endpointConfigPathSuffix;
    }

    public void Initialize(ITelemetry telemetry)
    {
        if (telemetry is RequestTelemetry requestTelemetry && requestTelemetry.Url != null)
        {
            // https://localhost:1234/controller/action => https://localhost:1234/product/api/controller/action
            requestTelemetry.Url = new Uri(
                new Uri(requestTelemetry.Url.AbsoluteUri.Substring(0,
                    requestTelemetry.Url.AbsoluteUri.IndexOf(requestTelemetry.Url.PathAndQuery, 
                       StringComparison.OrdinalIgnoreCase))),
                $"{_EndpointConfigPathSuffix}{requestTelemetry.Url.PathAndQuery}");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...