diff options
author | 2023-11-20 17:43:55 +0200 | |
---|---|---|
committer | 2023-11-20 16:43:55 +0100 | |
commit | 1ba3e14b36c8f00475bdd41cd4a487ef7636836e (patch) | |
tree | 17405b2de75bb6faaefb9bbfc6487fd7a5efc35a /internal/metrics/metrics.go | |
parent | [bugfix] self-referencing collection pages for status replies (#2364) (diff) | |
download | gotosocial-1ba3e14b36c8f00475bdd41cd4a487ef7636836e.tar.xz |
[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 <user@acertaindebian>
Co-authored-by: Tsuribori <none@example.org>
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
Diffstat (limited to 'internal/metrics/metrics.go')
-rw-r--r-- | internal/metrics/metrics.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go new file mode 100644 index 000000000..966f346fd --- /dev/null +++ b/internal/metrics/metrics.go @@ -0,0 +1,82 @@ +// 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 <http://www.gnu.org/licenses/>. + +//go:build !nometrics + +package metrics + +import ( + "errors" + + "github.com/gin-gonic/gin" + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/technologize/otel-go-contrib/otelginmetrics" + "github.com/uptrace/bun" + "github.com/uptrace/bun/extra/bunotel" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/prometheus" + sdk "go.opentelemetry.io/otel/sdk/metric" + "go.opentelemetry.io/otel/sdk/resource" + semconv "go.opentelemetry.io/otel/semconv/v1.17.0" +) + +const ( + serviceName = "GoToSocial" +) + +func Initialize() error { + if !config.GetMetricsEnabled() { + return nil + } + + if config.GetMetricsAuthEnabled() { + if config.GetMetricsAuthPassword() == "" || config.GetMetricsAuthUsername() == "" { + return errors.New("metrics-auth-username and metrics-auth-password must be set when metrics-auth-enabled is true") + } + } + + r, _ := resource.Merge( + resource.Default(), + resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceName(serviceName), + ), + ) + + prometheusExporter, err := prometheus.New() + if err != nil { + return err + } + + meterProvider := sdk.NewMeterProvider( + sdk.WithResource(r), + sdk.WithReader(prometheusExporter), + ) + otel.SetMeterProvider(meterProvider) + + return nil +} + +func InstrumentGin() gin.HandlerFunc { + return otelginmetrics.Middleware(serviceName) +} + +func InstrumentBun() bun.QueryHook { + return bunotel.NewQueryHook( + bunotel.WithMeterProvider(otel.GetMeterProvider()), + ) +} |