@Test public void class_is_serializable_without_causes() throws IOException, ClassNotFoundException { NodeHealth.Builder builder = newNodeHealthBuilder() .setStatus(randomStatus) .setDetails(testSupport.randomNodeDetails()); NodeHealth source = builder.build(); byte[] bytes = NodeDetailsTestSupport.serialize(source); NodeHealth underTest = (NodeHealth) new ObjectInputStream(new ByteArrayInputStream(bytes)).readObject(); assertThat(underTest).isEqualTo(source); }
@Test public void clearClauses_clears_clauses_of_builder() { NodeHealth.Builder underTest = testSupport.randomBuilder(); NodeHealth original = underTest .addCause(randomAlphanumeric(3)) .build(); underTest.clearCauses(); NodeHealth second = underTest.build(); assertThat(second.getStatus()).isEqualTo(original.getStatus()); assertThat(second.getDetails()).isEqualTo(original.getDetails()); assertThat(second.getCauses()).isEmpty(); }
public NodeHealth build() { requireNonNull(status, STATUS_CANT_BE_NULL); requireNonNull(details, DETAILS_CANT_BE_NULL); return new NodeHealth(this); } }
private String printStatusesAndTypes(@Nullable Set<NodeHealth> nodeHealths) { if (nodeHealths == null) { return "<null>"; } return nodeHealths.stream() // sort by type then status for debugging convenience .sorted(Comparator.<NodeHealth>comparingInt(s1 -> s1.getDetails().getType().ordinal()) .thenComparingInt(s -> s.getStatus().ordinal())) .map(s -> ImmutableList.of(s.getDetails().getType().name(), s.getStatus().name())) .map(String::valueOf) .collect(Collectors.joining(",")); }
private void writeNodeInfo(NodeInfo nodeInfo, ClusterHealth clusterHealth, JsonWriter json) { json.beginObject(); json.prop("Name", nodeInfo.getName()); json.prop("Error", nodeInfo.getErrorMessage().orElse(null)); json.prop("Host", nodeInfo.getHost().orElse(null)); json.prop("Started At", nodeInfo.getStartedAt().orElse(null)); clusterHealth.getNodeHealth(nodeInfo.getName()).ifPresent(h -> { json.prop("Health", h.getStatus().name()); json.name("Health Causes").beginArray().values(h.getCauses()).endArray(); }); writeSections(nodeInfo.getSections(), json); json.endObject(); }
public Optional<NodeHealth> getNodeHealth(String nodeName) { return nodes.stream() .filter(node -> nodeName.equals(node.getDetails().getName())) .findFirst(); }
default Stream<NodeHealth> withStatus(Set<NodeHealth> searchNodes, NodeHealth.Status... statuses) { return searchNodes.stream() .filter(t -> { for (NodeHealth.Status status : statuses) { if (status == t.getStatus()) { return true; } } return false; }); } }
@Test public void get_returns_status_RED_with_cause_if_elasticsearch_process_is_not_operational_in_ClusterAppState() { Properties properties = new Properties(); setRequiredPropertiesAndMocks(properties); when(clusterAppState.isOperational(ProcessId.ELASTICSEARCH, true)).thenReturn(false); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getStatus()).isEqualTo(NodeHealth.Status.RED); assertThat(nodeHealth.getCauses()).containsOnly("Elasticsearch is not operational"); }
@Override public Health check(Set<NodeHealth> nodeHealths) { Set<NodeHealth> appNodes = nodeHealths.stream() .filter(s -> s.getDetails().getType() == NodeDetails.Type.APPLICATION) .collect(toSet()); return Arrays.stream(AppNodeClusterHealthSubChecks.values()) .map(s -> s.check(appNodes)) .reduce(Health.GREEN, HealthReducer.INSTANCE); }
@Test public void get_returns_status_GREEN_if_elasticsearch_process_is_operational_in_ClusterAppState() { Properties properties = new Properties(); setRequiredPropertiesAndMocks(properties); when(clusterAppState.isOperational(ProcessId.ELASTICSEARCH, true)).thenReturn(true); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getStatus()).isEqualTo(NodeHealth.Status.GREEN); }
@Test public void verify_getters() { NodeDetails nodeDetails = testSupport.randomNodeDetails(); NodeHealth.Builder builder = builderUnderTest .setStatus(randomStatus) .setDetails(nodeDetails); String[] causes = IntStream.range(0, random.nextInt(10)).mapToObj(i -> randomAlphanumeric(4)).toArray(String[]::new); Arrays.stream(causes).forEach(builder::addCause); NodeHealth underTest = builder.build(); assertThat(underTest.getStatus()).isEqualTo(randomStatus); assertThat(underTest.getDetails()).isEqualTo(nodeDetails); assertThat(underTest.getCauses()).containsOnly(causes); }
NodeHealth.Builder randomBuilder(int minCauseCount) { NodeHealth.Builder builder = newNodeHealthBuilder() .setStatus(randomStatus()) .setDetails(randomNodeDetails()); IntStream.range(0, minCauseCount + random.nextInt(2)).mapToObj(i -> randomAlphanumeric(4)).forEach(builder::addCause); return builder; }
@Test public void get_returns_HEALTH_status_and_causes_from_HealthChecker_checkNode() { setRequiredPropertiesForConstructor(); setStartedAt(); when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(4)); Health.Status randomStatus = Health.Status.values()[random.nextInt(Health.Status.values().length)]; String[] expected = IntStream.range(0, random.nextInt(4)).mapToObj(s -> randomAlphabetic(55)).toArray(String[]::new); Health.Builder healthBuilder = Health.newHealthCheckBuilder() .setStatus(randomStatus); Arrays.stream(expected).forEach(healthBuilder::addCause); when(healthChecker.checkNode()).thenReturn(healthBuilder.build()); NodeHealthProviderImpl underTest = new NodeHealthProviderImpl(mapSettings.asConfig(), healthChecker, server, networkUtils); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getStatus().name()).isEqualTo(randomStatus.name()); assertThat(nodeHealth.getCauses()).containsOnly(expected); }
@Test public void get_returns_started_from_System2_now_at_constructor_time() { Properties properties = new Properties(); long now = setRequiredPropertiesAndMocks(properties); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getStartedAt()).isEqualTo(now); // change now when(clock.now()).thenReturn(now); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getStartedAt()).isEqualTo(now); }
default Stream<NodeHealth> withStatus(Set<NodeHealth> searchNodes, NodeHealth.Status... statuses) { return searchNodes.stream() .filter(t -> { for (NodeHealth.Status status : statuses) { if (status == t.getStatus()) { return true; } } return false; }); } }
private static System.Node toNode(NodeHealth nodeHealth, System.Node.Builder nodeBuilder, System.Cause.Builder causeBuilder) { nodeBuilder.clear(); nodeBuilder.setHealth(System.Health.valueOf(nodeHealth.getStatus().name())); nodeHealth.getCauses().forEach(str -> nodeBuilder.addCauses(toCause(str, causeBuilder))); NodeDetails details = nodeHealth.getDetails(); nodeBuilder .setType(System.NodeType.valueOf(details.getType().name())) .setName(details.getName()) .setHost(details.getHost()) .setPort(details.getPort()) .setStartedAt(formatDateTime(details.getStartedAt())); return nodeBuilder.build(); }
@Override public NodeHealth get() { NodeHealth.Builder builder = NodeHealth.newNodeHealthBuilder(); if (clusterAppState.isOperational(ProcessId.ELASTICSEARCH, true)) { builder.setStatus(NodeHealth.Status.GREEN); } else { builder.setStatus(NodeHealth.Status.RED) .addCause("Elasticsearch is not operational"); } return builder .setDetails(nodeDetails) .build(); }
private void writeNodeInfo(NodeInfo nodeInfo, ClusterHealth clusterHealth, JsonWriter json) { json.beginObject(); json.prop("Name", nodeInfo.getName()); json.prop("Error", nodeInfo.getErrorMessage().orElse(null)); json.prop("Host", nodeInfo.getHost().orElse(null)); json.prop("Started At", nodeInfo.getStartedAt().orElse(null)); clusterHealth.getNodeHealth(nodeInfo.getName()).ifPresent(h -> { json.prop("Health", h.getStatus().name()); json.name("Health Causes").beginArray().values(h.getCauses()).endArray(); }); writeSections(nodeInfo.getSections(), json); json.endObject(); }
private void getReturnsHostFromNetworkUtils(@Nullable String hostPropertyValue) { String host = randomAlphanumeric(34); Properties properties = new Properties(); properties.setProperty(CLUSTER_NODE_NAME.getKey(), randomAlphanumeric(3)); properties.setProperty(CLUSTER_NODE_HZ_PORT.getKey(), valueOf(1 + random.nextInt(4))); if (hostPropertyValue != null) { properties.setProperty(CLUSTER_NODE_HOST.getKey(), hostPropertyValue); } when(clock.now()).thenReturn(1L + random.nextInt(87)); when(networkUtils.getHostname()).thenReturn(host); SearchNodeHealthProvider underTest = new SearchNodeHealthProvider(new Props(properties), clusterAppState, networkUtils, clock); NodeHealth nodeHealth = underTest.get(); assertThat(nodeHealth.getDetails().getHost()).isEqualTo(host); // change now when(networkUtils.getHostname()).thenReturn(randomAlphanumeric(96)); NodeHealth newNodeHealth = underTest.get(); assertThat(newNodeHealth.getDetails().getHost()).isEqualTo(host); }