diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/consul/charts.go | 739 |
1 files changed, 739 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/consul/charts.go b/src/go/collectors/go.d.plugin/modules/consul/charts.go new file mode 100644 index 000000000..3e6c50cfd --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/consul/charts.go @@ -0,0 +1,739 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package consul + +import ( + "fmt" + + "github.com/blang/semver/v4" + + "github.com/netdata/netdata/go/go.d.plugin/agent/module" +) + +const ( + _ = module.Priority + iota + prioKVSApplyTime + prioKVSApplyOperations + prioTXNApplyTime + prioTXNApplyOperations + prioRaftCommitTime + prioRaftCommitsRate + + prioServerLeadershipStatus + prioRaftLeaderLastContactTime + prioRaftFollowerLastContactLeaderTime + prioRaftLeaderElections + prioRaftLeadershipTransitions + + prioAutopilotClusterHealthStatus + prioAutopilotFailureTolerance + prioAutopilotServerHealthStatus + prioAutopilotServerStableTime + prioAutopilotServerSerfStatus + prioAutopilotServerVoterStatus + + prioNetworkLanRTT + + prioRPCRequests + prioRPCRequestsExceeded + prioRPCRequestsFailed + + prioRaftThreadMainSaturation + prioRaftThreadFSMSaturation + + prioRaftFSMLastRestoreDuration + prioRaftLeaderOldestLogAge + prioRaftRPCInstallSnapshotTime + + prioBoltDBFreelistBytes + prioBoltDBLogsPerBatch + prioBoltDBStoreLogsTime + + prioMemoryAllocated + prioMemorySys + prioGCPauseTime + + prioServiceHealthCheckStatus + prioNodeHealthCheckStatus + + prioLicenseExpirationTime +) + +var ( + clientCharts = module.Charts{ + clientRPCRequestsRateChart.Copy(), + clientRPCRequestsExceededRateChart.Copy(), + clientRPCRequestsFailedRateChart.Copy(), + + memoryAllocatedChart.Copy(), + memorySysChart.Copy(), + gcPauseTimeChart.Copy(), + + licenseExpirationTimeChart.Copy(), + } + + serverLeaderCharts = module.Charts{ + raftCommitTimeChart.Copy(), + raftLeaderLastContactTimeChart.Copy(), + raftCommitsRateChart.Copy(), + raftLeaderOldestLogAgeChart.Copy(), + } + serverFollowerCharts = module.Charts{ + raftFollowerLastContactLeaderTimeChart.Copy(), + raftRPCInstallSnapshotTimeChart.Copy(), + } + serverAutopilotHealthCharts = module.Charts{ + autopilotServerHealthStatusChart.Copy(), + autopilotServerStableTimeChart.Copy(), + autopilotServerSerfStatusChart.Copy(), + autopilotServerVoterStatusChart.Copy(), + } + serverCommonCharts = module.Charts{ + kvsApplyTimeChart.Copy(), + kvsApplyOperationsRateChart.Copy(), + txnApplyTimeChart.Copy(), + txnApplyOperationsRateChart.Copy(), + + autopilotClusterHealthStatusChart.Copy(), + autopilotFailureTolerance.Copy(), + + raftLeaderElectionsRateChart.Copy(), + raftLeadershipTransitionsRateChart.Copy(), + serverLeadershipStatusChart.Copy(), + + networkLanRTTChart.Copy(), + + clientRPCRequestsRateChart.Copy(), + clientRPCRequestsExceededRateChart.Copy(), + clientRPCRequestsFailedRateChart.Copy(), + + raftThreadMainSaturationPercChart.Copy(), + raftThreadFSMSaturationPercChart.Copy(), + + raftFSMLastRestoreDurationChart.Copy(), + + raftBoltDBFreelistBytesChart.Copy(), + raftBoltDBLogsPerBatchChart.Copy(), + raftBoltDBStoreLogsTimeChart.Copy(), + + memoryAllocatedChart.Copy(), + memorySysChart.Copy(), + gcPauseTimeChart.Copy(), + + licenseExpirationTimeChart.Copy(), + } + + kvsApplyTimeChart = module.Chart{ + ID: "kvs_apply_time", + Title: "KVS apply time", + Units: "ms", + Fam: "transaction timing", + Ctx: "consul.kvs_apply_time", + Priority: prioKVSApplyTime, + Dims: module.Dims{ + {ID: "kvs_apply_quantile=0.5", Name: "quantile_0.5", Div: precision * precision}, + {ID: "kvs_apply_quantile=0.9", Name: "quantile_0.9", Div: precision * precision}, + {ID: "kvs_apply_quantile=0.99", Name: "quantile_0.99", Div: precision * precision}, + }, + } + kvsApplyOperationsRateChart = module.Chart{ + ID: "kvs_apply_operations_rate", + Title: "KVS apply operations", + Units: "ops/s", + Fam: "transaction timing", + Ctx: "consul.kvs_apply_operations_rate", + Priority: prioKVSApplyOperations, + Dims: module.Dims{ + {ID: "kvs_apply_count", Name: "kvs_apply"}, + }, + } + txnApplyTimeChart = module.Chart{ + ID: "txn_apply_time", + Title: "Transaction apply time", + Units: "ms", + Fam: "transaction timing", + Ctx: "consul.txn_apply_time", + Priority: prioTXNApplyTime, + Dims: module.Dims{ + {ID: "txn_apply_quantile=0.5", Name: "quantile_0.5", Div: precision * precision}, + {ID: "txn_apply_quantile=0.9", Name: "quantile_0.9", Div: precision * precision}, + {ID: "txn_apply_quantile=0.99", Name: "quantile_0.99", Div: precision * precision}, + }, + } + txnApplyOperationsRateChart = module.Chart{ + ID: "txn_apply_operations_rate", + Title: "Transaction apply operations", + Units: "ops/s", + Fam: "transaction timing", + Ctx: "consul.txn_apply_operations_rate", + Priority: prioTXNApplyOperations, + Dims: module.Dims{ + {ID: "txn_apply_count", Name: "kvs_apply"}, + }, + } + + raftCommitTimeChart = module.Chart{ + ID: "raft_commit_time", + Title: "Raft commit time", + Units: "ms", + Fam: "transaction timing", + Ctx: "consul.raft_commit_time", + Priority: prioRaftCommitTime, + Dims: module.Dims{ + {ID: "raft_commitTime_quantile=0.5", Name: "quantile_0.5", Div: precision * precision}, + {ID: "raft_commitTime_quantile=0.9", Name: "quantile_0.9", Div: precision * precision}, + {ID: "raft_commitTime_quantile=0.99", Name: "quantile_0.99", Div: precision * precision}, + }, + } + raftCommitsRateChart = module.Chart{ + ID: "raft_commits_rate", + Title: "Raft commits rate", + Units: "commits/s", + Fam: "transaction timing", + Ctx: "consul.raft_commits_rate", + Priority: prioRaftCommitsRate, + Dims: module.Dims{ + {ID: "raft_apply", Name: "commits", Div: precision, Algo: module.Incremental}, + }, + } + + autopilotClusterHealthStatusChart = module.Chart{ + ID: "autopilot_health_status", + Title: "Autopilot cluster health status", + Units: "status", + Fam: "autopilot", + Ctx: "consul.autopilot_health_status", + Priority: prioAutopilotClusterHealthStatus, + Dims: module.Dims{ + {ID: "autopilot_healthy_yes", Name: "healthy"}, + {ID: "autopilot_healthy_no", Name: "unhealthy"}, + }, + } + autopilotFailureTolerance = module.Chart{ + ID: "autopilot_failure_tolerance", + Title: "Autopilot cluster failure tolerance", + Units: "servers", + Fam: "autopilot", + Ctx: "consul.autopilot_failure_tolerance", + Priority: prioAutopilotFailureTolerance, + Dims: module.Dims{ + {ID: "autopilot_failure_tolerance", Name: "failure_tolerance"}, + }, + } + autopilotServerHealthStatusChart = module.Chart{ + ID: "autopilot_server_health_status", + Title: "Autopilot server health status", + Units: "status", + Fam: "autopilot", + Ctx: "consul.autopilot_server_health_status", + Priority: prioAutopilotServerHealthStatus, + Dims: module.Dims{ + {ID: "autopilot_server_healthy_yes", Name: "healthy"}, + {ID: "autopilot_server_healthy_no", Name: "unhealthy"}, + }, + } + autopilotServerStableTimeChart = module.Chart{ + ID: "autopilot_server_stable_time", + Title: "Autopilot server stable time", + Units: "seconds", + Fam: "autopilot", + Ctx: "consul.autopilot_server_stable_time", + Priority: prioAutopilotServerStableTime, + Dims: module.Dims{ + {ID: "autopilot_server_stable_time", Name: "stable"}, + }, + } + autopilotServerSerfStatusChart = module.Chart{ + ID: "autopilot_server_serf_status", + Title: "Autopilot server Serf status", + Units: "status", + Fam: "autopilot", + Ctx: "consul.autopilot_server_serf_status", + Priority: prioAutopilotServerSerfStatus, + Dims: module.Dims{ + {ID: "autopilot_server_sefStatus_alive", Name: "alive"}, + {ID: "autopilot_server_sefStatus_failed", Name: "failed"}, + {ID: "autopilot_server_sefStatus_left", Name: "left"}, + {ID: "autopilot_server_sefStatus_none", Name: "none"}, + }, + } + autopilotServerVoterStatusChart = module.Chart{ + ID: "autopilot_server_voter_status", + Title: "Autopilot server Raft voting membership", + Units: "status", + Fam: "autopilot", + Ctx: "consul.autopilot_server_voter_status", + Priority: prioAutopilotServerVoterStatus, + Dims: module.Dims{ + {ID: "autopilot_server_voter_yes", Name: "voter"}, + {ID: "autopilot_server_voter_no", Name: "not_voter"}, + }, + } + + raftLeaderLastContactTimeChart = module.Chart{ + ID: "raft_leader_last_contact_time", + Title: "Raft leader last contact time", + Units: "ms", + Fam: "leadership changes", + Ctx: "consul.raft_leader_last_contact_time", + Priority: prioRaftLeaderLastContactTime, + Dims: module.Dims{ + {ID: "raft_leader_lastContact_quantile=0.5", Name: "quantile_0.5", Div: precision * precision}, + {ID: "raft_leader_lastContact_quantile=0.9", Name: "quantile_0.9", Div: precision * precision}, + {ID: "raft_leader_lastContact_quantile=0.99", Name: "quantile_0.99", Div: precision * precision}, + }, + } + raftFollowerLastContactLeaderTimeChart = module.Chart{ + ID: "raft_follower_last_contact_leader_time", + Title: "Raft follower last contact with the leader time", + Units: "ms", + Fam: "leadership changes", + Ctx: "consul.raft_follower_last_contact_leader_time", + Priority: prioRaftFollowerLastContactLeaderTime, + Dims: module.Dims{ + {ID: "autopilot_server_lastContact_leader", Name: "leader_last_contact"}, + }, + } + raftLeaderElectionsRateChart = module.Chart{ + ID: "raft_leader_elections_rate", + Title: "Raft leader elections rate", + Units: "elections/s", + Fam: "leadership changes", + Ctx: "consul.raft_leader_elections_rate", + Priority: prioRaftLeaderElections, + Dims: module.Dims{ + {ID: "raft_state_candidate", Name: "leader", Algo: module.Incremental}, + }, + } + raftLeadershipTransitionsRateChart = module.Chart{ + ID: "raft_leadership_transitions_rate", + Title: "Raft leadership transitions rate", + Units: "transitions/s", + Fam: "leadership changes", + Ctx: "consul.raft_leadership_transitions_rate", + Priority: prioRaftLeadershipTransitions, + Dims: module.Dims{ + {ID: "raft_state_leader", Name: "leadership", Algo: module.Incremental}, + }, + } + serverLeadershipStatusChart = module.Chart{ + ID: "server_leadership_status", + Title: "Server leadership status", + Units: "status", + Fam: "leadership changes", + Ctx: "consul.server_leadership_status", + Priority: prioServerLeadershipStatus, + Dims: module.Dims{ + {ID: "server_isLeader_yes", Name: "leader"}, + {ID: "server_isLeader_no", Name: "not_leader"}, + }, + } + + networkLanRTTChart = module.Chart{ + ID: "network_lan_rtt", + Title: "Network lan RTT", + Units: "ms", + Fam: "network rtt", + Ctx: "consul.network_lan_rtt", + Type: module.Area, + Priority: prioNetworkLanRTT, + Dims: module.Dims{ + {ID: "network_lan_rtt_min", Name: "min", Div: 1e6}, + {ID: "network_lan_rtt_max", Name: "max", Div: 1e6}, + {ID: "network_lan_rtt_avg", Name: "avg", Div: 1e6}, + }, + } + + clientRPCRequestsRateChart = module.Chart{ + ID: "client_rpc_requests_rate", + Title: "Client RPC requests", + Units: "requests/s", + Fam: "rpc network activity", + Ctx: "consul.client_rpc_requests_rate", + Priority: prioRPCRequests, + Dims: module.Dims{ + {ID: "client_rpc", Name: "rpc", Algo: module.Incremental}, + }, + } + clientRPCRequestsExceededRateChart = module.Chart{ + ID: "client_rpc_requests_exceeded_rate", + Title: "Client rate-limited RPC requests", + Units: "requests/s", + Fam: "rpc network activity", + Ctx: "consul.client_rpc_requests_exceeded_rate", + Priority: prioRPCRequestsExceeded, + Dims: module.Dims{ + {ID: "client_rpc_exceeded", Name: "exceeded", Algo: module.Incremental}, + }, + } + clientRPCRequestsFailedRateChart = module.Chart{ + ID: "client_rpc_requests_failed_rate", + Title: "Client failed RPC requests", + Units: "requests/s", + Fam: "rpc network activity", + Ctx: "consul.client_rpc_requests_failed_rate", + Priority: prioRPCRequestsFailed, + Dims: module.Dims{ + {ID: "client_rpc_failed", Name: "failed", Algo: module.Incremental}, + }, + } + + raftThreadMainSaturationPercChart = module.Chart{ + ID: "raft_thread_main_saturation_perc", + Title: "Raft main thread saturation", + Units: "percentage", + Fam: "raft saturation", + Ctx: "consul.raft_thread_main_saturation_perc", + Priority: prioRaftThreadMainSaturation, + Dims: module.Dims{ + {ID: "raft_thread_main_saturation_quantile=0.5", Name: "quantile_0.5", Div: precision * 10}, + {ID: "raft_thread_main_saturation_quantile=0.9", Name: "quantile_0.9", Div: precision * 10}, + {ID: "raft_thread_main_saturation_quantile=0.99", Name: "quantile_0.99", Div: precision * 10}, + }, + } + raftThreadFSMSaturationPercChart = module.Chart{ + ID: "raft_thread_fsm_saturation_perc", + Title: "Raft FSM thread saturation", + Units: "percentage", + Fam: "raft saturation", + Ctx: "consul.raft_thread_fsm_saturation_perc", + Priority: prioRaftThreadFSMSaturation, + Dims: module.Dims{ + {ID: "raft_thread_fsm_saturation_quantile=0.5", Name: "quantile_0.5", Div: precision * 10}, + {ID: "raft_thread_fsm_saturation_quantile=0.9", Name: "quantile_0.9", Div: precision * 10}, + {ID: "raft_thread_fsm_saturation_quantile=0.99", Name: "quantile_0.99", Div: precision * 10}, + }, + } + + raftFSMLastRestoreDurationChart = module.Chart{ + ID: "raft_fsm_last_restore_duration", + Title: "Raft last restore duration", + Units: "ms", + Fam: "raft replication capacity", + Ctx: "consul.raft_fsm_last_restore_duration", + Priority: prioRaftFSMLastRestoreDuration, + Dims: module.Dims{ + {ID: "raft_fsm_lastRestoreDuration", Name: "last_restore_duration"}, + }, + } + raftLeaderOldestLogAgeChart = module.Chart{ + ID: "raft_leader_oldest_log_age", + Title: "Raft leader oldest log age", + Units: "seconds", + Fam: "raft replication capacity", + Ctx: "consul.raft_leader_oldest_log_age", + Priority: prioRaftLeaderOldestLogAge, + Dims: module.Dims{ + {ID: "raft_leader_oldestLogAge", Name: "oldest_log_age", Div: 1000}, + }, + } + raftRPCInstallSnapshotTimeChart = module.Chart{ + ID: "raft_rpc_install_snapshot_time", + Title: "Raft RPC install snapshot time", + Units: "ms", + Fam: "raft replication capacity", + Ctx: "consul.raft_rpc_install_snapshot_time", + Priority: prioRaftRPCInstallSnapshotTime, + Dims: module.Dims{ + {ID: "raft_rpc_installSnapshot_quantile=0.5", Name: "quantile_0.5", Div: precision * precision}, + {ID: "raft_rpc_installSnapshot_quantile=0.9", Name: "quantile_0.9", Div: precision * precision}, + {ID: "raft_rpc_installSnapshot_quantile=0.99", Name: "quantile_0.99", Div: precision * precision}, + }, + } + + raftBoltDBFreelistBytesChart = module.Chart{ + ID: "raft_boltdb_freelist_bytes", + Title: "Raft BoltDB freelist", + Units: "bytes", + Fam: "boltdb performance", + Ctx: "consul.raft_boltdb_freelist_bytes", + Priority: prioBoltDBFreelistBytes, + Dims: module.Dims{ + {ID: "raft_boltdb_freelistBytes", Name: "freelist"}, + }, + } + raftBoltDBLogsPerBatchChart = module.Chart{ + ID: "raft_boltdb_logs_per_batch_rate", + Title: "Raft BoltDB logs written per batch", + Units: "logs/s", + Fam: "boltdb performance", + Ctx: "consul.raft_boltdb_logs_per_batch_rate", + Priority: prioBoltDBLogsPerBatch, + Dims: module.Dims{ + {ID: "raft_boltdb_logsPerBatch_sum", Name: "written", Algo: module.Incremental}, + }, + } + + raftBoltDBStoreLogsTimeChart = module.Chart{ + ID: "raft_boltdb_store_logs_time", + Title: "Raft BoltDB store logs time", + Units: "ms", + Fam: "boltdb performance", + Ctx: "consul.raft_boltdb_store_logs_time", + Priority: prioBoltDBStoreLogsTime, + Dims: module.Dims{ + {ID: "raft_boltdb_storeLogs_quantile=0.5", Name: "quantile_0.5", Div: precision * precision}, + {ID: "raft_boltdb_storeLogs_quantile=0.9", Name: "quantile_0.9", Div: precision * precision}, + {ID: "raft_boltdb_storeLogs_quantile=0.99", Name: "quantile_0.99", Div: precision * precision}, + }, + } + + memoryAllocatedChart = module.Chart{ + ID: "memory_allocated", + Title: "Memory allocated by the Consul process", + Units: "bytes", + Fam: "memory", + Ctx: "consul.memory_allocated", + Priority: prioMemoryAllocated, + Dims: module.Dims{ + {ID: "runtime_alloc_bytes", Name: "allocated"}, + }, + } + memorySysChart = module.Chart{ + ID: "memory_sys", + Title: "Memory obtained from the OS", + Units: "bytes", + Fam: "memory", + Ctx: "consul.memory_sys", + Priority: prioMemorySys, + Dims: module.Dims{ + {ID: "runtime_sys_bytes", Name: "sys"}, + }, + } + + gcPauseTimeChart = module.Chart{ + ID: "gc_pause_time", + Title: "Garbage collection stop-the-world pause time", + Units: "seconds", + Fam: "garbage collection", + Ctx: "consul.gc_pause_time", + Priority: prioGCPauseTime, + Dims: module.Dims{ + {ID: "runtime_total_gc_pause_ns", Name: "gc_pause", Algo: module.Incremental, Div: 1e9}, + }, + } + + licenseExpirationTimeChart = module.Chart{ + ID: "license_expiration_time", + Title: "License expiration time", + Units: "seconds", + Fam: "license", + Ctx: "consul.license_expiration_time", + Priority: prioLicenseExpirationTime, + Dims: module.Dims{ + {ID: "system_licenseExpiration", Name: "license_expiration"}, + }, + } +) + +var ( + serviceHealthCheckStatusChartTmpl = module.Chart{ + ID: "health_check_%s_status", + Title: "Service health check status", + Units: "status", + Fam: "service health checks", + Ctx: "consul.service_health_check_status", + Priority: prioServiceHealthCheckStatus, + Dims: module.Dims{ + {ID: "health_check_%s_passing_status", Name: "passing"}, + {ID: "health_check_%s_critical_status", Name: "critical"}, + {ID: "health_check_%s_maintenance_status", Name: "maintenance"}, + {ID: "health_check_%s_warning_status", Name: "warning"}, + }, + } + nodeHealthCheckStatusChartTmpl = module.Chart{ + ID: "health_check_%s_status", + Title: "Node health check status", + Units: "status", + Fam: "node health checks", + Ctx: "consul.node_health_check_status", + Priority: prioNodeHealthCheckStatus, + Dims: module.Dims{ + {ID: "health_check_%s_passing_status", Name: "passing"}, + {ID: "health_check_%s_critical_status", Name: "critical"}, + {ID: "health_check_%s_maintenance_status", Name: "maintenance"}, + {ID: "health_check_%s_warning_status", Name: "warning"}, + }, + } +) + +func (c *Consul) addGlobalCharts() { + if !c.isTelemetryPrometheusEnabled() { + return + } + + var charts *module.Charts + + if !c.isServer() { + charts = clientCharts.Copy() + } else { + charts = serverCommonCharts.Copy() + + // can't really rely on checking if a response contains a metric due to retention of some metrics + // https://github.com/hashicorp/go-metrics/blob/b6d5c860c07ef6eeec89f4a662c7b452dd4d0c93/prometheus/prometheus.go#L75-L76 + if c.version != nil { + if c.version.LT(semver.Version{Major: 1, Minor: 13, Patch: 0}) { + _ = charts.Remove(raftThreadMainSaturationPercChart.ID) + _ = charts.Remove(raftThreadFSMSaturationPercChart.ID) + } + if c.version.LT(semver.Version{Major: 1, Minor: 11, Patch: 0}) { + _ = charts.Remove(kvsApplyTimeChart.ID) + _ = charts.Remove(kvsApplyOperationsRateChart.ID) + _ = charts.Remove(txnApplyTimeChart.ID) + _ = charts.Remove(txnApplyOperationsRateChart.ID) + _ = charts.Remove(raftBoltDBFreelistBytesChart.ID) + } + } + } + + if !c.hasLicense() { + _ = charts.Remove(licenseExpirationTimeChart.ID) + } + + for _, chart := range *charts { + chart.Labels = []module.Label{ + {Key: "datacenter", Value: c.cfg.Config.Datacenter}, + {Key: "node_name", Value: c.cfg.Config.NodeName}, + } + } + + if err := c.Charts().Add(*charts.Copy()...); err != nil { + c.Warning(err) + } +} + +func (c *Consul) addServerAutopilotHealthCharts() { + charts := serverAutopilotHealthCharts.Copy() + + for _, chart := range *charts { + chart.Labels = []module.Label{ + {Key: "datacenter", Value: c.cfg.Config.Datacenter}, + {Key: "node_name", Value: c.cfg.Config.NodeName}, + } + } + + if err := c.Charts().Add(*charts...); err != nil { + c.Warning(err) + } +} + +func newServiceHealthCheckChart(check *agentCheck) *module.Chart { + chart := serviceHealthCheckStatusChartTmpl.Copy() + chart.ID = fmt.Sprintf(chart.ID, check.CheckID) + chart.Labels = []module.Label{ + {Key: "node_name", Value: check.Node}, + {Key: "check_name", Value: check.Name}, + {Key: "service_name", Value: check.ServiceName}, + } + for _, d := range chart.Dims { + d.ID = fmt.Sprintf(d.ID, check.CheckID) + } + return chart +} + +func newNodeHealthCheckChart(check *agentCheck) *module.Chart { + chart := nodeHealthCheckStatusChartTmpl.Copy() + chart.ID = fmt.Sprintf(chart.ID, check.CheckID) + chart.Labels = []module.Label{ + {Key: "node_name", Value: check.Node}, + {Key: "check_name", Value: check.Name}, + } + for _, d := range chart.Dims { + d.ID = fmt.Sprintf(d.ID, check.CheckID) + } + return chart +} + +func (c *Consul) addHealthCheckCharts(check *agentCheck) { + var chart *module.Chart + + if check.ServiceName != "" { + chart = newServiceHealthCheckChart(check) + } else { + chart = newNodeHealthCheckChart(check) + } + + chart.Labels = append(chart.Labels, module.Label{ + Key: "datacenter", + Value: c.cfg.Config.Datacenter, + }) + + if err := c.Charts().Add(chart); err != nil { + c.Warning(err) + } +} + +func (c *Consul) removeHealthCheckCharts(checkID string) { + id := fmt.Sprintf("health_check_%s_status", checkID) + + chart := c.Charts().Get(id) + if chart == nil { + c.Warningf("failed to remove '%s' chart: the chart does not exist", id) + return + } + + chart.MarkRemove() + chart.MarkNotCreated() +} + +func (c *Consul) addLeaderCharts() { + charts := serverLeaderCharts.Copy() + + for _, chart := range *charts { + chart.Labels = []module.Label{ + {Key: "datacenter", Value: c.cfg.Config.Datacenter}, + {Key: "node_name", Value: c.cfg.Config.NodeName}, + } + } + + if err := c.Charts().Add(*charts...); err != nil { + c.Warning(err) + } +} + +func (c *Consul) removeLeaderCharts() { + s := make(map[string]bool) + for _, v := range serverLeaderCharts { + s[v.ID] = true + } + + for _, v := range *c.Charts() { + if s[v.ID] { + v.MarkRemove() + v.MarkNotCreated() + } + } +} + +func (c *Consul) addFollowerCharts() { + charts := serverFollowerCharts.Copy() + if c.isCloudManaged() { + // 'autopilot_server_lastContact_leader' comes from 'operator/autopilot/health' which is disabled + _ = charts.Remove(raftFollowerLastContactLeaderTimeChart.ID) + } + + for _, chart := range *charts { + chart.Labels = []module.Label{ + {Key: "datacenter", Value: c.cfg.Config.Datacenter}, + {Key: "node_name", Value: c.cfg.Config.NodeName}, + } + } + + if err := c.Charts().Add(*charts...); err != nil { + c.Warning(err) + } +} + +func (c *Consul) removeFollowerCharts() { + s := make(map[string]bool) + for _, v := range serverFollowerCharts { + s[v.ID] = true + } + + for _, v := range *c.Charts() { + if s[v.ID] { + v.MarkRemove() + v.MarkNotCreated() + } + } +} |