网站监控常见问题

您可以查阅网站监控的常见问题解答。

术语

多页应用程序和单页应用程序有什么区别?

在单页应用程序中,浏览器中的内容几乎完全是通过使用 JavaScript 来修改单个HTML文档来实现的。 浏览器仅加载一个页面,通常不会离开该页面。 通常,单页应用程序是通过使用 JavaScript 框架(例如 Angular 和 React )来创建的。 一个采用这种架构的网站示例是 Instana。

在多页应用程序中,应用程序的每个部分都构成一个独立的页面,浏览器必须分别加载这些页面。 这些页面可能包含动态的 JavaScript 元素,但它们并不负责处理应用程序不同部分之间的过渡。 维基百科是一个多页面应用程序 Web 站点的示例。

您所拥有的应用程序类型会影响 Instana 对该应用程序的监控方式。

页面浏览量、加载次数和页面跳转之间有什么区别?

从技术角度来看,单页应用程序和多页应用程序的工作方式不同。 这一差异对于判断性能,进而判断用户体验至关重要。 这些术语有助于传达 Web 站点的使用方式。

  • 页面装入: 检索初始 HTML 文档和所有后续操作,直到浏览器中的下一个导航。 例如,一个需要装入新的 HTML 文档的导航。 通常,网站内容会在服务器端渲染为 HTML,然后发送给用户。 多页面应用程序仅包含页面加载。

  • 页面转换: Web 站点可能会更改用户使用 JavaScript查看的内容。 与页面装入相比,页面转换不使用经典浏览器导航。 通常,新网站内容会通过 JavaScript 加载,然后转换为 HTML。 然后将此 HTML 放入文档中以扩充或替换现有文档。 单页应用程序使用此技术。 对于单页应用程序,页面转换数大于页面装入数。

    当通过 API 更改页面名称时,会触发页面跳转。

  • 页面浏览量: 引入术语页面浏览量是为了判断 Web 站点上的一般活动,而不考虑实现的体系结构。 页面浏览量是页面装入次数和页面转换次数的总和。

什么是信标?

JavaScript 代理会向 Instana 服务器发送轻量级监控数据包,这些数据包记录了网站页面浏览生命周期中发生的特定事件(例如页面加载、资源获取以及 HTTP 请求)。 “信标”一词源自 W3C 信标规范

什么是原点?

源是 Web 安全机制的核心部分。 有关源的更多信息,请参阅跨源资源共享 ( CORS )。 方案(也称为协议)、主机名和端口的组合构成一个源。 请参阅以下示例: URL :

https://shop.example.com/articles/hoverboard/ratings
 

前面的 URL 的起始点为 https://shop.example.com

- Scheme: `https`
- Hostname: `shop.example.com`
- Port: 443 (based on the default for the HTTPS protocol)
 

当所有三个部分 (方案,主机名和端口) 都相等时,两个源相同。 下面的例子都是彼此不平等的:

  • https://shop.example.com
  • http://shop.example.com
  • https://example.com
  • http://example.com

同源和跨源调用或资源共享是提及源时经常使用的术语。 Web 安全机制中的 “同源策略 ”以及跨源资源共享机制是众所周知的。 当源域(HTML 文档的源域)与目标域(API 服务器的源域)不同时,该调用被视为跨域调用,而非同源调用。

“起源”这一概念不应与 “遗址” 这一概念相混淆,尽管两者相似,但在具体应用和意图上却有显著差异。

度量

网站指标代表什么?

大多数 Web 站点度量是从各种 W3C 规范接收的。 具体

Instana 采用了 Web Vitals 项目中的常用网络术语。

Instana 尽可能遵循这一术语。 Instana 使用以下指标:

  • onLoad 时间: 对于每个页面装入,都存在此计时,并对时间进行建模,直到导航完成为止 (即,装入微调器停止)。 它定义为 loadEventEnd - fetchStart (请参阅导航计时)。 在用户界面中, onLoad Time(导航时间)和 onLoad EventTime(事件时间)被明确区分开来,以清晰体现 Instana 用户界面与导航时间规范在术语上的差异。
  • DOM: 在导航计时中定义的计时的变体。 此度量定义为 domContentLoadedEventStart - domLoading (请参阅导航计时)。 它被认为是比导航计时的处理时间更有用的计时击穿。 请参阅下图以了解 DOM 时间。
  • 子代: 在导航计时中定义的计时的变体。 此度量定义为 loadEventEnd - domContentLoadedEventStart (请参阅导航计时)。 它被视为比导航计时的 onLoad 时间更有用的计时细目。 请参阅下图以了解子级时间。

