consul: Collect useful session metrics

This commit is contained in:
Armon Dadgar 2014-12-18 16:57:49 -08:00
parent 096ff61121
commit 6b9ace19cf
3 changed files with 23 additions and 0 deletions

View File

@ -257,6 +257,9 @@ func NewServer(config *Config) (*Server, error) {
// Start listening for RPC requests // Start listening for RPC requests
go s.listen() go s.listen()
// Start the metrics handlers
go s.sessionStats()
return s, nil return s, nil
} }

View File

@ -166,6 +166,7 @@ func (s *Session) Renew(args *structs.SessionSpecificRequest,
if done, err := s.srv.forward("Session.Renew", args, args, reply); done { if done, err := s.srv.forward("Session.Renew", args, args, reply); done {
return err return err
} }
defer metrics.MeasureSince([]string{"consul", "session", "renew"}, time.Now())
// Get the session, from local state // Get the session, from local state
state := s.srv.fsm.State() state := s.srv.fsm.State()

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/armon/go-metrics"
"github.com/hashicorp/consul/consul/structs" "github.com/hashicorp/consul/consul/structs"
) )
@ -95,6 +96,7 @@ func (s *Server) resetSessionTimerLocked(id string, ttl time.Duration) {
// invalidateSession is invoked when a session TTL is reached and we // invalidateSession is invoked when a session TTL is reached and we
// need to invalidate the session. // need to invalidate the session.
func (s *Server) invalidateSession(id string) { func (s *Server) invalidateSession(id string) {
defer metrics.MeasureSince([]string{"consul", "session_ttl", "invalidate"}, time.Now())
// Clear the session timer // Clear the session timer
s.sessionTimersLock.Lock() s.sessionTimersLock.Lock()
delete(s.sessionTimers, id) delete(s.sessionTimers, id)
@ -142,3 +144,20 @@ func (s *Server) clearAllSessionTimers() error {
s.sessionTimers = nil s.sessionTimers = nil
return nil return nil
} }
// sessionStats is a long running routine used to capture
// the number of active sessions being tracked
func (s *Server) sessionStats() {
for {
select {
case <-time.After(5 * time.Second):
s.sessionTimersLock.Lock()
num := len(s.sessionTimers)
s.sessionTimersLock.Unlock()
metrics.SetGauge([]string{"consul", "session_ttl", "active"}, float32(num))
case <-s.shutdownCh:
return
}
}
}