• Stars
    star
    2,182
  • Rank 20,290 (Top 0.5 %)
  • Language
    Go
  • License
    Apache License 2.0
  • Created about 4 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Sharingan(写轮眼)是一个基于golang的流量录制回放工具,适合项目重构、回归测试等。

Sharingan

Build Status Gitter License GoDoc

Sharingan

Sharingan,中文名:写轮眼,是漫画《火影忍者》中的一种瞳术,具有复制、幻术等能力,在幻术世界里,一切因素包括时间,地点,质量等,都由施术者掌控。

一、简介

Sharingan是一个基于golang的流量录制回放工具,录制线上真实请求流量进行回放测试,适合项目重构、回归测试等。

1.1、背景

随着微服务架构的兴起,服务之间的依赖关系变的越来越复杂,软件测试也面临新的挑战:系统升级频繁、服务依赖众多等等。

  • 常见的测试方案(如:单元测试、系统测试等)构造和维护测试用例成本高,特别是业务复杂的场景。「构造测试数据
  • 依赖第三方服务众多,线下测试环境不太稳定,经常出现下游服务不可用导致测试失败的情况发生。「维护测试环境成本

为此,我们需要开发一套工具来缓解上述问题。

1.2、方案

  • 录制线上服务真实请求流量(包括下游调用流量),在线下进行回放,解决构造测试数据难的问题。「复制能力」
  • 回放的时候匹配Mock下游调用,不再依赖具体的下游服务,解决维护测试环境成本高的问题。「幻术能力」

1.3、特性

  • 支持下游流量录制。相比tcpcopygoreplay等方案,回放不依赖下游环境。
  • 支持并发流量录制和回放。录制对服务影响小,回放速度更快。
  • 支持时间重置、噪音去除、批量回放、覆盖率报告、常见协议解析等等。
  • 支持写流量回放,不会污染应用数据。
  • 不依赖业务框架,低应用浸入。

二、快速开始

2.1、使用示例

# Step1: 下载sharingan项目
$ git clone https://github.com/didi/sharingan.git
$ cd sharingan

# Step2: 使用定制版golang,以go1.13为例「慢?科学上网试试」
$ sudo sh install.sh go1.13 # 支持go1.10 ~ go1.15,限mac、linux、amd64「执行出错?请查看底部常见问题」
$ export GOROOT=/tmp/recorder-go1.13
$ export PATH=$GOROOT/bin:$PATH

# Step3: 编译、后台启动replayer-agent「默认会占用3515、8998端口,可修改」
# [回放接入文档]内有直接下载bin文件的链接,无需build
$ cd replayer-agent
$ go build
$ nohup ./replayer-agent >> run.log 2>&1 &

# Step4: 编译、后台启动example示例「默认会占用9999端口,可修改」
$ cd ../example
$ go build -tags="replayer" -gcflags="all=-N -l"
$ nohup ./example >> run.log 2>&1 &

# Step5: 打开回放页面
$ 浏览器打开,http://127.0.0.1:8998 # 非本机替换IP即可
$ 页面选择要回放的流量点执行          # 内置提前录制好的3条example示例流量

2.2、接入文档

三、技术方案

3.1、模块划分

  • recorder: 流量录制模块,录制流量本地文件存储、发送流量到录制agent等。
  • recorder-agent:流量录制agent,单独进程启动,控制录制比例、流量存储等。
  • replayer: 流量回放模块,重定向连接到Mock Server、Mock时间、添加流量标识等。
  • replayer-agent:流量回放agent,单独进程启动,查询流量、查询/上报噪音、流量diff、批量回放、生成覆盖率报告等。

3.2、整体架构图

架构图

3.3、录制方案

  • 修改golang源码,对外暴露Hook接口。「所有改动通过官方测试用例」
  • 提供API串联不同goroutine之间的网络调用。「常见的http、mysql、redis流量都不需要特别设置」
  • 提供单独的agent筛选流量、控制比例。
  • 更多参考:流量录制实现原理

3.4、回放方案

  • 连接重定向:将服务所有Connect网络调用重定向到Mock Server。「安装replayer-agent时候自带」
  • 流量匹配:Mock Server会根据服务真实的下游请求匹配一个返回。「mock下游调用」
  • 时间重置:将程序执行时间回退到录制执行时刻,尽量避免时间因素带来的干扰。
  • 噪音去除:提供API可以将已知的噪音流量去掉,如:traceID,每次请求本来就不一样。
  • 常见协议解析:会解析http、mysql、redis、thrift等协议,方便diff对比。
  • 更多参考:流量回放实现原理

四、演进之路

关于流量录制和回放,在内部进行过多次探索,主要经历下面三个阶段:

4.1、月光宝盒(串行录制、串行回放)

录制:利用tcpdump录制流量,改造router层将请求串行化,利用时间来分割请求。

回放:利用iptables转发流量到mock服务,匹配请求并mock返回。支持时间重置、流量对比等。

