@@ -16,6 +16,8 @@ import (
16
16
"github.com/prometheus/common/model"
17
17
"github.com/rs/zerolog"
18
18
"github.com/spf13/afero"
19
+ "go.opentelemetry.io/otel/attribute"
20
+ "go.opentelemetry.io/otel/trace"
19
21
)
20
22
21
23
// 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 (
92
94
func (r Processor ) Run (ctx context.Context , registry * prometheus.Registry , logger logger.Logger , internalLogger zerolog.Logger ) (bool , error ) {
93
95
k6runner := r .runner .WithLogger (& internalLogger )
94
96
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 )
97
99
if err != nil {
100
+ // TODO: This error message is okay to be Debug for local k6 execution, but should be Error for remote runners.
98
101
internalLogger .Debug ().
99
102
Err (err ).
100
103
Msg ("k6 script exited with error code" )
104
+ k6Span .RecordError (err )
105
+ k6Span .End ()
101
106
return false , err
102
107
}
103
108
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
+
104
118
// If only one of Error and ErrorCode are non-empty, the proxy is misbehaving.
105
119
switch {
106
120
case result .Error == "" && result .ErrorCode != "" :
@@ -126,11 +140,15 @@ func (r Processor) Run(ctx context.Context, registry *prometheus.Registry, logge
126
140
}()
127
141
}
128
142
143
+ _ , reportTelemetrySpan := trace .SpanFromContext (ctx ).TracerProvider ().Tracer ("" ).Start (ctx , "report telemetry" )
144
+
129
145
// Send logs before metrics to make sure logs are submitted even if the metrics output is not parsable.
130
146
if err := k6LogsToLogger (result .Logs , logger ); err != nil {
131
147
internalLogger .Debug ().
132
148
Err (err ).
133
149
Msg ("cannot load logs to logger" )
150
+ reportTelemetrySpan .RecordError (err )
151
+ reportTelemetrySpan .End ()
134
152
return false , err
135
153
}
136
154
@@ -143,16 +161,22 @@ func (r Processor) Run(ctx context.Context, registry *prometheus.Registry, logge
143
161
internalLogger .Debug ().
144
162
Err (err ).
145
163
Msg ("cannot extract metric samples" )
164
+ reportTelemetrySpan .RecordError (err )
165
+ reportTelemetrySpan .End ()
146
166
return false , err
147
167
}
148
168
149
169
if err := registry .Register (& collector .collector ); err != nil {
150
170
internalLogger .Error ().
151
171
Err (err ).
152
172
Msg ("cannot register collector" )
173
+ reportTelemetrySpan .RecordError (err )
174
+ reportTelemetrySpan .End ()
153
175
return false , err
154
176
}
155
177
178
+ reportTelemetrySpan .End ()
179
+
156
180
// https://github.com/grafana/sm-k6-runner/blob/b811839d444a7e69fd056b0a4e6ccf7e914197f3/internal/mq/runner.go#L51
157
181
switch result .ErrorCode {
158
182
case "" :
0 commit comments