JavaScript 代理程序 API

JavaScript 代理可在受监控的网站上公开 API。 您的网站可以与 JavaScript 代理的应用程序接口交互,以丰富或配置所收集的数据、发送自定义事件等。

JavaScript 代理 API 和 Web REST API 是不同的。 Web REST API 可用于对收集到的数据进行查询和配置新网站。

全局对象

Instana JavaScript 代理定义了一个新的全局函数,名为 ineum。 此函数在 HTML 文档中的 JavaScript 片段之后立即可用。 这意味着,即使代理本身没有被下载,功能也是存在的。 这样做是为了让 ineum API 调用变得简单高效。

当代理尚未下载时, ineum 会对所有已执行的 API 调用进行排队。 代理下载完成后,这些 API 调用将按照调用顺序同步执行。 从这一点出发, ineum 被一个立即执行 API 调用的函数所取代。

API 结构

所有 ineum 调用的结构如图所示:

ineum(commandName, ...args);

参数

下表列出了参数:

表 1. 参数
参数 描述
commandName (string) 标识要执行的命令。 例如,设置元数据或报告错误。
...args 此特定命令的实际参数。 参数的数量和类型因命令而异。

函数 ineum 从不返回任何内容(命令 getPageLoadId 除外)。

TypeScript 类型定义

TypeScript 用户可以安装和使用由 DefinitelyTyped 项目提供的类型定义。

npm install --save @types/ineum

API

以下各节介绍了可用的命令名称及其参数。

监测关键

可通过 key 命令设置监控密钥。 在 Instana 用户界面配置网站时,可以看到监控密钥。

ineum('key', trackingKey);

参数

下表列出了参数:

表 2. 参数
参数 描述
trackingKey (string) Instana 中 Web 站点配置的监视键。

示例

正确的配置显示在 Instana 用户界面上。

切换监控键

在 Instana 中将每个环境(生产、暂存和测试)建模为唯一的网站,以便根据部署情况为 JavaScript 代理配置不同的监控密钥。 如果监控密钥已经可用,请将监控密钥存储在配置管理系统中,并使用存储的值替换监控密钥。

如果网站纯粹由静态文件组成,或者没有配置管理系统,可以选择使用 Google Tag Manager 等工具,帮助管理网站的代码片段。 或者,您也可以选择对监控键进行硬编码,并在网络浏览器中执行检查。

if (window.location.hostname === 'example.com') {
  ineum('key', 'production monitoring key');
} else if (window.location.hostname === 'qa.example.com') {
  ineum('key', 'QA monitoring key');
} else {
  ineum('key', 'test monitoring key');
}

报告 URL

信标通过 HTTP GET 和 POST 传输到报告 URL ,将监测数据传送到 Instana。

ineum('reportingUrl', reportingUrl);

参数

下表列出了参数:

表 3. 参数
参数 描述
reportingUrl (string) 发送网站监控数据的 URL。

示例

SaaS 产品用户可在 Instana 用户界面上看到正确的配置。 内部部署用户需要根据其配置的 EUM 端点识别正确的 URL。

多个后端

在某些情况下,可能需要让 JavaScript 代理向多个后端报告。 在这种情况下,使用 reportingBackends 命令使 JavaScript 代理向多个后端报告。

ineum('reportingBackends', reportingBackends);

参数

下表列出了参数:

表 4. 参数
参数 描述
reportingBackends (ReportingBackend[]) ReportingBackend 对象的数组。 每个对象都定义了发送网站监控数据的后台。

ReportingBackend 对象如图所示:

{
  reportingUrl: 'http://example.com',  // The URL to which to send website monitoring data to.
  key: 'monitoring key'                // The monitoring key for the website configuration in Instana.
}

Instana 230 版及更高版本可使用 reportingBackends 命令。

示例

ineum('reportingBackends', [
      { reportingUrl: 'http://backend1.example.com', key: 'monitoring key 1' },
      { reportingUrl: 'http://backend2.example.com', key: 'moniroting key 2' }
    ]);

reportingBackends 命令优先于 reportingUrl 命令。 reportingBackends 命令调用后,任何 reportingUrl 命令调用都将被忽略。

页面

