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);
}
很难说清楚到底发生了什么,因为我不知道 JobHostConfiguration
、JobActivator
或 AutofacActivator
是什么,但是,我知道 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
。客户不会仅仅通过注册就得到解决。有些东西必须消耗它。
我的 .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);
}
很难说清楚到底发生了什么,因为我不知道 JobHostConfiguration
、JobActivator
或 AutofacActivator
是什么,但是,我知道 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
。客户不会仅仅通过注册就得到解决。有些东西必须消耗它。