Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT Source Maps详解(一)

简介: Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT Source Maps详解(一)

Sentry 支持通过 source maps(源代码映射)对 JavaScript 进行 un-minifying,这允许您以原始的未转换形式查看从堆栈跟踪中获得的源代码上下文。这对于调试压缩后的代码(例如,UglifyJS)或从高级语言编译的代码(如 TypeScriptES6)特别有用。

Sentry 将通过抓取堆栈跟踪中的 URL 自动获取源代码(source code)和源代码映射(source maps)。但是,您可能有正当的理由在 Sentry 中 disabling the JavaScript source fetching in Sentry(在 Sentry 中禁用 JavaScript 源代码获取)。


Capturing Source Maps


大多数现代 JavaScript 编译器都支持 source maps。下面你会发现我们推荐的说明,但我们也提供了各种常用工具的说明:


  • Webpack
  • TypeScript
  • UglifyJS
  • SystemJS

我们建议使用 Sentry's Webpack plugin 来配置 source maps 并在构建过程中自动上传它们:


npm install --save-dev @sentry/webpack-plugin
or
yarn add --dev @sentry/webpack-plugin


接下来,您需要为我们的 API 生成 access token。在您的组织设置中,导航到 Developer Settings,create a new internal integration,并提供一个适合您组织的名称。重要: 选择 Releases -> Admin,针对权限。


Releases -> Admin 权限在其他 API 文档中也称为 'project:releases'。

你可以通过它的文档机制来配置 sentry-cli,或者在初始化插件时简单地绑定所需的参数:


const SentryWebpackPlugin = require("@sentry/webpack-plugin");
module.exports = {
  // other configuration
  configureWebpack: {
    plugins: [
      new SentryWebpackPlugin({
        // sentry-cli configuration
        authToken: process.env.SENTRY_AUTH_TOKEN,
        org: "exmaple-org",
        project: "example-project",
        // webpack specific configuration
        include: ".",
        ignore: ["node_modules", "webpack.config.js"],
      }),
    ],
  },
};


在 Vue 2.x 中,应使用 vue.config.js 而不是 webpack.config.js,并使用 include: "./dist" 而不是 include: "."


Hosting Publicly



默认情况下,Sentry 将在已编译的 JavaScript 文件中查找源映射指令(source map directives),这些指令位于最后一行,并具有以下格式:


//# sourceMappingURL=<url>


当 Sentry 遇到这样一个指令时,它将解析与它所在的源文件相关的 source map URL,并尝试使用 HTTP 请求获取它。


例如,如果您有一个压缩的 JavaScript 文件位于 http://example.org/js/app.min.js,并且在该文件的最后一行中,则找到以下指令:


//# sourceMappingURL=app.js.map


Sentry 将尝试从 http://example.org/js/app.js.map 获取 app.js.map

另外,在生成源代码映射时,你可以指定源代码映射所在的绝对 URL:


//# sourceMappingURL=http://example.org/js/app.js.map


虽然从服务器使 source maps 可用于 Sentry 是最自然的集成(natural integration),但并不总是建议这样做:


  • Sentry 可能并不总是能够访问您的服务器。
  • 如果您没有在您的 asset URLs 中指定版本,可能存在版本不匹配
  • 额外的延迟可能意味着源映射对所有错误都不可用。

由于这些原因,最好的做法是预先上传 source maps 给 Sentry(见下文)。


Working Behind a Firewall


推荐的解决方案是将您的 source artifacts 上传到 Sentry,但有时有必要允许来自 Sentry 内部 IP 的通信。有关 Sentry 的公共IP 的更多信息,请参见:IP Ranges


Secure Access to Source Maps


如果你想保密你的 source maps 并且选择不直接上传你的 source maps 到 Sentry,你可以在你的项目设置中启用 “Security Token” 选项。


这将导致 Sentry 服务器对来自 “Allowed Domains” 的 URL 的出站请求附加 HTTP 标头 X-Sentry-Token 标头:


