你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Application Insights 使用分析

Web 或移动应用有哪些最热门的功能? 用户是否使用应用实现了其目标? 他们是否中途放弃应用,后来又回头使用了吗? Application Insights 可帮助你有效地深入分析人们如何使用你的应用。 每次更新应用时,都可以评估它在用户那里的运行状况。 了解这些信息后,你便可针对下一开发周期做出数据驱动的决策。

从应用发送遥测数据

通过在应用服务器代码和网页中安装 Application Insights 来获得最佳体验。 应用的客户端和服务器组件将遥测发送回 Azure 门户进行分析。

  1. 服务器代码:ASP.NETAzureJavaNode.js其他应用安装适当的模块。

  2. 网页代码:将以下脚本添加到网页中的结束标记 </head> 之前。 将检测密钥替换为 Application Insights 资源的相应值。

    当前代码片段为版本 5,并已在此处列出。 该版本在代码片段中编码为 sv:"#"。 GitHub 上也提供了当前版本

    <script type="text/javascript">
    !function(T,l,y){var S=T.location,k="script",D="instrumentationKey",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{
    src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js", // The SDK URL Source
    // name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
    // ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
    // useXhr: 1, // Use XHR instead of fetch to report failures (if available),
    crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
    // onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- as they won't get called)
    cfg: { // Application Insights Configuration
      instrumentationKey:"INSTRUMENTATION_KEY"
    }});
    </script>
    

    注意

    对检测密钥引入的支持将于 2025 年 3 月 31 日结束。 检测密钥引入功能将会继续工作,但我们将不再为该功能提供更新或支持。 转换为连接字符串,以利用新功能

    若要了解更多用于监视网站的高级配置,请查看 JavaScript SDK 参考一文。

  3. 移动应用代码:使用 App Center SDK 从应用收集事件。 然后通过遵循此指南将这些事件的副本发送到 Application Insights 进行分析。

  4. 获取遥测数据:在调试模式下运行项目几分钟。 然后在 Application Insights 的“概述”窗格中查看结果。

    发布应用以监视应用性能,并查看用户使用该应用在执行哪些操作。

浏览用户人口和统计信息

了解人们何时使用了你的应用以及他们最感兴趣的页面。 还可以了解用户所在的位置以及他们使用的浏览器和操作系统。

“用户”和“会话”报告按页面或自定义事件筛选数据。 报告按位置、环境和页面等属性对数据进行细分。 也可以添加自己的筛选器。

显示“用户”选项卡和条形图的屏幕截图。

右侧的见解指出了数据集中的相关模式。

  • “用户”报告统计所选时间段内访问页面的唯一用户数目。 对于 Web 应用,将使用 Cookie 统计用户。 如果某个用户使用不同的浏览器或客户端计算机访问你的站点或者清除其 Cookie,这些活动将被统计多次。
  • “会话”报告统计访问站点的用户会话数。 会话是一段时间的用户活动。 如果非活动时间超过半小时,则会终止会话。

有关用户、会话和事件工具的详细信息,请参阅在 Application Insights 中进行用户、会话和事件分析

保留:有多少个回头用户?

保留可帮助你根据特定时间桶内执行某个业务操作的用户队列,了解用户回头使用其应用的频率。 方法:

  • 了解哪些特定的功能导致某些用户比其他用户回来得更频繁。
  • 基于真实的用户数据构成假设。
  • 确定产品中是否存在保留问题。

“保留”工作簿的屏幕截图,其中显示了有关用户返回使用其应用的频率的信息。

可以使用顶部的保留控件来定义特定的事件和时间范围以计算保留率。 中间的图表根据指定的时间范围提供总体保留百分比的视觉表示形式。 底部的图表显示特定时间段内的各个保留。 这种详细程度可让你更细致地了解用户正在做什么,以及哪些因素可能会影响用户回头。

