Microsoft Azure Monitor Application Insights JavaScript SDK 配置

Azure 应用程序 Insights JavaScript SDK 提供用于跟踪、监视和调试 Web 应用程序的配置。

SDK 配置

这些配置字段是可选的,除非另有说明,否则默认为 false。 以下部分按目的对字段进行分组。

有关如何添加 SDK 配置的说明,请参阅添加 SDK 配置

Cookie 和会话存储

使用 disableCookiesUsage 可完全禁用 Cookie,使用 cookieCfg 可进行完整的基于实例的 Cookie 配置,使用 cookieDomaincookiePath 可将 Cookie 的作用范围限定在各子域或应用程序网关之间,使用 namePrefixsessionCookiePostfixuserCookiePostfix 可自定义 Cookie 和 localStorage 的名称。

配置字段 值类型 默认值
cookieCfg

启用 Cookie 使用的默认设置,请参阅 ICookieCfgConfig 设置,了解完整的默认值。
ICookieCfgConfig
[可选]
(自 2.6.0 起)
未定义
cookie 域名

自定义 Cookie 域。 如果要跨子域共享 Application Insights Cookie,这会非常有用。
(自 v2.6.0 起)如果定义了 cookieCfg.domain,则其优先级高于此值。
cookieCfg.domain 的别名
[可选]
null
cookiePath

自定义 cookie 路径。 如果你想在应用程序网关后面共享 Application Insights Cookie,这会很有帮助。
如果已定义 cookieCfg.path,则优先采用。
cookieCfg.path 的别名
[可选]
(自 2.6.0 起)
null
禁用Cookie使用

默认值为 false。 一个布尔值,指示 SDK 是否禁用 Cookie 的使用。 如果为 true,则 SDK 不会存储或读取 Cookie 中的任何数据。
(自 v2.6.0 起)如果已定义 cookieCfg.enabled,则优先采用。 通过 core.getCookieMgr().setEnabled(true) 进行初始化后,可以重新启用 Cookie 的使用。
cookieCfg.enabled 的别名
[可选]
名字前缀

一个可选值,用作 localStorage 和会话 Cookie 名称的名称后缀。
字符串 未定义
sessionCookiePostfix

用于作为会话 Cookie 名称后缀的可选值。 如果未定义,则 namePrefix 将用作会话 Cookie 名称的名称后缀。
字符串 未定义
userCookiePostfix

用作用户 Cookie 名称后缀的可选值。 如果未定义,则不会在用户 Cookie 名称上添加任何后缀。
字符串 未定义

Ajax 和 Fetch 跟踪

Ajax 和 Fetch 自动收集分为五个功能领域:开/关切换(disableAjaxTrackingdisableFetchTrackingdisableXhr)、请求和响应标头捕获(enableRequestHeaderTrackingenableResponseHeaderTrackingignoreHeaderscustomHeaders)、基于 URL 的筛选(excludeRequestFromAutoTrackingPatterns)、额外的 window.performance 查找(enableAjaxPerfTrackingajaxPerfLookupDelaymaxAjaxPerfLookupAttemptsenableAjaxErrorStatusText),以及每页数量控制和每次调用增强(maxAjaxCallsPerViewaddRequestContext)。

自动收集切换开关

使用这些字段启用或禁用自动收集 Ajax 和 Fetch 请求,并选择传输(XHR、提取或信标)。

配置字段 值类型 默认值
禁用Ajax跟踪

如果为 true,则不自动收集 Ajax 调用。 默认值为 false。
布尔
disableFetchTracking

disableFetchTracking 的默认设置为 false,这意味着它已处于启用状态。 但在 2.8.10 之前的版本中,它默认处于禁用状态。 在设置为 true 时,不会自动收集提取请求。 在版本 2.8.0 中,默认设置已从 true 更改为 false
布尔
禁用XHR

默认情况下,不要使用 XMLHttpRequest 或 XDomainRequest(对于 Internet Explorer < 版本 9),而应改为尝试使用fetch() 或 sendBeacon。 如果其他传输不可用,它将使用 XMLHttpRequest
布尔
isBeaconApiDisabled

如果为 false,则 SDK 将使用信标 API 发送所有遥测数据
布尔
onunloadDisableBeacon

默认值为 false。 关闭选项卡后,SDK 将使用信标 API 发送所有剩余的遥测
布尔
onunloadDisableFetch

如果支持 fetch keepalive,请不要在卸载期间使用它发送事件,它在不使用 keepalive 的情况下仍可能回退到 fetch()
布尔

标头跟踪

使用这些字段在依赖项遥测中包含 AJAX 和 Fetch 请求或响应标头,在自定义终结点上提供额外的标头,或筛选日志中的敏感标头。

配置字段 值类型 默认值
启用请求头跟踪

如果设为 true,则会跟踪 AJAX 和 Fetch 请求的标头,默认值为 false。 如果未配置 ignoreHeaders,则不会记录 Authorization 和 X-API-Key 标头。
布尔
启用响应头跟踪

如果为 true,则会跟踪 AJAX 和 Fetch 请求的响应标头,默认为 false。 如果未配置 ignoreHeaders,则不会记录 WWW-Authenticate 标头。
布尔
ignoreHeaders

在日志数据中要忽略的 AJAX 和 Fetch 请求标头及响应标头。 要替代或放弃默认值,请将包含要排除的所有标头的数组或空数组添加到配置。
字符串[] [“Authorization”、“X-API-Key”、“WWW-Authenticate”]
customHeaders

用户在使用自定义终端节点时提供额外标头的能力。 使用 Beacon 发送器时,在浏览器关闭时不会添加 customHeaders。 IE9 或更早版本不支持添加自定义标头。
[{header: string, value: string}] 未定义

URL 筛选

使用此字段可从自动 Ajax 和 Fetch 跟踪中排除特定请求 URL。

配置字段 值类型 默认值
排除请求自动跟踪模式

提供一种方法,可将特定路由排除在 XMLHttpRequest 或 Fetch 请求的自动跟踪之外。 如果已定义,则对于请求 URL 与正则表达式模式匹配的 Ajax / fetch 请求,自动跟踪处于关闭状态。 默认值为未定义。
string[] |RegExp[] 未定义

