如何在Azure App Insights中为页面视图事件提供自定义名称?

时间:2018-12-14 11:31:33

标签: azure azure-application-insights

默认情况下,App Insights使用页面标题作为事件名称。具有动态页面名称(例如“ Order 32424”)会创建大量的事件类型。

Documentation表示使用trackEvent方法,但没有示例。

appInsights.trackEvent("Edit button clicked", { "Source URL": "http://www.contoso.com/index" })

什么是最好的方法?拥有某种地图/过滤器将允许将某些页面的事件名称修改为共享名称,如“ Order 23424” =>“ Order”,同时保留大多数页面,这将是完美的。

3 个答案:

答案 0 :(得分:1)

您应该能够利用telemetry initializer方法将事件名称中的某些模式替换为该名称的“通用”版本。

这是Application Insights JS SDK GitHub上的示例,该示例说明如何在发送pageView数据之前对其进行修改。稍加修改,您就可以根据事件的外观使用它来更改事件名称:

window.appInsights = appInsights;
...
// Add telemetry initializer
appInsights.queue.push(function () {
    appInsights.context.addTelemetryInitializer(function (envelope) {
        var telemetryItem = envelope.data.baseData;

        // To check the telemetry item’s type:
        if (envelope.name === Microsoft.ApplicationInsights.Telemetry.PageView.envelopeType) {
            // this statement removes url from all page view documents
            telemetryItem.url = "URL CENSORED";
        }

        // To set custom properties:
        telemetryItem.properties = telemetryItem.properties || {};
        telemetryItem.properties["globalProperty"] = "boo";

        // To set custom metrics:
        telemetryItem.measurements = telemetryItem.measurements || {};
        telemetryItem.measurements["globalMetric"] = 100;
    });
});
// end

...
appInsights.trackPageView();
appInsights.trackEvent(...);

答案 1 :(得分:0)

Dmitry Matveev的帮助下,我提供了以下最终代码:

var appInsights = window.appInsights;

if (appInsights && appInsights.queue) {
    function adjustPageName(item) {
        var name = item.name.replace("AppName", "");

        if (name.indexOf("Order") !== -1)
            return "Order";

        if (name.indexOf("Product") !== -1)
            return "Shop";

        // And so on...

        return name;
    }

    // Add telemetry initializer
    appInsights.queue.push(function () {
        appInsights.context.addTelemetryInitializer(function (envelope) {
            var telemetryItem = envelope.data.baseData;

            // To check the telemetry item’s type:
            if (envelope.name === Microsoft.ApplicationInsights.Telemetry.PageView.envelopeType || envelope.name === Microsoft.ApplicationInsights.Telemetry.PageViewPerformance.envelopeType) {

                // Do not track admin pages
                if (telemetryItem.name.indexOf("Admin") !== -1)
                    return false;

                telemetryItem.name = adjustPageName(telemetryItem);
            }

        });
    });
}

为什么此代码很重要?由于App Insights默认使用页面标题作为PageView的名称,因此您将有成千上万种不同的事件,例如“ Order 123132”,这会使进一步的分析(渠道,流程,事件)变得毫无意义。

主要亮点:

  • var name = item.name.replace("AppName", "");如果您将应用程序/产品名称放在标题中,则可能要从事件名称中删除它,因为它只会在所有地方重复出现。
  • appInsights && appInsights.queue,您应该检查appInsights.queue,因为由于某些原因它无法定义,并且会导致错误。
  • if (telemetryItem.name.indexOf("Admin") !== -1) return false;返回false将导致根本不记录事件。您最可能不想跟踪某些事件/页面,例如网站的管理部分。
  • 有两种类型的事件,它们使用页面标题作为事件名称:PageView 和PageViewPerformance。修改它们都是有意义的。

答案 2 :(得分:0)

如果您使用模板来呈现/orders/12345页面,这是一种解决方法:

appInsights.trackPageView({name: TEMPLATE_NAME });

另一个选项,可能更适合带有react-router的SPA:

const Tracker = () => {
  let {pathname} = useLocation();
  pathname = pathname.replace(/([/]orders[/])([^/]+), "$1*");  // handle /orders/NN/whatever
  pathname = pathname.replace(/([/]foo[/]bar[/])([^/]+)(.*)/, "$1*");  // handle /foo/bar/NN/whatever
  useEffect(() => {
    appInsights.trackPageView({uri: pathname});
  }, [pathname]);
  return null;
}