diff --git a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/ClusterMetricsRegistry.java b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/ClusterMetricsRegistry.java index fe778c1f4098..1ce08db4e362 100644 --- a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/ClusterMetricsRegistry.java +++ b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/ClusterMetricsRegistry.java @@ -48,5 +48,17 @@ public ClusterMetricsRegistry() { .help("The total number of nodes in this cluster") .labelNames("instance") .register(registry)); + + nameToGaugeMap.put("IS_PRIMARY_NODE", Gauge.build() + .name("cluster_is_primary_node") + .help("Whether this NiFi instance is the Primary Node. Values are 0 or 1") + .labelNames("instance") + .register(registry)); + + nameToGaugeMap.put("IS_CLUSTER_COORDINATOR", Gauge.build() + .name("cluster_is_cluster_coordinator") + .help("Whether this NiFi instance is the Cluster Coordinator. Values are 0 or 1") + .labelNames("instance") + .register(registry)); } } diff --git a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/PrometheusMetricsUtil.java b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/PrometheusMetricsUtil.java index c9eaa86a3f3a..d12b1deec882 100644 --- a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/PrometheusMetricsUtil.java +++ b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/prometheusutil/PrometheusMetricsUtil.java @@ -500,12 +500,15 @@ public static void createVersionInfoMetrics(final VersionInfoRegistry versionInf } public static CollectorRegistry createClusterMetrics(final ClusterMetricsRegistry clusterMetricsRegistry, final String instId, final boolean isClustered, final boolean isConnectedToCluster, - final String connectedNodes, final int connectedNodeCount, final int totalNodeCount) { + final String connectedNodes, final int connectedNodeCount, final int totalNodeCount, + final boolean isPrimaryNode, final boolean isClusterCoordinator) { final String instanceId = StringUtils.isEmpty(instId) ? DEFAULT_LABEL_STRING : instId; clusterMetricsRegistry.setDataPoint(isClustered ? 1 : 0, "IS_CLUSTERED", instanceId); clusterMetricsRegistry.setDataPoint(isConnectedToCluster ? 1 : 0, "IS_CONNECTED_TO_CLUSTER", instanceId); clusterMetricsRegistry.setDataPoint(connectedNodeCount, "CONNECTED_NODE_COUNT", instanceId, connectedNodes); clusterMetricsRegistry.setDataPoint(totalNodeCount, "TOTAL_NODE_COUNT", instanceId); + clusterMetricsRegistry.setDataPoint(isPrimaryNode ? 1 : 0, "IS_PRIMARY_NODE", instanceId); + clusterMetricsRegistry.setDataPoint(isClusterCoordinator ? 1 : 0, "IS_CLUSTER_COORDINATOR", instanceId); return clusterMetricsRegistry.getRegistry(); } diff --git a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java index 4b9e9b2fface..abf728134a5e 100644 --- a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java +++ b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java @@ -8171,7 +8171,8 @@ protected Collection populateFlowMetrics(FlowMetricsRep } final boolean isClustered = clusterCoordinator != null; final boolean isConnectedToCluster = isClustered() && clusterCoordinator.isConnected(); - PrometheusMetricsUtil.createClusterMetrics(clusterMetricsRegistry, instanceId, isClustered, isConnectedToCluster, connectedNodesLabel, connectedNodeCount, totalNodeCount); + PrometheusMetricsUtil.createClusterMetrics(clusterMetricsRegistry, instanceId, isClustered, isConnectedToCluster, connectedNodesLabel, connectedNodeCount, totalNodeCount, + controllerFacade.isPrimary(), controllerFacade.isClusterCoordinator()); Collection metricsRegistries = Arrays.asList( nifiMetricsRegistry, jvmMetricsRegistry, diff --git a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java index e9a2436aa615..d33b4156dfc3 100644 --- a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java +++ b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java @@ -494,6 +494,20 @@ public boolean isClustered() { return flowController.isClustered(); } + /** + * @return true if this node is the Primary Node + */ + public boolean isPrimary() { + return flowController.isPrimary(); + } + + /** + * @return true if this node is the Cluster Coordinator + */ + public boolean isClusterCoordinator() { + return flowController.isClusterCoordinator(); + } + /** * Gets the name of this controller. * diff --git a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestFlowResource.java b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestFlowResource.java index b377bd2998e1..c954f548d24b 100644 --- a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestFlowResource.java +++ b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestFlowResource.java @@ -276,13 +276,13 @@ public void testGetFlowMetricsPrometheusAsJson() throws IOException { assertTrue(metrics.containsKey(ROOT_FIELD_NAME)); final List registryList = metrics.get(ROOT_FIELD_NAME); - assertEquals(13, registryList.size()); + assertEquals(15, registryList.size()); final Map result = getResult(registryList); assertEquals(3L, result.get(SAMPLE_NAME_JVM)); assertEquals(4L, result.get(SAMPLE_LABEL_VALUES_PROCESS_GROUP)); assertEquals(2L, result.get(SAMPLE_LABEL_VALUES_ROOT_PROCESS_GROUP)); - assertEquals(4L, result.get(CLUSTER_LABEL_KEY)); + assertEquals(6L, result.get(CLUSTER_LABEL_KEY)); } @Test @@ -836,6 +836,8 @@ private static CollectorRegistry getClusterMetricsRegistry() { clusterMetricsRegistry.setDataPoint(1, "IS_CONNECTED_TO_CLUSTER", "B1Id"); clusterMetricsRegistry.setDataPoint(2, "CONNECTED_NODE_COUNT", "B1Id", "2 / 3"); clusterMetricsRegistry.setDataPoint(3, "TOTAL_NODE_COUNT", "B1Id"); + clusterMetricsRegistry.setDataPoint(1, "IS_PRIMARY_NODE", "B1Id"); + clusterMetricsRegistry.setDataPoint(0, "IS_CLUSTER_COORDINATOR", "B1Id"); return clusterMetricsRegistry.getRegistry(); }