TelemetryClient.Flush 没有被 Autofac 调用

TelemetryClient.Flush not being called with Autofac

我的 .NET Framework 4.7.2 控制台应用程序中有以下配置:

var containerBuilder = new ContainerBuilder();

containerBuilder.Register(CreateTelemetryClient).As<TelemetryClient>().OnRelease(HandleTelemetryClientDisposal);
private static void HandleTelemetryClientDisposal(TelemetryClient client)
        {
            client.Flush();
        }

private static TelemetryClient CreateTelemetryClient(IComponentContext context)
        {
            var instrumentationKey = ConfigurationManager.AppSettings["ApplicationInsights:InstrumentationKey"];
            var configuration = TelemetryConfiguration.CreateDefault();
            configuration.InstrumentationKey = instrumentationKey;
            var telemetryClient = new TelemetryClient(configuration);
            telemetryClient.Context.InstrumentationKey = instrumentationKey;
            var telemetryInitializer = context.Resolve<ITelemetryInitializer>();
            configuration.TelemetryInitializers.Add(telemetryInitializer);

            return telemetryClient;
        }

这为 Application Insights 日志记录正确配置了遥测客户端。但是,OnRelease(HandleTelemetryClientDisposal) 永远不会被调用,因此 client.Flush() 也不会被调用,我相信这就是为什么我的日志没有出现在 App Insights 中的原因。

为什么不调用它 - 我是否配置不正确?

编辑以显示更多代码:

class Program
    {
        public static void Main(string[] args)
        {
            var jobHostConfig = new JobHostConfiguration();
            IocConfig.Configure(jobHostConfig );
        }
    }
 public static void Configure(JobHostConfiguration jobHostConfiguratio)
        {
            var containerBuilder = new ContainerBuilder();

            RegisterDependencies(containerBuilder);

            jobHostConfiguration.JobActivator = new AutofacActivator(containerBuilder.Build());
        }
private static void RegisterDependencies(ContainerBuilder containerBuilder) 
{ 

   containerBuilder.Register(CreateTelemetryClient).As<TelemetryClient>().OnRelease(HandleTelemetryClientDisposal);
}

很难说清楚到底发生了什么,因为我不知道 JobHostConfigurationJobActivatorAutofacActivator 是什么,但是,我知道 Autofac。一些快速的谷歌搜索让我认为这与 Hangfire 有关,所以如果这不能回答你的问题......最好在问题中提及 Hangfire and/or 标记它 hangfire 因为它是将与 Hangfire 应用程序生命周期有关。

OnRelease 在释放生命周期范围时发生。 We have some docs on it, but that's the gist - it's like adding IDisposable to a class that isn't disposable. There's a lot of doc explaining how disposal relates to containers and scopes.

从实际的角度来看,这意味着如果没有在容器或生命周期范围内调用 Dispose,则不会调用 OnRelease

var builder = new ContainerBuilder();
builder.Register(CreateTelemetryClient)
  .As<TelemetryClient>()
  .OnRelease(HandleTelemetryClientDisposal);
var container = builder.Build();
using(var scope = container.BeginLifetimeScope())
{
  var client = scope.Resolve<TelemetryClient>();

  // When this closing brace is hit, the lifetime scope
  // will be disposed, and the OnRelease will be called.
}

您会注意到我展示了使用生命周期范围的示例。如果您直接从容器中解析,则必须处理该容器...然后您就不能再使用该容器了。

这就是我对 Hangfire 缺乏了解的原因。我不知道 什么时候 TelemetryClient正在解决,我不知道它在使用什么,我不知道它是来自 容器 还是来自 生命周期范围 ,并且我不知道 container/scope 什么时候被处理掉。这是您必须弄清楚的事情,但它看起来像 the Hangfire.Autofac README covers some of the examples.

不过,您描述的症状是 OnRelease 从未被调用,因此 Flush 从未被调用...表明事情没有得到妥善处理,所以这就是您要处理的地方需要开始寻找。当然,这是假设首先解决了它 - 如果没有解决它,那么就没有什么可以处理的,当然 OnRelease 也不会被调用。同样,您的代码中没有任何内容显示 consuming TelemetryClient,因此作为一个独立示例...不,您永远不会看到 OnRelease 被调用,因为有此处显示的代码中没有任何内容依赖于 TelemetryClient。客户不会仅仅通过注册就得到解决。有些东西必须消耗它。