Instana 可按逻辑页面细分网站指标。 为此,它需要关于用户正在查看的页面的提示。 该页面名称可通过 page 命令设置。 尽早设置 page 。 您可以更改 page 来呈现文档更改(例如,单页应用程序)。 这使得 Instana 除了可以跟踪页面加载之外,还可以跟踪页面转换

ineum('page', pageName);

除了在页面加载阶段首次调用此 API 外,只要通过 API 更改页面名称,就会记录页面转换事件。

要定义页面,请使用 product detail pagepayment selection 这样的逻辑名称,而不是 window.titlewindow.href。 使用 product detail pagepayment selection 会减少与现有代码直接相关的页面。 而使用 window.titlewindow.href 则会产生许多跟踪页面,这些页面在大多数情况下都能提供价值,因为 window.title 包含产品名称。

Instana 提供了示例项目 ,展示如何为各种框架和库收集有意义的页面名称。 为缺失的框架或库提出拉取或支持请求。

参数

下表列出了参数:

表 5. 参数
参数 描述
pageName (string) 页面的名称。

示例

ineum('page', 'shopping-cart');

// Do you want to change meta data and the page name at the same time?
// Make sure to change the page name last as this immediately
// triggers a page transition beacon.
ineum('meta', 'product', 'skateboard');
ineum('page', 'article-details');

自动检测页面

Instana 的网站监控功能可自动检测单页网络应用程序的页面变化。 自网站 JavaScript agent 1.7.1 起支持该功能。

自动页面检测用于跟踪和记录页面转换事件,该功能默认为禁用。 要启用自动页面检测功能,请使用以下方法之一:

  • 在 HTML 头部添加 autoPageDetection API 命令。

  • 使用以下命令配置网站自动仪器

    ineum('autoPageDetection', enabled);
    
参数

下表列出了参数:

表 6. 参数
参数 描述
enabled (boolean) 要启用自动页面检测功能
示例
ineum('autoPageDetection', true);
// page changes will be detected once set to true
设置逻辑页面名称和 regex 映射

您可以使用 mappingRule 参数设置逻辑页面名称,该名称提供了一个正则表达式数组,用于映射 URL 更改,并用提供的名称进行替换。

ineum('autoPageDetection', {mappingRule: [[/.*urlRegex.*/i, 'Page Name']]});

要将文档标题设置为页面名称,必须启用 titleAsPageName 参数 true

ineum('autoPageDetection', {titleAsPageName: true});

如果配置网站自动检测以启用自动页面检测,默认情况下会将 URL 路径设置为页面名称。

启用自动页面检测并发生 popstate 事件时, JavaScript 代理会根据 popstate 事件检查页面转换。 当您使用浏览器的前进和后退按钮进行导航时,通常会发生 popstate 事件。 一些应用程序(包括静态内容应用程序)可能要求代理忽略 popstate 事件,因为这些事件会产生错误的页面转换。 当 ignorePopstateEvent 参数设置为 true 时, JavaScript 代理会忽略页面更改的 popstate 事件。

ineum('autoPageDetection',  {ignorePopstateEvent: true});
参数

下表列出了参数:

表 7. 参数
参数 描述
mappingRule (RegExp[], string) 一个 RegExp 对象数组,该数组与页面更改的 URL 匹配,并被所提供的字符串替换。 如果映射结果为空,则忽略此转换。 如果 titleAsPageName 设置为 true,则不提供映射规则。
titleAsPageName (boolean) 如果设置为 "true",则在页面转换信标中使用文档标题作为页面名称。 如果设置为 false,页面 URL 或映射规则将被用作页面转换信标中的页面名称。
ignorePopstateEvent (boolean) 如果设置为 "true", JavaScript 代理会忽略浏览器在检测页面转换时产生的 popstate 事件。
示例

例如,如果您的 URL 包含 https://example.com/accounts/checkUserDetails ,那么您可以在 Instana UI 中看到页面过渡到页面 User Details

ineum('autoPageDetection',  {mappingRule: [[/.*checkuserdetails.*/i, 'User Details']]});
// Matches the regex and sets page name as User Details
// .*checkuserdetails.* matches the characters in the URL while 'i' modifier represents a case insensitve match.

