You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by sh...@apache.org on 2023/04/13 04:56:07 UTC

[kafka] branch trunk updated: KAFKA-14883: Expose `observer` state in KRaft metrics (#13525)

This is an automated email from the ASF dual-hosted git repository.

showuon pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 571841fed3e KAFKA-14883: Expose `observer` state in KRaft metrics (#13525)
571841fed3e is described below

commit 571841fed3eed7cb3e76a8fec4477750b7533060
Author: Paolo Patierno <pp...@live.com>
AuthorDate: Thu Apr 13 06:55:57 2023 +0200

    KAFKA-14883: Expose `observer` state in KRaft metrics (#13525)
    
    Currently, the current-state KRaft related metric reports follower state for a broker while technically it should be reported as an observer as the kafka-metadata-quorum tool does.
    
    Reviewers: Luke Chen <sh...@gmail.com>, dengziming <de...@gmail.com>
---
 docs/ops.html                                                    | 2 +-
 .../java/org/apache/kafka/raft/internals/KafkaRaftMetrics.java   | 9 +++++++--
 .../org/apache/kafka/raft/internals/KafkaRaftMetricsTest.java    | 2 +-
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/docs/ops.html b/docs/ops.html
index 8adeeca75cd..fae7a035d11 100644
--- a/docs/ops.html
+++ b/docs/ops.html
@@ -1834,7 +1834,7 @@ These metrics are reported on both Controllers and Brokers in a KRaft Cluster
   </tr>
   <tr>
     <td>Current State</td>
-    <td>The current state of this member; possible values are leader, candidate, voted, follower, unattached.</td>
+    <td>The current state of this member; possible values are leader, candidate, voted, follower, unattached, observer.</td>
     <td>kafka.server:type=raft-metrics,name=current-state</td>
   </tr>
   <tr>
diff --git a/raft/src/main/java/org/apache/kafka/raft/internals/KafkaRaftMetrics.java b/raft/src/main/java/org/apache/kafka/raft/internals/KafkaRaftMetrics.java
index 6fb2ce1c8b7..1ed2a4f1b87 100644
--- a/raft/src/main/java/org/apache/kafka/raft/internals/KafkaRaftMetrics.java
+++ b/raft/src/main/java/org/apache/kafka/raft/internals/KafkaRaftMetrics.java
@@ -63,7 +63,7 @@ public class KafkaRaftMetrics implements AutoCloseable {
         this.numUnknownVoterConnections = 0;
         this.logEndOffset = new OffsetAndEpoch(0L, 0);
 
-        this.currentStateMetricName = metrics.metricName("current-state", metricGroupName, "The current state of this member; possible values are leader, candidate, voted, follower, unattached");
+        this.currentStateMetricName = metrics.metricName("current-state", metricGroupName, "The current state of this member; possible values are leader, candidate, voted, follower, unattached, observer");
         Gauge<String> stateProvider = (mConfig, currentTimeMs) -> {
             if (state.isLeader()) {
                 return "leader";
@@ -72,7 +72,12 @@ public class KafkaRaftMetrics implements AutoCloseable {
             } else if (state.isVoted()) {
                 return "voted";
             } else if (state.isFollower()) {
-                return "follower";
+                // a broker is special kind of follower, as not being a voter, it's an observer
+                if (state.isObserver()) {
+                    return "observer";
+                } else {
+                    return "follower";
+                }
             } else {
                 return "unattached";
             }
diff --git a/raft/src/test/java/org/apache/kafka/raft/internals/KafkaRaftMetricsTest.java b/raft/src/test/java/org/apache/kafka/raft/internals/KafkaRaftMetricsTest.java
index 54bdb25287c..7d1c22f596c 100644
--- a/raft/src/test/java/org/apache/kafka/raft/internals/KafkaRaftMetricsTest.java
+++ b/raft/src/test/java/org/apache/kafka/raft/internals/KafkaRaftMetricsTest.java
@@ -144,7 +144,7 @@ public class KafkaRaftMetricsTest {
         assertEquals((double) -1L, getMetric(metrics, "high-watermark").metricValue());
 
         state.transitionToFollower(2, 1);
-        assertEquals("follower", getMetric(metrics, "current-state").metricValue());
+        assertEquals("observer", getMetric(metrics, "current-state").metricValue());
         assertEquals((double) 1, getMetric(metrics, "current-leader").metricValue());
         assertEquals((double) -1, getMetric(metrics, "current-vote").metricValue());
         assertEquals((double) 2, getMetric(metrics, "current-epoch").metricValue());