From b1d0195ade52c7c2b66a7f47d78f62b1eb17e26c Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Fri, 21 Feb 2020 17:29:01 +0100 Subject: [PATCH 1/6] scope specification support, initial --- agent/agent.go | 6 ++++-- agent/recorder.go | 11 ++++++++--- env/vars.go | 43 +++++++++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/agent/agent.go b/agent/agent.go index d8044d3b..eb8d746b 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -46,6 +46,7 @@ type ( recorder *SpanRecorder recorderFilename string flushFrequency time.Duration + concurrencyLevel int optionalRecorders []tracer.SpanRecorder @@ -62,8 +63,8 @@ type ( var ( version = "0.1.13-pre5" - testingModeFrequency = time.Second - nonTestingModeFrequency = time.Minute + testingModeFrequency = time.Duration(env.ScopeTracerDispatcherHealthcheckFrequencyInTestMode.Value) * time.Millisecond + nonTestingModeFrequency = time.Duration(env.ScopeTracerDispatcherHealthcheckFrequency.Value) * time.Millisecond ) func WithApiKey(apiKey string) Option { @@ -185,6 +186,7 @@ func NewAgent(options ...Option) (*Agent, error) { agent.userAgent = fmt.Sprintf("scope-agent-go/%s", agent.version) agent.panicAsFail = false agent.failRetriesCount = 0 + agent.concurrencyLevel = env.ScopeTracerDispatcherConcurrencyLevel.Value for _, opt := range options { opt(agent) diff --git a/agent/recorder.go b/agent/recorder.go index 400e085a..6514eb17 100644 --- a/agent/recorder.go +++ b/agent/recorder.go @@ -41,9 +41,10 @@ type ( payloadSpans []PayloadSpan payloadEvents []PayloadEvent - flushFrequency time.Duration - url string - client *http.Client + flushFrequency time.Duration + concurrencyLevel int + url string + client *http.Client logger *log.Logger stats *RecorderStats @@ -79,9 +80,13 @@ func NewSpanRecorder(agent *Agent) *SpanRecorder { r.metadata = agent.metadata r.logger = agent.logger r.flushFrequency = agent.flushFrequency + r.concurrencyLevel = agent.concurrencyLevel r.url = agent.getUrl("api/agent/ingest") r.client = &http.Client{} r.stats = &RecorderStats{} + + r.logger.Printf("recorder frequency: %v", agent.flushFrequency) + r.logger.Printf("recorder concurrency level: %v", agent.concurrencyLevel) r.t.Go(r.loop) return r } diff --git a/env/vars.go b/env/vars.go index bd726a20..d4936c95 100644 --- a/env/vars.go +++ b/env/vars.go @@ -3,24 +3,27 @@ package env import "go.undefinedlabs.com/scopeagent/tags" var ( - ScopeDsn = newStringEnvVar("", "SCOPE_DSN") - ScopeApiKey = newStringEnvVar("", "SCOPE_APIKEY") - ScopeApiEndpoint = newStringEnvVar("https://app.scope.dev", "SCOPE_API_ENDPOINT") - ScopeService = newStringEnvVar("default", "SCOPE_SERVICE") - ScopeRepository = newStringEnvVar("", "SCOPE_REPOSITORY") - ScopeCommitSha = newStringEnvVar("", "SCOPE_COMMIT_SHA") - ScopeBranch = newStringEnvVar("", "SCOPE_BRANCH") - ScopeSourceRoot = newStringEnvVar("", "SCOPE_SOURCE_ROOT") - ScopeLoggerRoot = newStringEnvVar("", "SCOPE_LOGGER_ROOT", "SCOPE_LOG_ROOT_PATH") - ScopeDebug = newBooleanEnvVar(false, "SCOPE_DEBUG") - ScopeTracerGlobal = newBooleanEnvVar(false, "SCOPE_TRACER_GLOBAL", "SCOPE_SET_GLOBAL_TRACER") - ScopeTestingMode = newBooleanEnvVar(false, "SCOPE_TESTING_MODE") - ScopeTestingFailRetries = newIntEnvVar(0, "SCOPE_TESTING_FAIL_RETRIES") - ScopeTestingPanicAsFail = newBooleanEnvVar(false, "SCOPE_TESTING_PANIC_AS_FAIL") - ScopeConfiguration = newSliceEnvVar([]string{tags.PlatformName, tags.PlatformArchitecture, tags.GoVersion}, "SCOPE_CONFIGURATION") - ScopeMetadata = newMapEnvVar(nil, "SCOPE_METADATA") - ScopeInstrumentationHttpPayloads = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_HTTP_PAYLOADS") - ScopeInstrumentationHttpStacktrace = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_HTTP_STACKTRACE") - ScopeInstrumentationDbStatementValues = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_DB_STATEMENT_VALUES") - ScopeInstrumentationDbStacktrace = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_DB_STACKTRACE") + ScopeDsn = newStringEnvVar("", "SCOPE_DSN") + ScopeApiKey = newStringEnvVar("", "SCOPE_APIKEY") + ScopeApiEndpoint = newStringEnvVar("https://app.scope.dev", "SCOPE_API_ENDPOINT") + ScopeService = newStringEnvVar("default", "SCOPE_SERVICE") + ScopeRepository = newStringEnvVar("", "SCOPE_REPOSITORY") + ScopeCommitSha = newStringEnvVar("", "SCOPE_COMMIT_SHA") + ScopeBranch = newStringEnvVar("", "SCOPE_BRANCH") + ScopeSourceRoot = newStringEnvVar("", "SCOPE_SOURCE_ROOT") + ScopeLoggerRoot = newStringEnvVar("", "SCOPE_LOGGER_ROOT", "SCOPE_LOG_ROOT_PATH") + ScopeDebug = newBooleanEnvVar(false, "SCOPE_DEBUG") + ScopeTracerGlobal = newBooleanEnvVar(false, "SCOPE_TRACER_GLOBAL", "SCOPE_SET_GLOBAL_TRACER") + ScopeTestingMode = newBooleanEnvVar(false, "SCOPE_TESTING_MODE") + ScopeTestingFailRetries = newIntEnvVar(0, "SCOPE_INSTRUMENTATION_TESTS_FRAMEWORKS_FAIL_RETRIES", "SCOPE_TESTING_FAIL_RETRIES") + ScopeTestingPanicAsFail = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_TESTS_FRAMEWORKS_PANIC_AS_FAIL", "SCOPE_TESTING_PANIC_AS_FAIL") + ScopeConfiguration = newSliceEnvVar([]string{tags.PlatformName, tags.PlatformArchitecture, tags.GoVersion}, "SCOPE_CONFIGURATION") + ScopeMetadata = newMapEnvVar(nil, "SCOPE_METADATA") + ScopeInstrumentationHttpPayloads = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_HTTP_PAYLOADS") + ScopeInstrumentationHttpStacktrace = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_HTTP_STACKTRACE") + ScopeInstrumentationDbStatementValues = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_DB_STATEMENT_VALUES") + ScopeInstrumentationDbStacktrace = newBooleanEnvVar(false, "SCOPE_INSTRUMENTATION_DB_STACKTRACE") + ScopeTracerDispatcherHealthcheckFrequency = newIntEnvVar(60000, "SCOPE_TRACER_DISPATCHER_HEALTHCHECK_FRECUENCY") + ScopeTracerDispatcherHealthcheckFrequencyInTestMode = newIntEnvVar(1000, "SCOPE_TRACER_DISPATCHER_HEALTHCHECK_FRECUENCY_IN_TESTMODE") + ScopeTracerDispatcherConcurrencyLevel = newIntEnvVar(1, "SCOPE_TRACER_DISPATCHER_CONCURRENCY_LEVEL") ) From dd102f5a04d637ef0f9e9193171a012e6d9ac561 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Mon, 24 Feb 2020 11:51:11 +0100 Subject: [PATCH 2/6] Adds concurrency support --- agent/recorder.go | 102 +++++++++++++++++++++++++++++++++------------- go.mod | 1 + go.sum | 1 + 3 files changed, 76 insertions(+), 28 deletions(-) diff --git a/agent/recorder.go b/agent/recorder.go index 6514eb17..39ffc44e 100644 --- a/agent/recorder.go +++ b/agent/recorder.go @@ -3,6 +3,7 @@ package agent import ( "bytes" "compress/gzip" + "context" "crypto/x509" "errors" "fmt" @@ -16,6 +17,7 @@ import ( "github.com/google/uuid" "github.com/vmihailenco/msgpack" + "golang.org/x/sync/semaphore" "gopkg.in/tomb.v2" "go.undefinedlabs.com/scopeagent/tags" @@ -45,6 +47,7 @@ type ( concurrencyLevel int url string client *http.Client + s *semaphore.Weighted logger *log.Logger stats *RecorderStats @@ -84,7 +87,7 @@ func NewSpanRecorder(agent *Agent) *SpanRecorder { r.url = agent.getUrl("api/agent/ingest") r.client = &http.Client{} r.stats = &RecorderStats{} - + r.s = semaphore.NewWeighted(int64(r.concurrencyLevel)) r.logger.Printf("recorder frequency: %v", agent.flushFrequency) r.logger.Printf("recorder concurrency level: %v", agent.concurrencyLevel) r.t.Go(r.loop) @@ -146,48 +149,91 @@ func (r *SpanRecorder) loop() error { // Sends the spans in the buffer to Scope func (r *SpanRecorder) sendSpans() (error, bool) { + defer func() { + // We acquire all to ensure all previous go routines has finished before leaving this function + if r.s.Acquire(context.Background(), int64(r.concurrencyLevel)) == nil { + r.s.Release(int64(r.concurrencyLevel)) + } + }() atomic.AddInt64(&r.stats.sendSpansCalls, 1) const batchSize = 1000 + + // Local mutex to synchronize go routines and avoid race conditions in lastError var + var lastErrorMutex sync.Mutex var lastError error + getLastError := func() error { + lastErrorMutex.Lock() + defer lastErrorMutex.Unlock() + return lastError + } + setLastError := func(err error) { + lastErrorMutex.Lock() + defer lastErrorMutex.Unlock() + lastError = err + } + + var shouldCancel int32 + for { spans, spMore, spTotal := r.popPayloadSpan(batchSize) events, evMore, evTotal := r.popPayloadEvents(batchSize) - payload := map[string]interface{}{ - "metadata": r.metadata, - "spans": spans, - "events": events, - tags.AgentID: r.agentId, - } - buf, err := encodePayload(payload) + // We acquire one concurrency slot, if the concurrency level has been reached, we wait until a release + err := r.s.Acquire(context.Background(), 1) if err != nil { atomic.AddInt64(&r.stats.sendSpansKo, 1) atomic.AddInt64(&r.stats.spansNotSent, int64(len(spans))) return err, false } + // If we had acquire then a previous go routine has finished, we check if the shouldCancel has been set from previous goroutines + if atomic.LoadInt32(&shouldCancel) > 0 { + return getLastError(), true + } - var testSpans int64 - for _, span := range spans { - if isTestSpan(span) { - testSpans++ + go func(sp []PayloadSpan, ev []PayloadEvent, spTotalCount, evTotalCount int) { + defer r.s.Release(1) + payload := map[string]interface{}{ + "metadata": r.metadata, + "spans": sp, + "events": ev, + tags.AgentID: r.agentId, + } + buf, err := encodePayload(payload) + if err != nil { + atomic.AddInt64(&r.stats.sendSpansKo, 1) + atomic.AddInt64(&r.stats.spansNotSent, int64(len(sp))) + setLastError(err) + return + } + var testSpans int64 + for _, span := range sp { + if isTestSpan(span) { + testSpans++ + } } - } - r.logger.Printf("sending %d/%d spans with %d/%d events", len(spans), spTotal, len(events), evTotal) - statusCode, err := r.callIngest(buf) - if err != nil { - atomic.AddInt64(&r.stats.sendSpansKo, 1) - atomic.AddInt64(&r.stats.spansNotSent, int64(len(spans))) - atomic.AddInt64(&r.stats.testSpansNotSent, testSpans) - } else { - atomic.AddInt64(&r.stats.sendSpansOk, 1) - atomic.AddInt64(&r.stats.spansSent, int64(len(spans))) - atomic.AddInt64(&r.stats.testSpansSent, testSpans) - } - if statusCode == 401 { - return err, true - } - lastError = err + if len(sp) == 0 && len(ev) == 0 { + r.logger.Print("sending health check") + } else { + r.logger.Printf("sending %d/%d spans with %d/%d events", len(sp), spTotalCount, len(ev), evTotalCount) + } + statusCode, err := r.callIngest(buf) + if err != nil { + atomic.AddInt64(&r.stats.sendSpansKo, 1) + atomic.AddInt64(&r.stats.spansNotSent, int64(len(spans))) + atomic.AddInt64(&r.stats.testSpansNotSent, testSpans) + setLastError(err) + } else { + atomic.AddInt64(&r.stats.sendSpansOk, 1) + atomic.AddInt64(&r.stats.spansSent, int64(len(spans))) + atomic.AddInt64(&r.stats.testSpansSent, testSpans) + } + if statusCode == 401 { + atomic.AddInt32(&shouldCancel, 1) + return + } + + }(spans, events, spTotal, evTotal) if !spMore && !evMore { break diff --git a/go.mod b/go.mod index a6fd7988..87a00ad8 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 // indirect golang.org/x/net v0.0.0-20200301022130-244492dfa37a golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 // indirect + golang.org/x/sync v0.0.0-20190423024810-112230192c58 google.golang.org/appengine v1.6.5 // indirect google.golang.org/grpc v1.27.1 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect diff --git a/go.sum b/go.sum index cee7bb59..589b0605 100644 --- a/go.sum +++ b/go.sum @@ -107,6 +107,7 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= From 3c7719caaafbdd8bd382a60f43d8992ac933c945 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Mon, 24 Feb 2020 12:03:52 +0100 Subject: [PATCH 3/6] comments --- agent/recorder.go | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/recorder.go b/agent/recorder.go index 39ffc44e..f3de7014 100644 --- a/agent/recorder.go +++ b/agent/recorder.go @@ -493,3 +493,4 @@ func (r *SpanRecorder) addSpan(span tracer.RawSpan) { func isTestSpan(tags map[string]interface{}) bool { return tags["span.kind"] == "test" } + From 403fb8cc2871854aa19a0d27914457477d74ea23 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Wed, 26 Feb 2020 17:00:49 +0100 Subject: [PATCH 4/6] Fixes spans counters --- agent/recorder.go | 1 - 1 file changed, 1 deletion(-) diff --git a/agent/recorder.go b/agent/recorder.go index f3de7014..39ffc44e 100644 --- a/agent/recorder.go +++ b/agent/recorder.go @@ -493,4 +493,3 @@ func (r *SpanRecorder) addSpan(span tracer.RawSpan) { func isTestSpan(tags map[string]interface{}) bool { return tags["span.kind"] == "test" } - From 514deb7dabcb569a251515ac6e6fe7645a450c59 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Wed, 11 Mar 2020 18:05:29 +0100 Subject: [PATCH 5/6] fix span counters --- agent/recorder.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/recorder.go b/agent/recorder.go index 39ffc44e..419f6a97 100644 --- a/agent/recorder.go +++ b/agent/recorder.go @@ -220,12 +220,12 @@ func (r *SpanRecorder) sendSpans() (error, bool) { statusCode, err := r.callIngest(buf) if err != nil { atomic.AddInt64(&r.stats.sendSpansKo, 1) - atomic.AddInt64(&r.stats.spansNotSent, int64(len(spans))) + atomic.AddInt64(&r.stats.spansNotSent, int64(len(sp))) atomic.AddInt64(&r.stats.testSpansNotSent, testSpans) setLastError(err) } else { atomic.AddInt64(&r.stats.sendSpansOk, 1) - atomic.AddInt64(&r.stats.spansSent, int64(len(spans))) + atomic.AddInt64(&r.stats.spansSent, int64(len(sp))) atomic.AddInt64(&r.stats.testSpansSent, testSpans) } if statusCode == 401 { From 958e9f8c568b4202c9800908a211b62f5bb423a3 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Sat, 14 Mar 2020 23:41:32 +0100 Subject: [PATCH 6/6] mod changes --- go.mod | 4 +--- go.sum | 26 +++++++++----------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 87a00ad8..111f4adf 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/go-errors/errors v1.0.1 github.com/gogo/protobuf v1.3.1 github.com/google/uuid v1.1.1 - github.com/kr/pretty v0.1.0 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/opentracing/basictracer-go v1.0.0 github.com/opentracing/opentracing-go v1.1.0 @@ -18,11 +17,10 @@ require ( github.com/vmihailenco/msgpack v4.0.4+incompatible golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 // indirect golang.org/x/net v0.0.0-20200301022130-244492dfa37a - golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 // indirect golang.org/x/sync v0.0.0-20190423024810-112230192c58 + golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 // indirect google.golang.org/appengine v1.6.5 // indirect google.golang.org/grpc v1.27.1 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 ) diff --git a/go.sum b/go.sum index 589b0605..214d82f1 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= @@ -13,10 +16,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= @@ -31,6 +35,7 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -54,6 +59,7 @@ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKw github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -72,8 +78,6 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/undefinedlabs/go-mpatch v0.0.0-20200122152126-8db832768c71 h1:wVaGx1BqVqs6hb36eUX6O/z1peLxfRMoiw91mwjjiX8= -github.com/undefinedlabs/go-mpatch v0.0.0-20200122152126-8db832768c71/go.mod h1:TyJZDQ/5AgyN7FSLiBJ8RO9u2c6wbtRvK827b6AVqY4= github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98 h1:Z/megzdoMbuZ0H/oLmfTw92PAEfyTi1DkvAr8AUzFgw= github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98/go.mod h1:TyJZDQ/5AgyN7FSLiBJ8RO9u2c6wbtRvK827b6AVqY4= github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= @@ -98,10 +102,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191124235446-72fef5d5e266 h1:QuOiA7GCO0OSDzlNlFyOWOywDsjuzW8M2yvBfCqw+cY= -golang.org/x/net v0.0.0-20191124235446-72fef5d5e266/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -114,10 +114,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -140,12 +136,6 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2El google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -154,6 +144,7 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= @@ -163,6 +154,7 @@ gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=