diff --git a/cmd/uplink/external.go b/cmd/uplink/external.go index 6bb890655..9f93fc3a6 100644 --- a/cmd/uplink/external.go +++ b/cmd/uplink/external.go @@ -21,6 +21,8 @@ import ( "github.com/jtolio/eventkit" "github.com/spacemonkeygo/monkit/v3" + "github.com/spacemonkeygo/monkit/v3/collect" + "github.com/spacemonkeygo/monkit/v3/present" "github.com/zeebo/clingy" "github.com/zeebo/errs" "go.uber.org/zap" @@ -28,6 +30,7 @@ import ( "storj.io/common/experiment" "storj.io/common/rpc/rpctracing" + "storj.io/common/sync2/mpscqueue" "storj.io/common/tracing" jaeger "storj.io/monkit-jaeger" "storj.io/private/version" @@ -68,8 +71,9 @@ type external struct { } debug struct { - pprofFile string - traceFile string + pprofFile string + traceFile string + monkitTraceFile string } events struct { @@ -124,7 +128,7 @@ func (ex *external) Setup(f clingy.Flags) { ).(string) ex.tracing.tags = f.Flag( - "trace-tags", "coma separated k=v pairs to be added to distributed traces", map[string]string{}, + "trace-tags", "comma separated k=v pairs to be added to distributed traces", map[string]string{}, clingy.Advanced, clingy.Transform(func(val string) (map[string]string, error) { res := map[string]string{} @@ -151,6 +155,11 @@ func (ex *external) Setup(f clingy.Flags) { clingy.Advanced, ).(string) + ex.debug.monkitTraceFile = f.Flag( + "debug-monkit-trace", "File to collect Monkit trace data. Understands file extensions .json and .svg", "", + clingy.Advanced, + ).(string) + ex.analytics = f.Flag( "analytics", "Whether to send usage information to Storj", nil, clingy.Transform(strconv.ParseBool), clingy.Optional, clingy.Boolean, @@ -371,8 +380,60 @@ func (ex *external) Wrap(ctx context.Context, cmd clingy.Command) (err error) { eventkit.DefaultRegistry.Scope("init").Event("init") } - defer mon.Task()(&ctx)(&err) - return cmd.Execute(ctx) + var workErr error + work := func(ctx context.Context) { + defer mon.Task()(&ctx)(&err) + workErr = cmd.Execute(ctx) + } + + var formatter func(io.Writer, []*collect.FinishedSpan) error + switch { + default: + work(ctx) + return workErr + case strings.HasSuffix(strings.ToLower(ex.debug.monkitTraceFile), ".svg"): + formatter = present.SpansToSVG + case strings.HasSuffix(strings.ToLower(ex.debug.monkitTraceFile), ".json"): + formatter = present.SpansToJSON + } + + spans := mpscqueue.New[collect.FinishedSpan]() + collector := func(s *monkit.Span, err error, panicked bool, finish time.Time) { + spans.Enqueue(collect.FinishedSpan{ + Span: s, + Err: err, + Panicked: panicked, + Finish: finish, + }) + } + + defer collect.ObserveAllTraces(monkit.Default, spanCollectorFunc(collector))() + work(ctx) + + fh, err := os.Create(ex.debug.monkitTraceFile) + if err != nil { + return errs.Combine(workErr, err) + } + + var spanSlice []*collect.FinishedSpan + for { + next, ok := spans.Dequeue() + if !ok { + break + } + spanSlice = append(spanSlice, &next) + } + + err = formatter(fh, spanSlice) + return errs.Combine(workErr, err, fh.Close()) +} + +type spanCollectorFunc func(*monkit.Span, error, bool, time.Time) + +func (f spanCollectorFunc) Start(*monkit.Span) {} + +func (f spanCollectorFunc) Finish(s *monkit.Span, err error, panicked bool, finish time.Time) { + f(s, err, panicked, finish) } func tracked(ctx context.Context, cb func(context.Context)) (done func()) { diff --git a/go.mod b/go.mod index e0cf3d1a9..59772d396 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,7 @@ require ( golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e gopkg.in/segmentio/analytics-go.v3 v3.1.0 gopkg.in/yaml.v3 v3.0.1 - storj.io/common v0.0.0-20231114142336-6bf1d675854d + storj.io/common v0.0.0-20231120181527-7551d20a723d storj.io/drpc v0.0.33 storj.io/monkit-jaeger v0.0.0-20230707083646-f15e6e8b7e8c storj.io/private v0.0.0-20231012141933-ae62725d6691 diff --git a/go.sum b/go.sum index 330cdbbb1..e80407a19 100644 --- a/go.sum +++ b/go.sum @@ -1013,8 +1013,8 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= storj.io/common v0.0.0-20220719163320-cd2ef8e1b9b0/go.mod h1:mCYV6Ud5+cdbuaxdPD5Zht/HYaIn0sffnnws9ErkrMQ= -storj.io/common v0.0.0-20231114142336-6bf1d675854d h1:GvyLJ7lh9cu1Y6CVrfYSqcgBHnUOkxx39/iD7Q/Ion8= -storj.io/common v0.0.0-20231114142336-6bf1d675854d/go.mod h1:qjHfzW5RlGg5z04CwIEjJd1eQ3HCGhUNtxZ6K/W7yqM= +storj.io/common v0.0.0-20231120181527-7551d20a723d h1:grxc+N773G2/r2MENiLNC78sgFQYCIaZLCURy8j2S6I= +storj.io/common v0.0.0-20231120181527-7551d20a723d/go.mod h1:qjHfzW5RlGg5z04CwIEjJd1eQ3HCGhUNtxZ6K/W7yqM= storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg= storj.io/drpc v0.0.33 h1:yCGZ26r66ZdMP0IcTYsj7WDAUIIjzXk6DJhbhvt9FHI= storj.io/drpc v0.0.33/go.mod h1:vR804UNzhBa49NOJ6HeLjd2H3MakC1j5Gv8bsOQT6N4= diff --git a/testsuite/storjscan/go.mod b/testsuite/storjscan/go.mod index d0da0b735..d204a7a8e 100644 --- a/testsuite/storjscan/go.mod +++ b/testsuite/storjscan/go.mod @@ -9,7 +9,7 @@ require ( github.com/zeebo/errs v1.3.0 go.uber.org/zap v1.21.0 golang.org/x/sync v0.3.0 - storj.io/common v0.0.0-20231114142336-6bf1d675854d + storj.io/common v0.0.0-20231120181527-7551d20a723d storj.io/private v0.0.0-20231012141933-ae62725d6691 storj.io/storj v1.63.1 storj.io/storjscan v0.0.0-20220926140643-1623c3b391b0 diff --git a/testsuite/storjscan/go.sum b/testsuite/storjscan/go.sum index ac687ef91..47be457cd 100644 --- a/testsuite/storjscan/go.sum +++ b/testsuite/storjscan/go.sum @@ -1255,8 +1255,8 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= storj.io/common v0.0.0-20220719163320-cd2ef8e1b9b0/go.mod h1:mCYV6Ud5+cdbuaxdPD5Zht/HYaIn0sffnnws9ErkrMQ= -storj.io/common v0.0.0-20231114142336-6bf1d675854d h1:GvyLJ7lh9cu1Y6CVrfYSqcgBHnUOkxx39/iD7Q/Ion8= -storj.io/common v0.0.0-20231114142336-6bf1d675854d/go.mod h1:qjHfzW5RlGg5z04CwIEjJd1eQ3HCGhUNtxZ6K/W7yqM= +storj.io/common v0.0.0-20231120181527-7551d20a723d h1:grxc+N773G2/r2MENiLNC78sgFQYCIaZLCURy8j2S6I= +storj.io/common v0.0.0-20231120181527-7551d20a723d/go.mod h1:qjHfzW5RlGg5z04CwIEjJd1eQ3HCGhUNtxZ6K/W7yqM= storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg= storj.io/drpc v0.0.33 h1:yCGZ26r66ZdMP0IcTYsj7WDAUIIjzXk6DJhbhvt9FHI= storj.io/drpc v0.0.33/go.mod h1:vR804UNzhBa49NOJ6HeLjd2H3MakC1j5Gv8bsOQT6N4= diff --git a/testsuite/ui/go.mod b/testsuite/ui/go.mod index 2a8656a05..5077bae88 100644 --- a/testsuite/ui/go.mod +++ b/testsuite/ui/go.mod @@ -10,7 +10,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.23.0 - storj.io/common v0.0.0-20231114142336-6bf1d675854d + storj.io/common v0.0.0-20231120181527-7551d20a723d storj.io/gateway-mt v1.51.1-0.20230417204402-7d9bb25bc297 storj.io/private v0.0.0-20231012141933-ae62725d6691 storj.io/storj v0.12.1-0.20221125175451-ef4b564b82f7 diff --git a/testsuite/ui/go.sum b/testsuite/ui/go.sum index 752353813..93ced691a 100644 --- a/testsuite/ui/go.sum +++ b/testsuite/ui/go.sum @@ -1970,8 +1970,8 @@ sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1 sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= storj.io/common v0.0.0-20220719163320-cd2ef8e1b9b0/go.mod h1:mCYV6Ud5+cdbuaxdPD5Zht/HYaIn0sffnnws9ErkrMQ= -storj.io/common v0.0.0-20231114142336-6bf1d675854d h1:GvyLJ7lh9cu1Y6CVrfYSqcgBHnUOkxx39/iD7Q/Ion8= -storj.io/common v0.0.0-20231114142336-6bf1d675854d/go.mod h1:qjHfzW5RlGg5z04CwIEjJd1eQ3HCGhUNtxZ6K/W7yqM= +storj.io/common v0.0.0-20231120181527-7551d20a723d h1:grxc+N773G2/r2MENiLNC78sgFQYCIaZLCURy8j2S6I= +storj.io/common v0.0.0-20231120181527-7551d20a723d/go.mod h1:qjHfzW5RlGg5z04CwIEjJd1eQ3HCGhUNtxZ6K/W7yqM= storj.io/dotworld v0.0.0-20210324183515-0d11aeccd840 h1:oqMwoF6vaOrCe92SKRyr8cc2WSjLYAd8fjpAHA7rNqY= storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg= storj.io/drpc v0.0.33 h1:yCGZ26r66ZdMP0IcTYsj7WDAUIIjzXk6DJhbhvt9FHI=