rdebug/midi

Rdebug 的 PHP 重放客户端

维护者

详细信息

github.com/didi/rdebug

源代码

问题

安装: 40

依赖: 0

建议者: 0

安全性: 0

星星: 1,158

关注者: 64

分支: 171

开放问题: 11

0.0.6 2019-04-17 16:00 UTC

This package is auto-updated.

Last update: 2024-09-24 13:13:00 UTC


README

Gitter License

翻译

1. 简介

Rdebug 是一个开源的 工具链,专注于提高开发者在日常开发、测试和调试过程中的效率。代码将更加健壮。

1.1 背景

随着微服务架构使得服务 异构化易于部署高度可扩展,大型系统被分解成几个微服务。

但是,微服务架构并非万能。它存在一些缺点。一个服务被分割成几个小服务后,测试环境难以维护。单元测试需要模拟下游服务。这将降低开发效率,并增加生产环境中的错误。

我们相信这个行业需要进化。

1.2 原则

提高效率,缩短发布周期,提高代码质量,减少生产错误

1.3 何时使用

适合于已经记录了流量的旧 API 重构。

不适用于新 API 或未记录流量的 API。

正在调查对新的 API 的支持。

2. 快速开始

流量记录

# Modify php-fpm config, set `clear_env = no`

# Compile koala-libc.so & koala-recorder.so

# Start php-fpm with koala-libc.so & koala-recorder.so
# Set environment first
$ export KOALA_SO=/path/to/koala-recorder.so 
$ export KOALA_RECORD_TO_DIR=/path/to/your-save-recorded-session-dir
$ export LC_CTYPE="C"

# Recording
# macOS
$ DYLD_INSERT_LIBRARIES="/path/to/koala-libc.so" DYLD_FORCE_FLAT_NAMESPACE="y" /path/to/sbin/php-fpm

# or, Linux
$ LD_PRELOAD="/path/to/koala-libc.so" /path/to/sbin/php-fpm

流量回放

三种回放方式:从源回放,通过 midi.phar 回放,通过 composer vendor/bin 回放。

# Source
$ git clone https://github.com/didi/rdebug.git
$ cd rdebug/php/midi
$ sh install.sh
$ cd /path/to/your/project
$ /path/to/rdebug/php/midi/bin/midi run -f RECORD-SESSION-FILE

# Or, Phar
$ wget -O midi.phar -q https://github.com/didi/rdebug/raw/master/output/bin/midi.phar
$ midi.phar run -f RECORD-SESSION-FILE

# Or, Composer global
$ composer global require rdebug/midi
$ cd /path/to/your/project
$ ~/.composer/vendor/bin/midi run -f RECORD-SESSION-FILE

# Or, Composer
$ cd /path/to/your/project
$ composer require rdebug/midi --dev
$ ./vendor/bin/midi run -f RECORD-SESSION-FILE

PHP 示例

3. 技术细节

我们使用实际生产流量在非生产环境中进行测试。因此,Rdebug 的核心功能是流量记录和流量回放。

  • 流量记录

    记录生产流量,包括微服务之间的 RPC。最难的部分是跟踪将跨越多个服务的请求。

  • 流量回放

    将记录的生产流量回放到非生产环境,基于流量匹配模拟下游流量。最难的部分是拦截和流量匹配。

koala-midi

3.1 Koala & Koala-libc

Koala 和 Koala-libc 是 Rdebug 的引擎。

因为像 RPC 跟踪libc 拦截 这样的流量回放系统可能关心的问题,也是一个流量记录系统关心的问题。流量记录和回放系统共享同一个引擎。

Koala

Koala 使用 Go 语言编写,Koala-libc 包含一些用于拦截部分的 C++ 代码,这些代码将被编译成 koala-recorder.sokoala-replayer.so

Koala 支持单独以及同时进行回放和记录。

更多详情: koala

Koala-libc

koala-libc 使用 C 语言编写,并编译成 koala-libc.so

Go 语言不支持 fork。为了避免 PHP-FPM fork 工作进程带来的问题,您需要将 koala-libc.so 注入 PHP 的父进程。这样,当在子进程中进行 accept 时,koala-libc.so 将将 libc 拦截的请求转发到 *koala-recorder.so