GET /assets/bundle.min.js
X-Sentry-Token: {token}


token 是您在项目设置中定义的安全值。然后,您可以配置您的 web 服务器,以允许在此 header/token 对 存在时访问您的 source maps。你也可以覆盖默认的 header 名称(X-Sentry-Token)并使用 HTTP Basic Authentication,例如通过传递 Authorization: Basic {encoded_password}


Multiple Origins


可以从多个来源访问 web 应用程序的情况并不少见。例如:


在这种情况下,相同的 JavaScript 和 source map 文件可能位于两个或多个不同的源。在这种情况下,我们建议在路径上使用特殊的波浪号(~)前缀。

例如,如果你有以下内容:


您可以使用 ~/js/app.js 的 URL 进行上传。这将告诉 Sentry 忽略域,并将 artifact 用于任何来源。


此外,您还可以使用多个名称上传同一文件。在后台,Sentry 会将这些重复数据删除。

~前缀告诉 Sentry,对于给定的 URL,任何 路径为 /js/app.js 的协议和主机名的组合都应该使用这个工件(artifact)。只有当您的 source/source map 文件在所有可能的 protocol/hostname 组合上都相同时,才使用此方法。如果找到完整的 URL, Sentry 将优先使用,高于波浪前缀路径。


Tools



SystemJS


SystemJS 是 Angular 2 项目的默认模块加载器。SystemJS 构建工具可用于 bundle,transpile 和 minify 用于生产环境的源代码,并可配置为输出 source maps。


builder.bundle("src/app.js", "dist/app.min.js", {
  minify: true,
  sourceMaps: true,
  sourceMapContents: true,
});


上面的示例配置会将您原始的(original),未经转换(un-transformed)的源代码内联到生成的 source map 文件中。Sentry要求 source map(s) 和原始源文件都执行反向转换。如果您选择不内联源文件,则除了源映射外,还必须使这些源文件对 Sentry 可用(请参见下文)。


TypeScript


TypeScript 编译器可以输出 source maps。将 sourceRoot 属性配置为 /,以从生成的源代码引用中去除构建路径前缀。这允许 Sentry 匹配源文件相对于你的源根文件夹:


{
  "compilerOptions": {
    "sourceMap": true,
    "inlineSources": true,
    "sourceRoot": "/"
  }
}


UglifyJS


UglifyJS 是一种流行的工具,可用于压缩生产源代码。通过消除空格,重写变量名,删除无效代码分支等,它可以大大减少文件的大小。


我们强烈建议您使用更高级别的 bundler(或 transpiler),因为 UglifyJS 配置可能会变得非常复杂,无法达到预期的效果。


如果你正在使用 UglifyJS 来压缩你的源代码,下面的命令将额外生成一个 source map,将压缩的代码映射回原始源代码:


uglifyjs app.js \
  -o app.min.js.map \
  --source-map url=app.min.js.map,includeSources


Webpack


Webpack 是一个强大的构建工具,可以解析、捆绑和压缩 JavaScript 模块。它还支持各种 loaders 来转换高级语言、引用样式表或包含静态资源。

Sentry 提供了一个方便的 Webpack plugin,可以配置 source maps,并在构建时将它们上传到 Sentry。对于上传源到 Sentry,推荐使用这个过程:


npm install --save-dev @sentry/webpack-plugin
or
yarn add --dev @sentry/webpack-plugin


您可以通过其 documented mechanisms 来配置 sentry-cli,或者在初始化插件时仅绑定必需的参数:


const SentryWebpackPlugin = require("@sentry/webpack-plugin");
module.exports = {
  // other configuration
  configureWebpack: {
    plugins: [
      new SentryWebpackPlugin({
        // sentry-cli configuration
        authToken: process.env.SENTRY_AUTH_TOKEN,
        org: "exmaple-org",
        project: "example-project",
        // webpack specific configuration
        include: ".",
        ignore: ["node_modules", "webpack.config.js"],
      }),
    ],
  },
};


