From 7ba22700bfd12cd32ff72db022e4b53ccda1deca Mon Sep 17 00:00:00 2001 From: Antonio Ojea Date: Mon, 28 Jul 2025 21:59:08 +0000 Subject: [PATCH] websocket streamtranslator increament metrics before writing status Test that assert on metrics use the returned status to sync the test, if the metric is updated AFTER the state is returned the test will flake because the assertion on the metric will race. Change-Id: I317708a22cb47256c37dac3cab0463a2f925ad6b --- .../apiserver/pkg/util/proxy/streamtranslator.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/util/proxy/streamtranslator.go b/staging/src/k8s.io/apiserver/pkg/util/proxy/streamtranslator.go index 6593a3ed966..33bbdc32526 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/proxy/streamtranslator.go +++ b/staging/src/k8s.io/apiserver/pkg/util/proxy/streamtranslator.go @@ -73,14 +73,14 @@ func (h *StreamTranslatorHandler) ServeHTTP(w http.ResponseWriter, req *http.Req // Creating SPDY executor, ensuring redirects are not followed. spdyRoundTripper, err := spdy.NewRoundTripperWithConfig(spdy.RoundTripperConfig{UpgradeTransport: h.Transport, PingPeriod: 5 * time.Second}) if err != nil { - websocketStreams.writeStatus(apierrors.NewInternalError(err)) //nolint:errcheck metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(http.StatusInternalServerError)) + websocketStreams.writeStatus(apierrors.NewInternalError(err)) //nolint:errcheck return } spdyExecutor, err := remotecommand.NewSPDYExecutorRejectRedirects(spdyRoundTripper, spdyRoundTripper, "POST", h.Location) if err != nil { - websocketStreams.writeStatus(apierrors.NewInternalError(err)) //nolint:errcheck metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(http.StatusInternalServerError)) + websocketStreams.writeStatus(apierrors.NewInternalError(err)) //nolint:errcheck return } @@ -121,27 +121,27 @@ func (h *StreamTranslatorHandler) ServeHTTP(w http.ResponseWriter, req *http.Req if err != nil { //nolint:errcheck // Ignore writeStatus returned error if statusErr, ok := err.(*apierrors.StatusError); ok { - websocketStreams.writeStatus(statusErr) // Increment status code returned within status error. metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(int(statusErr.Status().Code))) + websocketStreams.writeStatus(statusErr) } else if exitErr, ok := err.(exec.CodeExitError); ok && exitErr.Exited() { - websocketStreams.writeStatus(codeExitToStatusError(exitErr)) // Returned an exit code from the container, so not an error in // stream translator--add StatusOK to metrics. metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(http.StatusOK)) + websocketStreams.writeStatus(codeExitToStatusError(exitErr)) } else { - websocketStreams.writeStatus(apierrors.NewInternalError(err)) metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(http.StatusInternalServerError)) + websocketStreams.writeStatus(apierrors.NewInternalError(err)) } return } + metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(http.StatusOK)) // Write the success status back to the WebSocket client. //nolint:errcheck websocketStreams.writeStatus(&apierrors.StatusError{ErrStatus: metav1.Status{ Status: metav1.StatusSuccess, }}) - metrics.IncStreamTranslatorRequest(req.Context(), strconv.Itoa(http.StatusOK)) } // translatorSizeQueue feeds the size events from the WebSocket