From 979a55f905a642fc8227f9e8476b2ffa645670da Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Sat, 28 Oct 2023 15:18:03 -0700 Subject: echo: prevent double gzip in prometheus --- echo/echo_default.go | 6 +----- echo/prometheus/prometheus.go | 12 +++++++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/echo/echo_default.go b/echo/echo_default.go index aa9e32a..b5602e6 100644 --- a/echo/echo_default.go +++ b/echo/echo_default.go @@ -366,14 +366,10 @@ func (w *EchoWrapper) configureRedirects(c *EchoConfig) { } func (w *EchoWrapper) configureCompression(c *EchoConfig) { - metricsSkipper := makeMiddlewareSkipper(c.PrometheusConfig) - w.Use(middleware.Decompress()) - // TODO: This mangles responses but only for Accept: */* (browsers). Why? w.Use(middleware.GzipWithConfig(middleware.GzipConfig{ - Skipper: metricsSkipper, - Level: 5, + Level: 6, // Nginx default compression level })) } diff --git a/echo/prometheus/prometheus.go b/echo/prometheus/prometheus.go index 2fbf252..5f93bea 100644 --- a/echo/prometheus/prometheus.go +++ b/echo/prometheus/prometheus.go @@ -64,9 +64,19 @@ func NewPrometheusWithConfig(c *PrometheusConfig) *Prometheus { c.ExtractHost = DefaultPrometheusConfig.ExtractHost } + // Mostly matches promhttp.Handler implementation + hnd := echo.WrapHandler(promhttp.InstrumentMetricHandler( + prometheus.DefaultRegisterer, + promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{ + // We gzip by default in the echo warpper; with this enabled we + // double gzip metrics and corrupt them + DisableCompression: true, + }), + )) + return &Prometheus{ Config: c, - MetricsHandler: echo.WrapHandler(promhttp.Handler()), + MetricsHandler: hnd, requestCount: promauto.NewCounterVec(prometheus.CounterOpts{ Subsystem: c.Subsystem, Name: "requests_total", -- cgit v1.2.3