diff --git a/src/main/java/org/opensearch/ubi/UserBehaviorInsightsPlugin.java b/src/main/java/org/opensearch/ubi/UserBehaviorInsightsPlugin.java index 530ed9e..02dbb3d 100644 --- a/src/main/java/org/opensearch/ubi/UserBehaviorInsightsPlugin.java +++ b/src/main/java/org/opensearch/ubi/UserBehaviorInsightsPlugin.java @@ -15,7 +15,11 @@ import org.opensearch.cluster.metadata.IndexNameExpressionResolver; import org.opensearch.cluster.node.DiscoveryNodes; import org.opensearch.cluster.service.ClusterService; -import org.opensearch.common.settings.*; +import org.opensearch.common.settings.ClusterSettings; +import org.opensearch.common.settings.IndexScopedSettings; +import org.opensearch.common.settings.Setting; +import org.opensearch.common.settings.Settings; +import org.opensearch.common.settings.SettingsFilter; import org.opensearch.core.common.io.stream.NamedWriteableRegistry; import org.opensearch.core.xcontent.NamedXContentRegistry; import org.opensearch.env.Environment; @@ -38,7 +42,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -53,6 +59,8 @@ public class UserBehaviorInsightsPlugin extends Plugin implements ActionPlugin { private ActionFilter userBehaviorLoggingFilter; + public static final Map storeSettings = new HashMap<>(); + @Override public Collection getRestHeaders() { return List.of( diff --git a/src/main/java/org/opensearch/ubi/action/UserBehaviorInsightsActionFilter.java b/src/main/java/org/opensearch/ubi/action/UserBehaviorInsightsActionFilter.java index 0be29c6..6ba5ccc 100644 --- a/src/main/java/org/opensearch/ubi/action/UserBehaviorInsightsActionFilter.java +++ b/src/main/java/org/opensearch/ubi/action/UserBehaviorInsightsActionFilter.java @@ -25,13 +25,19 @@ import org.opensearch.search.SearchHit; import org.opensearch.tasks.Task; import org.opensearch.threadpool.ThreadPool; +import org.opensearch.ubi.UserBehaviorInsightsPlugin; import org.opensearch.ubi.model.HeaderConstants; import org.opensearch.ubi.model.QueryRequest; import org.opensearch.ubi.model.QueryResponse; import org.opensearch.ubi.model.SettingsConstants; import org.opensearch.ubi.utils.UbiUtils; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; /** * An implementation of {@link ActionFilter} that passively listens for OpenSearch @@ -91,13 +97,8 @@ public void onResponse(Response response) { // If there is no event store header, ignore this search. if(!"".equals(eventStore)) { - // Get the id_field to use for each result's unique identifier. - final String queriesIndexName = UbiUtils.getQueriesIndexName(eventStore); - final GetSettingsRequest getSettingsRequest = new GetSettingsRequest().indices(queriesIndexName); - - final GetSettingsResponse getSettingsResponse = client.admin().indices().getSettings(getSettingsRequest).actionGet(); - final String idField = getSettingsResponse.getSetting(queriesIndexName, SettingsConstants.ID_FIELD); - final String index = getSettingsResponse.getSetting(queriesIndexName, SettingsConstants.INDEX); + final String index = getStoreSettings(eventStore, SettingsConstants.INDEX); + final String idField = getStoreSettings(eventStore, SettingsConstants.ID_FIELD); LOGGER.info("Using id_field [{}] of index [{}] for UBI query.", idField, index); @@ -178,6 +179,36 @@ public void onFailure(Exception ex) { } + private String getStoreSettings(final String storeName, final String setting) { + + final String key = storeName + "." + setting; + final String value; + + if(UserBehaviorInsightsPlugin.storeSettings.containsKey(key)) { + + LOGGER.debug("Getting setting " + setting + " for store " + storeName + " from the cache."); + value = UserBehaviorInsightsPlugin.storeSettings.get(key); + + } else{ + + LOGGER.debug("Getting setting " + setting + " for store " + storeName + " from the index."); + + // Get the id_field to use for each result's unique identifier. + final String queriesIndexName = UbiUtils.getQueriesIndexName(storeName); + final GetSettingsRequest getSettingsRequest = new GetSettingsRequest().indices(queriesIndexName); + + final GetSettingsResponse getSettingsResponse = client.admin().indices().getSettings(getSettingsRequest).actionGet(); + final String settingResponse = getSettingsResponse.getSetting(queriesIndexName, setting); + + UserBehaviorInsightsPlugin.storeSettings.put(key, settingResponse); + value = settingResponse; + + } + + return value; + + } + private String getHeaderValue(final HeaderConstants header, final String defaultValue, final Task task) { final String value = task.getHeader(header.getHeader()); @@ -196,7 +227,7 @@ private String getHeaderValue(final HeaderConstants header, final String default * @param queryRequest The {@link QueryRequest} that initiated the query. * @param queryResponse The {@link QueryResponse} that resulted from the query. */ - public void persistQuery(final String storeName, final QueryRequest queryRequest, QueryResponse queryResponse) { + private void persistQuery(final String storeName, final QueryRequest queryRequest, QueryResponse queryResponse) { LOGGER.info("Writing query ID {} with response ID {}", queryRequest.getQueryId(), queryResponse.getQueryResponseId()); diff --git a/src/main/java/org/opensearch/ubi/rest/UserBehaviorInsightsRestHandler.java b/src/main/java/org/opensearch/ubi/rest/UserBehaviorInsightsRestHandler.java index a49871f..6886f1f 100644 --- a/src/main/java/org/opensearch/ubi/rest/UserBehaviorInsightsRestHandler.java +++ b/src/main/java/org/opensearch/ubi/rest/UserBehaviorInsightsRestHandler.java @@ -27,6 +27,7 @@ import org.opensearch.rest.BaseRestHandler; import org.opensearch.rest.BytesRestResponse; import org.opensearch.rest.RestRequest; +import org.opensearch.ubi.UserBehaviorInsightsPlugin; import org.opensearch.ubi.events.Event; import org.opensearch.ubi.events.OpenSearchEventManager; import org.opensearch.ubi.model.HeaderConstants; @@ -34,9 +35,18 @@ import org.opensearch.ubi.utils.UbiUtils; import java.io.IOException; -import java.util.*; - -import static org.opensearch.rest.RestRequest.Method.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +import static org.opensearch.rest.RestRequest.Method.DELETE; +import static org.opensearch.rest.RestRequest.Method.GET; +import static org.opensearch.rest.RestRequest.Method.POST; +import static org.opensearch.rest.RestRequest.Method.PUT; +import static org.opensearch.rest.RestRequest.Method.TRACE; /** * The REST handler for User Behavior Insights. The handler provides the @@ -220,6 +230,9 @@ private RestChannelConsumer delete(final NodeClient nodeClient, final String sto builder.startObject().field("status", "deleted"); builder.endObject(); + // Remove this store's settings from the settings map. + UserBehaviorInsightsPlugin.storeSettings.entrySet().removeIf(entry -> entry.getKey().startsWith(storeName + ".")); + return (channel) -> channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder)); }