package
0.17.4
Repository: https://github.com/labstack/echo-contrib.git
Documentation: pkg.go.dev

# README

Tracing Library for Go

This library provides tracing for go using Zipkin

Usage

Server Tracing Middleware & http client tracing

package main

import (
	"github.com/labstack/echo-contrib/zipkintracing"
	"github.com/labstack/echo/v4"
	"github.com/openzipkin/zipkin-go"
	zipkinhttp "github.com/openzipkin/zipkin-go/middleware/http"
	zipkinHttpReporter "github.com/openzipkin/zipkin-go/reporter/http"
	"io/ioutil"
	"net/http"
)

func main() {
	e := echo.New()
	endpoint, err := zipkin.NewEndpoint("echo-service", "")
	if err != nil {
		e.Logger.Fatalf("error creating zipkin endpoint: %s", err.Error())
	}
	reporter := zipkinHttpReporter.NewReporter("http://localhost:9411/api/v2/spans")
	traceTags := make(map[string]string)
	traceTags["availability_zone"] = "us-east-1"
	tracer, err := zipkin.NewTracer(reporter, zipkin.WithLocalEndpoint(endpoint), zipkin.WithTags(traceTags))
	client, _ := zipkinhttp.NewClient(tracer, zipkinhttp.ClientTrace(true))
	if err != nil {
		e.Logger.Fatalf("tracing init failed: %s", err.Error())
	}
	//Wrap & Use trace server middleware, this traces all server calls
	e.Use(zipkintracing.TraceServer(tracer))
	//....
	e.GET("/echo", func(c echo.Context) error {
		//trace http request calls.
		req, _ := http.NewRequest("GET", "https://echo.labstack.com/", nil)
		resp, _ := zipkintracing.DoHTTP(c, req, client)
		body, _ := ioutil.ReadAll(resp.Body)
		return c.String(http.StatusOK, string(body))
	})

	defer reporter.Close() //defer close reporter
	e.Logger.Fatal(e.Start(":8080"))
}

Reverse Proxy Tracing

package main

import (
	"github.com/labstack/echo-contrib/zipkintracing"
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
	"github.com/openzipkin/zipkin-go"
	zipkinHttpReporter "github.com/openzipkin/zipkin-go/reporter/http"
	"net/http/httputil"
	"net/url"
)

func main() {
	e := echo.New()
	//new tracing instance
	endpoint, err := zipkin.NewEndpoint("echo-service", "")
	if err != nil {
		e.Logger.Fatalf("error creating zipkin endpoint: %s", err.Error())
	}
	reporter := zipkinHttpReporter.NewReporter("http://localhost:9411/api/v2/spans")
	traceTags := make(map[string]string)
	traceTags["availability_zone"] = "us-east-1"
	tracer, err := zipkin.NewTracer(reporter, zipkin.WithLocalEndpoint(endpoint), zipkin.WithTags(traceTags))
	if err != nil {
		e.Logger.Fatalf("tracing init failed: %s", err.Error())
	}
	//....
	e.GET("/echo",  func(c echo.Context) error {
		proxyURL, _ := url.Parse("https://echo.labstack.com/")
		httputil.NewSingleHostReverseProxy(proxyURL)
		return nil
	}, zipkintracing.TraceProxy(tracer))

	defer reporter.Close() //close reporter
	e.Logger.Fatal(e.Start(":8080"))

}

Trace function calls

To trace function calls e.g. to trace s3Func

package main

import (
	"github.com/labstack/echo-contrib/zipkintracing"
	"github.com/labstack/echo/v4"
	"github.com/openzipkin/zipkin-go"
)

func s3Func(c echo.Context, tracer *zipkin.Tracer) {
	defer zipkintracing.TraceFunc(c, "s3_read", zipkintracing.DefaultSpanTags, tracer)()
	//s3Func logic here...
}

Create Child Span

package main

import (
	"github.com/labstack/echo-contrib/zipkintracing"
	"github.com/labstack/echo/v4"
	"github.com/openzipkin/zipkin-go"
)

func traceWithChildSpan(c echo.Context, tracer *zipkin.Tracer) {
	span := zipkintracing.StartChildSpan(c, "someMethod", tracer)
	//func logic.....
	span.Finish()
}