更多详情: koala-libc

3.2 Midi

Midi 是一个用 PHP 编写的命令行流量回放客户端,用于 PHP。

koala-replayer.so 被嵌入到 Midi 中,它可以针对新代码回放生产流量,分析测试结果,生成差异报告,跟踪报告,覆盖率报告。

Midi 支持 Xdebug。

更多信息: midi

4. 编译

4.1 需求

Koala & Koala-libc

  • GCC >= 4.8
  • Go >= 1.8
  • Glide

Midi

  • macOS/Linux
  • PHP >= 7.0
  • Xdebug(可选)
  • Composer(可选)

4.2 编译 Koala-libc

$ cd koala-libc
$ sh build.sh

将生成 ../output/libs/koala-libc.so

4.3 编译 Koala

$ cd koala

# install depends
$ sh build.sh vendor

# koala-recorder.so
$ sh build.sh recorder

# koala-replayer.so
$ sh build.sh

将生成 ../output/libs/koala-recorder.so../output/libs/koala-replayer.so

4.4 编译 midi.phar

在编译 midi.pahr 之前,建议在您的系统中编译 koala-replayer.so 并存储在 php/midi/res/replayer 目录中。

仓库中的 php/midi/res/replayer/koala-replayer.so 适用于 macOS。

$ cd php/midi
$ sh build.sh

将生成 ../output/bin/midi.phar

默认 phar 不会包含 DiPlugin 插件,这是 didi 的内部插件。

如果您想使用 DiPlugin 插件进行编译

$ cd php/midi
$ sh build.sh midi-diplugin

5. 使用方法

5.1 流量记录

将流量记录到文件或 Elastic。

设置环境变量 KOALA_RECORD_TO_DIR 以将记录保存到指定目录

注入 so。在 macOS 中使用 DYLD_INSERT_LIBRARIES 或在 Linux 中使用 LD_PRELOAD

更多信息: Recorder

5.1.1 macOS 记录

$ DYLD_INSERT_LIBRARIES="/path/to/koala-libc.so:/usr/lib/libcurl.dylib" DYLD_FORCE_FLAT_NAMESPACE="y" LC_CTYPE="C" KOALA_SO=/path/to/koala-recorder.so KOALA_RECORD_TO_DIR=/tmp /usr/local/sbin/php-fpm

5.1.2 Linux 记录

LD_PRELOAD="/path/to/koala-libc.so /usr/lib64/libcurl.so.4" LC_CTYPE="C" KOALA_SO="/path/to/koala-recorder.so" KOALA_RECORD_TO_DIR=/tmp /usr/local/sbin/php-fpm

Koala 通过将 KOALA_RECORD_TO_DIR 替换为 KOALA_RECORD_TO_ES 支持将记录写入 Elastic,其中值是 Elastic 写入 URL

5.2 流量回放

流量回放是将记录的流量在生产环境中回放到非生产环境。您只需要部署代码,而无需部署下游服务。

以下是一个使用 '-f' 进行回放的简单示例,该选项指定要回放的文件。

5.2.1 回放

# Source
$ /path/to/rdebug/php/midi/bin/midi run -f RECORD-SESSION-FILE

# Or, phar
$ midi.phar run -f RECORD-SESSION-FILE

# Or, composer vendor bin
$ ./vendor/bin/midi -f RECORD-SESSION-FILE

更多信息: 回放

使用 -v, -vv 或 -vvv 以获取更多详细日志。

5.2.2 报告

使用 -R-T-C 生成:回放报告、跟踪报告、覆盖率报告

report

report-upstream

report-coverage

更多信息: Midi

6. 更多

6.1 翻译

6.2 文档

6.3 贡献

欢迎任何贡献。 更多信息

6.4 合同

  • 添加微信

  • QQ 群

QQ

6.5 许可证

Rdebug 根据 Apache 2.0 许可证授权。 LICENSE

6.6 贡献者

特别感谢 TaoWen 开发了 Koala & Koala-libc。

感谢所有贡献者。 更多信息