Application Insights未记录自定义事件

时间:2016-05-31 16:58:10

标签: c# asp.net azure azure-application-insights

我已经在C#Controller中的ASP.NET核心应用程序中设置了Application Insights,它正在记录基本数据,如页面视图,响应时间等。但我想创建一些自定义事件并记录这些事件,但我无法在Azure门户中显示任何自定义事件。目前我正在使用免费版的Application Insights。

非常直接

var appInsights = new TelemetryClient();
appInsights.TrackEvent(eventName, properties);

其中eventName是一个包含我想要跟踪的自定义事件的字符串,而属性是一个字典来跟踪一些其他属性。

在我运行应用程序并点击这些行后,我可以转到天蓝色的门户网站查看基本信息,但是当我进行搜索时,它会说有0个自定义事件并搜索任何一个按名称的自定义事件不会返回任何结果。

我有一个在下面有遥测内容的课程

public class ApplicationInsightsTracker : IApplicationTracker
{

    private readonly TelemetryClient AppInsights = new TelemetryClient();

    public void TrackEvent(string eventName, string userName, Dictionary<string, string> properties = null)
    {
        AppInsights.Context.User.AccountId = userName;
        TrackEvent(eventName, properties);
    }

    public void TrackRequest(string eventName, string userName, TimeSpan elapsed,
        Dictionary<string, string> properties = null)
    {
        AppInsights.Context.User.AccountId = userName;
        TrackEvent(eventName, properties);

        AppInsights.TrackRequest(eventName, DateTimeOffset.Now, elapsed, "200", true);
        AppInsights.Flush();
    }

    private void TrackEvent(string eventName, IDictionary<string, string> properties = null)
    {
        AppInsights.TrackEvent(eventName, properties);
        AppInsights.Flush();
    }

}

然后我使用它的一个简单例子是

        Tracker.TrackEvent("Visit HomePage", User.Identity.Name);

编辑:上面的事件正在运行,但下面的事件不是,它根本没有记录这个。这会调用TrackRequest以及TelementryClient上的TrackEvent,但我根本没有看到这些。

    Tracker?.TrackRequest("Drill Report", userName, stopwatch.Elapsed, 
        new Dictionary<string, string>
        {
            { "DrillBy", report.DrillBy == null ? "None" : report.DrillBy.FriendlyName }
        });

我有点想回来。我看到其中一些事件发生了,但是我把它们背靠背记录了一下,我只看到了6个我应该看到的中的2个?可能会发生什么想法?

3 个答案:

答案 0 :(得分:6)

Application Insights遥测客户端有一个内存缓冲区和一个刷新间隔(默认为1分钟,据我记得),用于将缓冲的遥测发送到AI端点。
您的Track方法有一个本地成员垃圾收集的遥测客户端&#39;在它实际将数据刷新到AI端点之前。因此,您有三个选项(首先推荐):

  1. 将遥测客户端存储为该类的成员,这将使每个Track执行时的初始化更加重要 - 更重要的是 - 将使客户端保持活动状态以进行刷新间隔(只要您不这样做)每次都重新生成ApplicationInsightsTracker。
  2. 调用后刷新内存缓冲区 TrackEvent / TrackRequest / TrackX,通过调用Flush API (appInsights.Flush())。
  3. 出于开发目的 - 您还可以启用Developer Mode以自动清除每个跟踪的遥测数据上的缓冲区。

答案 1 :(得分:0)

我怀疑在构建TelemetryClient()对象时未初始化某些基本配置。它可能很容易像遥测客户端对象中的“无检测密钥”,或者是从TelemetryConfiguration()对象读取的更隐藏的东西。

您可能希望检查传出的HTTP流量是否有对dc.services.visualstudio.com的失败请求 - 错误可能会提供修复/初始化内容的线索。

此外,您可以专门查看针对Asp.Net核心项目的getting started - 它可能包含您正在寻找的缺失部分。

AI WEB SDK和AI ASP.NET核心SDK的代码在GitHub上,因此您可以快速浏览代码,看看还有什么可以在这里偏离。

答案 2 :(得分:0)

我有类似的问题。我正在创建这样的遥测:

var tc = new Microsoft.ApplicationInsights.TelemetryClient(
                new TelemetryConfiguration({your intrumentation key})
                );
            tc.TrackEvent("CreatedAccount", new Dictionary<string, string> { { "AccountType", "My action" } }, null);
            tc.TrackEvent("AddedItemToCart", new Dictionary<string, string> { { "Item", "my item" } }, null);
            tc.TrackEvent("CompletedPurchase");

            tc.Flush();

只要将其更改为这样,它便开始工作,并且能够在应用程序见解中搜索customEvents时看到事件:

 var tc = new Microsoft.ApplicationInsights.TelemetryClient(
                new TelemetryConfiguration()
                { ConnectionString = "InstrumentationKey={your key}" }
                );
            tc.TrackEvent("CreatedAccount", new Dictionary<string, string> { { "AccountType", "My action" } }, null);
            tc.TrackEvent("AddedItemToCart", new Dictionary<string, string> { { "Item", "my item" } }, null);
            tc.TrackEvent("CompletedPurchase");

            tc.Flush();