性能查询

使用这些字段可在 Ajax 依赖项遥测中包含额外的 window.performance 计时信息,调整查找延迟和重试次数,并在 AJAX 请求失败时包含响应错误文本。

配置字段 值类型 默认值
enableAjaxPerfTracking

默认值为 false。 用于启用在上报的 Ajax(XHR 和 fetch)指标中查找并包含额外浏览器 window.performance 计时信息的标志。
布尔
ajaxPerfLookupDelay

默认值为 25 毫秒。 重新尝试查找 Ajax 请求的 window.performance 计时数据之前需要等待的时间。该时间以毫秒为单位,并会直接传递给 setTimeout()。
数字 二十五
maxAjaxPerfLookupAttempts

默认值为 3。 必须指定查找 window.performance 计时信息(如果可用)的最大次数。 并非所有浏览器都会在报告 XHR 请求结束之前填充 window.performance 对象。 对于提取请求,它是在完成后添加的。
数字 3
enableAjaxErrorStatusText

默认值为 false。 如果为 true,则在 AJAX 请求失败时将响应错误数据文本布尔值包含在依赖项事件中。
布尔

音量控制和增强

使用 maxAjaxCallsPerView 来限制每个页面视图的 Ajax 收集,并使用 addRequestContext 在每次 API 调用开始时通过回调丰富依赖项遥测数据。

配置字段 值类型 默认值
maxAjaxCallsPerView

默认值为 500 - 控制每页面视图监视的 Ajax 调用数量。 设置为 -1 可监视页面上的所有(无限制)Ajax 调用。
数字 500
添加请求上下文

提供一种在开始 API 调用时使用上下文扩充依赖项日志的方法。 默认值为未定义。 如果配置与 xhr 相关的上下文,则需要检查 xhr 是否存在。 如果配置与 fetch request 相关的上下文,则需要检查 fetch responsefetch 是否存在。 否则,可能无法获取所需的数据。
(requestContext: IRequestionContext) => {[key: string]: any} 未定义

分布式跟踪和关联

使用 distributedTracingMode 选择 W3C、AI 或 AI_AND_W3C 标头格式。 使用 disableCorrelationHeaders 可完全关闭相关性。 使用 enableCorsCorrelation 在跨域请求中注入关联标头。 用于 appId 设置固定关联标识。 使用 correlationHeaderDomainscorrelationHeaderExcludedDomainscorrelationHeaderExcludePatterns 将特定目标域或 URL 模式加入允许列表或阻止列表。

配置字段 值类型 默认值
应用程序ID

appId 用于在客户端上发生的 AJAX 依赖项与服务器端请求之间进行关联。 启用信标 API 后,无法自动使用它,但可以在配置中手动设置。 默认值为 null
字符串 null
相关性标头域

为特定域启用关联标头
字符串[] 未定义
相关性头排除域

禁用针对特定域名的关联标头
字符串[] 未定义
相关性头排除模式

使用正则表达式禁用关联标头
regex[] 未定义
禁用相关性头文件

如果为 false,则 SDK 会将两个标头(“Request-Id”和“Request-Context”)添加到所有依赖项请求,以将其关联到服务器端上的对应请求。 默认值为 false。
布尔
分布式追踪模式

设置分布式跟踪模式。 如果设置了 AI_AND_W3C 模式或 W3C 模式,则将生成 W3C 跟踪上下文标头 (traceparent/tracestate),并将其包含在所有传出请求中。 提供 AI_AND_W3C 是为了与任何旧版 Application Insights 检测服务向后兼容。
数字或 DistributedTracingModes DistributedTracing Modes.AI_AND_W3C
启用CORS关联

如果为 true,则 SDK 会将两个标头(“Request-Id”和“Request-Context”)添加到所有 CORS 请求,以将传出的 AJAX 依赖项与服务器端上的对应请求相关联。 默认值为 false
布尔

页面视图和路由跟踪

使用 enableAutoRouteTracking 来跟踪 SPA 路由变化。 使用 autoTrackPageVisitTime 记录上一个视图的页面停留时间。 使用 isBrowserLinkTrackingEnabled 跟踪 Browser Link 请求。 使用 overridePageViewDuration 根据 trackPageView 调用来计算页面视图持续时间,而不是使用导航计时 API。

配置字段 值类型 默认值
自动跟踪页面访问时间

如果为 true,则对于页面视图,将跟踪上一个检测的页面的查看时间并将其作为遥测数据发送,同时,为当前的页面视图启动新的计时器。 它作为 PageVisitTime 中名为 milliseconds 的自定义指标发送,通过 Date now() 函数(如果可用)进行计算,并在 now() 不可用的情况下(IE8 或更低版本)回退到 (new Date()).getTime()。 默认值为 false。
布尔
启用自动路线跟踪