有关“保留”工作簿的详细信息,请参阅使用 Application Insights 进行 Web 应用程序的用户保留分析

自定义业务事件

要明确了解用户将应用用于什么目的,可以插入代码行来记录自定义事件。 这些事件可以跟踪任何活动,包括详细的用户操作(例如选择特定的按钮),以及更重要的业务活动(例如购买活动或游戏获胜)。

你还可以使用单击分析自动收集插件来收集自定义事件。

在某些情况下页面视图可呈现有用的事件,但一般情况下这些事件并不真实。 用户无需购买产品即可打开产品页面。

使用特定的业务事件可以绘制用户在站点中的进度图表。 可以了解用户对不同选项的偏好,以及他们在哪个位置放弃了应用或者遇到了问题。 了解这些信息后,可以针对开发积压工作的优先级做出明智的决策。

可以在应用的客户端记录事件:

      appInsights.trackEvent({name: "incrementCount"});

或者,可以从服务器端记录事件:

    var tc = new Microsoft.ApplicationInsights.TelemetryClient();
    tc.TrackEvent("CreatedAccount", new Dictionary<string,string> {"AccountType":account.Type}, null);
    ...
    tc.TrackEvent("AddedItemToCart", new Dictionary<string,string> {"Item":item.Name}, null);
    ...
    tc.TrackEvent("CompletedPurchase");

可将属性值附加到这些事件,以便在门户检查事件时可以筛选或拆分事件。 此外,还将一组标准属性(例如匿名用户 ID)附加到每个事件,以便你跟踪单个用户的活动序列。

详细了解自定义事件属性

分解事件

在“用户”、“会话”和“事件”工具中,可按用户、事件名称和属性分解自定义事件。

显示按 AnalyticsItemsOperation 筛选并按 AppID 拆分的“事件”选项卡的屏幕截图。

在应用中设计遥测

设计应用的每项功能时,请考虑如何衡量它在用户那里取得的成功。 决定需要记录哪些事件,并一开始就在应用中针对这些事件编写跟踪调用。

A | B 测试

如果你不知道哪个功能变体更有成效,请同时发布这两个变体,使不同的用户可以访问每个变体。 衡量每个变体的成效,然后移至统一版本。

对于此技术,可将不同的属性值附加到应用的每个版本所发送的所有遥测数据。 可以通过在活动的 TelemetryContext 中定义属性来执行该步骤。 这些默认属性将添加到应用程序发送的每个遥测消息。 这意味着这些属性将添加到自定义消息和标准遥测数据。

在 Application Insights 门户中根据属性值筛选和拆分数据,以便比较不同的版本。

若要执行此步骤,请设置遥测初始化表达式

ASP.NET 应用

    // Telemetry initializer class
    public class MyTelemetryInitializer : ITelemetryInitializer
    {
        // In this example, to differentiate versions, we use the value specified in the AssemblyInfo.cs
        // for ASP.NET apps, or in your project file (.csproj) for the ASP.NET Core apps. Make sure that
        // you set a different assembly version when you deploy your application for A/B testing.
        static readonly string _version = 
            System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
            
        public void Initialize(ITelemetry item)
        {
            item.Context.Component.Version = _version;
        }
    }

在 Global.asax.cs 等 Web 应用初始化表达式中:


    protected void Application_Start()
    {
        // ...
        TelemetryConfiguration.Active.TelemetryInitializers
            .Add(new MyTelemetryInitializer());
    }

ASP.NET Core 应用

注意

对于 ASP.NET Core 应用程序,无法使用 ApplicationInsights.configTelemetryConfiguration.Active 添加初始化表达式。

对于 ASP.NET Core 应用程序,添加新的遥测初始化表达式是通过将其添加到依赖项注入容器来完成的,如下所示。 此步骤在 Startup.cs 类的 ConfigureServices 方法中完成。

using Microsoft.ApplicationInsights.Extensibility;

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}

后续步骤