Skip to content

Commit

Permalink
Report members per segment
Browse files Browse the repository at this point in the history
  • Loading branch information
pcewing committed Jun 3, 2021
1 parent 1f1d50f commit 7d0a17f
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 36 deletions.
7 changes: 6 additions & 1 deletion agent/consul/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,12 @@ func NewServer(config *Config, flat Deps) (*Server, error) {
WithDatacenter(s.config.Datacenter).
WithReportingInterval(s.config.MetricsReportingInterval),
func() []serf.Member {
return s.LANMembers()
members, err := s.LANMembersAllSegments()
if err != nil {
return []serf.Member{}
}

return members
},
)
if err != nil {
Expand Down
79 changes: 56 additions & 23 deletions agent/consul/usagemetrics/usagemetrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,12 @@ var Gauges = []prometheus.GaugeDefinition{
Help: "Measures the current number of unique services registered with Consul, based on service name. It is only emitted by Consul servers. Added in v1.9.0.",
},
{
Name: []string{"consul", "state", "client_agents"},
// TODO: Insert proper version
Help: "Measures the current number of client agents registered with Consul. It is only emitted by Consul servers. Added in vX.X.X.",
Name: []string{"consul", "members", "clients"},
Help: "Measures the current number of client agents registered with Consul. It is only emitted by Consul servers. Added in v1.9.6.",
},
{
Name: []string{"consul", "state", "server_agents"},
// TODO: Insert proper version
Help: "Measures the current number of server agents registered with Consul. It is only emitted by Consul servers. Added in vX.X.X.",
Name: []string{"consul", "members", "servers"},
Help: "Measures the current number of server agents registered with Consul. It is only emitted by Consul servers. Added in v1.9.6.",
},
}

Expand Down Expand Up @@ -153,46 +151,81 @@ func (u *UsageMetricsReporter) runOnce() {

u.emitServiceUsage(serviceUsage)

servers, clients := u.memberUsage()
u.emitMemberUsage(servers, clients)
segmentMembers := u.memberUsage()
u.emitMemberUsage(segmentMembers)
}

func (u *UsageMetricsReporter) memberUsage() (servers, clients int) {
type members struct {
clients int
servers int
}

func (u *UsageMetricsReporter) memberUsage() map[string]members {
if u.getMembersFunc == nil {
return 0, 0
return nil
}

members := u.getMembersFunc()

numClients := 0
numServers := 0
mems := u.getMembersFunc()
if len(mems) <= 0 {
u.logger.Warn("cluster reported zero members")
return nil
}

for _, m := range members {
segmentMembers := make(map[string]members)
for _, m := range mems {
if m.Status != serf.StatusAlive {
continue
}

segment := m.Tags["segment"]
sm := segmentMembers[segment]

switch m.Tags["role"] {
case "node":
numClients++
sm.clients++
case "consul":
numServers++
sm.servers++
}

segmentMembers[segment] = sm
}

return numServers, numClients
return segmentMembers
}

func (u *UsageMetricsReporter) emitMemberUsage(servers, clients int) {
func (u *UsageMetricsReporter) emitMemberUsage(segmentMembers map[string]members) {
totalClients := 0
totalServers := 0

for seg, mem := range segmentMembers {
segmentLabel := metrics.Label{Name: "segment", Value: seg}
labels := append([]metrics.Label{segmentLabel}, u.metricLabels...)

metrics.SetGaugeWithLabels(
[]string{"consul", "members", "clients"},
float32(mem.clients),
labels,
)

metrics.SetGaugeWithLabels(
[]string{"consul", "members", "servers"},
float32(mem.servers),
labels,
)

totalClients += mem.clients
totalServers += mem.servers
}

metrics.SetGaugeWithLabels(
[]string{"consul", "state", "client_agents"},
float32(clients),
[]string{"consul", "members", "clients"},
float32(totalClients),
u.metricLabels,
)

metrics.SetGaugeWithLabels(
[]string{"consul", "state", "server_agents"},
float32(servers),
[]string{"consul", "members", "servers"},
float32(totalServers),
u.metricLabels,
)
}
32 changes: 24 additions & 8 deletions agent/consul/usagemetrics/usagemetrics_oss_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@ func TestUsageReporter_emitServiceUsage_OSS(t *testing.T) {
{Name: "datacenter", Value: "dc1"},
},
},
"consul.usage.test.consul.state.client_agents;datacenter=dc1": {
Name: "consul.usage.test.consul.state.client_agents",
"consul.usage.test.consul.members.clients;datacenter=dc1": {
Name: "consul.usage.test.consul.members.clients",
Value: 0,
Labels: []metrics.Label{
{Name: "datacenter", Value: "dc1"},
},
},
"consul.usage.test.consul.state.server_agents;datacenter=dc1": {
Name: "consul.usage.test.consul.state.server_agents",
"consul.usage.test.consul.members.servers;datacenter=dc1": {
Name: "consul.usage.test.consul.members.servers",
Value: 0,
Labels: []metrics.Label{
{Name: "datacenter", Value: "dc1"},
Expand Down Expand Up @@ -114,20 +114,36 @@ func TestUsageReporter_emitServiceUsage_OSS(t *testing.T) {
{Name: "datacenter", Value: "dc1"},
},
},
"consul.usage.test.consul.state.client_agents;datacenter=dc1": {
Name: "consul.usage.test.consul.state.client_agents",
"consul.usage.test.consul.members.clients;datacenter=dc1": {
Name: "consul.usage.test.consul.members.clients",
Value: 1,
Labels: []metrics.Label{
{Name: "datacenter", Value: "dc1"},
},
},
"consul.usage.test.consul.state.server_agents;datacenter=dc1": {
Name: "consul.usage.test.consul.state.server_agents",
"consul.usage.test.consul.members.servers;datacenter=dc1": {
Name: "consul.usage.test.consul.members.servers",
Value: 2,
Labels: []metrics.Label{
{Name: "datacenter", Value: "dc1"},
},
},
"consul.usage.test.consul.members.clients;segment=;datacenter=dc1": {
Name: "consul.usage.test.consul.members.clients",
Value: 1,
Labels: []metrics.Label{
{Name: "segment", Value: ""},
{Name: "datacenter", Value: "dc1"},
},
},
"consul.usage.test.consul.members.servers;segment=;datacenter=dc1": {
Name: "consul.usage.test.consul.members.servers",
Value: 2,
Labels: []metrics.Label{
{Name: "segment", Value: ""},
{Name: "datacenter", Value: "dc1"},
},
},
},
},
}
Expand Down
8 changes: 4 additions & 4 deletions agent/consul/usagemetrics/usagemetrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,13 @@ func TestUsageReporter_Run_Nodes(t *testing.T) {
Value: 3,
Labels: []metrics.Label{{Name: "datacenter", Value: "dc1"}},
},
"consul.usage.test.consul.state.client_agents;datacenter=dc1": {
Name: "consul.usage.test.consul.state.client_agents",
"consul.usage.test.consul.members.clients;datacenter=dc1": {
Name: "consul.usage.test.consul.members.clients",
Value: 1,
Labels: []metrics.Label{{Name: "datacenter", Value: "dc1"}},
},
"consul.usage.test.consul.state.server_agents;datacenter=dc1": {
Name: "consul.usage.test.consul.state.server_agents",
"consul.usage.test.consul.members.servers;datacenter=dc1": {
Name: "consul.usage.test.consul.members.servers",
Value: 2,
Labels: []metrics.Label{{Name: "datacenter", Value: "dc1"}},
},
Expand Down

0 comments on commit 7d0a17f

Please sign in to comment.