summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/server/metrics/metrics.go65
-rw-r--r--internal/server/server.go16
2 files changed, 71 insertions, 10 deletions
diff --git a/internal/server/metrics/metrics.go b/internal/server/metrics/metrics.go
index 9c80665..725952b 100644
--- a/internal/server/metrics/metrics.go
+++ b/internal/server/metrics/metrics.go
@@ -5,14 +5,61 @@ import (
"github.com/prometheus/client_golang/prometheus/promauto"
)
-var (
- reg = prometheus.DefaultRegisterer
+const namespace = "eko"
- namespace = "eko"
+var RequestsProcessed = promauto.NewCounterVec(prometheus.CounterOpts{
+ Namespace: namespace,
+ Name: "requests_processed_total",
+ Help: "The total number of processed requests",
+}, []string{"request_type"})
- RequestsProcessed = promauto.With(reg).NewCounter(prometheus.CounterOpts{
- Namespace: namespace,
- Name: "processed_requests_total",
- Help: "The total number of processed requests",
- })
-)
+// var RequestsInProgress = promauto.NewCounterVec(prometheus.CounterOpts{
+// Namespace: namespace,
+// Name: "requests_in_progress_total",
+// Help: "The total number of in-progress requests",
+// }, []string{"request_type"})
+
+var RequestProcessingDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{
+ Namespace: namespace,
+ Name: "request_processing_duration_seconds",
+ Help: "The duration in seconds it took to process a request",
+ NativeHistogramBucketFactor: 1.00271,
+}, []string{"request_type"})
+
+// var RequestProcessingDuration = promauto.NewSummaryVec(prometheus.SummaryOpts{
+// Namespace: namespace,
+// Name: "request_processing_duration_seconds",
+// Help: "The duration in seconds it took to process a request",
+// Objectives: map[float64]float64{
+// 0.01: 0.001,
+// 0.50: 0.005,
+// 0.90: 0.009,
+// 0.95: 0.0095,
+// 0.99: 0.0099,
+// },
+// MaxAge: 1 * time.Hour,
+// }, []string{"request_type"})
+
+var ConnectionsEstablished = promauto.NewCounter(prometheus.CounterOpts{
+ Namespace: namespace,
+ Name: "connections_established_total",
+ Help: "The total number of established connections",
+})
+
+var ConnectionsClosed = promauto.NewCounter(prometheus.CounterOpts{
+ Namespace: namespace,
+ Name: "connections_closed_total",
+ Help: "The total number of closed connections",
+})
+
+var ConnectionsActive = promauto.NewGauge(prometheus.GaugeOpts{
+ Namespace: namespace,
+ Name: "connections_active_total",
+ Help: "The total number of active connections",
+})
+
+var UsersActive = promauto.NewGauge(prometheus.GaugeOpts{
+ Namespace: namespace,
+ Name: "users_active_total",
+ Help: "The total number of active users",
+})
diff --git a/internal/server/server.go b/internal/server/server.go
index fcc904d..28c1ae2 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -29,6 +29,7 @@ import (
"github.com/kyren223/eko/internal/server/session"
"github.com/kyren223/eko/pkg/assert"
"github.com/kyren223/eko/pkg/snowflake"
+ "github.com/prometheus/client_golang/prometheus"
)
var nodeId int64 = 0
@@ -129,6 +130,7 @@ func (s *server) AddSession(session *session.Session, userId snowflake.ID, pubKe
if sess, ok := s.sessions[session.ID()]; ok {
EvictSession(sess) // last connection wins
+ metrics.UsersActive.Dec()
slog.Info("closed due to new connection from another location",
ctxkeys.IpAddr.String(), sess.Addr(),
ctxkeys.UserID.String(), sess.ID(),
@@ -142,6 +144,7 @@ func (s *server) AddSession(session *session.Session, userId snowflake.ID, pubKe
}
s.sessions[session.ID()] = session
+ metrics.UsersActive.Inc()
}
func EvictSession(sess *session.Session) {
@@ -160,6 +163,7 @@ func (s *server) RemoveSession(id snowflake.ID) {
s.sessMu.Lock()
defer s.sessMu.Unlock()
delete(s.sessions, id)
+ metrics.UsersActive.Dec()
}
func (s *server) Session(id snowflake.ID) *session.Session {
@@ -214,7 +218,11 @@ func (s *server) Run() {
}
wg.Add(1)
go func() {
+ metrics.ConnectionsEstablished.Inc()
+ metrics.ConnectionsActive.Inc()
s.handleConnection(conn)
+ metrics.ConnectionsActive.Dec()
+ metrics.ConnectionsClosed.Inc()
wg.Done()
}()
}
@@ -292,8 +300,14 @@ func (server *server) handleConnection(conn net.Conn) {
// will still have a time limit upper bound, from timeout()
for request := range framer.Out {
+ start := time.Now().UTC()
processPacket(localCtx, sess, request)
- metrics.RequestsProcessed.Inc()
+ duration := time.Since(start)
+
+ labels := prometheus.Labels{"request_type": request.Type().String()}
+ metrics.RequestsProcessed.With(labels).Inc()
+ metrics.RequestProcessingDuration.With(labels).Observe(float64(duration.Seconds()))
+ slog.InfoContext(ctx, "processed request", "request_type", request.Type().String(), "duration", duration.String(), "duration_ns", duration.Nanoseconds())
}
slog.InfoContext(ctx, "processor done")
}()