【问题标题】:Application Insights Request Telemetry missing base pathApplication Insights 请求遥测缺少基本路径
【发布时间】:2020-08-02 22:45:42
【问题描述】:

我有一个 ASP.NET Core 2.1 WebApi 在反向代理(Azure 应用程序网关)后面的 Service Fabric 节点上运行。

网址如下:

Application Insights 照常添加。

        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 Fabric 的独立项目,PathBase 会按预期添加到 Request Telemetry。

【问题讨论】:

    标签: asp.net-core azure-service-fabric azure-application-insights


    【解决方案1】:

    根据docs,需要注册一个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 
            }
    

    (来自issue的灵感。)

    【讨论】:

    • 这是对我们遥测的宝贵补充。不幸的是,它不能解决基本路径问题。 PathBase: product/api 仍然从遥测日志中丢失。
    【解决方案2】:

    为了完整起见,这是我根据 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}");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多