不足:录制流量覆盖率低,一次只能录制一个请求。iptables转发,噪音干扰严重。

4.2、Fastdev(并行录制、串行回放)

录制:改造golang源码,利用goroutine+工作委托技术串联区分请求。链路追踪原理

回放:利用mock库重定向connect系统调用,转发流量到mock服务。支持Dashboard、噪音去除等。monkey mock原理

不足:录制接口和实现混合,golang多版本支持困难。不支持并发回放,启动阶段流量无法代理会失败,定时任务流量干扰严重。

4.3、Sharingan(并行录制、并行回放)

录制:接口和实现分离,golang源码改造部分只暴露接口,具体录制实现单独提供包支持。确保golang源码改动通过官方测试,支持1.10~1.14所有版本;优化录制服务性能。

回放:添加流量标识,支持并发回放;支持启动阶段流量代理;利用定制版golang,消除定时任务流量干扰;时间重置不再依赖本地文件,支持replayer-agent单独部署;支持常见协议解析。

五、效果展示

5.1、流量回放

5.1.1、单个回放

单个回放

对于下游请求很多且复杂的情况,支持对下游协议进行筛选 单个回放-协议刷选

5.1.2、批量回放

批量回放的并发度默认是10,可通过增加-parallel参数修改。 批量回放

5.2、覆盖率报告

5.2.1、整体报告

覆盖率报告支持覆盖率结果累计,即支持 多次 单个回放和批量回放后,统一生成覆盖率结果。 整体报告

5.2.1、覆盖详情

覆盖详情

六、更多

6.1、如何贡献

欢迎大家参与进来,更多参考Contribute

6.2、许可

基于Apache-2.0协议进行分发和使用,更多参考LICENSE

6.3、成员

huengyj20060714qiaodandedidibikong0411plpanfzl-yty

6.4、感谢

特别感谢TaoWen ,流量录制和回放初版设计者,为后续开源奠定了很好的基础。

6.5、联系我们

  • 微信交流群 【加管理员微信,拉进交流群】

WEIXIN

七、常见问题

  • 执行 $ sudo sh install.sh go1.13 提示 wget: command not found...

    # 首先安装 brew
    $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    # 然后用 `brew` 安装 `wget`:
    $ brew install wget
    # 下载并运行上述连接中安装包后
    $ sudo port install wget

More Repositories

1

DoKit

一款面向泛前端产品研发全生命周期的效率平台。
Java
19,956
star
2

cube-ui

🔶 A fantastic mobile ui lib implement by Vue
JavaScript
9,110
star
3

chameleon

🦎 一套代码运行多端,一端所见即多端所见
JavaScript
9,024
star
4

VirtualAPK

A powerful and lightweight plugin framework for Android
Java
8,949
star
5

LogicFlow

A flow chart editing framework focusing on business customization. 专注于业务自定义的流程图编辑框架,支持实现脑图、ER图、UML、工作流等各种图编辑场景。
TypeScript
6,812
star
6

KnowStreaming

一站式云原生实时流数据平台,通过0侵入、插件化构建企业级Kafka服务,极大降低操作、存储和管理实时流数据门槛
Java
6,747
star
7

booster

🚀Optimizer for mobile applications
Kotlin
4,752
star
8

nightingale

An enterprise-level cloud-native monitoring system, which can be used as drop-in replacement of Prometheus for alerting and management.
Go
4,510
star
9

mpx

Mpx,一款具有优秀开发体验和深度性能优化的增强型跨端小程序框架
JavaScript
3,531
star
10

mand-mobile

💰 A mobile UI toolkit, based on Vue.js 2, designed for financial scenarios.
Vue
3,429
star
11

tinyid

ID Generator id生成器 分布式id生成系统,简单易用、高性能、高可用的id生成系统
Java
2,071
star
12

ChineseNLP

Datasets, SOTA results of every fields of Chinese NLP
HTML
1,767
star
13

DiDiPrism

小桔棱镜,一款专注移动端操作行为的利器! A powerful tool (iOS & Android) that focuses on mobile operation behavior!
Objective-C
1,699
star
14

gendry

a golang library for sql builder
Go
1,500
star
15

DDMQ

DDMQ is a distributed messaging product with low latency, high throughput and high availability.
Java
1,286
star
16

Hummer

一套移动端高性能高可用的动态化跨端开发框架
Objective-C
1,283
star
17

rdebug

Rdebug — Real Debugger
PHP
1,155
star
18

echo

Echo是一款桌面端调试工具,旨在提高客户端的研发调试效率
Objective-C
1,022
star
19

DroidAssist

A lightweight Android Studio gradle plugin based on Javassist for editing bytecode in Android.
Java
881
star
20

AoE

AoE (AI on Edge,终端智能,边缘计算) 是一个终端侧AI集成运行时环境 (IRE),帮助开发者提升效率。
C++
870
star
21

turbo

