From 8b2c6ba39dd987469a4ea13a2f1e634703b668c1 Mon Sep 17 00:00:00 2001 From: Brian Murphy Date: Thu, 13 Nov 2014 11:25:28 +0000 Subject: [PATCH] CORE : Add alerts stats. This commit adds the alerts stats actions. Original commit: elastic/x-pack-elasticsearch@c3c471de744df1db6ab8b80be4cbad7f98cec19f --- .../elasticsearch/alerts/AlertManager.java | 4 + .../elasticsearch/alerts/AlertingModule.java | 2 + .../alerts/actions/AlertAction.java | 15 ++-- .../alerts/actions/AlertActionManager.java | 4 + .../alerts/actions/AlertActionRegistry.java | 4 +- .../alerts/client/AlertsClient.java | 24 +++++- .../alerts/client/AlertsClientInterface.java | 37 ++++++++- .../actions/stats/AlertsStatsAction.java | 31 ++++++++ .../actions/stats/AlertsStatsRequest.java | 44 +++++++++++ .../stats/AlertsStatsRequestBuilder.java | 28 +++++++ .../actions/stats/AlertsStatsResponse.java | 78 +++++++++++++++++++ .../stats/TransportAlertStatsAction.java | 71 +++++++++++++++++ .../transport/actions/stats/package-info.java | 10 +++ 13 files changed, 337 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsAction.java create mode 100644 src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequest.java create mode 100644 src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequestBuilder.java create mode 100644 src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsResponse.java create mode 100644 src/main/java/org/elasticsearch/alerts/transport/actions/stats/TransportAlertStatsAction.java create mode 100644 src/main/java/org/elasticsearch/alerts/transport/actions/stats/package-info.java diff --git a/src/main/java/org/elasticsearch/alerts/AlertManager.java b/src/main/java/org/elasticsearch/alerts/AlertManager.java index ec66ec0e2af..510caa7211d 100644 --- a/src/main/java/org/elasticsearch/alerts/AlertManager.java +++ b/src/main/java/org/elasticsearch/alerts/AlertManager.java @@ -151,6 +151,10 @@ public class AlertManager extends AbstractComponent { } } + public long getNumberOfAlerts() { + return alertsStore.getAlerts().size(); + } + private final class AlertsClusterStateListener implements ClusterStateListener { @Override diff --git a/src/main/java/org/elasticsearch/alerts/AlertingModule.java b/src/main/java/org/elasticsearch/alerts/AlertingModule.java index c481c5d3bda..41cc161a842 100644 --- a/src/main/java/org/elasticsearch/alerts/AlertingModule.java +++ b/src/main/java/org/elasticsearch/alerts/AlertingModule.java @@ -9,6 +9,7 @@ package org.elasticsearch.alerts; import org.elasticsearch.alerts.actions.AlertActionManager; import org.elasticsearch.alerts.actions.AlertActionRegistry; import org.elasticsearch.alerts.client.AlertsClient; +import org.elasticsearch.alerts.rest.RestAlertsStatsAction; import org.elasticsearch.alerts.rest.RestDeleteAlertAction; import org.elasticsearch.alerts.rest.RestIndexAlertAction; import org.elasticsearch.alerts.scheduler.AlertScheduler; @@ -29,6 +30,7 @@ public class AlertingModule extends AbstractModule { bind(AlertActionRegistry.class).asEagerSingleton(); bind(RestIndexAlertAction.class).asEagerSingleton(); bind(RestDeleteAlertAction.class).asEagerSingleton(); + bind(RestAlertsStatsAction.class).asEagerSingleton(); //bind(AlertsClientInterface.class).to(AlertsClient.class).asEagerSingleton(); bind(AlertsClient.class).asEagerSingleton(); } diff --git a/src/main/java/org/elasticsearch/alerts/actions/AlertAction.java b/src/main/java/org/elasticsearch/alerts/actions/AlertAction.java index 201cc0f8ea0..a20c79ed16d 100644 --- a/src/main/java/org/elasticsearch/alerts/actions/AlertAction.java +++ b/src/main/java/org/elasticsearch/alerts/actions/AlertAction.java @@ -5,17 +5,18 @@ */ package org.elasticsearch.alerts.actions; -import org.elasticsearch.alerts.Alert; -import org.elasticsearch.alerts.triggers.TriggerResult; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.ToXContent; -import org.elasticsearch.common.xcontent.XContentBuilder; - -import java.io.IOException; +/** + * Classes that implement this interface should be a POJO + * containing the data needed to do this action + */ public interface AlertAction extends ToXContent { + /** + * + * @return + */ public String getActionName(); } diff --git a/src/main/java/org/elasticsearch/alerts/actions/AlertActionManager.java b/src/main/java/org/elasticsearch/alerts/actions/AlertActionManager.java index 6cfa0acb8f1..018268b50b6 100644 --- a/src/main/java/org/elasticsearch/alerts/actions/AlertActionManager.java +++ b/src/main/java/org/elasticsearch/alerts/actions/AlertActionManager.java @@ -268,6 +268,10 @@ public class AlertActionManager extends AbstractComponent { entry.setVersion(response.getVersion()); } + public long getQueueSize() { + return actionsToBeProcessed.size(); + } + private class AlertHistoryRunnable implements Runnable { private final AlertActionEntry entry; diff --git a/src/main/java/org/elasticsearch/alerts/actions/AlertActionRegistry.java b/src/main/java/org/elasticsearch/alerts/actions/AlertActionRegistry.java index 1a063d2b84c..a73e476adda 100644 --- a/src/main/java/org/elasticsearch/alerts/actions/AlertActionRegistry.java +++ b/src/main/java/org/elasticsearch/alerts/actions/AlertActionRegistry.java @@ -12,8 +12,6 @@ import org.elasticsearch.client.Client; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentParser; @@ -23,7 +21,7 @@ import java.util.List; public class AlertActionRegistry extends AbstractComponent { - private static volatile ImmutableOpenMap actionImplemented; + private volatile ImmutableOpenMap actionImplemented; @Inject public AlertActionRegistry(Settings settings, Client client) { diff --git a/src/main/java/org/elasticsearch/alerts/client/AlertsClient.java b/src/main/java/org/elasticsearch/alerts/client/AlertsClient.java index d0774a0d694..f719a0fcecf 100644 --- a/src/main/java/org/elasticsearch/alerts/client/AlertsClient.java +++ b/src/main/java/org/elasticsearch/alerts/client/AlertsClient.java @@ -9,9 +9,11 @@ import org.elasticsearch.action.*; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.TransportAction; import org.elasticsearch.alerts.AlertManager; +import org.elasticsearch.alerts.actions.AlertActionManager; import org.elasticsearch.alerts.transport.actions.index.*; import org.elasticsearch.alerts.transport.actions.delete.*; import org.elasticsearch.alerts.transport.actions.get.*; +import org.elasticsearch.alerts.transport.actions.stats.*; import org.elasticsearch.client.Client; import org.elasticsearch.client.support.Headers; import org.elasticsearch.cluster.ClusterService; @@ -35,7 +37,7 @@ public class AlertsClient implements AlertsClientInterface { Headers headers, ActionFilters filters, TransportService transportService, ClusterService clusterService, AlertManager alertManager, - Client client) { + Client client, AlertActionManager alertActionManager) { this.headers = headers; internalActions = new HashMap<>(); this.threadPool = threadPool; @@ -49,6 +51,11 @@ public class AlertsClient implements AlertsClientInterface { internalActions.put(DeleteAlertAction.INSTANCE, new TransportDeleteAlertAction(settings, DeleteAlertAction.NAME, transportService, clusterService, threadPool, filters, alertManager)); + internalActions.put(AlertsStatsAction.INSTANCE, new TransportAlertStatsAction(settings, + AlertsStatsAction.NAME, transportService, clusterService, threadPool, filters, alertManager, + alertActionManager)); + + } @Override @@ -110,6 +117,21 @@ public class AlertsClient implements AlertsClientInterface { return execute(IndexAlertAction.INSTANCE, request); } + @Override + public ActionFuture alertsStats(AlertsStatsRequest request) { + return execute(AlertsStatsAction.INSTANCE, request); + } + + @Override + public AlertsStatsRequestBuilder prepareAlertsStats() { + return new AlertsStatsRequestBuilder(this); + } + + @Override + public void alertsStats(AlertsStatsRequest request, ActionListener listener) { + execute(AlertsStatsAction.INSTANCE, request, listener); + } + @SuppressWarnings("unchecked") @Override public > ActionFuture execute(Action action, Request request) { diff --git a/src/main/java/org/elasticsearch/alerts/client/AlertsClientInterface.java b/src/main/java/org/elasticsearch/alerts/client/AlertsClientInterface.java index 63be219434c..5603b1b3b0a 100644 --- a/src/main/java/org/elasticsearch/alerts/client/AlertsClientInterface.java +++ b/src/main/java/org/elasticsearch/alerts/client/AlertsClientInterface.java @@ -5,16 +5,20 @@ */ package org.elasticsearch.alerts.client; -import org.elasticsearch.action.*; -import org.elasticsearch.alerts.transport.actions.index.IndexAlertRequest; -import org.elasticsearch.alerts.transport.actions.index.IndexAlertRequestBuilder; -import org.elasticsearch.alerts.transport.actions.index.IndexAlertResponse; +import org.elasticsearch.action.ActionFuture; +import org.elasticsearch.action.ActionListener; import org.elasticsearch.alerts.transport.actions.delete.DeleteAlertRequest; import org.elasticsearch.alerts.transport.actions.delete.DeleteAlertRequestBuilder; import org.elasticsearch.alerts.transport.actions.delete.DeleteAlertResponse; import org.elasticsearch.alerts.transport.actions.get.GetAlertRequest; import org.elasticsearch.alerts.transport.actions.get.GetAlertRequestBuilder; import org.elasticsearch.alerts.transport.actions.get.GetAlertResponse; +import org.elasticsearch.alerts.transport.actions.index.IndexAlertRequest; +import org.elasticsearch.alerts.transport.actions.index.IndexAlertRequestBuilder; +import org.elasticsearch.alerts.transport.actions.index.IndexAlertResponse; +import org.elasticsearch.alerts.transport.actions.stats.AlertsStatsRequest; +import org.elasticsearch.alerts.transport.actions.stats.AlertsStatsRequestBuilder; +import org.elasticsearch.alerts.transport.actions.stats.AlertsStatsResponse; import org.elasticsearch.client.ElasticsearchClient; /** @@ -114,4 +118,29 @@ public interface AlertsClientInterface extends ElasticsearchClient indexAlert(IndexAlertRequest request); + + /** + * Gets the alert stats + * + * @param request The request for the alert stats + * @return The response containing the StatsResponse for this action + */ + ActionFuture alertsStats(AlertsStatsRequest request); + + /** + * Creates a request builder to build a request to get the alerts stats + * + * @return The builder get the alerts stats + */ + AlertsStatsRequestBuilder prepareAlertsStats(); + + /** + * Gets the alert stats + * + * @param request The request for the alert stats + * @param listener The listener for the response containing the AlertsStatsResponse + */ + public void alertsStats(AlertsStatsRequest request, ActionListener listener); + + } diff --git a/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsAction.java b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsAction.java new file mode 100644 index 00000000000..4b32e45c155 --- /dev/null +++ b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsAction.java @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.alerts.transport.actions.stats; + +import org.elasticsearch.alerts.client.AlertsClientAction; +import org.elasticsearch.alerts.client.AlertsClientInterface; + +/** + */ +public class AlertsStatsAction extends AlertsClientAction { + + public static final AlertsStatsAction INSTANCE = new AlertsStatsAction(); + public static final String NAME = "cluster/alerts/stats"; + + private AlertsStatsAction() { + super(NAME); + } + + @Override + public AlertsStatsResponse newResponse() { + return new AlertsStatsResponse(); + } + + @Override + public AlertsStatsRequestBuilder newRequestBuilder(AlertsClientInterface client) { + return new AlertsStatsRequestBuilder(client); + } +} diff --git a/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequest.java b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequest.java new file mode 100644 index 00000000000..e6f617a577e --- /dev/null +++ b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequest.java @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.alerts.transport.actions.stats; + +import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.action.support.master.MasterNodeOperationRequest; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; + +import java.io.IOException; + +/** + */ +public class AlertsStatsRequest extends MasterNodeOperationRequest { + + + public AlertsStatsRequest() { + } + + + + @Override + public ActionRequestValidationException validate() { + return null; + } + + @Override + public void readFrom(StreamInput in) throws IOException { + super.readFrom(in); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + } + + @Override + public String toString() { + return "alertStats"; + } +} diff --git a/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequestBuilder.java b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequestBuilder.java new file mode 100644 index 00000000000..2dc3f7bfbad --- /dev/null +++ b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsRequestBuilder.java @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.alerts.transport.actions.stats; + +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.support.master.MasterNodeOperationRequestBuilder; +import org.elasticsearch.alerts.client.AlertsClientInterface; + +/** + * An alert stats document action request builder. + */ +public class AlertsStatsRequestBuilder + extends MasterNodeOperationRequestBuilder { + + public AlertsStatsRequestBuilder(AlertsClientInterface client) { + super(client, new AlertsStatsRequest()); + } + + + @Override + protected void doExecute(final ActionListener listener) { + client.alertsStats(request, listener); + } + +} diff --git a/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsResponse.java b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsResponse.java new file mode 100644 index 00000000000..c63b18f02d5 --- /dev/null +++ b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/AlertsStatsResponse.java @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.alerts.transport.actions.stats; + +import org.elasticsearch.action.ActionResponse; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; + +import java.io.IOException; + +/** + */ +public class AlertsStatsResponse extends ActionResponse { + + private long numberOfRegisteredAlerts; + private boolean alertManagerStarted; + private boolean alertActionManagerStarted; + private long alertActionManagerQueueSize; + + public AlertsStatsResponse() { + } + + + + public long getAlertActionManagerQueueSize() { + return alertActionManagerQueueSize; + } + + public void setAlertActionManagerQueueSize(long alertActionManagerQueueSize) { + this.alertActionManagerQueueSize = alertActionManagerQueueSize; + } + + public long getNumberOfRegisteredAlerts() { + return numberOfRegisteredAlerts; + } + + public void setNumberOfRegisteredAlerts(long numberOfRegisteredAlerts) { + this.numberOfRegisteredAlerts = numberOfRegisteredAlerts; + } + + public boolean isAlertManagerStarted() { + return alertManagerStarted; + } + + public void setAlertManagerStarted(boolean alertManagerStarted) { + this.alertManagerStarted = alertManagerStarted; + } + + public boolean isAlertActionManagerStarted() { + return alertActionManagerStarted; + } + + public void setAlertActionManagerStarted(boolean alertActionManagerStarted) { + this.alertActionManagerStarted = alertActionManagerStarted; + } + + + @Override + public void readFrom(StreamInput in) throws IOException { + super.readFrom(in); + numberOfRegisteredAlerts = in.readLong(); + alertActionManagerQueueSize = in.readLong(); + alertManagerStarted = in.readBoolean(); + alertActionManagerStarted = in.readBoolean(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeLong(numberOfRegisteredAlerts); + out.writeLong(alertActionManagerQueueSize); + out.writeBoolean(alertManagerStarted); + out.writeBoolean(alertActionManagerStarted); + } +} diff --git a/src/main/java/org/elasticsearch/alerts/transport/actions/stats/TransportAlertStatsAction.java b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/TransportAlertStatsAction.java new file mode 100644 index 00000000000..6efc93dfe70 --- /dev/null +++ b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/TransportAlertStatsAction.java @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.alerts.transport.actions.stats; + +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.support.ActionFilters; +import org.elasticsearch.action.support.master.TransportMasterNodeOperationAction; +import org.elasticsearch.alerts.AlertManager; +import org.elasticsearch.alerts.AlertsStore; +import org.elasticsearch.alerts.actions.AlertActionManager; +import org.elasticsearch.cluster.ClusterService; +import org.elasticsearch.cluster.ClusterState; +import org.elasticsearch.cluster.block.ClusterBlockException; +import org.elasticsearch.cluster.block.ClusterBlockLevel; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.transport.TransportService; + +/** + * Performs the delete operation. + */ +public class TransportAlertStatsAction extends TransportMasterNodeOperationAction { + + private final AlertManager alertManager; + private final AlertActionManager alertActionManager; + + @Inject + public TransportAlertStatsAction(Settings settings, String actionName, TransportService transportService, + ClusterService clusterService, ThreadPool threadPool, ActionFilters actionFilters, + AlertManager alertManager, AlertActionManager alertActionManager) { + super(settings, actionName, transportService, clusterService, threadPool, actionFilters); + this.alertManager = alertManager; + this.alertActionManager = alertActionManager; + } + + @Override + protected String executor() { + return ThreadPool.Names.MANAGEMENT; + } + + @Override + protected AlertsStatsRequest newRequest() { + return new AlertsStatsRequest(); + } + + @Override + protected AlertsStatsResponse newResponse() { + return new AlertsStatsResponse(); + } + + @Override + protected void masterOperation(AlertsStatsRequest request, ClusterState state, ActionListener listener) throws ElasticsearchException { + AlertsStatsResponse statsResponse = new AlertsStatsResponse(); + statsResponse.setAlertManagerStarted(alertManager.isStarted()); + statsResponse.setAlertActionManagerStarted(alertActionManager.started()); + statsResponse.setAlertActionManagerQueueSize(alertActionManager.getQueueSize()); + statsResponse.setNumberOfRegisteredAlerts(alertManager.getNumberOfAlerts()); + } + + @Override + protected ClusterBlockException checkBlock(AlertsStatsRequest request, ClusterState state) { + return state.blocks().indicesBlockedException(ClusterBlockLevel.WRITE, new String[]{AlertsStore.ALERT_INDEX, AlertActionManager.ALERT_HISTORY_INDEX}); + } + + +} diff --git a/src/main/java/org/elasticsearch/alerts/transport/actions/stats/package-info.java b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/package-info.java new file mode 100644 index 00000000000..99d622fd8b8 --- /dev/null +++ b/src/main/java/org/elasticsearch/alerts/transport/actions/stats/package-info.java @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/** + * Delete action. + */ +package org.elasticsearch.alerts.transport.actions.stats; \ No newline at end of file