From 573086694b2d374df75a9cef05ea4000280bd5a3 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Mon, 4 Aug 2025 21:43:15 +0300 Subject: [PATCH] handler/meter: add HTTPHandlerFunc method Signed-off-by: Vasiliy Tolstov --- handler/meter/meter.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/handler/meter/meter.go b/handler/meter/meter.go index 78fadbc..8ee064a 100644 --- a/handler/meter/meter.go +++ b/handler/meter/meter.go @@ -5,6 +5,8 @@ import ( "compress/gzip" "context" "fmt" + "io" + http "net/http" "strings" "sync" @@ -85,6 +87,33 @@ func NewHandler(opts ...Option) *Handler { return &Handler{Options: options} } +func (h *Handler) HTTPHandlerFunc(w http.ResponseWriter, r *http.Request) { + var wr io.Writer + if v := r.Header.Get(acceptEncodingHeader); strings.Contains(v, "gzip") && !h.Options.DisableCompress { + w.Header().Add(contentEncodingHeader, "gzip") + + gz := gzipPool.Get().(*gzip.Writer) + defer gzipPool.Put(gz) + + gz.Reset(w) + defer gz.Close() + + wr = gz + } else { + wr = w + } + + if err := h.Options.Meter.Write(wr, h.Options.MeterOptions...); err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + + // gz.Flush() must be called after writing metrics to ensure buffered data is written to the underlying writer. + if gz, ok := wr.(*gzip.Writer); ok { + gz.Flush() + } +} + func (h *Handler) Metrics(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { log, ok := logger.FromContext(ctx) if !ok {