此外,您还可以设置更复杂的页面名称,如下例所示:

ineum('autoPageDetection',  {mappingRule: [[/.*product[0-9]+contains-[A-Za-z]+-productID-account-([A-Za-z].*)\1+/, 'Product Page : id $1'],[/.*aboutPage.*-([A-Za-z].*)/, 'About Page id: $1']]});

标识用户

用户特定信息可以选择与传输到 Instana 的数据一起发送。 然后可以使用此信息解锁更多功能,例如:

  • 计算受错误影响的用户数量
  • 过滤特定用户的数据
  • 查看哪个用户启动了页面加载或 Ajax 调用。

缺省情况下,Instana 不会将任何用户可标识信息与信标关联。 当您选择这样做时,请注意相关的数据保护法律。 在 Instana 中,用户 ID 是一个透明的 string ,仅用于计算某些指标。 因此,用户的身份识别是通过用户 ID 来完成的。 userNameuserEmail 也可用于访问更多过滤器和有效展示用户信息。

已经传送到Instana服务器的数据不能追溯更新。 因此,必须在页面加载过程中尽快调用此 API。

在页面加载过程中同步调用此 API,例如在服务器端将信息渲染到 HTML 文档中,有助于确保所有信标都携带用户信息,确保唯一用户或受影响用户的统计数据正确无误,并在分析时对信标进行正确过滤和分组。

ineum('user', userId, userName, userEmail);

参数

下表列出了参数:

表 8. 参数
参数 描述
userIdstring,可选) 这是用户的标识。
userNamestring,可选) 用户名。
userEmailstring,可选) 此用户的电子邮件地址。

对于您不希望设置的值,可以传递 nullundefined

示例

// Report everything to Instana
ineum('user', 'hjmna897k1', 'Tom Mason', 'tom@example.com');

// or only some data points
ineum('user', 'hjmna897k1');
ineum('user', null, null, 'tom@example.com');

会话跟踪

会话跟踪可用于深入了解终端用户在页面加载过程中的活动。 会话跟踪特别使 Instana 能够在没有定义用户信息的情况下确定最终用户的影响。

要跟踪会话, JavaScript 代理在调用 localStorage 浏览器 API 调用 trackSessions 。 从技术上讲,会话是一个随机 ID,与两个时间戳一起存储在浏览器的 localStorage 中,密钥为 in-session

遵守隐私法规的责任由此 API 的调用者承担。

初始化/重复使用会话

该应用程序接口会启动一个新会话,或尽可能重用现有会话。

ineum('trackSessions', sessionInactivityTimeout, sessionTerminationTimeout);
参数

下表列出了参数:

表 9. 参数
参数 描述
sessionInactivityTimeoutnumber,可选) 描述自最近一次 trackSessions 调用以来会话保持活动状态的时间(以毫秒为单位)。 缺省值为 3 小时。
sessionTerminationTimeoutnumber,可选) 描述自第一次 trackSessions 调用以来会话保持活动状态的时间(以毫秒为单位)。 缺省值为 6 小时。

对于您不希望设置的值,可以传递 nullundefined

示例
// Starts tracking sessions with the default timeouts
ineum('trackSessions');

// or specify custom timeouts
ineum('trackSessions', 900000 /* 15min */, 3600000 /* 1h */);

终止会话

终止当前运行的会话(如果有),并从 localStorage 中删除存储的数据。

ineum('terminateSession');
示例
// Starts tracking sessions with the default timeouts
ineum('trackSessions');

// after some time…
ineum('terminateSession');

元数据

元数据可用于注释页面加载和 Ajax 调用。 使用元数据来跟踪用户界面配置值、设置、功能标志或任何对分析有用的附加上下文。

ineum('meta', key, value);

参数

下表列出了参数:

表 10. 参数
参数 描述
key (string) 要添加为元数据的“键/值”对的key
value (string) 要添加为元数据的“键/值”对的value

示例

ineum('meta', 'version', '1.42.3');
ineum('meta', 'role', 'admin');

页面加载后台跟踪 ID

作为页面加载的一部分,可以定义一个后台跟踪 ID,以便进行前端或后台关联。 更多信息,请参阅后台相关性。 需要定义后端跟踪 ID,以便在页面加载的后端和前端处理之间建立关联。 XMLHttpRequestfetch 请求之间的相关性并不需要它。 跟踪 ID 必须是 16 或 32 个字符的十六进制字符串。