对于 Instana 网站( REST API )的用户,系统会显示一个 API 端点 ,用于了解技术指标 ID(metricId)。该端点响应中引用的指标 ID 可用于通过各种 Instana 网站监控 Web REST API 查询指标。

图 1. 导航计时变化
导航计时变体

为什么某些网站指标有时无法获取,或者显示的数值很奇怪?

最重要的因素是用户交互和 Web 浏览器支持。

在收集度量值的时间范围内,某些度量值需要用户交互,例如, "首次输入延迟"。 如果没有用户交互,那么没有可用的度量值。

第二个重要因素是 Web 浏览器支持。 某些度量需要尚未广泛支持的 Web 浏览器功能,例如,现代 Web vitals。 不受支持的 Web 浏览器功能意味着某些 Web 站点整体,某些页面或单个页面装入可能不包含有关度量值的任何信息 (例如,有关累积布局 Shift)。 不同的 Web 浏览器支持也会造成一些令人困惑的情况。 例如, "第一-内容画" (FCP) 比 "最大-内容画" (LCP) 更受广泛支持。 因此,对一组观测值进行统计汇总后,得到的LCP值会小于FCP值。 虽然很难观察单个页面装入,但如果 Web 浏览器支持存在差异,那么可能会对一组页面装入进行统计聚集,如以下示例所示。

  • 观察到的 First-Contentful Paint 值:1000 ms1400 ms1600 ms。平均值:1333ms
  • 观察到的 Largest-Contentful Paint 值:1000 msUNSUPPORTED METRIC1600 ms。平均值:1300ms

为什么我的一些 HTTP 调用的记录耗时会异常高?

