Skip to content

Commit

Permalink
Ensure gzip reader is closed when fetching metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
jwilder committed Sep 18, 2024
1 parent db8ed39 commit 3c6faef
Showing 1 changed file with 29 additions and 1 deletion.
30 changes: 29 additions & 1 deletion collector/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"crypto/x509"
"encoding/json"
"fmt"
"io"
"net"
"net/http"
"os"
Expand Down Expand Up @@ -189,7 +190,7 @@ func (c *MetricsClient) FetchMetricsIterator(target string) (*prompb.Iterator, e

br := resp.Body
if resp.Header.Get("Content-Encoding") == "gzip" {
br, err = gzip.NewReader(resp.Body)
br, err = NewGzipReaderWithClose(resp.Body)
if err != nil {
defer br.Close()
return nil, fmt.Errorf("collect node metrics for %s: %w", target, err)
Expand Down Expand Up @@ -269,3 +270,30 @@ func (c *MetricsClient) refreshToken() {
}
}
}

// gzipReaderWithClose wraps gzip.Reader and the underlying reader
type gzipReaderWithClose struct {
*gzip.Reader
underlying io.ReadCloser
}

// Close closes both the gzip.Reader and the underlying reader
func (gr *gzipReaderWithClose) Close() error {
err := gr.Reader.Close()
if err != nil {
return err
}
return gr.underlying.Close()
}

// NewGzipReaderWithClose creates a new gzipReaderWithClose
func NewGzipReaderWithClose(r io.ReadCloser) (*gzipReaderWithClose, error) {
gr, err := gzip.NewReader(r)
if err != nil {
return nil, err
}
return &gzipReaderWithClose{
Reader: gr,
underlying: r,
}, nil
}

0 comments on commit 3c6faef

Please sign in to comment.