Adds a middleware to enable tracing with OpenTracing/OpenZipkin. Enabling tracing will have a large impact on performance so it is not advisable in production.
87 lines
1.6 KiB
Go
87 lines
1.6 KiB
Go
package trace
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/miekg/coredns/core/dnsserver"
|
|
"github.com/miekg/coredns/middleware"
|
|
|
|
"github.com/mholt/caddy"
|
|
)
|
|
|
|
func init() {
|
|
caddy.RegisterPlugin("trace", caddy.Plugin{
|
|
ServerType: "dns",
|
|
Action: setup,
|
|
})
|
|
}
|
|
|
|
func setup(c *caddy.Controller) error {
|
|
t, err := traceParse(c)
|
|
if err != nil {
|
|
return middleware.Error("trace", err)
|
|
}
|
|
|
|
dnsserver.GetConfig(c).AddMiddleware(func(next middleware.Handler) middleware.Handler {
|
|
t.Next = next
|
|
return t
|
|
})
|
|
|
|
traceOnce.Do(func() {
|
|
c.OnStartup(t.OnStartup)
|
|
})
|
|
|
|
return nil
|
|
}
|
|
|
|
func traceParse(c *caddy.Controller) (*Trace, error) {
|
|
var (
|
|
tr = &Trace{Endpoint: defEP, EndpointType: defEpType}
|
|
err error
|
|
)
|
|
|
|
cfg := dnsserver.GetConfig(c)
|
|
tr.ServiceEndpoint = cfg.ListenHost + ":" + cfg.Port
|
|
for c.Next() {
|
|
if c.Val() == "trace" {
|
|
var err error
|
|
args := c.RemainingArgs()
|
|
switch len(args) {
|
|
case 0:
|
|
tr.Endpoint, err = normalizeEndpoint(tr.EndpointType, defEP)
|
|
case 1:
|
|
tr.Endpoint, err = normalizeEndpoint(defEpType, args[0])
|
|
case 2:
|
|
tr.EndpointType = strings.ToLower(args[0])
|
|
tr.Endpoint, err = normalizeEndpoint(tr.EndpointType, args[1])
|
|
default:
|
|
err = c.ArgErr()
|
|
}
|
|
if err != nil {
|
|
return tr, err
|
|
}
|
|
}
|
|
}
|
|
return tr, err
|
|
}
|
|
|
|
func normalizeEndpoint(epType, ep string) (string, error) {
|
|
switch epType {
|
|
case "zipkin":
|
|
if strings.Index(ep, "http") == -1 {
|
|
ep = "http://" + ep + "/api/v1/spans"
|
|
}
|
|
return ep, nil
|
|
default:
|
|
return "", fmt.Errorf("Tracing endpoint type '%s' is not supported.", epType)
|
|
}
|
|
}
|
|
|
|
var traceOnce sync.Once
|
|
|
|
const (
|
|
defEP = "localhost:9411"
|
|
defEpType = "zipkin"
|
|
)
|