自动跟踪单页应用程序 (SPA) 中的路由更改。 如果为 true,则每次更改路由都会将新的页面视图发送到 Application Insights。 哈希路由更改 (example.com/foo#bar) 也会记录为新的页面视图。
注意:如果启用此字段,请不要为 history 启用 对象,因为这会产生多个页面浏览事件。
布尔
启用浏览器链接跟踪

默认值为 false。 如果为 true,则 SDK 将跟踪所有浏览器链接请求。
布尔
overridePageViewDuration

如果为 true,则在调用 trackPageView 时,trackPageView 的默认行为将更改为记录页面视图持续时间间隔的结束时间。 如果为 false 且未为 trackPageView 提供自定义持续时间,则会使用导航计时 API 计算页面视图性能。 默认值为 false。
布尔

异常跟踪

使用 disableExceptionTracking 可选择退出自动异常收集,并使用 enableUnhandledPromiseRejectionTracking 将未处理的 Promise 拒绝作为 JavaScript 错误包含在内。

配置字段 值类型 默认值
禁用异常跟踪

如果为 true,则 SDK 不会自动收集异常。 默认值为 false。
布尔
启用未处理的Promise拒绝跟踪

如果为 true,则 SDK 自动收集未经处理的承诺拒绝作为 JavaScript 错误。 如果 disableExceptionTracking 为 true(不跟踪异常),则会忽略配置值,并且不会报告未处理的承诺拒绝。
布尔

采样、批处理和存储

使用 samplingPercentage 设置固定采样率,使用 maxBatchIntervalmaxBatchSizeInBytes 调整批量发送行为,使用 enableSessionStorageBufferisStorageUseDisabled 控制 SDK 是否将未发送的遥测数据保存在会话存储或本地存储中,使用 eventsLimitInMem 限制内存缓冲区大小,使用 isRetryDisabled 禁用暂时性故障时的重试,使用 disableFlushOnBeforeUnload 在页面卸载时跳过刷新,以及使用 disableTelemetry 作为全局总开关。

配置字段 值类型 默认值
禁用卸载前刷新

默认值为 false。 如果为 true,则 onBeforeUnload 事件触发时不调用 flush 方法。
布尔
禁用遥测

如果为 true,则 SDK 不会收集或发送遥测数据。 默认值为 false。
布尔
启用会话存储缓冲

默认值为 true。 如果为 true,则会将包含所有未发送的遥测数据的缓冲区存储在会话存储中。 缓冲区在页面加载时还原。
布尔
eventsLimitInMem

不使用会话存储时,在 SDK 开始删除事件之前内存中可以保留的事件数(默认值)。
数字 1万
重试功能是否禁用

默认值为 false。 如果为 false,请在出现 206(部分成功)、408(超时)、429(请求过多)、500(内部服务器错误)、503(服务不可用)以及 0(离线,仅在检测到时)时重试。
布尔
存储使用是否已禁用

如果为 true,则 SDK 不会存储或读取本地和会话存储中的任何数据。 默认值为 false。
布尔
maxBatchInterval

发送前遥测数据批量收集的时长(毫秒)。
数字 15000
最大批处理大小(以字节为单位)

遥测数据批次的最大大小。 如果某个批超出此限制,则会立即发送并启动一个新批。
数字 1万
采样百分比

发送的事件百分比。 默认值为 100,表示发送所有事件。 如果希望保留适用于大型应用程序的数据上限,请设置此项。
数字 100

日志记录和调试

使用 loggingLevelConsoleloggingLevelTelemetry 将 SDK 内部错误发送到控制台或遥测系统。 使用 enableDebug 可在开发过程中将内部错误作为异常抛出。 使用 diagnosticLogInterval 调整内部日志轮询器。 使用 disableDataLossAnalysis 可跳过启动缓冲区检查。 使用 disableIkeyDeprecationMessage 禁止显示检测密钥弃用通知。

配置字段 值类型 默认值
diagnosticLogInterval

(内部)内部日志队列轮询间隔(毫秒)
数字 1万
禁用数据丢失分析 (disableDataLossAnalysis)

如果为 false,则启动时会检查内部遥测发送器缓冲区中尚未发送的项目。
布尔
disableIkeyDeprecationMessage

禁用 Instrumentation Key 弃用错误消息。 如果为 true,则不会发送错误消息。
布尔
enableDebug

如果为 true,则无论 SDK 日志记录设置如何,内部调试数据都将作为异常抛出,而不是被记录。 默认值为 false。
注意:如果启用此设置,每当发生内部错误时,会导致遥测数据丢失。 这可能有利于快速识别 SDK 的配置或用法问题。 如果你不希望在调试时丢失遥测数据,请考虑使用 loggingLevelConsoleloggingLevelTelemetry,而不是 enableDebug
布尔
控制台日志级别

将 Application Insights 的内部错误记录到控制台。
0:关闭,
1:仅限严重错误,
2:所有内容(错误和警告)
数字 0
日志级别遥测

Application Insights 内部错误以遥测数据的形式发送。
0:关闭,
1:仅限严重错误,
2:所有内容(错误和警告)
数字 1

性能管理器

使用 enablePerfMgr 从已插桩的代码路径中发出本地 perfEvents。 使用 createPerfMgr 提供自定义的 IPerfManager 工厂。 使用 perfEvtsSendAll 来控制是每个 perfEvent 都触发,还是仅触发父级事件。

配置字段 值类型 默认值
创建性能管理器

在需要且已启用 enablePerfMgr 的情况下,将被调用以创建 IPerfManager 实例的回调函数。它支持你替换 PerfManager() 的默认创建,而无需在初始化之后进行 setPerfMgr()
(核心:IAppInsightsCore,notificationManager:INotificationManager)=> IPerfManager 未定义
启用性能管理器

启用后(为 true 时),将为已检测的代码创建本地 perfEvents,以(通过 doPerf() 帮助程序)发出 perfEvents。 它可以用于根据使用情况识别 SDK 中的性能问题,或者选择性地在自己的已检测代码中识别性能问题。
布尔
perfEvtsSendAll

enablePerfMgr 启用且 IPerfManager 触发 INotificationManager.perfEvent() 时,此标志决定是针对所有事件触发事件并将其发送给所有侦听器(true),还是仅针对“父”事件触发事件(false,<默认>)。
父级 IPerfEvent 事件在创建时没有其他 IPerfEvent 仍在运行,且其父级属性不为 null 或未定义状态。 自 v2.5.7 起
布尔

标识符和会话生存期

使用 accountId 将用户分组到账户中,使用 idLength 设置生成的随机 ID 长度,使用 sessionExpirationMs 设置最长会话持续时间,以及使用 sessionRenewalMs 设置因无活动而结束会话的超时时间。

配置字段 值类型 默认值
帐户ID

可选的帐户 ID(如果应用将用户分组到帐户中)。 不允许使用空格、逗号、分号、等于或竖线
字符串 null
标识符长度

指定用于生成新的随机会话 ID 和用户 ID 的默认长度。 默认值为 22,之前的默认值为 5(v2.5.8 及更早版本);如果需要保持之前的最大长度,请将该值设为 5。
数字 22
会话过期时间毫秒(sessionExpirationMs)

如果会话持续此时间(以毫秒为单位),则会记录会话。 默认值为 24 小时
数字 86400000
sessionRenewalMs

如果用户处于非活动状态有这么长的时间(以毫秒为单位),则会记录会话。 默认值为 30 分钟
数字 1800000

其他设置

使用 featureOptIn 启用预览功能,使用 throttleMgrCfg 配置限流,使用 disableInstrumentationKeyValidation 绕过数据引入密钥检查,使用 convertUndefined 为未定义字段代入默认值,以及使用 sdkExtension 为下游 SDK 扩展的 ai.internal.sdkVersion 标签添加前缀。

配置字段 值类型 默认值
convertUndefined

为用户提供一个选项,将未定义的字段转换为用户定义的值。
any 未定义
禁止仪器键验证

如果为 true,则跳过检测密钥验证检查。 默认值为 false。
布尔
featureOptIn

设置功能选择加入详细信息。

此配置字段仅在 3.0.3 及更高版本中可用。
IFeatureOptIn 未定义
sdkExtension

设置 SDK 扩展名。 仅允许使用字母字符。 扩展名将添加为“ai.internal.sdkVersion”标记的前缀(例如“ext_javascript:2.0.0”)。 默认值为 null。
字符串 null
throttleMgrCfg

按键设置限流 mgr 配置。

此配置字段仅在 3.0.3 及更高版本中可用。
{[key: number]: IThrottleMgrConfig} 未定义

分布式跟踪

新式云和 微服务 体系结构实现了简单的独立可部署服务,可降低成本,同时提高可用性和吞吐量。 但是,它使整个系统更难以推理和调试。 分布式跟踪通过提供类似于云和微服务体系结构的调用堆栈的性能探查器来解决此问题。

Azure Monitor 提供了两种使用分布式跟踪数据的体验:单个事务/请求的 事务诊断 视图和 应用程序映射 视图,用于显示系统交互方式。

Application Insights 可以单独监视每个组件,并使用分布式遥测关联来检测哪个组件负责故障或性能下降。 本文介绍 Application Insights 使用的不同语言和平台上的数据模型、上下文传播技术、协议和关联策略的实现。

通过 Application Insights 使用 Autoinstrumentation 或 SDK 启用分布式跟踪。

支持的 Azure Monitor OpenTelemetry 工具和 JavaScript SDK 为常见框架和库发出分布式跟踪数据。

配置了支持的检测工具后,会自动收集常见框架、库和技术的跟踪信息。

还可以通过 创建自定义范围手动跟踪任何技术。

用于遥测关联的数据模型

Application Insights 为分布式遥测关联定义 数据模型 。 若要将遥测与逻辑操作关联起来,每个遥测项都有一个名为operation_Id的上下文字段。 分布式跟踪中的每个遥测项都共享此标识符。 因此,即使从单个层丢失遥测数据,仍可以关联其他组件报告的遥测数据。

分布式逻辑操作通常由一组较小的操作组成,这些请求由其中一个组件进行处理。 请求遥测 定义这些操作。 每个请求遥测项都有自己的 id,标识它的唯一性和全球性。 与请求关联的所有遥测项(例如跟踪和异常)都应将operation_parentId设置为请求id的值。

依赖项遥测 表示每个传出操作,例如对另一个组件的 HTTP 调用。 它还定义了其自身全局唯一的 id。 请求遥测由这次依赖项调用启动,并使用此 id 作为其 operation_parentId

可以使用operation_Idoperation_parentIdrequest.id配合dependency.id来构建分布式逻辑操作的视图。 这些字段还定义了遥测调用的因果关系顺序。

在微服务环境中,来自组件的跟踪可以转到不同的存储项。 每个组件都可以在 Application Insights 中有自己的连接字符串。 若要获取逻辑操作的遥测数据,Application Insights 会查询每个存储项的数据。

当存储项数较大时,需要一个提示,说明下一步要查找的位置。 Application Insights 数据模型定义了两个用于解决此问题的字段: request.source 以及 dependency.target。 第一个字段标识启动依赖项请求的组件。 第二个字段标识哪个组件返回了依赖项调用的响应。

有关从多个不同实例进行查询的信息,请参阅 Azure Monitor 中 Log Analytics 工作区、应用程序和资源的查询数据

Example

我们来看一个示例。 名为“股票价格”的应用程序使用名为 Stock 的外部 API 显示股票的当前市场价格。 股票价格应用程序中有一个名为“股票”的页面,客户端 Web 浏览器通过 GET /Home/Stock 打开该页面。 应用程序使用 HTTP 调用 GET /api/stock/value查询 Stock API。

可以通过运行查询来分析生成的遥测数据:

(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id

在结果中,所有遥测项共享根 operation_Id。 从页面发出 Ajax 调用时,会将新的唯一 ID (qJSXU) 分配给依赖项遥测,并将 pageView 的 ID 用作 operation_ParentId。 然后,服务器请求使用 Ajax ID 作为 operation_ParentId

项目类型 姓名 ID operation_ParentId operation_Id
页面浏览量 库存页面 STYz STYz
依赖,依赖性 or 依赖关系 GET /Home/Stock qJSXU STYz STYz
申请 GET 首页/库存 KqKwlrSt9PA= qJSXU STYz
依赖,依赖性 or 依赖关系 GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

对外部服务进行调用 GET /api/stock/value 时,需要知道该服务器的标识,以便可以相应地设置 dependency.target 字段。 当外部服务不支持监视时, target 将设置为服务的主机名。 示例为 stock-prices-api.com。 但是,如果服务通过返回预定义的 HTTP 标头来标识自身, target 则包含允许 Application Insights 通过查询该服务的遥测数据来生成分布式跟踪的服务标识。

使用 W3C TraceContext 的关联标头

Application Insights 正在转换为 W3C 跟踪上下文,后者定义:

  • traceparent:承载全局唯一的操作 ID 和调用的唯一标识符。
  • tracestate:承载特定于系统的跟踪上下文。

支持的检测工具使用 W3C 跟踪上下文协议进行分布式跟踪。

相关 HTTP 协议(也称为 Request-Id)即将弃用。 此协议定义两个标头:

  • Request-Id:承载调用的全局唯一 ID。
  • Correlation-Context:承载分布式跟踪属性的名称/值对集合。

Application Insights 还使用关联上下文来填充字段,例如 dependency.targetrequest.source,当该上下文可用时。

W3C Trace-Context和 Application Insights 数据模型的映射方式如下:

Application Insights W3C TraceContext
IdRequestDependency parent-id
Operation_Id trace-id
Operation_ParentId 此范围的父范围的 parent-id。 如果是根跨度,此字段必须为空。

有关详细信息,请参阅 Application Insights 遥测数据模型

启用 W3C 分布式跟踪支持

默认情况下,此功能为 JavaScript 启用,并且当托管页域与请求发送到的域相同时,会自动包含标头(例如,宿主页是 example.com Ajax 请求发送到 example.com的域)。 若要更改分布式跟踪模式,请使用 distributedTracingMode 配置字段。 默认值 AI_AND_W3C为 Application Insights 检测的任何旧服务提供向后兼容性。

如果 XMLHttpRequest 或 Fetch Ajax 请求转到其他域主机(包括子域),则默认情况下不包括相关标头。 若要启用此功能,请将 enableCorsCorrelation 配置字段 设置为 true。 如果将 enableCorsCorrelation 设置为 true,则所有的 XMLHttpRequest 和 Fetch Ajax 请求都会包含相关的关联标头。 因此,如果请求调用的服务器上的应用程序不支持 traceparent 标头,则请求可能会失败。 此失败取决于浏览器和版本是否可以根据服务器接受的标头来验证请求。 可以使用 correlationHeaderExcludedDomains 配置字段 排除服务器域名,以避免跨组件间的关联标头注入。 例如,可使用 correlationHeaderExcludedDomains: ['*.auth0.com'] 从发送到 Auth0 标识提供者的请求中排除关联标头。

重要

若要查看启用关联所需的所有配置,请参阅 JavaScript 相关文档

筛选和预处理遥测

对于 JavaScript Web 应用程序,请使用遥测初始值设定项在发送之前筛选、修改或扩充遥测数据。

  • 从初始值设定项返回 false ,以在发送遥测项之前删除它。
  • 添加或修改遥测项上的字段,以使用可用于筛选和分析的值来扩充遥测。
  • 如果需要统计采样而不是显式筛选,请使用 SDK 采样配置来减少遥测量。

警告

筛选遥测数据可能会影响门户统计数据,并且也可能更难跟踪相关项。 在不需要显式排除特定遥测数据的情况下,如果需要减少数据量,应优先选择采样。

JavaScript Web 应用程序

若要从 JavaScript Web 应用程序筛选遥测数据,请使用 ITelemetryInitializer

  1. 创建遥测初始化回调函数。 回调函数 ITelemetryItem 采用参数,这是正在处理的事件。 如果回调返回 false,则会筛选掉遥测项。

    var filteringFunction = (envelope) => {
      if (envelope.data.someField === 'tobefilteredout') {
        return false;
      }
      return true;
    };
    
  2. 添加你的遥测初始化器回调。

    appInsights.addTelemetryInitializer(filteringFunction);
    

JavaScript 遥测初始化程序

遥测初始值设定项会在发送 JavaScript 遥测项之前运行。 使用这些工具来添加、修改或删除浏览器遥测数据。 从初始化程序 false 返回会丢弃该项。

使用遥测初始化器进行定向增强或筛选。 如果需要减少数据量而不显式排除特定遥测数据,请使用采样。

JavaScript 遥测初始化程序

根据需要插入 JavaScript 遥测初始化器。 有关 Application Insights JavaScript SDK 的遥测初始值设定项的详细信息,请参阅 遥测初始值设定项

通过在 onInit中添加 回调函数来插入遥测初始化程序:

<script type="text/javascript">
!(function (cfg){function e(){cfg.onInit&&cfg.onInit(n)}var x,w,D,t,E,n,C=window,O=document,b=C.location,q="script",I="ingestionendpoint",L="disableExceptionTracking",j="ai.device.";"instrumentationKey"[x="toLowerCase"](),w="crossOrigin",D="POST",t="appInsightsSDK",E=cfg.name||"appInsights",(cfg.name||C[t])&&(C[t]=E),n=C[E]||function(g){var f=!1,m=!1,h={initialize:!0,queue:[],sv:"8",version:2,config:g};function v(e,t){var n={},i="Browser";function a(e){e=""+e;return 1===e.length?"0"+e:e}return n[j+"id"]=i[x](),n[j+"type"]=i,n["ai.operation.name"]=b&&b.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(h.sv||h.version),{time:(i=new Date).getUTCFullYear()+"-"+a(1+i.getUTCMonth())+"-"+a(i.getUTCDate())+"T"+a(i.getUTCHours())+":"+a(i.getUTCMinutes())+":"+a(i.getUTCSeconds())+"."+(i.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}},ver:undefined,seq:"1",aiDataContract:undefined}}var n,i,t,a,y=-1,T=0,S=["js.monitor.azure.com","js.cdn.applicationinsights.io","js.cdn.monitor.azure.cn","js0.cdn.applicationinsights.io","js0.cdn.monitor.azure.cn","js2.cdn.applicationinsights.io","js2.cdn.monitor.azure.cn","az416426.vo.msecnd.net"],o=g.url||cfg.src,r=function(){return s(o,null)};function s(d,t){if((n=navigator)&&(~(n=(n.userAgent||"").toLowerCase()).indexOf("msie")||~n.indexOf("trident/"))&&~d.indexOf("ai.3")&&(d=d.replace(/(\/)(ai\.3\.)([^\d]*)$/,function(e,t,n){return t+"ai.2"+n})),!1!==cfg.cr)for(var e=0;e<S.length;e++)if(0<d.indexOf(S[e])){y=e;break}var n,i=function(e){var a,t,n,i,o,r,s,c,u,l;h.queue=[],m||(0<=y&&T+1<S.length?(a=(y+T+1)%S.length,p(d.replace(/^(.*\/\/)([\w\.]*)(\/.*)$/,function(e,t,n,i){return t+S[a]+i})),T+=1):(f=m=!0,s=d,!0!==cfg.dle&&(c=(t=function(){var e,t={},n=g.connectionString;if(n)for(var i=n.split(";"),a=0;a<i.length;a++){var o=i[a].split("=");2===o.length&&(t[o[0][x]()]=o[1])}return t[I]||(e=(n=t.endpointsuffix)?t.location:null,t[I]="https://"+(e?e+".":"")+"dc."+(n||"services.visualstudio.com")),t}()).instrumentationkey||g.instrumentationKey||"",t=(t=(t=t[I])&&"/"===t.slice(-1)?t.slice(0,-1):t)?t+"/v2/track":g.endpointUrl,t=g.userOverrideEndpointUrl||t,(n=[]).push((i="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",o=s,u=t,(l=(r=v(c,"Exception")).data).baseType="ExceptionData",l.baseData.exceptions=[{typeName:"SDKLoadFailed",message:i.replace(/\./g,"-"),hasFullStack:!1,stack:i+"\nSnippet failed to load ["+o+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(b&&b.pathname||"_unknown_")+"\nEndpoint: "+u,parsedStack:[]}],r)),n.push((l=s,i=t,(u=(o=v(c,"Message")).data).baseType="MessageData",(r=u.baseData).message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+l+")").replace(/\"/g,"")+'"',r.properties={endpoint:i},o)),s=n,c=t,JSON&&((u=C.fetch)&&!cfg.useXhr?u(c,{method:D,body:JSON.stringify(s),mode:"cors"}):XMLHttpRequest&&((l=new XMLHttpRequest).open(D,c),l.setRequestHeader("Content-type","application/json"),l.send(JSON.stringify(s)))))))},a=function(e,t){m||setTimeout(function(){!t&&h.core||i()},500),f=!1},p=function(e){var n=O.createElement(q),e=(n.src=e,t&&(n.integrity=t),n.setAttribute("data-ai-name",E),cfg[w]);return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=a,n.onerror=i,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||a(0,t)},cfg.ld&&cfg.ld<0?O.getElementsByTagName("head")[0].appendChild(n):setTimeout(function(){O.getElementsByTagName(q)[0].parentNode.appendChild(n)},cfg.ld||0),n};p(d)}cfg.sri&&(n=o.match(/^((http[s]?:\/\/.*\/)\w+(\.\d+){1,5})\.(([\w]+\.){0,2}js)$/))&&6===n.length?(d="".concat(n[1],".integrity.json"),i="@".concat(n[4]),l=window.fetch,t=function(e){if(!e.ext||!e.ext[i]||!e.ext[i].file)throw Error("Error Loading JSON response");var t=e.ext[i].integrity||null;s(o=n[2]+e.ext[i].file,t)},l&&!cfg.useXhr?l(d,{method:"GET",mode:"cors"}).then(function(e){return e.json()["catch"](function(){return{}})}).then(t)["catch"](r):XMLHttpRequest&&((a=new XMLHttpRequest).open("GET",d),a.onreadystatechange=function(){if(a.readyState===XMLHttpRequest.DONE)if(200===a.status)try{t(JSON.parse(a.responseText))}catch(e){r()}else r()},a.send())):o&&r();try{h.cookie=O.cookie}catch(k){}function e(e){for(;e.length;)!function(t){h[t]=function(){var e=arguments;f||h.queue.push(function(){h[t].apply(h,e)})}}(e.pop())}var c,u,l="track",d="TrackPage",p="TrackEvent",l=(e([l+"Event",l+"PageView",l+"Exception",l+"Trace",l+"DependencyData",l+"Metric",l+"PageViewPerformance","start"+d,"stop"+d,"start"+p,"stop"+p,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),h.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(g.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==g[L]&&!0!==l[L]&&(e(["_"+(c="onerror")]),u=C[c],C[c]=function(e,t,n,i,a){var o=u&&u(e,t,n,i,a);return!0!==o&&h["_"+c]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:C.event}),o},g.autoExceptionInstrumented=!0),h}(cfg.cfg),(C[E]=n).queue&&0===n.queue.length?(n.queue.push(e),n.trackPageView({})):e();})({
src: "https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js",
crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
onInit: function (sdk) {
    sdk.addTelemetryInitializer(function (envelope) {
    envelope.data = envelope.data || {};
    envelope.data.someField = 'This item passed through my telemetry initializer';
    });
}, // Once the application insights instance has loaded and initialized this method will be called
// sri: false, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check
cfg: { // Application Insights Configuration
    connectionString: "YOUR_CONNECTION_STRING"
}});
</script>

有关遥测项上可用的非自定义属性的摘要,请参阅 Application Insights 导出数据模型

可以根据需要添加任意数量的初始值设定项。 它们会按照添加顺序依次被调用。

添加云角色名称和云角色实例

使用遥测初始器设置 ai.cloud.roleai.cloud.roleInstance 标记。 这些标记定义组件在 Azure Monitor 中的应用程序映射 中的显示方式。

appInsights.queue.push(() => {
appInsights.addTelemetryInitializer((envelope) => {
  envelope.tags["ai.cloud.role"] = "your role name";
  envelope.tags["ai.cloud.roleInstance"] = "your role instance";
});
});

从版本 2.6.0 开始,Azure 应用程序 Insights JavaScript SDK 提供基于实例的 Cookie 管理,可以在初始化后禁用和重新启用。

如果在初始化期间使用 disableCookiesUsagecookieCfg.enabled 配置禁用 Cookie,则可以通过使用 setEnabled 函数重新启用它们。

基于实例的 Cookie 管理替代了之前的 disableCookies()setCookie()getCookie()deleteCookie() 的 CoreUtils 全局函数。

若要利用版本 2.6.0 中引入的树摇增强功能,请停止使用全局函数。

ICookieMgrConfig 是在 2.6.0 版本中添加的、用于基于实例的 Cookie 管理的 Cookie 配置项。 它提供的选项允许你启用或禁用 SDK 使用 Cookie。 还可以设置自定义 Cookie 域和路径,并自定义用于提取、设置和删除 Cookie 的函数。

下表定义了 ICookieMgrConfig 选项。

名称 类型 默认 说明
启用 布尔 SDK 的当前实例使用此布尔值来指示是否启用了 Cookie 的使用。 如果为 false,则由此配置初始化的 SDK 实例将不会存储或读取 Cookie 中的任何数据。
字符串 null 自定义 Cookie 域。 如果要跨子域共享 Application Insights Cookie,这会非常有用。 如果未提供,请使用根 cookieDomain 值中的值。
路径 字符串 / 指定 Cookie 使用的路径。 如果未提供,请使用根 cookiePath 值中的任何值。
忽略Cookie 字符串[] 未定义 指定要忽略的 Cookie 名称。 它会导致任何匹配的 Cookie 名称永远不会读取或写入。 它们仍然可以被明确清除或删除。 无需在 blockedCookies 配置中重复该名称。 (自 v2.8.8 起)
被屏蔽的Cookie 字符串[] 未定义 指定永不写入的 Cookie 名称。 它阻止创建或更新任何 Cookie 名称,但它们仍然可以读取,除非也包含在其中 ignoreCookies。 它们仍可被明确地清除或删除。 如果未提供,则默认使用 ignoreCookies 中的相同列表。 (自 v2.8.8 起)
getCookie (name: string) => string null 用于提取命名 Cookie 值的函数。 如果未提供,SDK 将使用内部 Cookie 分析和缓存。
setCookie (name: string, value: string) => void null 用于设置具有指定值的命名 Cookie 的函数。 仅当添加或更新 Cookie 时调用。
delCookie (name: string, value: string) => void null 用于删除具有指定值的命名 Cookie 的函数。 此函数与 setCookie 分离开来,以避免必须通过解析该值来确定是要添加还是删除 Cookie。 如果未提供,SDK 将使用内部 Cookie 分析和缓存。

源映射表

源映射支持可通过还原异常遥测数据中压缩后的调用堆栈,帮助你调试压缩后的 JavaScript 代码。

  • 与“异常详细信息”面板上的所有当前集成兼容
  • 支持所有当前和将来的 JavaScript SDK,包括 Node.js,无需 SDK 升级

Application Insights 支持将源映射上传到Azure 存储帐户 blob 容器。 使用源映射还原 端到端事务详细信息 页面上的调用堆栈。 还可以使用源映射还原由 JavaScript SDKNode.js SDK 发送的任何异常信息。

显示选择通过与存储帐户链接来取消缩小调用堆栈的选项的屏幕截图。

新建存储帐户和 Blob 容器

如果已有存储帐户或 blob 容器,则可以跳过此步骤。

  1. 新建存储帐户

  2. 在存储帐户中创建 Blob 容器。 将“公共访问级别”设为“专用”,以确保源映射不可公开访问。

    显示将容器访问级别设置为“专用”的屏幕截图。

将源映射推送到 Blob 容器

将持续部署管道配置为自动将源映射上传到已配置的 Blob 容器,从而将持续部署管道集成到你的存储帐户。

可以将源映射上传到 Azure Blob 存储容器,使用与它们在编译和部署时相同的文件夹结构。 一个常见的用例是用其版本作为部署文件夹的前缀,例如 1.2.3/static/js/main.js。 通过名为 sourcemaps 的 Azure Blob 容器进行还原压缩时,管道会尝试获取位于 sourcemaps/1.2.3/static/js/main.js.map 的源映射文件。

如果使用 Azure Pipelines 持续生成和部署应用程序,请将 Azure 文件复制任务添加到管道,以自动上传源映射。

显示如何将 Azure 文件复制任务添加到管道中,以便将源映射上传到 Azure Blob 存储的屏幕截图。

使用源映射存储账户配置 Application Insights 资源

你有两个选项可使用源映射存储帐户来配置你的 Application Insights 资源。

“端到端事务详细信息”选项卡

在“端到端事务详细信息”选项卡中,选择“取消缩小”。 如果资源尚未配置,请进行配置。

  1. 在 Azure 门户中,查看已缩小的异常的详细信息。
  2. 选择 取消压缩
  3. 如果你的资源尚未配置,请进行配置。
“属性”选项卡

若要配置或更改链接到 Application Insights 资源的存储帐户或 Blob 容器:

  1. 转到 Application Insights 资源的“属性”选项卡。

  2. 选择“更改源映射 Blob 容器”。

  3. 选择另一个 Blob 容器作为源映射容器。

  4. 选择应用

    显示“属性”窗格上重新配置所选 Azure Blob 容器的屏幕截图。

查看未压缩的调用堆栈

若要查看未确定的调用堆栈,请在Azure门户中选择异常遥测项,找到与调用堆栈匹配的源映射,并将源映射拖放到Azure门户中的调用堆栈上。 源映射必须与堆栈帧的源文件同名,但扩展名为 map

如果遇到涉及 JavaScript 应用程序的源映射支持的问题,请参阅排查 JavaScript 应用程序的源映射支持问题

演示取消压缩功能的动画。

摇树

树摇动会从最终 JavaScript 捆绑包中删除未使用的代码。

要利用 tree shaking,请仅将 SDK 中必要的组件导入到代码中。 通过执行此操作,将从最终捆绑包中排除未使用的代码,从而减小其大小并提高性能。

摇树增强功能和建议

在版本 2.6.0 中,SDK 已弃用并删除了这些静态帮助程序类的内部用法,以提高对树摇算法的支持。 此更改允许 npm 包安全地删除未使用的代码。

  • CoreUtils
  • EventHelper
  • Util
  • UrlHelper
  • DateTimeUtils
  • ConnectionStringParser

这些函数现在作为模块的顶层导出提供,从而使你能够更轻松地重构代码,以获得更好的 Tree Shaking 优化效果。

静态类现在是引用新导出函数的常数对象。

摇树已弃用的函数和替换项

本节仅适用于使用已弃用函数且希望优化软件包大小的情况。 若要减小大小并支持所有版本的Internet Explorer,请使用替换函数。

现存 替代功能
CoreUtils @microsoft/applicationinsights-core-js
CoreUtils._canUseCookies 无。 请勿使用此函数,因为它会导致最终代码中包含所有 CoreUtils 引用。
重构 Cookie 处理,以使用 appInsights.getCookieMgr().setEnabled(true/false) 设置值,使用 appInsights.getCookieMgr().isEnabled() 检查 值。
CoreUtils.isTypeof 类型判断
CoreUtils.isUndefined (检查是否未定义) 未定义状态 (isUndefined)
CoreUtils.isNullOrUndefined isNullOrUndefined
CoreUtils.hasOwnProperty hasOwnProperty
CoreUtils.isFunction isFunction
CoreUtils.isObject isObject
CoreUtils.isDate isDate
CoreUtils.isArray isArray
CoreUtils.isError isError
CoreUtils.isString isString
CoreUtils.isNumber isNumber(判断是否为数字)
CoreUtils.isBoolean isBoolean
CoreUtils.toISOString toISOString 或 getISOString
CoreUtils.arrForEach arrForEach
CoreUtils.arrIndexOf arrIndexOf
CoreUtils.arrMap arrMap
CoreUtils.arrReduce arrReduce
CoreUtils.strTrim strTrim
CoreUtils.objCreate objCreateFn
CoreUtils.objKeys objKeys
CoreUtils.objDefineAccessors 对象定义访问器
CoreUtils.addEventHandler 添加事件处理器
CoreUtils.dateNow 当前日期
CoreUtils.isIE isIE
CoreUtils.disableCookies (禁用 cookies) disableCookies
引用任一函数会导致引用 CoreUtils 以实现向后兼容性。
重构您的 Cookie 处理逻辑,改为使用 appInsights.getCookieMgr().setEnabled(false)
CoreUtils.newGuid newGuid
CoreUtils.perfNow perfNow
CoreUtils.newId 新ID
CoreUtils.randomValue 随机值
CoreUtils.random32 random32
CoreUtils.mwcRandomSeed mwcRandomSeed
CoreUtils.mwcRandom32 mwcRandom32
CoreUtils.generateW3CId 生成W3C标识
EventHelper @microsoft/applicationinsights-core-js
EventHelper.Attach attachEvent
EventHelper.AttachEvent attachEvent
EventHelper.Detach detachEvent
EventHelper.DetachEvent detachEvent
Util @microsoft/applicationinsights-common-js
Util.NotSpecified strNotSpecified
Util.createDomEvent createDomEvent
Util.禁用存储 utlDisableStorage
Util.isInternalApplicationInsightsEndpoint isInternalApplicationInsightsEndpoint (是否内部应用洞察终端)
Util.canUseLocalStorage utlCanUseLocalStorage
Util.getStorage utlGetLocalStorage
Util.setStorage utlSetLocalStorage
Util.removeStorage utlRemoveStorage
Util.canUseSessionStorage utlCanUseSessionStorage
Util.getSessionStorageKeys utlGetSessionStorageKeys
Util.getSessionStorage utlGetSessionStorage
Util.setSessionStorage utlSetSessionStorage
Util.removeSessionStorage(移除会话存储) utlRemoveSessionStorage
Util.disableCookies disableCookies
引用任意一项都会导致引用 CoreUtils 以实现向后兼容性。
重构您的 Cookie 处理逻辑,改为使用 appInsights.getCookieMgr().setEnabled(false)
Util.canUseCookies canUseCookies
引用任意一项都会导致引用 CoreUtils 以实现向后兼容性。
重构您的 Cookie 处理逻辑,改为使用 appInsights.getCookieMgr().isEnabled()
工具.禁止SameSite为None uaDisallowsSameSiteNone
Util.setCookie coreSetCookie
进行引用时,为了保持向后兼容性,会同时引用 CoreUtils。
重构您的 Cookie 处理逻辑,改为使用 appInsights.getCookieMgr().set(name: string, value: string)
Util.stringToBoolOrDefault stringToBoolOrDefault(字符串转布尔或默认)
Util.getCookie coreGetCookie
进行引用时,为了保持向后兼容性,会同时引用 CoreUtils。
重构您的 Cookie 处理逻辑,改为使用 appInsights.getCookieMgr().get(name: string)
Util.deleteCookie(删除Cookie) coreDeleteCookie
进行引用时,为了保持向后兼容性,会同时引用 CoreUtils。
重构您的 Cookie 处理逻辑,改为使用 appInsights.getCookieMgr().del(name: string, path?: string)
Util.trim strTrim
Util.newId 新ID
Util.random32 ---
无替换,重构代码以使用核心 random32(true)
Util.generateW3CId 生成W3C标识
Util.isArray isArray
Util.isError isError
Util.isDate isDate
Util.toISOStringForIE8 toISOString
Util.getIEVersion getIEVersion(获取IE版本)
Util.msToTimeSpan msToTimeSpan
Util.isCrossOriginError isCrossOriginError(跨域错误)
Util.dump dumpObj
Util.getExceptionName 获取异常名称 (getExceptionName)
Util.addEventHandler attachEvent
Util.IsBeaconApiSupported BeaconApi是否支持
Util.getExtension getExtensionByName
UrlHelper @microsoft/applicationinsights-common-js
UrlHelper.parseUrl urlParseUrl
UrlHelper.获取绝对网址 urlGetAbsoluteUrl
UrlHelper.getPathName urlGetPathName
UrlHelper.getCompeteUrl urlGetCompleteUrl
UrlHelper.parseHost urlParseHost
UrlHelper.parseFullHost urlParseFullHost
DateTimeUtils @microsoft/applicationinsights-common-js
DateTimeUtils.Now dateTimeUtilsNow
DateTimeUtils.GetDuration dateTimeUtilsDuration
ConnectionStringParser @microsoft/applicationinsights-common-js
ConnectionStringParser.parse 解析连接字符串

服务通知

SDK 包含提供可操作建议的服务通知,以帮助确保遥测流不间断地流向 Application Insights。 在 Application Insights 中,将通知视为异常消息。 SDK 确保通知基于 SDK 设置与你相关,并根据建议的紧迫性调整详细程度。 保持服务通知开启,但你也可以通过 featureOptIn 配置选择不接收。

目前,不会发送任何活动通知。

JavaScript SDK 管理服务通知,并定期轮询公共 JSON 文件来控制和更新这些通知。 要禁用 JavaScript SDK 进行的轮询,请禁用 featureOptIn 模式

故障排除

请参阅专用疑难解答文章

后续步骤