Instana 网站监控使用 记录从请求开始(XMLHttpRequest#send)到成功 readyState === 4事件(XMLHttpRequest#onreadystatechange)之间的时间。 以下因素影响前两个事件之间的时间:

  • HTTP 重定向
  • DNS 查找时间
  • 建立 TCP 或 TLS 连接
  • 服务器响应时间
  • 请求排队时间
  • 延迟和吞吐量
  • 请求和响应大小
  • 页面调速

对于页面调速,浏览器可能会决定对不可见的 Web 页面进行调速甚至停止处理。 页面限流很可能是导致延迟时间过长的原因。 如需了解更多信息,请参阅 Google 关于此主题的博客文章 ,或访问 Mozilla 开发者网络中的“页面可见性”页面: API。

为什么缺少地理信息?

Instana 的网站监控服务基于 IP 地址或地理位置映射来收集地理信息。 IP 地址信息是通过使用逆向代理服务器收集的。 如果网站监控用户界面中缺少地理位置信息,您可以检查 JavaScript 代理的报告地址 URL 是否已配置为绕过反向代理服务器,并直接将数据发送至内部监控端点(通常为 2999)。

作为 Instana Self-hosted(内部部署)设置的一部分,将自动安装逆向代理服务器。 如需了解更多信息,请参阅 《向最终用户公开监控端点》

数据收集

你是如何收集这些信息的?

Instana 的网站监控基于一个名为 weasel 的开源库。 Weasel 从浏览器的导航计时数据( API )中收集信息,并以高效的形式进行传输。 有关 weasel 的更多信息,请参阅 GitHub 上的源代码。

支持哪些浏览器?

JavaScript 代理程序支持所有常用浏览器。 但是,一些 API 和 JavaScript 语言功能在较旧的浏览器中不受支持。 在这些情况下, JavaScript 代理程序可能无法收集所有需要的数据点,例如导航,资源和油柒计时信息。

在旧浏览器 (Internet Explorer 6 之前的所有浏览器) 中, JavaScript 代理程序可能无法装入。 因此,不会收集任何数据。

对于不支持导航计时( API )的浏览器,您会如何处理?

对于不支持导航计时 API 的浏览器, Instana 提供了近似计时数据。 这些计时不靠谱,所以不要过分依赖它们来进行这些痕迹。 当 Instana 必须对页面加载时间进行估算时,这些数值将从统计数据中排除,也就是说,估算值不会计入平均值、最小值和最大值等汇总页面加载时间中。

为什么我会被 AdBlock 或类似的浏览器扩展程序拦截?

虽然大多数广告分块扩展都是为了不显示广告而创建的,但大多数扩展都演变为阻止网站所有者跟踪其用户的扩展。 Instana 的监控脚本最终被许多广告拦截扩展程序所采用。 如果您对用户具有控制权,那么可以要求用户在其ad-分块扩展中允许 EUM 脚本。

后端关联在 Ajax 调用中是如何工作的?

有关后端关联机制的更多信息,请参阅 “后端关联 ”。

HTTP 请求可能会出现哪些错误?

JavaScript 代理在发出 HTTP 请求的网页浏览器上运行。 JavaScript 代理会收集常见的 HTTP 错误,其中包括 HTTP 响应代码 4XX 的客户端错误,以及 HTTP 响应代码为 5XX 的服务器错误,这些错误均通过 HTTP 响应代码进行标识。 当 Web 浏览器处理不完整的 HTTP 请求时,代理还可以检测到以下错误:

使用了哪些 HTTP 标头?

JavaScript 代理使用以下 HTTP 头部来实现后端关联。

  • 请求头(发送到后端):
    • X-INSTANA-T
    • X-INSTANA-S
    • X-INSTANA-L
  • 响应头 (到前端):
    • Server-Timing

为什么 GoogleBot 等网站没有数据?

由于存在利用 JavaScript API 返回可预测或可复现结果的机器人, Instana JavaScript 代理和服务器会识别并阻止各类机器人的数据采集行为。 阻止数据收集在提取 Web 时具有积极影响,但不幸的是,当想要监控用户体验时,会导致问题。 例如, GoogleBot's JavaScript API :

  • Date.now() 不会返回当前时间(以毫秒计),而是返回一些看似固定的时间戳记。 因此,无法信任通过分散由 Date.now() 获取的两个时间戳记来记录的持续时间。
  • Math.random()crypto.getRandomValues() 从预定义值的池中返回值。 这会导致客户机端生成的标识出现问题,例如导致错误的后端关联引用。

用户会调用哪些 HTTP 端点(用于 SaaS )?

您无需进行任何配置,即可将数据正确传输至 Instana 的 SaaS 平台。 Instana 用户界面始终显示正确的跟踪片段,其中包含必需的 URL。 有关端点的更多信息,请参阅网站监控端点

能否对 HTTP 端点(用于 SaaS )进行代理?

请勿尝试对 HTTP 端点进行代理。 Instana 不提供任何代理设置的支持,也不处理因使用代理而可能引发的任何问题。 如果您仍然需要(或已经)设置代理,以下提示或许对您有所帮助:

  • 设置正确的 Host HTTP 头。
  • 请考虑 eum.instana.ioeum-{region}.instana.io 服务器之间的差异。
  • 请确保 Instana 服务器能够识别用户的IP地址。 向 Instana 服务器发送包含用户 IP X-FORWARDED-FOR 地址的 标头。 或者,向 Instana 服务器发送一个包含用户 IP X-REALER-IP 地址的 HTTP 头部(而非 X-REAL-IP)。
  • 通过 Instana 服务器包含在响应主体中的所有 HTTP 头进行传递。
  • 请勿在代理中执行任何高速缓存。

您是否从 WebSockets? 收集任何数据?

Instana 的 JavaScript 代理不会收集任何关于 WebSockets 的信息。 WebSockets 除了客户端与服务器之间传输的消息外, Instana 无法有效监控任何语义模型。 由于 WebSocket 消息的格式是任意的(仅为字符序列或字节), Instana 无法推断出请求、响应、成功或失败状态的类型。

虽然从理论上讲,您可以将通过 WebSockets 发送或接收的每条消息转发至 Instana 的服务器,但此类转发存在以下几个问题:

  • 收集绝不能在监视系统中降落的敏感数据的可能性很高。
  • 系统会从每位用户那里收集大量数据,这给用户带来了额外负担。
  • 通常,收集的数据中的信噪比较低。
  • 由于数据中缺乏标准化的语义模型, Instana 无法为您优化数据访问。

鉴于上述原因, Instana 不会自动收集有关 WebSockets 的任何数据。 但是,某些客户在 WebSockets上实现请求或响应和预订机制。 如需更多信息,请参阅自定义事件 API。 借助自定义事件 API ,您可以为 WebSocket-based 请求或响应系统实现后端关联。

为什么 eum.js 是所有 XMLHttpRequest 和Fetch调用的发起者?

Instana JavaScript 代理通过调用网页浏览器的 XMLHttpRequestfetch API 来了解网站发出的请求。 此配置会使 JavaScript 代理( eum.js )在网页浏览器开发者工具中显示为发起者,如下图所示。 似乎是 Instana JavaScript 代理在发起这些请求。 不过,这些调用是由 Instana 所监控的网站发出的。

Instana 的 JavaScript 代理仅与在 JavaScript 代码片段中定义的服务器直接通信,这些服务器会在 Instana 用户界面中显示,或根据本地部署进行相应调整。

图 2. 显示 eum.js 作为所有 XMLHttpRequest 和访存调用发起方的 Chrome Developer 工具
Chrome Developer 工具,将 eum.js 显示为所有 XMLHttpRequest 的发起方并访存调用

网络连接不佳的用户会遇到什么情况?

可能发生两种情况:

  1. Web 站点访问者可能无法下载我们的 JavaScript 代理程序。 在这些情况下,无法收集任何数据。
  2. 从您的 Web 站点访问者到我们的服务器数据传输请求可能不起作用。 Instana 在这些情况下,系统不会重新尝试投递, Instana 也不会将数据存储起来以便日后投递。

为什么你的 script 标签带有 属性 defer

关于 JavaScript 代码片段、其结构以及 Instana 采用的方法,常有相关疑问。 该片段精心设计,以平衡客户的需求。 以下各节将对这些问题进行探讨。

权衡

网站监控是指在尽可能减少对最终用户影响的前提下收集所有相关数据,这是一种权衡。 用户在其 Web 站点上嵌入的 JavaScript 片段最容易记下权衡。 以下是导致当前设计的一些考虑因素。

全面的 JavaScript 初始化过程监控

现代单页应用程序在其初始化过程中运行 JavaScript 。 通常,此初始化过程包含 HTTP 请求。 客户期望看到此初始化过程的详细监视数据。 虽然部分监控数据可以在事后收集,但某些关键信息(例如,关于 HTTP 请求的详细分析以及后端关联数据)只能在代理程序于网站 JavaScript 之前运行时才能收集到。

应对服务器故障的弹性

除了 HTML 解析器分块之外, JavaScript 文件的检索失败可能会对 HTML 文档装入体验产生严重影响,例如,阻止在 HTML 文档解析,装入和执行过程中发生的各种事件,以及通过此中断的 Web 站点。

JavaScript 代理的同步调用 API

Instana 的 JavaScript 代理提供了一个 API ,用户可以通过该页面进行配置、设置页面名称、触发自定义事件等操作。 为了方便使用, API 的用法非常简单,且与 JavaScript 代理的加载流程相互独立。

总体体验不错

Instana 用户群体十分广泛,他们在网页开发和网页监控的具体领域中拥有不同的技能和专业水平。 该解决方案必须满足各种用例。

将权衡因素映射到我们的方法中

在 Instana 页面中,请使用带有 属 defer 性的 script 标签。 此属性既可避免阻塞 HTML 解析器,又能让大多数 Instana 用户获得全面的 JavaScript 初始化过程监控。 在某些情况下,仅使用一个 ` async script` 标签就足够了。 在其他场景中,解析器分块,同步下载和运行脚本就足够了。 考虑到大多数现代 Web 框架及其装入过程的方法, defer 属性最有效。

另一个问题是针对服务器故障的弹性。 当无法加载 Instana 的 JavaScript 代理时, JavaScript-loading 的高级机制可以对该代理进行负载均衡。 优秀的CDN合作伙伴(Akamai)以及包含过期内容的缓存控制头,能够有效规避这一风险,同时避免了高级 JavaScript-loading 机制所带来的持续开销。

删除或替换该 defer 属性

如前几节中所述,决定使用 async over defer,或者既不使用也不使用列出的权衡条件。 这三种加载机制对于 Instana 的 JavaScript 代理来说都是完全可行的。 不过, Instana 的监控指标和钩子的可用性,以及监控数据的可用性都会受到影响。 如果要调整装入行为,请检查以下内容:

您是否将 window.fetch 分配给局部变量,然后继续使用此变量来发出 HTTP 请求? 在分配之前,请确认已加载 Instanawindow.fetch代理。 或者,您可以更改代码以始终使用全局。 Apollo-link-http 是一个采用此模式的库。

  • 您是否在触发 DOMContentLoaded 事件之前就发起了 HTTP 请求? 移除“deferred”属性后,您可能会获得更深入的见解。

为 JavaScript 代理启用调试日志记录

Instana 的 JavaScript 支持调试日志功能,您可以通过该功能进一步了解配置错误、数据传输、限制等信息。 要启用 JavaScript 代理的调试日志记录,请在监控代码片段中将 URL 更改为 JavaScript 代理。

编辑监视片段,并将文件引用从eum.min.js替换为eum.debug.js,如以下片段中所示。

<!-- before -->
<script defer crossorigin="anonymous" src="https://{{hostname}}/eum.min.js"></script>

<!-- after -->
<script defer crossorigin="anonymous" src="https://{{hostname}}/eum.debug.js"></script>
 

收集的数据量是否有上限?

JavaScript 代理程序对每个浏览器标签页设定了数据收集限制,以保护 Instana 系统和用户免受配置错误及循环监控模式的影响。 这些限制如下:

  • 任何已传输的信标(除页面资源外,除后面提到的更具体的规则外,还适用规则)
    • 最大值/10s:128
    • 最大值 (每 10 分钟): 4096
    • 每页最大加载量:8096
  • 页面更改
    • 最大值/10s:32
    • 最大值 (每 10 分钟): 128
  • 定制事件
    • 最大值/10s:32
    • 最大值 (每 10 分钟): 128
  • HTTP 通过以下方式启动的呼叫信标 window.fetch
    • 最大值/10s:32
    • 最大值 (每 10 分钟): 256
  • HTTP 通过以下方式启动的呼叫信标 window.XMLHttpRequest
    • 最大值/10s:32
    • 最大值 (每 10 分钟): 256

敏感数据

您是否在收集能够唯一识别用户身份的数据?

默认情况下, Instana JavaScript 代理不包含可用于唯一识别用户的数据。 此外, Instana JavaScript 代理也不会使用设备或浏览器指纹识别等技术。

可以通过使用用户 API ,将特定于该用户的数据提供给 Instana。

您是如何处理传输至 Instana 的用户数据的?

客户可以配置用户 API ,使其向 Instana 发送用户身份信息。 此信息仅用于提供在产品中可见的功能部件。 Instana 不会以任何其他方式解释此数据,也不会在多个客户之间进行关联。

用户数据传输至 Instana 后,是否可以将其删除?

Instana 支持不定期的删除请求,例如为了遵守《通用数据保护条例》(GDPR)。 如果您预计会收到频繁或定期的删除请求,请改将匿名化数据(例如,经过哈希处理的用户 ID)发送至 Instana。

IP地址是否经过匿名化处理?

IP 是匿名的。 缺省情况下,IPv4 个地址的最后一个八位元和 IPv6 个地址的最后 80 位设置为零。 您可以通过 Instana 用户界面中网站仪表盘的“配置”选项卡,设置更严格的匿名化规则。

如何获取用户的IP地址?

JavaScript 代理程序无权访问 IP 地址。 用户 IP 地址通过他们与服务器建立的网络连接进行访问。 从 JavaScript 代理程序接收的数据由具有 匿名 IP 地址的服务器扩充。

Instana 是否使用 Cookie?

网站监控本身并不直接使用 cookie。

Instana 使用的是 localStorage 还是 sessionStorage

默认情况下, Instana JavaScript 代理不使用 localStoragesessionStorage 技术。 但是,当您开启 会话跟踪时,将使用 localStorage 。 默认情况下, Instana JavaScript 代理不支持会话跟踪功能。

Instana 将网站监控数据存储在何处?

网站监控数据的存储位置取决于具体的 Instana 安装环境。 通常,数据存储在亚马逊或 Google 的云端,具体位于其欧洲或美国区域。 您可以根据 Instana 跟踪代码片段中显示的 reportingUrl ,以及 JavaScript 代理的报告端点列表 ,来确定数据的存储位置。

CDN(Akamai)会存储用户数据吗?

用户通过使用 Akamai 提供的内容分发网络 (CDN) 下载 JavaScript 代理。 Akamai收集并存储服务运营个人数据。 如需了解更多信息,请参阅 Akamai 常见问题解答

网络安全的影响

我已经启用了内容安全策略(Content-Security-Policy),还需要做些什么吗?

Instana 的JS代理会从 异步加载 eum.instana.io ,也可以通过 HTTP (S) 进行加载。 请检查是否可以从此域装入脚本。

数据通过图像加载、 HTTP GET 请求以及 POST 请求(使用 XMLHttpRequest)传输至 Instana。 用于数据传输的源将显示在跟踪片段中。

以下 Content-Security-Policy 定义显示 Instana 的 SaaS 产品所需要的内容:

script-src *.instana.io;
img-src *.instana.io;
connect-src *.instana.io;
 

对于自托管版本, Instana 的JS代理是从自托管的后端加载的,而不是从 eum.instana.io 域名加载的。 要加载代理脚本,必须将前面的 Content-Security-Policy 定义 *.instana.io 值(如)替换为自托管后端所使用的具体网络域。

同源策略对网站监控有何影响?

同源策略是网站安全中最基础的概念之一。 每个 Web 站点都受该策略约束,因为所有 Web 浏览器都会强制实施该策略。 作为一家网站监控服务提供商, Instana 无法控制您的网站或浏览器安全。 Instana 只能在既定的安全限制范围内运行。 遗憾的是,这限制了 Instana 的监控能力。

  • 浏览器将对错误消息和堆栈跟踪的访问限制为相同源的脚本。
  • 浏览器限制跨源请求所允许的 HTTP 头。 因此,后端关联并非始终可行。

若涉及多个源,要启用这些功能,您可以使用跨源资源共享( CORS )。 CORS 是一种机制,用于对同源策略安全机制设定受控的例外情况。 下图详细描述了需要执行哪些操作来解决同一源策略施加的限制。

有关 Instana 后端关联机制以及 Web 安全如何影响这些关联机制的更多信息,请参阅 “后端关联 ”。

图 3. 支持跨域的终端用户监控
说明跨源终端用户监控的示意图。

为什么无法总是获取详细的资源检索明细?

对网络时间,高速缓存统计信息和资产大小的洞察的可用性取决于 资源计时功能。 当同一源策略允许时,这些功能在 大多数现代 Web 浏览器 中可用。

若要了解跨源资源的来源(例如,从 加载的 HTML https://example.com:443 文档的 https://cdn.example.com:443 来源),可以使用 Timing-Allow-OriginHTTP 请求头。 下图显示了如何设置头。 另外,有关更多信息,请参阅 资源计时规范

图 4. 支持跨域的终端用户监控
说明跨源终端用户监控的示意图。

如何分析脚本错误?

嵌入许多第三方脚本的 Web 站点通常会迂到稳定数量的脚本错误。 Script Error 指示第三方脚本中存在 JavaScript 错误。 出于安全目的, Web 浏览器通过将实际错误消息替换为 Script Error 并清除堆栈跟踪来限制对第三方脚本的 JavaScript 错误的访问。

在 Web 上,您可以使用以下方法来深入了解 Script Error:

  • 通过指示第三方脚本不包含敏感数据,您可以指示 Web 浏览器公开错误消息和堆栈跟踪。
  • 您可以在 Web 安全模型中使用漏洞(不推荐使用,也不保证工作)。

建议您使用第一个选项,因为这是实现 Script Error 洞察的设计和正确方法。 要实现第一个选项,请执行以下操作:

  • crossorigin="anonymous"属性添加到脚本标记。
  • 确保包含该脚本的源的 HTTP 响应正在发送Access-Control-Allow-Origin响应头。
图5。 支持跨域的错误跟踪
说明支持跨源的错误跟踪的图片。

我应该在商业分析场景中使用 Instana 吗?

某些商业分析用例可以通过 Instana 收集的数据来解决。 Instana 致力于提供业界顶尖的高性能产品,因此不能替代专业的商业分析产品。

JavaScript 堆栈跟踪转换

什么是 JavaScript 的堆栈跟踪翻译?

JavaScript 的堆栈跟踪转换功能可在 Instana 中提供清晰且更具操作性的堆栈跟踪信息。

Before:
at http://shop-demo-app.instana.io/static/js/main.b1510333.chunk.js:1:1559

After:
at ProductDetails.js 26:11
 

未转换的堆栈跟踪行的问题是这些错误不可操作。 开发人员需要处理许多(通常是小巧的)文件。 出于性能考虑,这些文件以打包和压缩的形式发送至用户浏览器,导致堆栈跟踪中的文件名、行号和列号无法被人类阅读或用于操作。

通过转换后的堆栈跟踪,很明显在 …/main.b1510333.chunk.js:1:1559 处发生的错误实际上是at ProductDetails.js 26:11

JavaScript 的堆栈跟踪转换功能是如何工作的?

该翻译通过使用源映射来实现。 源映射使我们能够将不可操作的堆栈跟踪转换为可操作的堆栈跟踪。 更具体地说,它们允许我们将对文件、名称、行和列的引用转换为它们的实际源代码对应内容。

为实现这一目标, Instana 执行以下步骤:

  1. JavaScript 代理程序向 Instana 的服务器报告 JavaScript 错误。 例如,假设堆栈跟踪包含第 at http://shop-demo-app.instana.io/static/js/main.b1510333.chunk.js:1:1559 行。
  2. Instana 的服务器会尝试下载 JavaScript 文件,以确定该文件的源映射文件。
  3. 解析 HTTP 的响应,并由 Instana 查找源映射的引用
  4. 当引用源映射文件时, Instana 会通过 HTTP 的 GET 请求下载该源映射文件,或从用户上传的源映射文件中进行搜索。
  5. 当下载或查找成功时,将使用源映射文件来转换文件,名称,行和列引用。

请参阅以下步骤以了解堆栈跟踪行 at http://shop-demo-app.instana.io/static/js/main.b1510333.chunk.js:1:1559

  1. 向 Instana 的服务器报告了错误。
  2. Instana 的服务器向http://shop-demo-app.instana.io/static/js/main.b1510333.chunk.js发出 HTTP GET 请求。
  3. 源映射引用 //# sourceMappingURL=main.b1510333.chunk.js.map 在 JavaScript 文件中。
  4. 源映射文件可通过发送 http://shop-demo-app.instana.io/static/js/main.b1510333.chunk.js.mapHTTP GET 请求下载,或从已上传的源映射文件中获取。
  5. 将解析源映射,并且堆栈跟踪将变为可读。

Instana 究竟是如何从我们的服务器上检索文件的?

当 Instana 检测到堆栈跟踪时,它会自动发出 HTTP 请求,以获取 JavaScript 和源映射文件。 以下调用显示所进行的调用的最接近表示:

curl -H 'Accept: */*' \
  # Use a fake user-agent to bypass simple bot blockers
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' \
  {{url of JavaScript or source map files}}
 

您可以使用上述命令来确定 Instana 需要采用何种配置,才能从您的服务器下载 JavaScript 和源映射文件。 HTTP 的请求由运行在 AWS ( Amazon Web Services ) 或 Google Cloud 内的服务器发出。 高级机器人检测机制可能会拦截来自 AWS 或 Google Cloud 的请求。 因此,请考虑配置 Instana 需要发送给您服务器的额外头部信息,以绕过机器人检测机制。

如何确保 Instana 服务器能够建立 TCP 或 TLS 连接?

Instana 服务器正在从 AWS 或 Google Cloud 服务器发送请求。 因此, JavaScript 和源映射文件可通过互联网访问。 此外,您还需要确保服务器上的 TLS 配置正常工作,并且证书链完整。 您可以通过使用 SSL Labs/Qualys提供的免费 SSL 测试,或运行以下命令来检查是否存在 TLS 相关问题:

openssl s_client -showcerts -connect {{YOUR_DOMAIN_HERE}}:443
 

为什么在严格的环境(例如 SCOM 或 XML 解析器)中,使用 Instana EUM 代码片段时会出现“ JavaScript ”语法错误?该如何解决?

在严格的环境中(例如 System Center Operations Manager (SCOM) Web 控制台), Instana EUM JavaScript 代码片段可能会引发语法错误。 出现此错误是因为该代码片段依赖于 JavaScript's 的自动分号插入(ASI)功能,而某些环境在预处理、转换或验证 JavaScript 代码时,对此功能的处理方式各不相同。

问题:

原始代码片段中包含这一行:

n.l = 1 * new Date

虽然由于 ASI 的缘故,这在大多数浏览器中都能正常工作,但在严格模式下,浏览器可能无法正确处理,从而导致语法错误。

解决方案:

请选择以下方法之一来解决此问题:

选项 1:添加一个显式的分号

n.l = 1 * new Date;

选项 2:使用函数调用语法

n.l = 1 * new Date();

选项 3:使用 ` Date.now ()`(建议)

n.l = Date.now();

该解决方案最为稳健,因为它明确清晰,不依赖于 ASI 或类型转换,并且在所有 JavaScript 环境中都能保持一致的运行效果。

选项 4:使用 CDATA(仅适用于 XHTML 或 XML 环境)

如果您的环境以 XHTML 格式提供网页,或者通过 XML 解析器处理网页,请将脚本包裹在 CDATA 中:

<script>
//<![CDATA[
  (function(s,t,a,n){s[t]||(s[t]=a,n=s[a]=function(){n.q.push(arguments)},
  n.q=[],n.v=2,n.l=Date.now());})(window,"InstanaEumObject","ineum");

  ineum('reportingUrl', 'https://<region>.instana.io');
  ineum('key', 'YOUR_KEY');
  ineum('trackSessions');
//]]>
</script>
注意: CDATA 用于解决 XML 中的解析问题,而非 JavaScript 中的语法错误。 对于 SCOM Web 控制台,请使用选项 1-3。

完整的更新后代码片段示例

<script>
  (function(s,t,a,n){s[t]||(s[t]=a,n=s[a]=function(){n.q.push(arguments)},
  n.q=[],n.v=2,n.l=Date.now());})(window,"InstanaEumObject","ineum");

  ineum('reportingUrl', 'https://<region>.instana.io');
  ineum('key', 'YOUR_KEY');
  ineum('trackSessions');
</script>
<script defer crossorigin="anonymous" src="https://eum.instana.io/eum.min.js"></script>

何时应用此修复程序:

如果您在采用严格 JavaScript 解析的环境中进行部署,例如企业管理控制台(SCOM)、实施了严格内容安全策略(CSP)的系统,或者任何会导致标准代码片段引发语法错误的环境,请应用此修复方案。

如何在不更新网站的情况下,始终获取最新版本的 Instana EUM脚本?

您可以选择以下两种方案之一,以确保您的网站始终加载最新的 Instana EUM 脚本:

  • 将脚本托管在您自己的 CDN 或服务器上

    您可以下载最新的 Instana EUM脚本,并将其托管在您自己的CDN或服务器上,从而在不修改网站代码的情况下,完全掌控更新事宜。

  1. 请从 Instana 下载最新脚本
  2. https://yourdomain.com/js/eum.min.js将脚本上传到您自己的域名或 CDN(例如,)。
  3. 在 HTML 中引用该脚本。
    <script defer src="https://yourdomain.com/js/eum.min.js"></script>
当您将 Instana 的 EUM 脚本托管在自己的 CDN 或服务器上时,您将获得以下几个关键优势:
  • 无需因每个新脚本版本而更新您的网站。
  • 确保脚本由可信的、自主管理的主机提供。
  • 取消了对 Subresource Integrity ( SRI )的要求,因为该域名是由您自己的域名提供的,而非第三方域名。
  • 请使用 Instana URL (不带版本号)
    您可以直接从官方的 Instana URL 引用 Instana EUM 脚本,无需指定版本:
    <script defer src="https://eum.instana.io/eum.min.js"></script>

    如果您直接从官方 Instana URL 引用 Instana EUM 脚本,且未指定版本,浏览器将自动加载最新版本。

    在此方法中,您无法使用 SRI 来验证脚本的完整性。