zazkia

模拟连接问题的 tcp 代理。「tcp proxy to simulate connection problems」

Github stars Tracking Chart

zazkia
is a tool that simulates all kinds of connection problems with a tcp connection (reset,delay,throttle,corrupt).

systemtest dashboard

How does it work ?

In order to apply misbehavior, zazkia must be used as a proxy between a client and service.
It will accept tcp connections from a client and for each new one, will create a connection to the target service.

Routes

By specifying routes, you can tell zazkia on what ports to listen and what target to connect to (host and port).

Minimal zazkia-routes.json example

[
    {
        "label": "oracle",
        "service-hostname": "some.host.name",
        "service-port": 1521,
        "listen-port": 49997
    }
]

With this route definition, your application should use "localhost:49997" instead of "some.host.name:1521" in the connection specification.
Your application (the client) will setup a tcp connection with zazkia which will setup another tcp connection to oracle (the service).

Initial transport behavior

The transport part of a route configuration can be used to setup the initial behavior of a new connection pair (called link).
Using a REST api, the transport behavior can be changed on a per-link basis.

Full zazkia-routes.json example

[
    {
        "label": "postgresql",
        "service-hostname": "some.other.host.name",
        "service-port": 5432,
        "listen-port": 49998,
        "transport": {
			"accept-connections": true,
			"throttle-service-response": 1000,
			"delay-service-response": 100,
			"break-service-response": 10,
			"service-response-corrupt-method": "randomize",
			"sending-to-client": true,
			"receiving-from-client": true,
			"sending-to-service": true,
			"receiving-from-service": true,
			"verbose": true
        }
    }
]
transport property comment effective values
accept-connections whether connections from the client are accepted true, false
throttle-service-response bytes per second non-negative integer
delay-service-response milliseconds delay non-negative integer
break-service-response percentage of broken connections integer between 0 and 100
service-response-corrupt-method how the bytes are mangled empty, randomize
sending-to-client whether a response from the service is sent back to the client true, false
receiving-from-client whether a request from the client is read true, false
sending-to-service whether a request from the client is sent to the service true, false
receiving-from-service whether a response from the service is read true, false
verbose log each message that is transported between client and service true, false

Default transport behavior

"transport": {
	"accept-connections": true,
	"throttle-service-response": 0,
	"delay-service-response": 0,
	"break-service-response": 0,
	"service-response-corrupt-method": "",
	"sending-to-client": true,
	"receiving-from-client": true,
	"sending-to-service": true,
	"receiving-from-service": true,
	"verbose": false
}

Build

go test
go build

Run

Usage

./zazkia  -h
2021/03/26 14:38:06 zazkia - tpc proxy for simulating network problems
Usage of ./zazkia:
  -f string
        route definition (default "zazkia-routes.json")
  -p int
        port on which the admin http server will listen (default 9191)
  -v    verbose logging

Defaults (-p 9191 -f zazkia-routes.json)

./zazkia

Dashboard

A simple HTML dashboard is available to change the transport behavior of individual links. See the Swagger tab for documentation of the REST API.

http://localhost:9191

Docker

A Docker image is available on Docker Hub.

Usage

docker run -d -p 9200-9300:9200-9300 -p 9191:9191 -v $(pwd):/data emicklei/zazkia

Zazkia will look for a file called zazkia-routes.json.
The web UI will be running on http://localhost:9191
When using Docker, routes must use listener ports in the range 9200-9300 or 3306 (mysql) or 5432 (postgres) or 8080 (tomcat,jboss).

Examples

See the examples folder for simple usecase examples.

Build your own image

GOOS=linux go build && docker build -t emicklei/zazkia:latest .

© 2024, ernestmicklei.com. Apache v2 License. Contributions welcome.

Main metrics

Overview
Name With Owneremicklei/zazkia
Primary LanguageGo
Program languageGo (Language Count: 7)
Platform
License:Other
所有者活动
Created At2016-09-29 05:29:17
Pushed At2024-12-06 12:56:37
Last Commit At2024-12-06 13:56:29
Release Count12
Last Release Namev0.8.1 (Posted on 2024-12-06 13:56:36)
First Release Name0.1.0 (Posted on 2017-02-13 11:04:34)
用户参与
Stargazers Count76
Watchers Count4
Fork Count5
Commits Count86
Has Issues Enabled
Issues Count1
Issue Open Count0
Pull Requests Count2
Pull Requests Open Count0
Pull Requests Close Count1
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private