SylviaBABY commented on code in PR #1296: URL: https://github.com/apache/apisix-website/pull/1296#discussion_r950951499
########## blog/zh/blog/2022/08/19/apache-apisix-runtime-dynamic-debugging.md: ########## @@ -0,0 +1,224 @@ +--- +title: "Apache APISIX 运行时动态调试功能详解" +authors: + - name: "屠正松" + title: "Author" + url: "https://github.com/tzssangglass" + image_url: "https://github.com/tzssangglass.png" + - name: "韩飞" + title: "Technical Writer" + url: "https://github.com/hf400159" + image_url: "https://github.com/hf400159.png" +keywords: +- API gateway +- Apache APISIX +- Debug +description: 本文详细介绍了云原生 API 网关 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 +tags: [Ecosystem] +--- + +> 本文详细介绍了 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 Review Comment: ```suggestion > 本文详细介绍了 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷地排查 Bug 并解决相关问题。 ``` ########## blog/zh/blog/2022/08/19/apache-apisix-runtime-dynamic-debugging.md: ########## @@ -0,0 +1,224 @@ +--- +title: "Apache APISIX 运行时动态调试功能详解" +authors: + - name: "屠正松" + title: "Author" + url: "https://github.com/tzssangglass" + image_url: "https://github.com/tzssangglass.png" + - name: "韩飞" + title: "Technical Writer" + url: "https://github.com/hf400159" + image_url: "https://github.com/hf400159.png" +keywords: +- API gateway +- Apache APISIX +- Debug +description: 本文详细介绍了云原生 API 网关 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 +tags: [Ecosystem] +--- + +> 本文详细介绍了 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 + +<!--truncate--> + +Apache APISIX 是一个动态,实时,高性能的 API 网关,它基于 NGINX 和 Lua 实现,因此天然继承了二者的高性能。动态意味着如果你对它做了任意配置的变更,不需要重启或者热更新,因此也不会产生服务中断或短暂不可用。由于 NGINX 的配置保存在文件中,如果变更配置,就需要重启服务,该操作会涉及到连接断开,占用高达两倍的资源。 + +APISIX 通过其动态的优势, 提供了强大的运行时动态调试的能力,但由于该功能对使用者有着略高的技术背景要求,在常规业务需求中也不太会用到这项功能,因此大家对 APISIX 运行时动态调试能力了解不足。本文将通过实际案例为你详细讲解 Apache APISIX 运行时动态调试的功能。 + +## 故障发生 + +某年某月某日,一个用户的生产环境出现异常,与用户交流过后并没有发现用户操作有什么异常之处,一切都很合理。而且根据用户的描述,该 Bug 会在 APISIX 重启后消失,然后运行一段时间之后就会随机出现 。没有人知道这个 Bug 发生的原因,也不知道如何复现该 Bug。在检查完用户的配置之后,我们也没有发现异常的地方。 Review Comment: ```suggestion 某年某月某日,一个用户的生产环境出现异常,与用户交流过后并没有发现用户操作有什么异常之处,一切都很合理。而且根据用户的描述,该 Bug 会在 APISIX 重启后消失,然后运行一段时间之后就会随机出现。没有人知道这个 Bug 发生的原因,也不知道如何复现该 Bug。在检查完用户的配置之后,我们也没有发现异常的地方。 ``` ########## blog/zh/blog/2022/08/19/apache-apisix-runtime-dynamic-debugging.md: ########## @@ -0,0 +1,224 @@ +--- +title: "Apache APISIX 运行时动态调试功能详解" +authors: + - name: "屠正松" + title: "Author" + url: "https://github.com/tzssangglass" + image_url: "https://github.com/tzssangglass.png" + - name: "韩飞" + title: "Technical Writer" + url: "https://github.com/hf400159" + image_url: "https://github.com/hf400159.png" +keywords: +- API gateway +- Apache APISIX +- Debug +description: 本文详细介绍了云原生 API 网关 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 +tags: [Ecosystem] +--- + +> 本文详细介绍了 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 + +<!--truncate--> + +Apache APISIX 是一个动态,实时,高性能的 API 网关,它基于 NGINX 和 Lua 实现,因此天然继承了二者的高性能。动态意味着如果你对它做了任意配置的变更,不需要重启或者热更新,因此也不会产生服务中断或短暂不可用。由于 NGINX 的配置保存在文件中,如果变更配置,就需要重启服务,该操作会涉及到连接断开,占用高达两倍的资源。 + +APISIX 通过其动态的优势, 提供了强大的运行时动态调试的能力,但由于该功能对使用者有着略高的技术背景要求,在常规业务需求中也不太会用到这项功能,因此大家对 APISIX 运行时动态调试能力了解不足。本文将通过实际案例为你详细讲解 Apache APISIX 运行时动态调试的功能。 + +## 故障发生 + +某年某月某日,一个用户的生产环境出现异常,与用户交流过后并没有发现用户操作有什么异常之处,一切都很合理。而且根据用户的描述,该 Bug 会在 APISIX 重启后消失,然后运行一段时间之后就会随机出现 。没有人知道这个 Bug 发生的原因,也不知道如何复现该 Bug。在检查完用户的配置之后,我们也没有发现异常的地方。 + +而在用户提供的与异常相关的日志中,我们发现其中最关键的一条日志。这条日志看起来稀松平常,只不过是调用 `eval` 函数失败。 + + + +但在正常情况下,在这行日志对应的代码段不应该会抛出这个错误。为什么呢?我们先看下异常日志对应的代码段,下图中倒数第二行是抛出异常的地方: + + + +这段代码的逻辑是:首先对 `conf.response_expr` 对象做了非空判断,如果不存在,则会创建该对象。对象创建完成,才会调用它的 `eval` 函数,而在该对象对应的模块中,已经实现了 `eval` 函数。所以我们认为这个错误是不应该出现的。那么为什么创建了这个对象但是调用它的函数失败呢? + +## 动态调试详解 + +从前文描述的已知信息来看,我们已经无法判断 Bug 产生的原因了,因此我们采用动态调试的方式来寻找 Bug 的根本原因。 + +### 动态调试特性 + +在正式开启寻 Bug 之路前,先为大家介绍下什么是动态调试以及它的特性。 + +动态调试功能主要用于在 APISIX 运行过程中通过响应、日志等方式,输出更多的调试信息,用来帮助排查异常,比如缩小排查范围、窥探异常上下文等。其特性有以下三点: + +- 实时关闭&开启 + + 动态调试可以在 APISIX 运行时通过修改指定的配置文件开启或关闭,不需要重启 APISIX 或者进行其他操作。 + +- 打印任何模块级函数 + + 该功能可以调试和打印任何模块级别函数的入参和出参,不管这个函数是位于 APISIX 的代码中,还是 APISIX 依赖的诸多 `lua-resty` 第三方库中,或者是 OpenResty 的 `lualib` 中的模块。只要能通过 `require` 引用该函数,就可以 `hook` 该函数。 + +- 针对指定请求开启 + 除了以上两点,该功能也支持针对指定请求开启。通过设置特殊的请求头,对调试请求进行染色,便于追踪和分析。该特性可以通过 `curl xxx -H “X-APISIX-Dynamic-Debug”` 命令开启,该命令表示只有请求中携带 `X-APISIX-Dynamic-Debug` 请求头时,才会在日志中输出指定函数的入参和出参。该功能本质上是请求过滤,防止输出太多无意义的日志,也可以借此区分真实请求和调试请求。 Review Comment: ```suggestion 除了以上两点,该功能也支持针对指定请求开启。通过设置特殊的请求头,对调试请求进行染色,便于追踪和分析。该特性可以通过 `curl xxx -H “X-APISIX-Dynamic-Debug”` 命令开启,该命令表示只有请求中携带 `X-APISIX-Dynamic-Debug` 请求头时,才会在日志中输出指定函数的入参和出参。该功能本质上是请求过滤,防止输出太多无意义的日志,也可以借此区分真实请求和调试请求。 ``` ########## blog/zh/blog/2022/08/19/apache-apisix-runtime-dynamic-debugging.md: ########## @@ -0,0 +1,224 @@ +--- +title: "Apache APISIX 运行时动态调试功能详解" +authors: + - name: "屠正松" + title: "Author" + url: "https://github.com/tzssangglass" + image_url: "https://github.com/tzssangglass.png" + - name: "韩飞" + title: "Technical Writer" + url: "https://github.com/hf400159" + image_url: "https://github.com/hf400159.png" +keywords: +- API gateway +- Apache APISIX +- Debug +description: 本文详细介绍了云原生 API 网关 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷的排查 Bug 并解决相关问题。 Review Comment: ```suggestion description: 本文详细介绍了云原生 API 网关 Apache APISIX 动态调试功能以及该功能的实现原理,你可以通过该功能更便捷地排查 Bug 并解决相关问题。 ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
