TReactor is a microservice designed to test and experiment with observability of microservices. You can play with it
on your own machine in local
more, but it gets interesting when you deploy it on a Kubernetes cluster or an Istio mesh.
In cluster mode you can have a bit over 120 microservices (atoms in the mendeleev table). You control treactor
by
giving it some interesting molecules
.
I created this microservice to let me inspect what happens inside the kubernetes cluster or a mesh. I've noticed that not all the scenario's and products worked that well together, certainly when you go a bit beyond the happy path. This microservice will enable me to make reproducibles. I hope it's also helpful for other people to learn technologies like tracing, kubernetes networking, logging, istio, etc...
I will start using (and extending) treactor for bug reports, articles and talks. Let's see if this will get as popular as httpbin is ;).
- Create cascading microservice calls from one origin call
- Configure tracing and logging
- Inspect headers, every level in the call hierarchy
To see what treactor does lets take a very simple example. TReactor works by splitting molecules:
[[H]]^2[O]
Everything between the brackets []
will be a call to the next microservice. The brackets can be prefixed with a number
and an optional parameter (s
or p
), this tells treactor how many times the service needs to be called and how (
sequential or parallel). Multiple calls can be make by appending them using ^
(sequential) or *
(parallel).
Depending the content of the bracket the call will be different. If treactor detects an atom a call to the corresponding atom service will be made. But if treactor detects another sub-molecule it calls the next bond and apply the same logic till only atoms are left. So the example above will result in:
http://treactor-api/treact/split?molecule=[[H]]^2[O]
calling
http://bond-1/treact/split?molecule=[h]
http://atom-o/treact/atom/o?atom=o
http://atom-o/treact/atom/o?atom=o
bond will split the molecule [H] (ok, this looks strange, but each bracket is a layer) into it's atoms, in this
case only 1 H
:
http://atom-h/treact/atom?atom=H
Try the local installation, to see how it looks in the trace (this will make it more clear).
Create a directory tmp
and work
in this repo. Don't worry, they are in the .gitignore
so you do not accidentally
check them in.
Build the treactor
from source
go install ./cmd/treactor/
Set the environmental variables. Replace project-name
project with your own
export PORT=3330
export TREACTOR_NAME=reactor-api
export TREACTOR_VERSION=1
export TREACTOR_DEBUG=1
export TREACTOR_PROFILE=0
export TREACTOR_MODE=local
Fire up the treactor
treactor
And test it by calling:
http://localhost:3330/treact/split?molecule=[[H]]^2[O]
Go to the Cloud Console, select Trace.
Not yet fully tested/supported
go install ./cmd/trprep/
kubectl label namespace default istio-injection=disabled --overwrite
Not yet fully tested/supported
kubectl label namespace default istio-injection=enabled --overwrite
Prepares the Kubernetes files, from the templates
NAME | Description | Default |
---|---|---|
PORT | Port | |
SERVICE_NAME | Application name | treactor |
SERVICE_VERSION | Application version | 0.0.0 |
TREACTOR_MODE | Reactor mode (local, k8s) | local |
TREACTOR_TRACE_PROPAGATION | OpenTelemetry propagator (w3c) | w3c |
S [H,x=1,y=2,z=3]*2[O,x=1,y=2,z=3],x=1,y=2,z=3
A H,x=1,y=2,z=3
A O,x=1,y=2,z=3
S 2[5[Ur,log:1,xyz:4]^5[C,log:1,xyz:4]],x:1,y:2
O1 5[Ur,log:1,xyz:4]^5[C,log:1,xyz:4]
A Ur,log:1,xyz:4
A C,log:1,xyz:4