ineum('traceId', traceId);

参数

表 11. 参数
参数 描述
traceId (string) 关联的后端跟踪的跟踪标识。

示例

ineum('traceId', '89jkbds891jkn321');

将 URL 排除在跟踪之外

您可以使用此 API 定义多种正则表达式。 如果至少有一个匹配,则不会向 Instana 传输数据。 正则表达式在以下情况下进行评估:

  • 根据文档的 URL(地址栏中可见的 URL,即 window.location.href )进行评估。当其中一个正则表达式匹配时,所有向 Instana 传输的数据都将被禁用。
  • 根据资源的 URL(例如 JavaScript 和 CSS 文件的 URL)进行评估。 与正则表达式之一匹配的资源信息不会传输到 Instana。
  • 根据 HTTP 调用的目标 URL 进行评估,例如通过 XMLHttpRequestfetch。 与正则表达式之一相匹配的 HTTP 调用信息不会传送给 Instana。
ineum('ignoreUrls', ignoreUrls);

Instana 还支持从文档 URL(即浏览器地址栏中可见的 URL )中剥离秘密(请参阅秘密 API)。 但要注意的是,存储在文档 URL 中的秘密几乎会泄露给所有第三方。 我们有一个具有描述的专用示例应用程序,它显示了存储在文档 URL 中的私钥容易泄露给所有第三方的原因。 更多详情,请参阅本示例应用程序和说明。 不过,您可以选择忽略通过此 API 对这些 URL 收集的所有监控数据。

参数

下表列出了参数:

表 12. 参数
参数 描述
ignoreUrls (RegExp[]) RegExp 对象的数组,匹配您要忽略的 URL。

示例

ineum('ignoreUrls', [
  /\/comet.+/i,
  /\/ws.+/i,
  /.*(&|\?)secret=.*/i
]);

重新编辑 URL 中的秘密

收集到的 URL 中的查询参数可能包含敏感数据。 因此, JavaScript 代理支持为其值被编辑的查询参数键指定模式。 Redaction 发生在 JavaScript 代理中,即网络浏览器中。 因此,秘密无法到达 Instana 服务器进行处理,也无法在用户界面中进行分析或通过 API 进行检索。

ineum('secrets', secrets);

如果查询参数与列表中的条目匹配,那么会编辑该值,并且不会将其发送到 Instana 后端。 如果未定义 ineum('secrets'),那么缺省情况下 Instana 会使用 [/key/i, /secret/i, /password/i] 作为匹配规则。

参数

下表列出了参数:

表 13. 参数
参数 描述
secrets (RegExp[]) RegExp 对象的数组,这些对象的值与查询参数键名相匹配,并被视为机密。

示例

ineum('secrets', [/account/i, /user/i]);

例如,收集 https://example.com/accounts/status?account=acount_name&user=user_name 并显示为 https://example.com/accounts/status?account=<redacted>&user=<redacted>

JavaScript 代理支持将路径参数 (/account/<account id>/status) 或矩阵参数 (/account;accountId=<account id>/status) 视为机密。

存储在文档 URL 中的秘密几乎会泄露给所有第三方。 如需了解更多信息,请参阅附有说明的专用示例应用程序 ,了解为什么存储在文档 URL 中的秘密容易泄露给所有第三方。

编辑 URL 片段

收集到的 URL 片段可能包含敏感信息。 因此, JavaScript 代理支持根据 URL 路径指定可编辑的片段值模式。 这种编辑是在网络浏览器 JavaScript 代理中进行的。 因此,敏感信息无法到达 Instana 服务器进行处理。 敏感信息仍无法通过用户界面进行分析或通过应用程序接口进行检索。

ineum('fragment', fragment);

如果 URL 路径的某个片段与列表中的某个条目相匹配,该片段值将被编辑,不会发送到 Instana 后台。 默认情况下,Instana 不会编辑 URL 片段。

参数

下表列出了参数:

表 14. 参数
参数 描述
fragment (RegExp[]) 一个数组,包含与 URL 路径匹配的 RegExp 对象,其片段已被编辑。

