From 1ba3e14b36c8f00475bdd41cd4a487ef7636836e Mon Sep 17 00:00:00 2001 From: Tsuribori <30933799+Tsuribori@users.noreply.github.com> Date: Mon, 20 Nov 2023 17:43:55 +0200 Subject: [feature] Initial Prometheus metrics implementation (#2334) * feat: Initial OTEL metrics * docs: add metrics documentation * fix: metrics endpoint conditional check * feat: metrics endpoint basic auth * fix: make metrics-auth-enabled default false * fix: go fmt helpers.gen.go * fix: add metric-related env vars to envparsing.sh * fix: metrics docs * fix: metrics related stuff in envparsing.sh * fix: metrics docs * chore: metrics docs wording * fix: metrics stuff in envparsing? * bump otel versions --------- Co-authored-by: Tsuribori Co-authored-by: Tsuribori Co-authored-by: tsmethurst --- internal/web/metrics.go | 33 +++++++++++++++++++++++++++++++++ internal/web/web.go | 13 +++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 internal/web/metrics.go (limited to 'internal/web') diff --git a/internal/web/metrics.go b/internal/web/metrics.go new file mode 100644 index 000000000..eb5530290 --- /dev/null +++ b/internal/web/metrics.go @@ -0,0 +1,33 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package web + +import ( + "github.com/gin-gonic/gin" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +const ( + metricsPath = "/metrics" + metricsUser = "metrics" +) + +func (m *Module) metricsGETHandler(c *gin.Context) { + h := promhttp.Handler() + h.ServeHTTP(c.Writer, c.Request) +} diff --git a/internal/web/web.go b/internal/web/web.go index 86e74d6f8..6a21a754b 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -110,6 +110,19 @@ func (m *Module) Route(r *router.Router, mi ...gin.HandlerFunc) { r.AttachHandler(http.MethodGet, domainBlockListPath, m.domainBlockListGETHandler) r.AttachHandler(http.MethodGet, tagsPath, m.tagGETHandler) + // Prometheus metrics export endpoint + if config.GetMetricsEnabled() { + metricsGroup := r.AttachGroup(metricsPath) + metricsGroup.Use(mi...) + // Attach basic auth if enabled + if config.GetMetricsAuthEnabled() { + metricsGroup.Use(gin.BasicAuth(gin.Accounts{ + config.GetMetricsAuthUsername(): config.GetMetricsAuthPassword(), + })) + } + metricsGroup.Handle(http.MethodGet, "", m.metricsGETHandler) + } + // Attach redirects from old endpoints to current ones for backwards compatibility r.AttachHandler(http.MethodGet, "/auth/edit", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, userPanelPath) }) r.AttachHandler(http.MethodGet, "/user", func(c *gin.Context) { c.Redirect(http.StatusMovedPermanently, userPanelPath) }) -- cgit v1.2.3