From f0467f26118de82c1616cef56d2c095ff0d655ef Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Fri, 31 Jan 2020 20:17:44 +0100 Subject: [PATCH 1/8] standard logger instrumentation with context --- instrumentation/logging/logger.go | 49 +++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/instrumentation/logging/logger.go b/instrumentation/logging/logger.go index d9e95fcb..9d378edc 100644 --- a/instrumentation/logging/logger.go +++ b/instrumentation/logging/logger.go @@ -1,6 +1,7 @@ package logging import ( + "context" "fmt" "io" stdlog "log" @@ -8,6 +9,7 @@ import ( "regexp" "sync" "time" + "unsafe" "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/log" @@ -25,6 +27,7 @@ type ( logRecordsMutex sync.RWMutex logRecords []opentracing.LogRecord regex *regexp.Regexp + logger *stdlog.Logger } logItem struct { time time.Time @@ -42,12 +45,14 @@ var ( patchedLoggersMutex sync.Mutex patchedLoggers = map[*stdlog.Logger]loggerPatchInfo{} stdLoggerWriter io.Writer + loggerContextMutex sync.RWMutex + loggerContext = map[*stdlog.Logger]context.Context{} ) // Patch the standard logger func PatchStandardLogger() { stdLoggerWriter := getStdLoggerWriter() - otWriter := newInstrumentedWriter(stdlog.Prefix(), stdlog.Flags()) + otWriter := newInstrumentedWriter(nil, stdlog.Prefix(), stdlog.Flags()) stdlog.SetOutput(io.MultiWriter(stdLoggerWriter, otWriter)) recorders = append(recorders, otWriter) } @@ -65,7 +70,7 @@ func PatchLogger(logger *stdlog.Logger) { return } currentWriter := getLoggerWriter(logger) - otWriter := newInstrumentedWriter(logger.Prefix(), logger.Flags()) + otWriter := newInstrumentedWriter(logger, logger.Prefix(), logger.Flags()) logger.SetOutput(io.MultiWriter(currentWriter, otWriter)) recorders = append(recorders, otWriter) patchedLoggers[logger] = loggerPatchInfo{ @@ -84,10 +89,28 @@ func UnpatchLogger(logger *stdlog.Logger) { } } +// Create a new logger with a context +func WithContext(logger *stdlog.Logger, ctx context.Context) *stdlog.Logger { + oLogger := (*struct { + _ sync.Mutex + prefix string + flag int + out io.Writer + _ []byte + })(unsafe.Pointer(logger)) + rLogger := stdlog.New(oLogger.out, oLogger.prefix, oLogger.flag) + loggerContextMutex.Lock() + defer loggerContextMutex.Unlock() + loggerContext[rLogger] = ctx + PatchLogger(rLogger) + return rLogger +} + // Create a new instrumented writer for loggers -func newInstrumentedWriter(prefix string, flag int) *otWriter { +func newInstrumentedWriter(logger *stdlog.Logger, prefix string, flag int) *otWriter { return &otWriter{ - regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, prefix)), + regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, prefix)), + logger: logger, } } @@ -159,8 +182,6 @@ func (w *otWriter) process(p []byte) { // Stores a new log record from the logItem func (w *otWriter) storeLogRecord(item *logItem) { - w.logRecordsMutex.Lock() - defer w.logRecordsMutex.Unlock() fields := []log.Field{ log.String(tags.EventType, tags.LogEvent), log.String(tags.LogEventLevel, tags.LogLevel_VERBOSE), @@ -171,8 +192,24 @@ func (w *otWriter) storeLogRecord(item *logItem) { item.file = filepath.Clean(item.file) fields = append(fields, log.String(tags.EventSource, fmt.Sprintf("%s:%s", item.file, item.lineNumber))) } + span := getContextSpanFromLogger(w.logger) + if span != nil { + span.LogFields(fields...) + return + } + w.logRecordsMutex.Lock() + defer w.logRecordsMutex.Unlock() w.logRecords = append(w.logRecords, opentracing.LogRecord{ Timestamp: item.time, Fields: fields, }) } + +func getContextSpanFromLogger(logger *stdlog.Logger) opentracing.Span { + loggerContextMutex.RLock() + defer loggerContextMutex.RUnlock() + if ctx, ok := loggerContext[logger]; ok { + return opentracing.SpanFromContext(ctx) + } + return nil +} From c0d2b27de82cc9c93fd5d5a69812b936e0e51cb0 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Sat, 1 Feb 2020 22:03:08 +0100 Subject: [PATCH 2/8] fixes --- instrumentation/logging/logger.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/instrumentation/logging/logger.go b/instrumentation/logging/logger.go index 9d378edc..f9afc668 100644 --- a/instrumentation/logging/logger.go +++ b/instrumentation/logging/logger.go @@ -43,7 +43,7 @@ type ( var ( patchedLoggersMutex sync.Mutex - patchedLoggers = map[*stdlog.Logger]loggerPatchInfo{} + patchedLoggers = map[io.Writer]loggerPatchInfo{} stdLoggerWriter io.Writer loggerContextMutex sync.RWMutex loggerContext = map[*stdlog.Logger]context.Context{} @@ -66,14 +66,15 @@ func UnpatchStandardLogger() { func PatchLogger(logger *stdlog.Logger) { patchedLoggersMutex.Lock() defer patchedLoggersMutex.Unlock() - if _, ok := patchedLoggers[logger]; ok { - return - } currentWriter := getLoggerWriter(logger) + if patchInfo, ok := patchedLoggers[currentWriter]; ok { + currentWriter = patchInfo.previous + } otWriter := newInstrumentedWriter(logger, logger.Prefix(), logger.Flags()) - logger.SetOutput(io.MultiWriter(currentWriter, otWriter)) + mWriter := io.MultiWriter(currentWriter, otWriter) + logger.SetOutput(mWriter) recorders = append(recorders, otWriter) - patchedLoggers[logger] = loggerPatchInfo{ + patchedLoggers[mWriter] = loggerPatchInfo{ current: otWriter, previous: currentWriter, } @@ -83,9 +84,10 @@ func PatchLogger(logger *stdlog.Logger) { func UnpatchLogger(logger *stdlog.Logger) { patchedLoggersMutex.Lock() defer patchedLoggersMutex.Unlock() - if logInfo, ok := patchedLoggers[logger]; ok { + currentWriter := getLoggerWriter(logger) + if logInfo, ok := patchedLoggers[currentWriter]; ok { logger.SetOutput(logInfo.previous) - delete(patchedLoggers, logger) + delete(patchedLoggers, currentWriter) } } From 1611c33b9ae7bf0f438b381ed49cede1f271f10f Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Tue, 4 Feb 2020 23:57:17 +0100 Subject: [PATCH 3/8] remove unsafe --- instrumentation/logging/logger.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/instrumentation/logging/logger.go b/instrumentation/logging/logger.go index f9afc668..f93b7524 100644 --- a/instrumentation/logging/logger.go +++ b/instrumentation/logging/logger.go @@ -9,7 +9,6 @@ import ( "regexp" "sync" "time" - "unsafe" "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/log" @@ -93,14 +92,7 @@ func UnpatchLogger(logger *stdlog.Logger) { // Create a new logger with a context func WithContext(logger *stdlog.Logger, ctx context.Context) *stdlog.Logger { - oLogger := (*struct { - _ sync.Mutex - prefix string - flag int - out io.Writer - _ []byte - })(unsafe.Pointer(logger)) - rLogger := stdlog.New(oLogger.out, oLogger.prefix, oLogger.flag) + rLogger := stdlog.New(getLoggerWriter(logger), logger.Prefix(), logger.Flags()) loggerContextMutex.Lock() defer loggerContextMutex.Unlock() loggerContext[rLogger] = ctx From 360f1ef668f255c5a273f248473c9d96a0f41eb9 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Mon, 10 Feb 2020 14:33:58 +0100 Subject: [PATCH 4/8] restore go.mod --- go.mod | 2 ++ 1 file changed, 2 insertions(+) diff --git a/go.mod b/go.mod index a6fd7988..a9815ef6 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98 github.com/vmihailenco/msgpack v4.0.4+incompatible golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 // indirect + golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect golang.org/x/net v0.0.0-20200301022130-244492dfa37a golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 // indirect google.golang.org/appengine v1.6.5 // indirect @@ -24,4 +25,5 @@ require ( 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 + honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc // indirect ) From b0846137330d73d6294c5007c8c02da25d0df6da Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Thu, 20 Feb 2020 10:25:15 +0100 Subject: [PATCH 5/8] changes --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index a9815ef6..a6fd7988 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,6 @@ require ( github.com/undefinedlabs/go-mpatch v0.0.0-20200122175732-0044123dbb98 github.com/vmihailenco/msgpack v4.0.4+incompatible golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4 // indirect - golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect golang.org/x/net v0.0.0-20200301022130-244492dfa37a golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 // indirect google.golang.org/appengine v1.6.5 // indirect @@ -25,5 +24,4 @@ require ( 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 - honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc // indirect ) From 22bf2eaa08e5ddc9639e318733de4d8283010e7f Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Thu, 20 Feb 2020 12:29:07 +0100 Subject: [PATCH 6/8] changes --- instrumentation/logging/logger.go | 50 ++++++++++++++++++------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/instrumentation/logging/logger.go b/instrumentation/logging/logger.go index f93b7524..9647ac6f 100644 --- a/instrumentation/logging/logger.go +++ b/instrumentation/logging/logger.go @@ -9,6 +9,7 @@ import ( "regexp" "sync" "time" + "unsafe" "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/log" @@ -26,7 +27,7 @@ type ( logRecordsMutex sync.RWMutex logRecords []opentracing.LogRecord regex *regexp.Regexp - logger *stdlog.Logger + parentLogger *stdlog.Logger } logItem struct { time time.Time @@ -44,14 +45,15 @@ var ( patchedLoggersMutex sync.Mutex patchedLoggers = map[io.Writer]loggerPatchInfo{} stdLoggerWriter io.Writer - loggerContextMutex sync.RWMutex - loggerContext = map[*stdlog.Logger]context.Context{} + + loggerContextMutex sync.RWMutex + loggerContext = map[uintptr]context.Context{} ) // Patch the standard logger func PatchStandardLogger() { stdLoggerWriter := getStdLoggerWriter() - otWriter := newInstrumentedWriter(nil, stdlog.Prefix(), stdlog.Flags()) + otWriter := newInstrumentedWriter(nil, stdlog.Prefix()) stdlog.SetOutput(io.MultiWriter(stdLoggerWriter, otWriter)) recorders = append(recorders, otWriter) } @@ -69,7 +71,7 @@ func PatchLogger(logger *stdlog.Logger) { if patchInfo, ok := patchedLoggers[currentWriter]; ok { currentWriter = patchInfo.previous } - otWriter := newInstrumentedWriter(logger, logger.Prefix(), logger.Flags()) + otWriter := newInstrumentedWriter(logger, logger.Prefix()) mWriter := io.MultiWriter(currentWriter, otWriter) logger.SetOutput(mWriter) recorders = append(recorders, otWriter) @@ -93,18 +95,16 @@ func UnpatchLogger(logger *stdlog.Logger) { // Create a new logger with a context func WithContext(logger *stdlog.Logger, ctx context.Context) *stdlog.Logger { rLogger := stdlog.New(getLoggerWriter(logger), logger.Prefix(), logger.Flags()) - loggerContextMutex.Lock() - defer loggerContextMutex.Unlock() - loggerContext[rLogger] = ctx + setLoggerContext(rLogger, ctx) PatchLogger(rLogger) return rLogger } // Create a new instrumented writer for loggers -func newInstrumentedWriter(logger *stdlog.Logger, prefix string, flag int) *otWriter { +func newInstrumentedWriter(logger *stdlog.Logger, prefix string) *otWriter { return &otWriter{ - regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, prefix)), - logger: logger, + regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, prefix)), + parentLogger: logger, } } @@ -186,24 +186,34 @@ func (w *otWriter) storeLogRecord(item *logItem) { item.file = filepath.Clean(item.file) fields = append(fields, log.String(tags.EventSource, fmt.Sprintf("%s:%s", item.file, item.lineNumber))) } - span := getContextSpanFromLogger(w.logger) - if span != nil { + + if span := opentracing.SpanFromContext(getLoggerContext(w.parentLogger)); span != nil { span.LogFields(fields...) return } - w.logRecordsMutex.Lock() - defer w.logRecordsMutex.Unlock() - w.logRecords = append(w.logRecords, opentracing.LogRecord{ + w.appendLogRecords(opentracing.LogRecord{ Timestamp: item.time, Fields: fields, }) } -func getContextSpanFromLogger(logger *stdlog.Logger) opentracing.Span { +func (w *otWriter) appendLogRecords(record opentracing.LogRecord) { + w.logRecordsMutex.Lock() + defer w.logRecordsMutex.Unlock() + w.logRecords = append(w.logRecords, record) +} + +func setLoggerContext(logger *stdlog.Logger, ctx context.Context) { + loggerContextMutex.Lock() + defer loggerContextMutex.Unlock() + loggerContext[uintptr(unsafe.Pointer(logger))] = ctx +} + +func getLoggerContext(logger *stdlog.Logger) context.Context { loggerContextMutex.RLock() defer loggerContextMutex.RUnlock() - if ctx, ok := loggerContext[logger]; ok { - return opentracing.SpanFromContext(ctx) + if ctx, ok := loggerContext[uintptr(unsafe.Pointer(logger))]; ok { + return ctx } - return nil + return context.TODO() } From d0f0c8989fe661ba58168ae73b5185b62481e9f3 Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Thu, 20 Feb 2020 13:14:47 +0100 Subject: [PATCH 7/8] changes --- instrumentation/logging/logger.go | 116 ++++++++++++++---------------- 1 file changed, 53 insertions(+), 63 deletions(-) diff --git a/instrumentation/logging/logger.go b/instrumentation/logging/logger.go index 9647ac6f..65e4d9a6 100644 --- a/instrumentation/logging/logger.go +++ b/instrumentation/logging/logger.go @@ -9,7 +9,6 @@ import ( "regexp" "sync" "time" - "unsafe" "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/log" @@ -27,7 +26,7 @@ type ( logRecordsMutex sync.RWMutex logRecords []opentracing.LogRecord regex *regexp.Regexp - parentLogger *stdlog.Logger + ctx context.Context } logItem struct { time time.Time @@ -36,7 +35,7 @@ type ( message string } loggerPatchInfo struct { - current io.Writer + current *otWriter previous io.Writer } ) @@ -45,15 +44,12 @@ var ( patchedLoggersMutex sync.Mutex patchedLoggers = map[io.Writer]loggerPatchInfo{} stdLoggerWriter io.Writer - - loggerContextMutex sync.RWMutex - loggerContext = map[uintptr]context.Context{} ) // Patch the standard logger func PatchStandardLogger() { stdLoggerWriter := getStdLoggerWriter() - otWriter := newInstrumentedWriter(nil, stdlog.Prefix()) + otWriter := &otWriter{regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, stdlog.Prefix()))} stdlog.SetOutput(io.MultiWriter(stdLoggerWriter, otWriter)) recorders = append(recorders, otWriter) } @@ -65,49 +61,21 @@ func UnpatchStandardLogger() { // Patch a logger func PatchLogger(logger *stdlog.Logger) { - patchedLoggersMutex.Lock() - defer patchedLoggersMutex.Unlock() - currentWriter := getLoggerWriter(logger) - if patchInfo, ok := patchedLoggers[currentWriter]; ok { - currentWriter = patchInfo.previous - } - otWriter := newInstrumentedWriter(logger, logger.Prefix()) - mWriter := io.MultiWriter(currentWriter, otWriter) - logger.SetOutput(mWriter) - recorders = append(recorders, otWriter) - patchedLoggers[mWriter] = loggerPatchInfo{ - current: otWriter, - previous: currentWriter, - } + patchLogger(logger, nil) } // Unpatch a logger func UnpatchLogger(logger *stdlog.Logger) { - patchedLoggersMutex.Lock() - defer patchedLoggersMutex.Unlock() - currentWriter := getLoggerWriter(logger) - if logInfo, ok := patchedLoggers[currentWriter]; ok { - logger.SetOutput(logInfo.previous) - delete(patchedLoggers, currentWriter) - } + unpatchLogger(logger) } // Create a new logger with a context func WithContext(logger *stdlog.Logger, ctx context.Context) *stdlog.Logger { rLogger := stdlog.New(getLoggerWriter(logger), logger.Prefix(), logger.Flags()) - setLoggerContext(rLogger, ctx) - PatchLogger(rLogger) + patchLogger(rLogger, ctx) return rLogger } -// Create a new instrumented writer for loggers -func newInstrumentedWriter(logger *stdlog.Logger, prefix string) *otWriter { - return &otWriter{ - regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, prefix)), - parentLogger: logger, - } -} - // Write data to the channel and the base writer func (w *otWriter) Write(p []byte) (n int, err error) { w.process(p) @@ -129,6 +97,42 @@ func (w *otWriter) GetRecords() []opentracing.LogRecord { return w.logRecords } +// Patch logger with optional context +func patchLogger(logger *stdlog.Logger, ctx context.Context) { + unpatchLogger(logger) + + patchedLoggersMutex.Lock() + defer patchedLoggersMutex.Unlock() + + otWriter := &otWriter{ + regex: regexp.MustCompile(fmt.Sprintf(logRegexTemplate, logger.Prefix())), + ctx: ctx, + } + + currentWriter := getLoggerWriter(logger) + newWriter := io.MultiWriter(currentWriter, otWriter) + patchedLoggers[newWriter] = loggerPatchInfo{ + current: otWriter, + previous: currentWriter, + } + + recorders = append(recorders, otWriter) + logger.SetOutput(newWriter) +} + +// Unpatch logger +func unpatchLogger(logger *stdlog.Logger) { + patchedLoggersMutex.Lock() + defer patchedLoggersMutex.Unlock() + + currentWriter := getLoggerWriter(logger) + + if logInfo, ok := patchedLoggers[currentWriter]; ok { + logger.SetOutput(logInfo.previous) + delete(patchedLoggers, currentWriter) + } +} + // Process bytes and create new log items struct to store func (w *otWriter) process(p []byte) { if len(p) == 0 { @@ -187,33 +191,19 @@ func (w *otWriter) storeLogRecord(item *logItem) { fields = append(fields, log.String(tags.EventSource, fmt.Sprintf("%s:%s", item.file, item.lineNumber))) } - if span := opentracing.SpanFromContext(getLoggerContext(w.parentLogger)); span != nil { - span.LogFields(fields...) - return + // If context is found, we try to find the a span from the context and write the logs + if w.ctx != nil { + if span := opentracing.SpanFromContext(w.ctx); span != nil { + span.LogFields(fields...) + return + } } - w.appendLogRecords(opentracing.LogRecord{ - Timestamp: item.time, - Fields: fields, - }) -} -func (w *otWriter) appendLogRecords(record opentracing.LogRecord) { + // If no context, we store the log records for future extraction w.logRecordsMutex.Lock() defer w.logRecordsMutex.Unlock() - w.logRecords = append(w.logRecords, record) -} - -func setLoggerContext(logger *stdlog.Logger, ctx context.Context) { - loggerContextMutex.Lock() - defer loggerContextMutex.Unlock() - loggerContext[uintptr(unsafe.Pointer(logger))] = ctx -} - -func getLoggerContext(logger *stdlog.Logger) context.Context { - loggerContextMutex.RLock() - defer loggerContextMutex.RUnlock() - if ctx, ok := loggerContext[uintptr(unsafe.Pointer(logger))]; ok { - return ctx - } - return context.TODO() + w.logRecords = append(w.logRecords, opentracing.LogRecord{ + Timestamp: item.time, + Fields: fields, + }) } From 935aa92388c7bccee3ce0f79292c1b74545f399a Mon Sep 17 00:00:00 2001 From: Daniel Redondo Date: Sat, 14 Mar 2020 23:53:14 +0100 Subject: [PATCH 8/8] go mod tidy --- go.mod | 2 -- go.sum | 26 +++++++++----------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index a6fd7988..83b7e90c 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 @@ -21,7 +20,6 @@ require ( 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 cee7bb59..0f57dbf3 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= @@ -113,10 +113,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= @@ -139,12 +135,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= @@ -153,6 +143,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= @@ -162,6 +153,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=