Skip to content

Commit c28e7ff

Browse files
authored
Merge pull request kubernetes#130708 from fuweid/reduce-spans-in-writer
*: reduce tracing events during streaming JSON objects
2 parents 69dd6b3 + 003f215 commit c28e7ff

File tree

1 file changed

+30
-18
lines changed
  • staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters

1 file changed

+30
-18
lines changed

staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ type deferredResponseWriter struct {
200200
hasWritten bool
201201
hw http.ResponseWriter
202202
w io.Writer
203+
// totalBytes is the number of bytes written to `w` and does not include buffered bytes
204+
totalBytes int
205+
// lastWriteErr holds the error result (if any) of the last write attempt to `w`
206+
lastWriteErr error
203207

204208
ctx context.Context
205209
}
@@ -242,26 +246,11 @@ func (w *deferredResponseWriter) Write(p []byte) (n int, err error) {
242246
}
243247

244248
func (w *deferredResponseWriter) unbufferedWrite(p []byte) (n int, err error) {
245-
ctx := w.ctx
246-
span := tracing.SpanFromContext(ctx)
247-
// This Step usually wraps in-memory object serialization.
248-
span.AddEvent("About to start writing response", attribute.Int("size", len(p)))
249-
250-
firstWrite := !w.hasWritten
251249
defer func() {
252-
if err != nil {
253-
span.AddEvent("Write call failed",
254-
attribute.String("writer", fmt.Sprintf("%T", w.w)),
255-
attribute.Int("size", len(p)),
256-
attribute.Bool("firstWrite", firstWrite),
257-
attribute.String("err", err.Error()))
258-
} else {
259-
span.AddEvent("Write call succeeded",
260-
attribute.String("writer", fmt.Sprintf("%T", w.w)),
261-
attribute.Int("size", len(p)),
262-
attribute.Bool("firstWrite", firstWrite))
263-
}
250+
w.totalBytes += n
251+
w.lastWriteErr = err
264252
}()
253+
265254
if w.hasWritten {
266255
return w.w.Write(p)
267256
}
@@ -282,12 +271,35 @@ func (w *deferredResponseWriter) unbufferedWrite(p []byte) (n int, err error) {
282271
w.w = hw
283272
}
284273

274+
span := tracing.SpanFromContext(w.ctx)
275+
span.AddEvent("About to start writing response",
276+
attribute.String("writer", fmt.Sprintf("%T", w.w)),
277+
attribute.Int("size", len(p)),
278+
)
279+
285280
header.Set("Content-Type", w.mediaType)
286281
hw.WriteHeader(w.statusCode)
287282
return w.w.Write(p)
288283
}
289284

290285
func (w *deferredResponseWriter) Close() (err error) {
286+
defer func() {
287+
if !w.hasWritten {
288+
return
289+
}
290+
291+
span := tracing.SpanFromContext(w.ctx)
292+
293+
if w.lastWriteErr != nil {
294+
span.AddEvent("Write call failed",
295+
attribute.Int("size", w.totalBytes),
296+
attribute.String("err", w.lastWriteErr.Error()))
297+
} else {
298+
span.AddEvent("Write call succeeded",
299+
attribute.Int("size", w.totalBytes))
300+
}
301+
}()
302+
291303
if !w.hasWritten {
292304
if !w.hasBuffered {
293305
return nil

0 commit comments

Comments
 (0)