mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2026-01-03 10:24:26 +00:00
137 lines
4.2 KiB
Go
137 lines
4.2 KiB
Go
package dbmanager
|
|
|
|
import (
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
)
|
|
|
|
var (
|
|
// connectionsTotal tracks the total number of configured database connections
|
|
connectionsTotal = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connections_total",
|
|
Help: "Total number of configured database connections",
|
|
},
|
|
[]string{"type"},
|
|
)
|
|
|
|
// connectionStatus tracks connection health status (1=healthy, 0=unhealthy)
|
|
connectionStatus = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connection_status",
|
|
Help: "Connection status (1=healthy, 0=unhealthy)",
|
|
},
|
|
[]string{"name", "type"},
|
|
)
|
|
|
|
// connectionPoolSize tracks connection pool sizes
|
|
connectionPoolSize = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connection_pool_size",
|
|
Help: "Current connection pool size",
|
|
},
|
|
[]string{"name", "type", "state"}, // state: open, idle, in_use
|
|
)
|
|
|
|
// connectionWaitCount tracks how many times connections had to wait for availability
|
|
connectionWaitCount = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connection_wait_count",
|
|
Help: "Number of times connections had to wait for availability",
|
|
},
|
|
[]string{"name", "type"},
|
|
)
|
|
|
|
// connectionWaitDuration tracks total time connections spent waiting
|
|
connectionWaitDuration = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connection_wait_duration_seconds",
|
|
Help: "Total time connections spent waiting for availability",
|
|
},
|
|
[]string{"name", "type"},
|
|
)
|
|
|
|
// reconnectAttempts tracks reconnection attempts and their outcomes
|
|
reconnectAttempts = promauto.NewCounterVec(
|
|
prometheus.CounterOpts{
|
|
Name: "dbmanager_reconnect_attempts_total",
|
|
Help: "Total number of reconnection attempts",
|
|
},
|
|
[]string{"name", "type", "result"}, // result: success, failure
|
|
)
|
|
|
|
// connectionLifetimeClosed tracks connections closed due to max lifetime
|
|
connectionLifetimeClosed = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connection_lifetime_closed_total",
|
|
Help: "Total connections closed due to exceeding max lifetime",
|
|
},
|
|
[]string{"name", "type"},
|
|
)
|
|
|
|
// connectionIdleClosed tracks connections closed due to max idle time
|
|
connectionIdleClosed = promauto.NewGaugeVec(
|
|
prometheus.GaugeOpts{
|
|
Name: "dbmanager_connection_idle_closed_total",
|
|
Help: "Total connections closed due to exceeding max idle time",
|
|
},
|
|
[]string{"name", "type"},
|
|
)
|
|
)
|
|
|
|
// PublishMetrics publishes current metrics for all connections
|
|
func (m *connectionManager) PublishMetrics() {
|
|
stats := m.Stats()
|
|
|
|
// Count connections by type
|
|
typeCount := make(map[DatabaseType]int)
|
|
for _, connStats := range stats.ConnectionStats {
|
|
typeCount[connStats.Type]++
|
|
}
|
|
|
|
// Update total connections gauge
|
|
for dbType, count := range typeCount {
|
|
connectionsTotal.WithLabelValues(string(dbType)).Set(float64(count))
|
|
}
|
|
|
|
// Update per-connection metrics
|
|
for name, connStats := range stats.ConnectionStats {
|
|
labels := prometheus.Labels{
|
|
"name": name,
|
|
"type": string(connStats.Type),
|
|
}
|
|
|
|
// Connection status
|
|
status := float64(0)
|
|
if connStats.Connected && connStats.HealthCheckStatus == "healthy" {
|
|
status = 1
|
|
}
|
|
connectionStatus.With(labels).Set(status)
|
|
|
|
// Pool size metrics (SQL databases only)
|
|
if connStats.Type != DatabaseTypeMongoDB {
|
|
connectionPoolSize.WithLabelValues(name, string(connStats.Type), "open").Set(float64(connStats.OpenConnections))
|
|
connectionPoolSize.WithLabelValues(name, string(connStats.Type), "idle").Set(float64(connStats.Idle))
|
|
connectionPoolSize.WithLabelValues(name, string(connStats.Type), "in_use").Set(float64(connStats.InUse))
|
|
|
|
// Wait stats
|
|
connectionWaitCount.With(labels).Set(float64(connStats.WaitCount))
|
|
connectionWaitDuration.With(labels).Set(connStats.WaitDuration.Seconds())
|
|
|
|
// Lifetime/idle closed
|
|
connectionLifetimeClosed.With(labels).Set(float64(connStats.MaxLifetimeClosed))
|
|
connectionIdleClosed.With(labels).Set(float64(connStats.MaxIdleClosed))
|
|
}
|
|
}
|
|
}
|
|
|
|
// RecordReconnectAttempt records a reconnection attempt
|
|
func RecordReconnectAttempt(name string, dbType DatabaseType, success bool) {
|
|
result := "failure"
|
|
if success {
|
|
result = "success"
|
|
}
|
|
|
|
reconnectAttempts.WithLabelValues(name, string(dbType), result).Inc()
|
|
}
|