[feature] Add metrics for instance user count, statuses count and federating instances count (#2592)
Co-authored-by: Tsuribori <none@example.org>
This commit is contained in:
parent
46c06b1b8f
commit
142b7ec54f
|
@ -82,11 +82,6 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
||||||
return fmt.Errorf("error initializing tracing: %w", err)
|
return fmt.Errorf("error initializing tracing: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize Metrics
|
|
||||||
if err := metrics.Initialize(); err != nil {
|
|
||||||
return fmt.Errorf("error initializing metrics: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open connection to the database
|
// Open connection to the database
|
||||||
dbService, err := bundb.NewBunDBService(ctx, &state)
|
dbService, err := bundb.NewBunDBService(ctx, &state)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -218,6 +213,11 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
||||||
return fmt.Errorf("error scheduling poll expiries: %w", err)
|
return fmt.Errorf("error scheduling poll expiries: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initialize metrics.
|
||||||
|
if err := metrics.Initialize(state.DB); err != nil {
|
||||||
|
return fmt.Errorf("error initializing metrics: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
HTTP router initialization
|
HTTP router initialization
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -69,10 +69,6 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
||||||
return fmt.Errorf("error initializing tracing: %w", err)
|
return fmt.Errorf("error initializing tracing: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := metrics.Initialize(); err != nil {
|
|
||||||
return fmt.Errorf("error initializing metrics: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize caches and database
|
// Initialize caches and database
|
||||||
state.DB = testrig.NewTestDB(&state)
|
state.DB = testrig.NewTestDB(&state)
|
||||||
|
|
||||||
|
@ -143,6 +139,11 @@ var Start action.GTSAction = func(ctx context.Context) error {
|
||||||
|
|
||||||
processor := testrig.NewTestProcessor(&state, federator, emailSender, mediaManager)
|
processor := testrig.NewTestProcessor(&state, federator, emailSender, mediaManager)
|
||||||
|
|
||||||
|
// Initialize metrics.
|
||||||
|
if err := metrics.Initialize(state.DB); err != nil {
|
||||||
|
return fmt.Errorf("error initializing metrics: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
HTTP router initialization
|
HTTP router initialization
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -20,15 +20,18 @@
|
||||||
package metrics
|
package metrics
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||||
|
"github.com/superseriousbusiness/gotosocial/internal/db"
|
||||||
"github.com/technologize/otel-go-contrib/otelginmetrics"
|
"github.com/technologize/otel-go-contrib/otelginmetrics"
|
||||||
"github.com/uptrace/bun"
|
"github.com/uptrace/bun"
|
||||||
"github.com/uptrace/bun/extra/bunotel"
|
"github.com/uptrace/bun/extra/bunotel"
|
||||||
"go.opentelemetry.io/otel"
|
"go.opentelemetry.io/otel"
|
||||||
"go.opentelemetry.io/otel/exporters/prometheus"
|
"go.opentelemetry.io/otel/exporters/prometheus"
|
||||||
|
"go.opentelemetry.io/otel/metric"
|
||||||
sdk "go.opentelemetry.io/otel/sdk/metric"
|
sdk "go.opentelemetry.io/otel/sdk/metric"
|
||||||
"go.opentelemetry.io/otel/sdk/resource"
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
|
||||||
|
@ -38,7 +41,8 @@ const (
|
||||||
serviceName = "GoToSocial"
|
serviceName = "GoToSocial"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Initialize() error {
|
func Initialize(db db.DB) error {
|
||||||
|
|
||||||
if !config.GetMetricsEnabled() {
|
if !config.GetMetricsEnabled() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -54,6 +58,7 @@ func Initialize() error {
|
||||||
resource.NewWithAttributes(
|
resource.NewWithAttributes(
|
||||||
semconv.SchemaURL,
|
semconv.SchemaURL,
|
||||||
semconv.ServiceName(serviceName),
|
semconv.ServiceName(serviceName),
|
||||||
|
semconv.ServiceVersion(config.GetSoftwareVersion()),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -66,8 +71,64 @@ func Initialize() error {
|
||||||
sdk.WithResource(r),
|
sdk.WithResource(r),
|
||||||
sdk.WithReader(prometheusExporter),
|
sdk.WithReader(prometheusExporter),
|
||||||
)
|
)
|
||||||
|
|
||||||
otel.SetMeterProvider(meterProvider)
|
otel.SetMeterProvider(meterProvider)
|
||||||
|
|
||||||
|
meter := meterProvider.Meter(serviceName)
|
||||||
|
|
||||||
|
thisInstance := config.GetHost()
|
||||||
|
|
||||||
|
_, err = meter.Int64ObservableGauge(
|
||||||
|
"gotosocial.instance.total_users",
|
||||||
|
metric.WithDescription("Total number of users on this instance"),
|
||||||
|
metric.WithInt64Callback(func(c context.Context, o metric.Int64Observer) error {
|
||||||
|
userCount, err := db.CountInstanceUsers(c, thisInstance)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
o.Observe(int64(userCount))
|
||||||
|
return nil
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = meter.Int64ObservableGauge(
|
||||||
|
"gotosocial.instance.total_statuses",
|
||||||
|
metric.WithDescription("Total number of statuses on this instance"),
|
||||||
|
metric.WithInt64Callback(func(c context.Context, o metric.Int64Observer) error {
|
||||||
|
statusCount, err := db.CountInstanceStatuses(c, thisInstance)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
o.Observe(int64(statusCount))
|
||||||
|
return nil
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = meter.Int64ObservableGauge(
|
||||||
|
"gotosocial.instance.total_federating_instances",
|
||||||
|
metric.WithDescription("Total number of other instances this instance is federating with"),
|
||||||
|
metric.WithInt64Callback(func(c context.Context, o metric.Int64Observer) error {
|
||||||
|
federatingCount, err := db.CountInstanceDomains(c, thisInstance)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
o.Observe(int64(federatingCount))
|
||||||
|
return nil
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,11 @@ import (
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||||
|
"github.com/superseriousbusiness/gotosocial/internal/db"
|
||||||
"github.com/uptrace/bun"
|
"github.com/uptrace/bun"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Initialize() error {
|
func Initialize(db db.DB) error {
|
||||||
if config.GetMetricsEnabled() {
|
if config.GetMetricsEnabled() {
|
||||||
return errors.New("metrics was disabled at build time")
|
return errors.New("metrics was disabled at build time")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue