Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork4
🪡 Dead simple, lightweight tracing.
License
kamilsk/tracer
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Dead simple, lightweight tracing.
The tracer provides API to trace execution flow.
funcDo(ctx context.Context) {defertracer.Fetch(ctx).Start().Stop()// do some heavy job}
A full description of the idea is availablehere.
AtAvito, we use theJaeger - a distributed tracing platform.It is handy in most cases, but at production, we also use sampling. So, what is a problem, you say?
I had 0.02% requests with awrite: broken pipe
error and it was difficult to find the appropriate one intheSentry which also has trace related to it in theJaeger.
For that reason, I wrote the simple solution to handle this specific case and found the bottleneck in our code quickly.
import ("context""io""net/http""time""github.com/kamilsk/tracer")funcInjectTracer(handler http.Handler) http.Handler {returnhttp.HandlerFunc(func(rw http.ResponseWriter,req*http.Request) {req=req.WithContext(tracer.Inject(req.Context(),make([]*tracer.Call,0,10)))handler.ServeHTTP(rw,req)})}funcHandle(rw http.ResponseWriter,req*http.Request) {ctx,cancel:=context.WithTimeout(req.Context(),time.Second)defercancel()call:=tracer.Fetch(req.Context()).Start(req.Header.Get("X-Request-Id"))defercall.Stop()...call.Checkpoint("serialize")data,err:=FetchData(ctx,req.Body)iferr!=nil {http.Error(rw,err.Error(),http.StatusInternalServerError)return}call.Checkpoint("store")iferr:=StoreIntoDatabase(ctx,data);err!=nil {http.Error(rw,http.StatusText(http.StatusInternalServerError),http.StatusInternalServerError)return}rw.WriteHeader(http.StatusOK)}funcFetchData(ctx context.Context,r io.Reader) (Data,error) {defertracer.Fetch(ctx).Start().Stop()// fetch a data into a struct}funcStoreIntoDatabase(ctx context.Context,dataData)error {defertracer.Fetch(ctx).Start().Stop()// store the data into a database}
Output:
allocates at call stack: 0, detailed call stack:call Handle [ca7a87c4-58d0-4fdf-857c-ef49fc3bf271]: 14.038083ms, allocates: 2checkpoint [serialize]: 1.163587mscheckpoint [store]: 2.436265mscall FetchData: 1.192829ms, allocates: 0call StoreIntoDatabase: 10.428663ms, allocates: 0
The library usesSemVer for versioning, and it is notBC-safe through major releases.You can usego modules to manage its version.
$ go get github.com/kamilsk/tracer@latest
made with ❤️ for everyone
About
🪡 Dead simple, lightweight tracing.
Topics
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.