示例

ineum('fragment', [/example.com/i]);

例如,收集 https://example.com/accounts/status?account=acount_name#fragmentinformation 并显示为 https://example.com/accounts/status?account=acount_name#<redacted>

将用户计时排除在跟踪之外

Instana 可自动收集通过用户计时应用程序接口(User-Timing API )进行的标记和测量,并将其转化为自定义事件。 这意味着,用户计时 API 可以用作向 Instana 报告纯计时数据的与供应商无关的方式。

通过使用用户计时 API,您可以定义多个正则表达式,当至少有一个正则表达式匹配时,就不会产生特定用户计时集合。 默认情况下,以下条件将被忽略:

  • React 的用户计时:以 ⚛️ 或 ⛔ 表情符开头的标记和计量单位
  • Angular 的用户计时:以 Zone
  • 名称以 start end
ineum('ignoreUserTimings', ignoreUserTimings);

参数

下表列出了参数:

表 15. 参数
参数 描述
ignoreUserTimings (RegExp[]) 与您要忽略的用户计时标记和度量的名称匹配的 RegExp 对象的数组。

示例

ineum('ignoreUserTimings', [
  /^\u269B/,
  /^\u26D4/,
  /^Zone(:|$)/,
  /mySecretTiming/i
]);

从跟踪中排除 URL 查询参数和片段

默认情况下, JavaScript 代理会收集完整的 URL ,其中包括所有参数。 您可以配置代理只收集与指定正则表达式列表匹配的 URL 的参数。 不跟踪排除 URL 的参数。

根据所提供的正则表达式列表, JavaScript 代理会对 URL 进行如下跟踪:

  • 如果 URL 与列表中的一个条目匹配,则会收集包括所有参数在内的整个 URL。
  • 如果 URL 与列表中的条目不匹配,则不会向 Instana 后台发送查询参数和 URL 的片段。
  • 如果所提供的列表为空,则应用默认行为,并跟踪带有参数的完整 URL。
ineum('queryTrackedDomainList',queryTrackedDomainList);

如果 URL 中包含通过 ineum('secrets', secrets)ineum('fragment', fragment) 编辑的秘密或片段,以下情况将予以说明:

  • 如果 URL 与 queryTrackedDomainList 中的条目相匹配,则整个 URL 和经编辑的密文或片段会被发送到 Instana 后台。
  • 如果 URL 与 queryTrackedDomainList 中的条目不匹配,则在向 Instana 后台发送 URL 之前,会排除所有参数。

参数

参数 描述
queryTrackedDomainList (RegExp[]) 与要跟踪的 URL 名称(包括其所有参数)相匹配的 RegExp 对象数组。

示例

在下面的示例中,与 regex /\/comet.+/i/\/ws.+/i/example.com/i 匹配的 URL 将连同其参数一起全部收集:

ineum('queryTrackedDomainList', [
  /\/comet.+/i,
  /\/ws.+/i,
  /example.com/i
]);

支持 W3C 跟踪头,用于后端关联

当浏览器向远程服务器发送请求,而 Instana 代理监控远程服务器时,服务器的响应可能包含 HTTP 标头 Server-Timing,以便向浏览器中运行的 Instana 代理提供 backendTraceId 。 如果远程服务器启用了 OpenTelemetry ,则 tracestate HTTP 标头可包含 backendTraceId

tracestatetraceparent 是 W3C-defined 标头,用于关联分布式跟踪 ID。 有关 W3C 跟踪头的更多信息,请参阅跟踪上下文级别

如果预计远程服务器可以使用 OpenTelemetry 并在 tracestate 标头中提供 backendTraceId ,那么浏览器中的 Instana 代理就必须将 enableW3CHeaders API 设置为 true,以使用 W3C 标头中的 backendTraceId 值。

