应用洞察未记录自定义事件

10

我已在我的ASP.NET Core应用程序的C#控制器中设置了应用程序洞察功能,它正在记录基本数据,如页面浏览量、响应时间等。但我也想创建一些自定义事件并将其记录下来,但我无法在Azure门户中看到任何自定义事件。目前我正在使用免费版本的应用程序洞察功能。

这非常简单明了。

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

eventName是一个包含我想要跟踪的自定义事件的字符串,properties是一个字典,用于跟踪一些附加属性。

当我运行应用程序并多次点击这些代码行后,我可以转到Azure门户,在那里看到基本信息,但当我进行搜索时,它会显示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);
编辑:上述事件可以工作,但下面的事件不能工作,根本没有记录。它调用TelementryClient的TrackRequest和TrackEvent,但我根本看不到这些信息。
    Tracker?.TrackRequest("Drill Report", userName, stopwatch.Elapsed, 
        new Dictionary<string, string>
        {
            { "DrillBy", report.DrillBy == null ? "None" : report.DrillBy.FriendlyName }
        });

我有点收回之前的话。我看到了一些这样的事件,但是我连续记录了一堆事件,但我只看到了其中的2个而不是应该看到的6个?有什么想法吗?


我根本看不到它们。当我点击搜索时,显示自定义事件的方块显示为0,我完全找不到它们。至于精确的示例,请参见上面的代码。 - Paul Cavacas
当您调试应用程序时,是否看到类似于“Application Insights Telemetry: {something here|}”的行出现在调试输出窗口中?我想确保所有东西都能真正输出。或者,如果您使用Fiddler,您是否可以看到从您的应用程序发送到“dc.servies.visualstudio.com”的出站请求?它们是否成功?(200s?) - John Gardner
如果您的数据已成功传输并到达了预期的仪表板密钥,那么可能是后端延迟了。通常情况下,事件应该在几分钟内显示在门户中,但您可能需要检查http://aka.ms/aistatus以查看当前状态,以确保(我没有看到任何暗示后端落后的情况)。 - John Gardner
(另外:注意:您不应该需要自定义“发生”属性,事件时间是一个标准的事情,已经在所有事件上了)。您可能还想将用户名字段放入内置的telemetry.context.user.id字段中(请参见https://dev59.com/9V0a5IYBdhLWcg3wW3ca) - John Gardner
你使用的是哪个版本的ASP.NET Core SDK?我们在v1.0.0-rc1-update3及之前的版本中遇到了问题,其中“new TelemetryClient()”未初始化为活动配置。这在rc1-update4中得到了解决。 - Alex Bulankou
显示剩余4条评论
3个回答

11

Application Insights遥测客户端有一个内存缓冲区和一个刷新间隔(默认为1分钟,据我所记)用于将缓冲的遥测发送到AI终端。
在您的Track方法中,遥测客户端有一个本地成员,该成员在实际将数据刷新到AI终端之前被“垃圾回收”。因此,您有三个选项(建议按顺序使用第一个选项):

  1. 将遥测客户端存储为类的成员,这将免去每次Track执行时的初始化,并更重要的是 - 在保持ApplicationInsightsTracker不重新生成的情况下,将在刷新间隔内保存客户端。
  2. 在调用TrackEvent/TrackRequest/TrackX后刷新内存缓冲区,调用Flush API(appInsights.Flush())。
  3. 开发目的 - 您还可以启用Developer Mode ,以在每个遥测跟踪时自动刷新缓冲区。

我将 TelementryClient 移动到类级变量中,并在代码行中添加了 Flush,但没有任何改变。 - Paul Cavacas
天真的问题,但值得问一下:您是否确保使用应用程序的仪表板密钥更新了ApplicationInsights.config?您可能会收到页面视图遥测,因为js代码具有自己的ikey配置,并且没有使用ApplicationInsights.config文件。 - yonisha
在VS中,我点击了“添加应用程序洞察”来添加它,但它没有添加任何.config文件。它确实将以下内容放入了appsettings.json文件中。这是一个ASP.NET Core应用程序。 "ApplicationInsights": { "InstrumentationKey": "blah-blah" }, - Paul Cavacas

1

我曾经遇到过类似的问题。我正在创建一个类似于这样的遥测:

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();

0

我怀疑在构造TelemetryClient()对象时,某些重要的配置未被初始化。可能是像Telemetry Client对象中的“无仪表键”这样简单的问题,或者是从TelemetryConfiguration()对象中读取的更隐藏的问题。

您可能需要检查出站HTTP流量,以查找到dc.services.visualstudio.com的失败请求 - 错误可能会给出修复/初始化的线索。

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

AI WEB SDK和AI ASP.NET core SDK的代码位于GitHub上,因此您可以快速浏览代码,看看还有哪些问题可能会偏离轨道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接