didi / sharingan Goto Github PK
View Code? Open in Web Editor NEWSharingan(写轮眼)是一个基于golang的流量录制回放工具,适合项目重构、回归测试等。
License: Apache License 2.0
Sharingan(写轮眼)是一个基于golang的流量录制回放工具,适合项目重构、回归测试等。
License: Apache License 2.0
想看一下改了哪一些地方。我发现只有release,我还要自己对比,太折腾了。
这样运行项目的时候可以直接在docker中运行,不用在折腾本地的环境了
滴滴内部员工来吐槽下,难用的一批,响应也很不及时,为了开源而开源的产物
udp 53端口
关于上下游流量inbound/outbound的对应匹配:
这应该是框架做的事情,框架应该维护一个traceid,跟着流量在全链路传播
关于工作委托:
在业务层,应该通过context来传递信息吧,而不是修改源码,把数据存在源码未导出的结构体.
请问使用一个context来传递相关的threadlocal信息有什么局限吗?
使用过Goreplay,无法直接录制443端口的HTTPS请求。目前的方式是用nginx做流量镜像转发到其他端口,再录制新端口的请求。
请问写轮眼可以直接录制HTTPS流量,而不需要更改反向代理节点配置的方案吗?
测试代码
`package main
import (
"github.com/didi/sharingan"
"database/sql"
"github.com/garyburd/redigo/redis"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)
var (
SqlDB *sql.DB // mysql连接
RedisConn redis.Conn // redis连接
err error
)
func init() {
SqlDB, err = sql.Open("mysql", "root:my-secret-pw@tcp(192.168.174.134:3306)/meng")
if err != nil {
log.Println("初始化mysql连接失败.", err)
} else {
SqlDB.SetConnMaxLifetime(100 * time.Second) //最大连接周期,超过时间的连接就close
SqlDB.SetMaxOpenConns(100) //设置最大连接数
SqlDB.SetMaxIdleConns(16) //设置闲置连接数
log.Println("初始化mysql连接成功", SqlDB.Stats())
}
RedisConn, err = redis.Dial("tcp", "192.168.174.134:6379")
if err != nil {
log.Println("Connect to redis error", err)
} else {
log.Println("初始化redis连接成功")
}
}
func SetTaskRouter() *gin.Engine {
router := gin.Default()
api := router.Group("/api")
{
api.POST("/book",ShanT)
}
return router
}
func main(){
r := SetTaskRouter()
r.Use(cors.Default())
r.Run(":8090")
}
var msg chan string
func init() {
msg = make(chan string)
}
type Book struct {
BookName string db:"name" json:"name"
BookAuthor string db:"author" json:"author"
}
func ShanT(c *gin.Context) {
book := Book{}
c.ShouldBindJSON(&book)
if book.BookName == "" || book.BookAuthor == "" {
c.JSON(500,"需要用户信息")
}
// 写mysql
InsertMysql(book)
// 查询mysql
mbook,err := GetMysqlBookByAuthor(book.BookAuthor)
if err != nil {
log.Println("从mysql查询失败,停止查询")
} else {
log.Println("mysql中查询到的book",mbook)
// 读写redis
go Redis(mbook,sharingan.GetCurrentGoRoutineID())
// 从channel中读取数据
m := <- msg
c.JSON(200,m)
}
}
func InsertMysql(book Book) {
result,err := SqlDB.Exec("insert INTO book(name,author) values (?,?)",book.BookName,book.BookAuthor)
if err != nil {
log.Println("插入myql失败",err)
} else {
num,_ := result.RowsAffected()
log.Println("插入mysql成功,影响行数",num)
}
}
func GetMysqlBookByAuthor(author string) (Book,error){
book := new(Book)
row := SqlDB.QueryRow("select * from book where author=?",author)
//row.scan中的字段必须是按照数据库存入字段的顺序,否则报错
if err :=row.Scan(&book.BookName,&book.BookAuthor); err != nil{
log.Println("从mysql查询失败",err)
return *book,err
} else {
return *book,nil
}
}
func Redis(book Book,delegatedID int64) {
sharingan.SetDelegatedFromGoRoutineID(delegatedID)
defer sharingan.SetDelegatedFromGoRoutineID(0)
_, err = RedisConn.Do("SET", book.BookName,book.BookAuthor)
if err != nil {
log.Println("redis set failed:", err)
}
author, err := redis.String(RedisConn.Do("GET", book.BookName))
if err != nil {
log.Println("redis get failed:", err)
} else {
log.Println("Get mykey: %v \n", author)
}
msg <- author
}
可以连接mysql,但是redis连接异常
[GIN-debug] Listening and serving HTTP on :8090
2020/05/22 19:48:44 插入mysql成功,影响行数 1
2020/05/22 19:48:44 mysql中查询到的book {b b}
2020/05/22 19:48:44 redis set failed: EOF
2020/05/22 19:48:44 redis get failed: write tcp 127.0.0.1:45722->127.0.0.1:3515: use of closed network connection
[GIN] 2020/05/22 - 19:48:44 | 200 | 0s | 127.0.0.1 | POST "/api/book"
2020/05/22 19:48:39 插入mysql成功,影响行数 1
2020/05/22 19:48:39 mysql中查询到的book {a a}
2020/05/22 19:48:39 redis set failed: write tcp 127.0.0.1:45722->127.0.0.1:3515: use of closed network connection
2020/05/22 19:48:39 redis get failed: write tcp 127.0.0.1:45722->127.0.0.1:3515: use of closed network connection
`
回放页面显示miss
如题, 请教下相关的方案, 以及遇到的痛点
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.