From 8481b4496f3c46f0ab977268a8a2b0ef649edec5 Mon Sep 17 00:00:00 2001 From: Tyler Ohlsen Date: Wed, 17 Jan 2024 23:48:07 +0000 Subject: [PATCH] Add missing index check Signed-off-by: Tyler Ohlsen --- .../agent/tools/SearchMonitorsTool.java | 79 ++++++++++++------- .../integTest/SearchMonitorsToolIT.java | 19 ----- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/opensearch/agent/tools/SearchMonitorsTool.java b/src/main/java/org/opensearch/agent/tools/SearchMonitorsTool.java index 162a3daf..8edcf22c 100644 --- a/src/main/java/org/opensearch/agent/tools/SearchMonitorsTool.java +++ b/src/main/java/org/opensearch/agent/tools/SearchMonitorsTool.java @@ -6,8 +6,11 @@ package org.opensearch.agent.tools; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.lucene.search.join.ScoreMode; @@ -105,22 +108,17 @@ public void run(Map parameters, ActionListener listener) if (monitorId != null) { GetMonitorRequest getMonitorRequest = new GetMonitorRequest(monitorId, 1L, RestRequest.Method.GET, null); ActionListener getMonitorListener = ActionListener.wrap(response -> { - StringBuilder sb = new StringBuilder(); Monitor monitor = response.getMonitor(); - if (monitor != null) { - sb.append("Monitors=["); - sb.append("{"); - sb.append("id=").append(monitor.getId()).append(","); - sb.append("name=").append(monitor.getName()); - sb.append("}]"); - sb.append("TotalMonitors=1"); + processGetMonitorHit(monitor, listener); + }, e -> { + // System index isn't initialized by default, so ignore such errors. Alerting plugin does not return the + // standard IndexNotFoundException so we parse the message instead + if (e.getMessage().contains("Configured indices are not found")) { + processGetMonitorHit(null, listener); } else { - sb.append("Monitors=[]TotalMonitors=0"); + log.error("Failed to get monitor.", e); + listener.onFailure(e); } - listener.onResponse((T) sb.toString()); - }, e -> { - log.error("Failed to search monitors.", e); - listener.onFailure(e); }); AlertingPluginInterface.INSTANCE.getMonitor((NodeClient) client, getMonitorRequest, getMonitorListener); } else { @@ -172,21 +170,19 @@ public void run(Map parameters, ActionListener listener) SearchMonitorRequest searchMonitorRequest = new SearchMonitorRequest(searchRequest); ActionListener searchMonitorListener = ActionListener.wrap(response -> { - StringBuilder sb = new StringBuilder(); - SearchHit[] hits = response.getHits().getHits(); - sb.append("Monitors=["); - for (SearchHit hit : hits) { - sb.append("{"); - sb.append("id=").append(hit.getId()).append(","); - sb.append("name=").append(hit.getSourceAsMap().get("name")); - sb.append("}"); - } - sb.append("]"); - sb.append("TotalMonitors=").append(response.getHits().getTotalHits().value); - listener.onResponse((T) sb.toString()); + List hits = Arrays.asList(response.getHits().getHits()); + Map hitsAsMap = hits.stream().collect(Collectors.toMap(SearchHit::getId, hit -> hit)); + processHits(hitsAsMap, listener); + }, e -> { - log.error("Failed to search monitors.", e); - listener.onFailure(e); + // System index isn't initialized by default, so ignore such errors. Alerting plugin does not return the + // standard IndexNotFoundException so we parse the message instead + if (e.getMessage().contains("Configured indices are not found")) { + processHits(Collections.emptyMap(), listener); + } else { + log.error("Failed to search monitors.", e); + listener.onFailure(e); + } }); AlertingPluginInterface.INSTANCE.searchMonitors((NodeClient) client, searchMonitorRequest, searchMonitorListener); } @@ -202,6 +198,35 @@ public String getType() { return TYPE; } + private void processHits(Map hitsAsMap, ActionListener listener) { + StringBuilder sb = new StringBuilder(); + sb.append("Monitors=["); + for (SearchHit hit : hitsAsMap.values()) { + sb.append("{"); + sb.append("id=").append(hit.getId()).append(","); + sb.append("name=").append(hit.getSourceAsMap().get("name")); + sb.append("}"); + } + sb.append("]"); + sb.append("TotalMonitors=").append(hitsAsMap.size()); + listener.onResponse((T) sb.toString()); + } + + private void processGetMonitorHit(Monitor monitor, ActionListener listener) { + StringBuilder sb = new StringBuilder(); + if (monitor != null) { + sb.append("Monitors=["); + sb.append("{"); + sb.append("id=").append(monitor.getId()).append(","); + sb.append("name=").append(monitor.getName()); + sb.append("}]"); + sb.append("TotalMonitors=1"); + } else { + sb.append("Monitors=[]TotalMonitors=0"); + } + listener.onResponse((T) sb.toString()); + } + /** * Factory for the {@link SearchMonitorsTool} */ diff --git a/src/test/java/org/opensearch/integTest/SearchMonitorsToolIT.java b/src/test/java/org/opensearch/integTest/SearchMonitorsToolIT.java index 6720dd35..72a5805e 100644 --- a/src/test/java/org/opensearch/integTest/SearchMonitorsToolIT.java +++ b/src/test/java/org/opensearch/integTest/SearchMonitorsToolIT.java @@ -55,25 +55,6 @@ public void testSearchMonitorsToolInFlowAgent_withNoSystemIndex() { assertEquals("Monitors=[]TotalMonitors=0", result); } - // @SneakyThrows - // public void testSearchAnomalyDetectorsToolInFlowAgent_noMatching() { - // String agentId = createAgent(registerAgentRequestBody); - // String agentInput = "{\"parameters\":{\"detectorName\": \"" + detectorName + "foo" + "\"}}"; - // String result = executeAgent(agentId, agentInput); - // assertEquals("AnomalyDetectors=[]TotalAnomalyDetectors=0", result); - // } - - // @SneakyThrows - // public void testSearchAnomalyDetectorsToolInFlowAgent_matching() { - // String agentId = createAgent(registerAgentRequestBody); - // String agentInput = "{\"parameters\":{\"detectorName\": \"" + detectorName + "\"}}"; - // String result = executeAgent(agentId, agentInput); - // assertEquals( - // String.format(Locale.ROOT, "AnomalyDetectors=[{id=%s,name=%s}]TotalAnomalyDetectors=%d", detectorId, detectorName, 1), - // result - // ); - // } - @SneakyThrows private void createMonitorsSystemIndex(String monitorId, String monitorName) { createIndexWithConfiguration(