78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
|
package zipkintracer
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
|
||
|
"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
|
||
|
)
|
||
|
|
||
|
// Collector represents a Zipkin trace collector, which is probably a set of
|
||
|
// remote endpoints.
|
||
|
type Collector interface {
|
||
|
Collect(*zipkincore.Span) error
|
||
|
Close() error
|
||
|
}
|
||
|
|
||
|
// NopCollector implements Collector but performs no work.
|
||
|
type NopCollector struct{}
|
||
|
|
||
|
// Collect implements Collector.
|
||
|
func (NopCollector) Collect(*zipkincore.Span) error { return nil }
|
||
|
|
||
|
// Close implements Collector.
|
||
|
func (NopCollector) Close() error { return nil }
|
||
|
|
||
|
// MultiCollector implements Collector by sending spans to all collectors.
|
||
|
type MultiCollector []Collector
|
||
|
|
||
|
// Collect implements Collector.
|
||
|
func (c MultiCollector) Collect(s *zipkincore.Span) error {
|
||
|
return c.aggregateErrors(func(coll Collector) error { return coll.Collect(s) })
|
||
|
}
|
||
|
|
||
|
// Close implements Collector.
|
||
|
func (c MultiCollector) Close() error {
|
||
|
return c.aggregateErrors(func(coll Collector) error { return coll.Close() })
|
||
|
}
|
||
|
|
||
|
func (c MultiCollector) aggregateErrors(f func(c Collector) error) error {
|
||
|
var e *collectionError
|
||
|
for i, collector := range c {
|
||
|
if err := f(collector); err != nil {
|
||
|
if e == nil {
|
||
|
e = &collectionError{
|
||
|
errs: make([]error, len(c)),
|
||
|
}
|
||
|
}
|
||
|
e.errs[i] = err
|
||
|
}
|
||
|
}
|
||
|
return e
|
||
|
}
|
||
|
|
||
|
// CollectionError represents an array of errors returned by one or more
|
||
|
// failed Collector methods.
|
||
|
type CollectionError interface {
|
||
|
Error() string
|
||
|
GetErrors() []error
|
||
|
}
|
||
|
|
||
|
type collectionError struct {
|
||
|
errs []error
|
||
|
}
|
||
|
|
||
|
func (c *collectionError) Error() string {
|
||
|
errs := []string{}
|
||
|
for _, err := range c.errs {
|
||
|
if err != nil {
|
||
|
errs = append(errs, err.Error())
|
||
|
}
|
||
|
}
|
||
|
return strings.Join(errs, "; ")
|
||
|
}
|
||
|
|
||
|
// GetErrors implements CollectionError
|
||
|
func (c *collectionError) GetErrors() []error {
|
||
|
return c.errs
|
||
|
}
|