您可以在三个不同的地方设置 backendTraceId :通过 Server-Timing 标头、 tracestate 标头,以及使用浏览器中的 traceId API 手动设置。 这些方法的顺序如下

  • 如果启用了 enableW3CHeaders ,则有两种选择。 首先,从当前页面的元数据 traceparent 中提取 tracestate 值并使用它。 如果无法检索 tracestate ,则会生成并使用与 W3C 跟踪上下文兼容的 16 个字符的长字符串。
  • 如果 enableW3CHeaders 已禁用,请首先验证是否调用了 traceId API。 如果调用 traceId API,则使用 ID 作为 backendTraceId。 如果未调用 traceId API,则解析 HTTP 标头 Server-Timing 以获取 backendTraceId
  • 如果上述值都不可用,则无法将信标与后台跟踪相关联。
ineum('enableW3CHeaders',true);

参数

下表列出了参数:

表 23. 参数
参数 描述
enabled (boolean) 用于禁用或启用此功能的标志。

示例

下面的示例显示 W3C 标头已启用:

ineum('enableW3CHeaders', true);

配置页面加载后的最大等待时间

要收集更多指标, JavaScript 代理会等待,直到符合以下条件。 例如,首次输入延迟和累积布局偏移。

  • 可提供所有指标
  • 页面已卸载(例如标签已关闭)
  • 直到最长等待时间结束

您可以使用此 API 来重新配置最大等待时间。 默认情况下,Instana 会在页面加载完成(即 onLoad 事件结束)后最多等待一秒钟。

ineum('maxMaitForPageLoadMetricsMillis', durationMillis);

参数

下表列出了参数:

表 16. 参数
参数 描述
durationMillis (数量) 页面加载完成后,传输页面加载信标前的最长等待时间(毫秒)。

示例

ineum('maxMaitForPageLoadMetricsMillis', 500);

读取页面加载 ID

有时,手动接收页面加载的 ID 会很有用,例如,当需要进行自定义关联时。 该函数返回 undefined ,直至 JavaScript 代理未加载。 JavaScript 代理加载后,总是返回相同的 string

ineum('getPageLoadId');

退货

stringundefined 形式的页面装入标识。

示例

var pageLoadId = ineum('getPageLoadId');
console.log(pageLoadId);

错误跟踪

手动错误报告

可以报告捕获的错误。 这可用于将 Instana 与捕获到未捕获错误的框架和库集成。

ineum('reportError', error, opts);
参数

下表列出了参数:

表 17. 参数
参数 描述
errorErrorstring JavaScript Error 对象或错误消息。
optsErrorReportingOpts,可选) 对象的外观如下
{
  componentStack: '...' // an optional string

  meta: {               // An optional JavaScript object with `string` values which can be used
    widgetType: 'chart' // to send metadata to Instana just for this singular event. In contrast to
  }                     // the usage of the metadata API, this metadata is not included in subsequent
                        // beacons.
}
示例
ineum('reportError', new Error('Something failed'), {
  componentStack: '…',
  meta: {
    widgetType: 'chart'
  }
});
React 集成

将 JavaScript 代理与 React 错误边界集成后,可以获得更好的错误洞察力。 具体来说,除了错误(函数)堆栈跟踪外,还可提供组件堆栈跟踪。

以下代码片段显示了如何扩展 React 的 componentDidCatch 以实现此集成。 有关 componentDidCatch 生命周期的更多信息,请参阅 React 文档

componentDidCatch(error, info) {
  ineum('reportError', error, {
    componentStack: info.componentStack
  });

  // your regular error boundary code
}
Angular 2+ 集成

Angular 默认会捕获所有错误并将其记录到控制台。 这意味着 JavaScript 代理无法访问这些错误。 以下 TypeScript 片段显示如何将 Angular 捕获的错误与 Instana 集成。

有关 Angular 错误处理程序的更多信息,请参阅 Angular 文档

import { ErrorHandler, NgModule } from '@angular/core';

class CustomErrorHandler implements ErrorHandler {
  handleError(error) {
    ineum('reportError', error);

    // Continue to log caught errors to the console
    console.error(error);
  }
}

@NgModule({
  providers: [{ provide: ErrorHandler, useClass: CustomErrorHandler }],
})
class MyModule {
  // the rest of your application code…
}
Vue 集成

Vue 可以为应用程序传播的未捕获错误指定一个全局处理程序。 下面的代码片段展示了如何将 Vue 的错误处理与 Instana 集成。

有关 Vue 错误处理程序的更多信息,请参阅 Vue 文档

