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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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搭建和管理企业级网站应用
相关文章
|
10天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
10天前
|
消息中间件 存储 Cloud Native
云原生架构下的数据一致性挑战与应对策略####
本文探讨了在云原生环境中,面对微服务架构的广泛应用,数据一致性问题成为系统设计的核心挑战之一。通过分析云原生环境的特点,阐述了数据不一致性的常见场景及其对业务的影响,并深入讨论了解决这些问题的策略,包括采用分布式事务、事件驱动架构、补偿机制以及利用云平台提供的托管服务等。文章旨在为开发者提供一套系统性的解决方案框架,以应对在动态、分布式的云原生应用中保持数据一致性的复杂性。 ####
|
6天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
29 5
|
7天前
|
Kubernetes 负载均衡 Cloud Native
云原生架构下的微服务治理策略
随着云原生技术的不断成熟,微服务架构已成为现代应用开发的主流选择。本文探讨了在云原生环境下实施微服务治理的策略和方法,重点分析了服务发现、负载均衡、故障恢复和配置管理等关键技术点,以及如何利用Kubernetes等容器编排工具来优化微服务的部署和管理。文章旨在为开发者提供一套实用的微服务治理框架,帮助其在复杂的云环境中构建高效、可靠的分布式系统。
22 5
|
7天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
7天前
|
消息中间件 缓存 Cloud Native
云原生架构下的性能优化实践与挑战####
随着企业数字化转型的加速,云原生架构以其高度解耦、弹性伸缩和快速迭代的特性,成为现代软件开发的首选模式。本文深入探讨了云原生环境下性能优化的关键策略与面临的主要挑战,通过案例分析,揭示了如何有效利用容器化、微服务、动态调度等技术手段提升应用性能,同时指出了在复杂云环境中确保系统稳定性和高效性的难题,为开发者和架构师提供了实战指南。 ####
21 3
|
8天前
|
运维 Kubernetes Cloud Native
深入理解云原生架构:从理论到实践
【10月更文挑战第38天】本文将引导读者深入探索云原生技术的核心概念,以及如何将这些概念应用于实际的软件开发和运维中。我们将从云原生的基本定义出发,逐步展开其背后的设计哲学、关键技术组件,并以一个具体的代码示例来演示云原生应用的构建过程。无论你是云原生技术的初学者,还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和实操指南。
|
7天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用架构中的实践与思考
【10月更文挑战第38天】随着云计算的不断成熟和演进,云原生(Cloud-Native)已成为推动企业数字化转型的重要力量。本文从云原生的基本概念出发,深入探讨了其在现代应用架构中的实际应用,并结合代码示例,展示了云原生技术如何优化资源管理、提升系统弹性和加速开发流程。通过分析云原生的优势与面临的挑战,本文旨在为读者提供一份云原生转型的指南和启示。
21 3
|
7天前
|
运维 Kubernetes Cloud Native
云原生技术在现代应用架构中的实践与挑战####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在实际项目中的应用案例,分析了企业在向云原生转型过程中面临的主要挑战及应对策略。不同于传统摘要的概述性质,本摘要强调通过具体实例揭示云原生技术如何促进应用的灵活性、可扩展性和高效运维,同时指出实践中需注意的技术债务、安全合规等问题,为读者提供一幅云原生技术实践的全景视图。 ####
|
8天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?

推荐镜像

更多