183 lines
4.1 KiB
Go
183 lines
4.1 KiB
Go
|
|
// Package prommetrics provides Prometheus metrics registration and update functions.
|
||
|
|
// This package is intentionally separate from routes to avoid import cycles.
|
||
|
|
package prommetrics
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strconv"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/prometheus/client_golang/prometheus"
|
||
|
|
)
|
||
|
|
|
||
|
|
var (
|
||
|
|
// Prometheus registry
|
||
|
|
Registry = prometheus.NewRegistry()
|
||
|
|
|
||
|
|
// Custom metrics
|
||
|
|
httpRequestsTotal = prometheus.NewCounterVec(
|
||
|
|
prometheus.CounterOpts{
|
||
|
|
Name: "sub2api_http_requests_total",
|
||
|
|
Help: "Total number of HTTP requests",
|
||
|
|
},
|
||
|
|
[]string{"method", "path", "status"},
|
||
|
|
)
|
||
|
|
|
||
|
|
httpRequestDuration = prometheus.NewHistogramVec(
|
||
|
|
prometheus.HistogramOpts{
|
||
|
|
Name: "sub2api_http_request_duration_seconds",
|
||
|
|
Help: "HTTP request duration in seconds",
|
||
|
|
Buckets: prometheus.DefBuckets,
|
||
|
|
},
|
||
|
|
[]string{"method", "path"},
|
||
|
|
)
|
||
|
|
|
||
|
|
dbConnectionsActive = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_db_connections_active",
|
||
|
|
Help: "Number of active database connections",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
dbConnectionsIdle = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_db_connections_idle",
|
||
|
|
Help: "Number of idle database connections",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
redisConnectionsTotal = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_redis_connections_total",
|
||
|
|
Help: "Total number of Redis connections",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
redisConnectionsIdle = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_redis_connections_idle",
|
||
|
|
Help: "Number of idle Redis connections",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
accountActiveTotal = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_accounts_active_total",
|
||
|
|
Help: "Total number of active accounts",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
requestQueueDepth = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_request_queue_depth",
|
||
|
|
Help: "Current request queue depth",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
opsHealthScore = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_ops_health_score",
|
||
|
|
Help: "Overall system health score (0-100)",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
errorRate = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_error_rate",
|
||
|
|
Help: "Current error rate",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
successRate = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_success_rate",
|
||
|
|
Help: "Current success rate",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
qps = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_qps",
|
||
|
|
Help: "Queries per second",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
|
||
|
|
tps = prometheus.NewGauge(
|
||
|
|
prometheus.GaugeOpts{
|
||
|
|
Name: "sub2api_tps",
|
||
|
|
Help: "Tokens per second",
|
||
|
|
},
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
func init() {
|
||
|
|
// Register custom metrics
|
||
|
|
Registry.MustRegister(
|
||
|
|
httpRequestsTotal,
|
||
|
|
httpRequestDuration,
|
||
|
|
dbConnectionsActive,
|
||
|
|
dbConnectionsIdle,
|
||
|
|
redisConnectionsTotal,
|
||
|
|
redisConnectionsIdle,
|
||
|
|
accountActiveTotal,
|
||
|
|
requestQueueDepth,
|
||
|
|
opsHealthScore,
|
||
|
|
errorRate,
|
||
|
|
successRate,
|
||
|
|
qps,
|
||
|
|
tps,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
// RecordHTTPRequest records an HTTP request for Prometheus metrics
|
||
|
|
func RecordHTTPRequest(method, path string, statusCode int, duration time.Duration) {
|
||
|
|
httpRequestsTotal.WithLabelValues(method, path, strconv.Itoa(statusCode)).Inc()
|
||
|
|
httpRequestDuration.WithLabelValues(method, path).Observe(duration.Seconds())
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetDBConnections sets database connection metrics
|
||
|
|
func SetDBConnections(active, idle int) {
|
||
|
|
dbConnectionsActive.Set(float64(active))
|
||
|
|
dbConnectionsIdle.Set(float64(idle))
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetRedisConnections sets Redis connection metrics
|
||
|
|
func SetRedisConnections(total, idle int) {
|
||
|
|
redisConnectionsTotal.Set(float64(total))
|
||
|
|
redisConnectionsIdle.Set(float64(idle))
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetActiveAccounts sets the active accounts count
|
||
|
|
func SetActiveAccounts(count int) {
|
||
|
|
accountActiveTotal.Set(float64(count))
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetRequestQueueDepth sets the request queue depth
|
||
|
|
func SetRequestQueueDepth(depth int) {
|
||
|
|
requestQueueDepth.Set(float64(depth))
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetOpsHealthScore sets the overall health score
|
||
|
|
func SetOpsHealthScore(score int) {
|
||
|
|
opsHealthScore.Set(float64(score))
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetErrorRate sets the error rate
|
||
|
|
func SetErrorRate(rate float64) {
|
||
|
|
errorRate.Set(rate)
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetSuccessRate sets the success rate
|
||
|
|
func SetSuccessRate(rate float64) {
|
||
|
|
successRate.Set(rate)
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetQPS sets queries per second
|
||
|
|
func SetQPS(value float64) {
|
||
|
|
qps.Set(value)
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetTPS sets tokens per second
|
||
|
|
func SetTPS(value float64) {
|
||
|
|
tps.Set(value)
|
||
|
|
}
|