app.config.errorHandler = (err, instance, info) => {
  ineum('reportError', err);
  // your regular error handling code
}

从跟踪中排除错误

可以明确阻止向 Instana 报告某些错误。 这可用于忽略已知或无法修复的错误。

ineum('ignoreErrorMessages', ignoreErrorMessages);
参数

下表列出了参数:

表 18. 参数
参数 描述
ignoreErrorMessages (RegExp[]) 一个 RegExp 对象数组,用于匹配要从错误跟踪中排除的错误。
示例
ineum('ignoreErrorMessages', [/^script error/i]);

洞察脚本错误

嵌入许多第三方脚本的网站通常会遇到稳定的 Script Errors。 Instana 提供了关于如何访问这些错误的指导 ,即如何访问真实的错误信息和堆栈。 有时,您可能无法遵循这些说明,例如因为第三方没有添加必要的 Access-Control-Allow-Origin 标头。 对于这些情况,Instana 提供了其他方法来提高对 Script Errorss 的洞察力。

这种机制并非灵丹妙药。 它提高了您的可视性,并且您遇到了更有用的跟踪错误,但是您仍然会看到(减少了)Script Error。 更多信息,请参阅跨来源指南

明确跟踪 DOM 事件监听器错误

这样,Instana 代理就会进入每个 DOM 事件监听器的调用堆栈。 Instana 代理会自动在事件监听器的函数周围添加 try/catch 语句。 这样可以更深入了解跨源错误。

缺省情况下,此功能处于禁用状态,因为对于大多数客户而言,该值值得怀疑。 此外,由于网络浏览器已开始修补网络安全模型中的这一漏洞,因此无法保证通过这种方法收集到有关脚本错误的更多信息。

ineum('wrapEventHandlers', enabled);
参数

下表列出了参数:

表 19. 参数
参数 描述
enabled (boolean) 用于禁用或启用此功能的标志。
示例
ineum('wrapEventHandlers', true);
明确跟踪计时器错误

这样,Instana 代理就会进入所有计时器的调用堆栈。 Instana 代理会自动在定时器处理程序的函数周围添加 try/catch 语句。 这样可以更深入了解跨源错误。

缺省情况下,此功能处于“禁用”状态,因为对于大多数客户而言,该值值得怀疑。 此外,由于网络浏览器已开始修补网络安全模型中的这一漏洞,因此无法保证通过这种方法收集到有关脚本错误的更多信息。

ineum('wrapTimers', enabled);
参数

下表列出了参数:

表 20. 参数
参数 描述
enabled (boolean) 禁用或启用此功能的标志。
示例
ineum('wrapTimers', true);
忽略脚本错误

如果使用前面提到的任何机制都无法深入了解脚本错误,则可能需要阻止向 Instana 报告这些错误。 这有助于确保错误统计数据保持可操作性。 要阻止将脚本错误报告到 Instana,可以使用以下片段。

ineum('ignoreErrorMessages', [/^script error/i]);

报告自定义事件

有关全局自定义事件的更多信息,请参阅事件页面

自定义事件可以向 Instana 报告非标准活动、重要交互和自定义时间。 这对分析未捕获错误(面包屑)和跟踪更多性能指标特别有用。

ineum('reportEvent', eventName, {
  duration: duration,
  timestamp: timestamp,
  backendTraceId: backendTraceId,
  error: error,
  componentStack: componentStack,
  meta: meta,
  customMetric: customMetric
});

参数

下表列出了参数:

表 21. 参数
参数 描述
eventName (string) 定义网站上发生的可能导致自定义信标传输的事件类型。
timestampnumber可选 时间戳表示事件发生的时间。 未定义时回退到now() - duration
durationnumber可选 事件持续的时间(以毫秒为单位)。
backendTraceIdstring可选 使用此参数可将信标与后端跟踪关联。 其值必须是 16 或 32 个字符的十六进制字符串。
errorError可选 JavaScript 错误对象,以提供更多上下文信息。 如果要报告发生了错误,请使用专用的错误报告 API
componentStackstring可选 表示组件层次结构的字符串。 通常由基于组件的框架提供。
metaobject可选 JavaScript 对象,包含 string 值,可用于向 Instana 发送此单一事件的元数据。 与元数据 API 的使用情况相比,此元数据不包含在后续信标中。
customMetricnumber可选 自定义度量数据,精度可达小数点后四位。 请勿在此指标中包含敏感信息。

