@@ -16,6 +16,8 @@ import (
1616 "github.com/prometheus/common/model"
1717 "github.com/rs/zerolog"
1818 "github.com/spf13/afero"
19+ "go.opentelemetry.io/otel/attribute"
20+ "go.opentelemetry.io/otel/trace"
1921)
2022
2123// Script is a k6 script that a runner is able to run, with some added instructions for that runner to act on.
@@ -92,15 +94,27 @@ var (
9294func (r Processor ) Run (ctx context.Context , registry * prometheus.Registry , logger logger.Logger , internalLogger zerolog.Logger ) (bool , error ) {
9395 k6runner := r .runner .WithLogger (& internalLogger )
9496
95- // TODO: This error message is okay to be Debug for local k6 execution, but should be Error for remote runners.
96- result , err := k6runner .Run (ctx , r .script )
97+ k6Ctx , k6Span := trace . SpanFromContext ( ctx ). TracerProvider (). Tracer ( "" ). Start ( ctx , " k6 processor" )
98+ result , err := k6runner .Run (k6Ctx , r .script )
9799 if err != nil {
100+ // TODO: This error message is okay to be Debug for local k6 execution, but should be Error for remote runners.
98101 internalLogger .Debug ().
99102 Err (err ).
100103 Msg ("k6 script exited with error code" )
104+ k6Span .RecordError (err )
105+ k6Span .End ()
101106 return false , err
102107 }
103108
109+ k6Span .SetAttributes (
110+ attribute .String ("error" , result .Error ),
111+ attribute .String ("errorCode" , result .ErrorCode ),
112+ attribute .Int ("metricsSizeBytes" , len (result .Metrics )),
113+ attribute .Int ("logsSizeBytes" , len (result .Logs )),
114+ )
115+
116+ k6Span .End ()
117+
104118 // If only one of Error and ErrorCode are non-empty, the proxy is misbehaving.
105119 switch {
106120 case result .Error == "" && result .ErrorCode != "" :
@@ -126,11 +140,15 @@ func (r Processor) Run(ctx context.Context, registry *prometheus.Registry, logge
126140 }()
127141 }
128142
143+ _ , reportTelemetrySpan := trace .SpanFromContext (ctx ).TracerProvider ().Tracer ("" ).Start (ctx , "report telemetry" )
144+
129145 // Send logs before metrics to make sure logs are submitted even if the metrics output is not parsable.
130146 if err := k6LogsToLogger (result .Logs , logger ); err != nil {
131147 internalLogger .Debug ().
132148 Err (err ).
133149 Msg ("cannot load logs to logger" )
150+ reportTelemetrySpan .RecordError (err )
151+ reportTelemetrySpan .End ()
134152 return false , err
135153 }
136154
@@ -143,16 +161,22 @@ func (r Processor) Run(ctx context.Context, registry *prometheus.Registry, logge
143161 internalLogger .Debug ().
144162 Err (err ).
145163 Msg ("cannot extract metric samples" )
164+ reportTelemetrySpan .RecordError (err )
165+ reportTelemetrySpan .End ()
146166 return false , err
147167 }
148168
149169 if err := registry .Register (& collector .collector ); err != nil {
150170 internalLogger .Error ().
151171 Err (err ).
152172 Msg ("cannot register collector" )
173+ reportTelemetrySpan .RecordError (err )
174+ reportTelemetrySpan .End ()
153175 return false , err
154176 }
155177
178+ reportTelemetrySpan .End ()
179+
156180 // https://github.com/grafana/sm-k6-runner/blob/b811839d444a7e69fd056b0a4e6ccf7e914197f3/internal/mq/runner.go#L51
157181 switch result .ErrorCode {
158182 case "" :
0 commit comments