1package lightstep 2 3import ( 4 "context" 5 "io" 6 "net/http" 7 8 "github.com/lightstep/lightstep-tracer-common/golang/gogo/collectorpb" 9) 10 11var accessTokenHeader = http.CanonicalHeaderKey("Lightstep-Access-Token") 12 13// Connection describes a closable connection. Exposed for testing. 14type Connection interface { 15 io.Closer 16} 17 18// ConnectorFactory is for testing purposes. 19type ConnectorFactory func() (interface{}, Connection, error) 20 21// collectorResponse encapsulates internal grpc/http responses. 22type collectorResponse interface { 23 GetErrors() []string 24 Disable() bool 25 DevMode() bool 26} 27 28// Collector encapsulates custom transport of protobuf messages 29type Collector interface { 30 Report(context.Context, *collectorpb.ReportRequest) (*collectorpb.ReportResponse, error) 31} 32 33type reportRequest struct { 34 protoRequest *collectorpb.ReportRequest 35 httpRequest *http.Request 36} 37 38// collectorClient encapsulates internal grpc/http transports. 39type collectorClient interface { 40 Report(context.Context, reportRequest) (collectorResponse, error) 41 Translate(*collectorpb.ReportRequest) (reportRequest, error) 42 ConnectClient() (Connection, error) 43 ShouldReconnect() bool 44} 45 46func newCollectorClient(opts Options) (collectorClient, error) { 47 if opts.CustomCollector != nil { 48 return newCustomCollector(opts), nil 49 } 50 if opts.UseHttp { 51 return newHTTPCollectorClient(opts) 52 } 53 if opts.UseGRPC { 54 return newGrpcCollectorClient(opts) 55 } 56 57 // No transport specified, defaulting to HTTP 58 return newHTTPCollectorClient(opts) 59} 60