除非调用Flush,否则TelemetryClient不会发送任何数据

时间:2015-06-18 01:05:07

标签: c# azure azure-application-insights

我在我的代码中直接使用TelemetryClient(v0.17.0.576),看起来我只能在最后手动调用Flush时将数据推送到Azure,这感觉不对。我在这里错过了什么吗?

var configuration = TelemetryConfiguration.CreateDefault();
configuration.InstrumentationKey = "KEY";
var client = new TelemetryClient(configuration);

for (int i = 0; i < 10; i++)
{
   log.Information("Loop: {0} {1}", i, value);

   client.Track(new TraceTelemetry(value));
}
client.Flush();

4 个答案:

答案 0 :(得分:9)

出于性能原因,Application Insights SDK批量遥测并以块的形式发送。要查看此操作,您可以通过调用Thread.Sleep(70000)替换您的Flush调用,一旦应用程序终止,您将看到上传到AI的工具。

答案 1 :(得分:1)

添加到Mario Hewardt的回答中。如果您使用persistence channel

TelemetryConfiguration.Active.TelemetryChannel = new PersistenceChannel();

Flush()是同步的(所以你不需要在一段时间内睡觉线程)。如果无法联系Application Insights,它还可以将遥测数据保存到本地文件,然后在下次通过良好连接调用Flush()时发送。

答案 2 :(得分:0)

Thread.sleep(30000)对我有用,但是在应用程序中冲洗不起作用。我想使用Flush()方法,因为我无法让应用程序休眠30秒钟。 Flush()方法与特定于版本有关还是我遗漏了其他东西?

我有控制台应用程序,该应用程序调用另一个控制台库,该控制台应用程序将进一步调用另一个具有遥测类的控制台库(即,控制台应用程序-> DLL-> DLL(具有遥测实现))。

答案 3 :(得分:0)

不需要刷新数据——除非应用程序在发送最后一个跟踪后直接结束。不幸的是,Flush 还不够,它不会阻塞(*)。所以建议同时进行冲洗和五秒钟的等待。

(*) https://github.com/microsoft/ApplicationInsights-dotnet/issues/407