在 Vue 2.x 中,应使用 vue.config.js 而不是 webpack.config.js,并使用 include: "./dist" 而不是 include: "."

SentryWebpackPlugin 设置为最后一个正在运行的插件,否则,该插件接收到的结果 source maps 可能不是最终的。


Advanced Usage


如果您希望手动上传 source maps,请将 Webpack 配置为输出 source maps:


module.exports = {
  output: {
    path: path.join(__dirname, "dist"),
    filename: "[name].js",
    sourceMapFilename: "[name].js.map",
  },
  // other configuration
};


如果使用 SourceMapDevToolPlugin 进行 source map 生成的更细粒度控制,请关闭 noSources,以便 Sentry 在事件堆栈跟踪中显示正确的源代码上下文。

此外,Webpack 插件将自动设置 window.SENTRY_RELEASE,因此您的 Sentry.init 调用将不需要更新。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
3月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
72 3
|
3月前
|
Cloud Native 持续交付 云计算
云原生架构的演进与挑战
随着云计算技术的不断发展,云原生架构已成为企业数字化转型的重要支撑。本文深入探讨了云原生架构的概念、发展历程、核心技术以及面临的挑战,旨在为读者提供一个全面了解云原生架构的视角。通过分析Kubernetes、Docker等关键技术的应用,以及微服务、持续集成/持续部署(CI/CD)等实践案例,本文揭示了云原生架构在提高应用开发效率、降低运维成本、增强系统可扩展性等方面的显著优势。同时,也指出了云原生架构在安全性、复杂性管理等方面所面临的挑战,并提出了相应的解决策略。
|
2月前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
2月前
|
弹性计算 运维 Cloud Native
云原生架构的崛起与未来展望
在数字化转型的浪潮中,云原生架构凭借其高效、灵活和可扩展的特性,正逐渐成为企业IT战略的核心。本文旨在探讨云原生架构的定义、关键特性、实施优势以及面临的挑战,同时展望未来的发展趋势。通过深入分析,我们期望为读者提供一个关于云原生架构全面而深入的视角,助力企业在云计算时代做出更明智的决策。
55 3
|
2月前
|
Cloud Native API 持续交付
云原生时代的微服务架构设计
随着云计算的蓬勃发展,云原生概念逐渐成为IT行业的热点。本文将通过深入浅出的方式,介绍在云原生环境下,如何设计一个高效、可扩展的微服务架构。文章不仅涉及理论概念,还将结合实际代码示例,帮助读者理解微服务架构的核心要素和设计原则,以及如何在云平台上实现这些设计。
|
3月前
|
Kubernetes Cloud Native Docker
云原生之旅:从传统架构到容器化服务的演变
随着技术的快速发展,云计算已经从简单的虚拟化服务演进到了更加灵活和高效的云原生时代。本文将带你了解云原生的概念、优势以及如何通过容器化技术实现应用的快速部署和扩展。我们将以一个简单的Python Web应用为例,展示如何利用Docker容器进行打包和部署,进而探索Kubernetes如何管理这些容器,确保服务的高可用性和弹性伸缩。
|
3月前
|
Cloud Native 持续交付 云计算
云原生技术在现代IT架构中的转型力量####
本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的关键作用与实践路径。通过具体案例分析,展示了云原生如何赋能企业实现更高效的资源利用、更快的迭代速度以及更强的系统稳定性,为读者提供了一套可借鉴的实施框架与策略。 ####
35 0
|
3月前
|
消息中间件 运维 Cloud Native
云原生架构下的微服务优化策略####
本文深入探讨了云原生环境下微服务架构的优化路径,针对服务拆分、通信效率、资源管理及自动化运维等核心环节提出了具体的优化策略。通过案例分析与最佳实践分享,旨在为开发者提供一套系统性的解决方案,以应对日益复杂的业务需求和快速变化的技术挑战,助力企业在云端实现更高效、更稳定的服务部署与运营。 ####

热门文章

最新文章