默认情况下,App Insights使用页面标题作为事件名称。具有动态页面名称(例如“ Order 32424”)会创建大量的事件类型。
Documentation表示使用trackEvent方法,但没有示例。
appInsights.trackEvent("Edit button clicked", { "Source URL": "http://www.contoso.com/index" })
什么是最好的方法?拥有某种地图/过滤器将允许将某些页面的事件名称修改为共享名称,如“ Order 23424” =>“ Order”,同时保留大多数页面,这将是完美的。
答案 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将导致根本不记录事件。您最可能不想跟踪某些事件/页面,例如网站的管理部分。答案 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;
}