tercul-backend/internal/platform/db/prometheus.go
Damir Mukimov d50722dad5
Some checks failed
Test / Integration Tests (push) Successful in 4s
Build / Build Binary (push) Failing after 2m9s
Docker Build / Build Docker Image (push) Failing after 2m32s
Test / Unit Tests (push) Failing after 3m12s
Lint / Go Lint (push) Failing after 1m0s
Refactor ID handling to use UUIDs across the application
- Updated database models and repositories to replace uint IDs with UUIDs.
- Modified test fixtures to generate and use UUIDs for authors, translations, users, and works.
- Adjusted mock implementations to align with the new UUID structure.
- Ensured all relevant functions and methods are updated to handle UUIDs correctly.
- Added necessary imports for UUID handling in various files.
2025-12-27 00:33:34 +01:00

99 lines
2.6 KiB
Go

package db
import (
"tercul/internal/observability"
"time"
"gorm.io/gorm"
)
const (
startTime = "start_time"
)
type PrometheusPlugin struct {
Metrics *observability.Metrics
}
func (p *PrometheusPlugin) Name() string {
return "PrometheusPlugin"
}
func (p *PrometheusPlugin) Initialize(db *gorm.DB) error {
// Before callbacks
if err := db.Callback().Create().Before("gorm:create").Register("prometheus:before_create", p.before); err != nil {
return err
}
if err := db.Callback().Query().Before("gorm:query").Register("prometheus:before_query", p.before); err != nil {
return err
}
if err := db.Callback().Update().Before("gorm:update").Register("prometheus:before_update", p.before); err != nil {
return err
}
if err := db.Callback().Delete().Before("gorm:delete").Register("prometheus:before_delete", p.before); err != nil {
return err
}
if err := db.Callback().Row().Before("gorm:row").Register("prometheus:before_row", p.before); err != nil {
return err
}
if err := db.Callback().Raw().Before("gorm:raw").Register("prometheus:before_raw", p.before); err != nil {
return err
}
// After callbacks
if err := db.Callback().Create().After("gorm:create").Register("prometheus:after_create", p.after); err != nil {
return err
}
if err := db.Callback().Query().After("gorm:query").Register("prometheus:after_query", p.after); err != nil {
return err
}
if err := db.Callback().Update().After("gorm:update").Register("prometheus:after_update", p.after); err != nil {
return err
}
if err := db.Callback().Delete().After("gorm:delete").Register("prometheus:after_delete", p.after); err != nil {
return err
}
if err := db.Callback().Row().After("gorm:row").Register("prometheus:after_row", p.after); err != nil {
return err
}
if err := db.Callback().Raw().After("gorm:raw").Register("prometheus:after_raw", p.after); err != nil {
return err
}
return nil
}
func (p *PrometheusPlugin) before(db *gorm.DB) {
db.Set(startTime, time.Now())
}
func (p *PrometheusPlugin) after(db *gorm.DB) {
_ts, ok := db.Get(startTime)
if !ok {
return
}
ts, ok := _ts.(time.Time)
if !ok {
return
}
operation := db.Statement.SQL.String()
if len(operation) > 50 { // Truncate long queries
operation = operation[:50]
}
status := "success"
if db.Error != nil {
status = "error"
}
duration := time.Since(ts).Seconds()
p.Metrics.DBQueryDuration.WithLabelValues(operation, status).Observe(duration)
p.Metrics.DBQueriesTotal.WithLabelValues(operation, status).Inc()
}
func NewPrometheusPlugin(metrics *observability.Metrics) *PrometheusPlugin {
return &PrometheusPlugin{Metrics: metrics}
}