示例

ineum('reportEvent', 'login');

ineum('reportEvent', 'full example', {
  timestamp: Date.now(),
  duration: 42,
  backendTraceId: '31ab91fc109223fe',
  error: new Error('whooops – sorry!'),
  componentStack: 'a component stack',
  meta: {
    state: 'running'
  },
  customMetric: 123.2342
});

跨源请求后台相关性

Instana 的后台相关性通过在 XMLHttpRequest / fetch 请求上设置自定义头来实现。 JavaScript 代理会设置这些标头,然后由服务器读取。 在浏览器中,同一源策略限制了定制头的传输。 更具体地说,自定义标头只能针对同源请求或允许传输自定义标头的其他源请求进行设置。 例如,默认情况下,由 https://example.com:443 提供服务的网站不能将 XMLHttpRequests 转至 https://shop.example.com:443 ,因为这是两个不同的来源。

要解决此安全限制,请使用跨源资源共享 (CORS)。 使用 CORS 时,可以允许源进行跨源资源访问。 如果已在应用程序中具有跨源资源访问权,那么您很可能已使用某些 CORS 头。

要启用 Instana 后台相关性,请完成以下步骤:

  1. 通过在服务器端使用以下头进行响应,允许将 Instana 的关联头用于跨源请求。

    对于预检请求和常规请求,服务器都必须使用这些标头进行响应。 预检请求(可通过 OPTIONS HTTP 方法识别)由浏览器执行,以验证是否可向服务器发出请求。

    Access-Control-Allow-Origin: https://your-origin.example.com
    Access-Control-Allow-Headers: X-INSTANA-T, X-INSTANA-S, X-INSTANA-L
    
  2. 通知 JavaScript 代理 CORS 已正确配置,它必须设置这些相关标头:

    ineum('allowedOrigins', urls);
    

参数

下表列出了参数:

表 21. 参数
参数 描述
urls (RegExp[]) 与允许的 URL 匹配的 RegExp 对象的数组。

allowedOrigins 命令适用于 Instana 185 版及更高版本。 在旧版本中使用别名 whitelistedOrigins

别名

whitelistedOrigins 命令是 allowedOrigins 的弃用别名。

示例

ineum('allowedOrigins', [/.*api\.example\.com.*/]);

检查应用程序在这些更改后是否正常工作。 在服务器端未配置 CORS 的情况下,指示 JavaScript 代理添加后台相关标头(即允许来源),很有可能会破坏您的网站!

捕捉 HTTP 请求或响应标头

JavaScript 代理可捕获 HTTP 请求或 XMLHttpRequestfetch 请求的响应标头。 可以定义您希望 JavaScript 代理程序通过 captureHeaders 命令捕获的 HTTP 头。

在浏览器中,同一源策略会限制对定制头的访问。 在没有跨源资源共享 (CORS) 配置的情况下,JavaScript 代理程序可能无法捕获所有 HTTP 头。 要启用 CORS,请参阅跨源请求后端关联。 使用 CORS 时, JavaScript 代理只能收集满足 CORS 要求的请求或响应标头,以及在 Access-Control-Expose-Headers 中定义的标头。

注:
  • 对于请求中的标头,通常只能捕获添加到 HTTP 请求中的标头,而不能捕获浏览器添加的内置标头。 例如, User-Agent 标头是一个特征字符串,服务器和网络对等体通过它来识别请求用户代理的应用程序、操作系统、供应商和版本。 它由浏览器添加,无法被 JavaScript 代理捕获。
  • 对于响应中的标头,如果没有被跨源策略阻止,服务器端的内置或自定义标头都可以被 JavaScript 代理捕获。

参数

下表列出了参数:

表 22. 参数
参数 描述
captureHeaders (RegExp[]) 一个 RegExp 对象数组,用于匹配希望 JavaScript 代理捕获的 HTTP 请求或响应标头的关键字。

captureHeaders 命令从 Instana 第 216 版开始提供。

示例

ineum('captureHeaders', [/content-type/i]);