Turbo is a light-weight flow engine framework, support BPMN2.0. 一款轻量级流程引擎服务框架,可作为底层服务支持各类流程设计、低代码设计、工作流、服务编排等场景
Java
798
star
22

DRouter

Android Router Framework
Java
711
star
23

AgileTC

AgileTC is an agile test case management platform
JavaScript
642
star
24

falcon-log-agent

用于监控系统的日志采集agent,可无缝对接open-falcon
Go
554
star
25

epage

一款基于schema的低代码可视化页面配置工具
Vue
441
star
26

super-jacoco

Java
430
star
27

GateKeeper

A high-performance Golang gateway that supports rapid development and plug-inization
Go
428
star
28

sds

SDS是一个基于Java开发的简单、易用、高性能的服务降级系统,支持限流、熔断和降级等功能,服务端必备!!
Java
406
star
29

KnowSearch

面向Elasticsearch研发与运维人员,围绕集群、索引构建的零侵入、多租户的Elasticsearch GUI管控平台
Java
377
star
30

kemon

An Open-Source Pre and Post Callback-Based Framework for macOS Kernel Monitoring.
C
368
star
31

di18n

一种自动转换、基于配置的前端国际化方案
JavaScript
286
star
32

pile.js

pile.js components build with React.
CSS
267
star
33

ES-Fastloader

Quickly build large-scale ElasticSearch indices by using the fault tolerance and parallelism of Hadoop
Java
259
star
34

KnowAgent

基于日志模板构建,采集任务动态管控、数据质量精确度量,一站式日志采集平台
Java
243
star
35

LogiCommon

Java版 认证、鉴权、管理、任务调度通用功能组件
Java
213
star
36

Tips

JavaScript
187
star
37

maskdetection

C++
179
star
38

xiaoju-survey

「快速」打造「专属」问卷系统, 让调研「更轻松」
Vue
167
star
39

DreamBox

DreamBox是一个为客户端开发者打造的统一视图开发框架,具有性能好、可动态更新的特点
Java
165
star
40

dlflow

DLFlow is a deep learning framework.
Python
156
star
41

hetsann

Source Codes of HetSANN in the AAAI'20 paper: An Attention-based Graph Nerual Network for Heterogeneous Structural Learning.
Python
140
star
42

collection

go collection package for fasting coding
Go
127
star
43

didi.github.io

didi website
HTML
125
star
44

athena

A release version for https://github.com/athena-team/athena
Python
123
star
45

JuShaTa

JuShaTa是一个Java容器,提供模块隔离及模块热加载能力。
Java
114
star
46

logbook

Java
108
star
47

levin

A Quick Way to Bulk Loading
C++
104
star
48

heteta

HetETA: Heterogeneous Information Network Embedding for Estimating Time of Arrival
Python
101
star
49

thrift-mock

A lightweight java test library for mocking thrift server
Java
90
star
50

mand-mobile-rn

💰 Mand Mobile for React Native, designed for financial scenarios.
TypeScript
87
star
51

TrafficIndex

TTI ,Smart Transportation Industry Standard
C++
85
star
52

slime-validator

JavaScript library of validation based on Plugin system and make data validation be easy.
JavaScript
85
star
53

vue-tmap

一个基于腾讯地图JavaScript API GL、TypeScript 封装适用于 Vue3 的高性能地图组件库
TypeScript
81
star
54

mtmc-vt

MTMC Vehicle Tracking For AI City challenge 2019
Jupyter Notebook
69
star
55

sgt

didiyun super-agent daemon
Go
57
star
56

FeatureProbe

开源的高效可视化『功能』管理平台,提供灰度发布、AB实验、配置变更全功能。
53
star
57

ALITA

ALITA is a layer-based data analysis tool. The front-end see
Java
50
star
58

react-tmap

一个基于腾讯地图JavaScript API GL、TypeScript 封装适用于 react 的高性能地图组件库
TypeScript
45
star
59

benchmark-thrift

An open source application designed to load test Thrift applications
Java
44
star
60

elastic-trib

elasticsearch cluster command line tool.
Go
39
star
61

mpx-cube-ui

基于"Mpx 小程序框架"的移动端基础组件库
TypeScript
25
star
62

yarc

基于 eBPF 的流量录制工具
C
24
star
63

paladin

Scala
20
star
64

MEEP

End-to-end framework to build automatic agents (chatbots) for task-oriented dialogs
Python
18
star
65

tg-flow

Go
18
star
66

Unify

Dart
15
star
67

ALITA_UI

ALITA is a layer-based data analysis tool. The back-end see
JavaScript
13
star
68

wmt2021_triangular_mt

The baseline model code for WMT 2021 Triangular MT
Python
13
star
69

MeetDot

Python
11
star
70

DAIBench

Shell
10
star
71

WorkTrans

Python
10
star
72

didi-tech-edu

9
star
73

daedalus

JavaScript
6
star
74

tmap-types

腾讯地图 js api 类型声明,主要用于 react-tmap 和 vue-tmap 组件库
4
star
75

Json-adapter

Java
3
star