diff --git a/cmd/erasure-server-pool.go b/cmd/erasure-server-pool.go index 92095e1b2..929fcca63 100644 --- a/cmd/erasure-server-pool.go +++ b/cmd/erasure-server-pool.go @@ -2296,6 +2296,7 @@ type HealthResult struct { PoolID, SetID int HealthyDrives int HealingDrives int + ReadQuorum int WriteQuorum int } WriteQuorum int @@ -2373,8 +2374,10 @@ func (z *erasureServerPools) Health(ctx context.Context, opts HealthOptions) Hea } b := z.BackendInfo() + poolReadQuorums := make([]int, len(b.StandardSCData)) poolWriteQuorums := make([]int, len(b.StandardSCData)) for i, data := range b.StandardSCData { + poolReadQuorums[i] = data poolWriteQuorums[i] = data if data == b.StandardSCParity { poolWriteQuorums[i] = data + 1 @@ -2412,15 +2415,17 @@ func (z *erasureServerPools) Health(ctx context.Context, opts HealthOptions) Hea for poolIdx := range erasureSetUpCount { for setIdx := range erasureSetUpCount[poolIdx] { result.ESHealth = append(result.ESHealth, struct { - Maintenance bool - PoolID, SetID int - HealthyDrives, HealingDrives, WriteQuorum int + Maintenance bool + PoolID, SetID int + HealthyDrives, HealingDrives int + ReadQuorum, WriteQuorum int }{ Maintenance: opts.Maintenance, SetID: setIdx, PoolID: poolIdx, HealthyDrives: erasureSetUpCount[poolIdx][setIdx].online, HealingDrives: erasureSetUpCount[poolIdx][setIdx].healing, + ReadQuorum: poolReadQuorums[poolIdx], WriteQuorum: poolWriteQuorums[poolIdx], }) diff --git a/cmd/metrics-v2.go b/cmd/metrics-v2.go index 630c0c885..37c758685 100644 --- a/cmd/metrics-v2.go +++ b/cmd/metrics-v2.go @@ -3236,6 +3236,16 @@ func getClusterHealthStatusMD() MetricDescription { } } +func getClusterErasureSetReadQuorumMD() MetricDescription { + return MetricDescription{ + Namespace: clusterMetricNamespace, + Subsystem: "health", + Name: "erasure_set_read_quorum", + Help: "Get the read quorum for this erasure set", + Type: gaugeMetric, + } +} + func getClusterErasureSetWriteQuorumMD() MetricDescription { return MetricDescription{ Namespace: clusterMetricNamespace, @@ -3280,7 +3290,7 @@ func getClusterHealthMetrics() *MetricsGroup { opts := HealthOptions{} result := objLayer.Health(ctx, opts) - metrics = make([]Metric, 0, 2+3*len(result.ESHealth)) + metrics = make([]Metric, 0, 2+4*len(result.ESHealth)) metrics = append(metrics, Metric{ Description: getClusterWriteQuorumMD(), @@ -3302,6 +3312,11 @@ func getClusterHealthMetrics() *MetricsGroup { "pool": strconv.Itoa(h.PoolID), "set": strconv.Itoa(h.SetID), } + metrics = append(metrics, Metric{ + Description: getClusterErasureSetReadQuorumMD(), + VariableLabels: labels, + Value: float64(h.ReadQuorum), + }) metrics = append(metrics, Metric{ Description: getClusterErasureSetWriteQuorumMD(), VariableLabels: labels,