From 51292592677363b43e1e7840f5a79aa2a51f7463 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Tue, 3 Oct 2017 12:25:25 +0200 Subject: [PATCH] SONAR-9802 add global section "Search State" to System Info of cluster --- .../monitoring/WebSystemInfoModule.java | 2 + .../cluster/EsClusterStateSection.java | 54 +++++++++++++++++++ .../cluster/EsClusterStateSectionTest.java | 50 +++++++++++++++++ .../sonarqube/tests/cluster/ClusterTest.java | 2 + 4 files changed, 108 insertions(+) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSection.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSectionTest.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/WebSystemInfoModule.java b/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/WebSystemInfoModule.java index a8eb7a8a5dc..fa3a32f3b67 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/WebSystemInfoModule.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/WebSystemInfoModule.java @@ -28,6 +28,7 @@ import org.sonar.server.platform.monitoring.cluster.GlobalSystemSection; import org.sonar.server.platform.monitoring.cluster.LoggingSection; import org.sonar.server.platform.monitoring.cluster.NodeSystemSection; import org.sonar.server.platform.monitoring.cluster.ProcessInfoProvider; +import org.sonar.server.platform.monitoring.cluster.EsClusterStateSection; import org.sonar.server.platform.monitoring.cluster.SearchNodesInfoLoaderImpl; import org.sonar.server.platform.ws.ClusterInfoAction; import org.sonar.server.platform.ws.InfoAction; @@ -65,6 +66,7 @@ public class WebSystemInfoModule { DbSection.class, DbConnectionSection.class, EsIndexesSection.class, + EsClusterStateSection.class, GlobalSystemSection.class, LoggingSection.class, NodeSystemSection.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSection.java b/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSection.java new file mode 100644 index 00000000000..d9bd445ce4f --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSection.java @@ -0,0 +1,54 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.platform.monitoring.cluster; + +import org.elasticsearch.action.admin.cluster.stats.ClusterStatsResponse; +import org.sonar.api.server.ServerSide; +import org.sonar.process.systeminfo.Global; +import org.sonar.process.systeminfo.SystemInfoSection; +import org.sonar.process.systeminfo.protobuf.ProtobufSystemInfo; +import org.sonar.server.es.EsClient; + +import static org.sonar.process.systeminfo.SystemInfoUtils.setAttribute; + +/** + * In cluster mode, section "Search" that displays all ES information + * that are not specific to a node or an index + */ +@ServerSide +public class EsClusterStateSection implements SystemInfoSection, Global { + + private final EsClient esClient; + + public EsClusterStateSection(EsClient esClient) { + this.esClient = esClient; + } + + @Override + public ProtobufSystemInfo.Section toProtobuf() { + ProtobufSystemInfo.Section.Builder protobuf = ProtobufSystemInfo.Section.newBuilder(); + protobuf.setName("Search State"); + ClusterStatsResponse stats = esClient.prepareClusterStats().get(); + setAttribute(protobuf, "State", stats.getStatus().name()); + setAttribute(protobuf, "Nodes", stats.getNodesStats().getCounts().getTotal()); + return protobuf.build(); + } + +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSectionTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSectionTest.java new file mode 100644 index 00000000000..06925996959 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/platform/monitoring/cluster/EsClusterStateSectionTest.java @@ -0,0 +1,50 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.platform.monitoring.cluster; + +import org.junit.Rule; +import org.junit.Test; +import org.sonar.api.config.internal.MapSettings; +import org.sonar.process.systeminfo.protobuf.ProtobufSystemInfo; +import org.sonar.server.es.EsTester; +import org.sonar.server.issue.index.IssueIndexDefinition; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.process.systeminfo.SystemInfoUtils.attribute; + +public class EsClusterStateSectionTest { + + @Rule + public EsTester esTester = new EsTester(new IssueIndexDefinition(new MapSettings().asConfig())); + + private EsClusterStateSection underTest = new EsClusterStateSection(esTester.client()); + + @Test + public void test_name() { + assertThat(underTest.toProtobuf().getName()).isEqualTo("Search State"); + } + + @Test + public void test_attributes() { + ProtobufSystemInfo.Section section = underTest.toProtobuf(); + assertThat(attribute(section, "Nodes").getLongValue()).isGreaterThan(0); + assertThat(attribute(section, "State").getStringValue()).isIn("RED", "YELLOW", "GREEN"); + } +} diff --git a/tests/src/test/java/org/sonarqube/tests/cluster/ClusterTest.java b/tests/src/test/java/org/sonarqube/tests/cluster/ClusterTest.java index c3fc01257d2..74d69832b42 100644 --- a/tests/src/test/java/org/sonarqube/tests/cluster/ClusterTest.java +++ b/tests/src/test/java/org/sonarqube/tests/cluster/ClusterTest.java @@ -144,6 +144,8 @@ public class ClusterTest { .shouldHaveMainSection() .shouldHaveSection("Database") .shouldHaveField("Database Version") + .shouldHaveSection("Search State") + .shouldHaveSection("Search Indexes") .shouldNotHaveSection("Settings") .shouldNotHaveSection("Plugins") .shouldHaveField("High Availability") -- 2.39.5