From 2aba52de8f9315b0e384e1c657d7b0401d26a1b0 Mon Sep 17 00:00:00 2001 From: Shaunak Kashyap Date: Mon, 17 Sep 2018 18:33:43 -0700 Subject: [PATCH] Implement xpack.monitoring.elasticsearch.collection.enabled setting (#33474) * Implement xpack.monitoring.elasticsearch.collection.enabled setting * Fixing line lengths * Updating constructor calls in test * Removing unused import * Fixing line lengths in test classes * Make monitoringService.isElasticsearchCollectionEnabled() return true for tests * Remove wrong expectation * Adding unit tests for new flag to be false * Fixing line wrapping/indentation for better readability * Adding docs * Fixing logic in ClusterStatsCollector::shouldCollect * Rebasing with master and resolving conflicts * Simplifying implementation by gating scheduling * Doc fixes / improvements * Making methods package private * Fixing wording * Fixing method access --- .../configuring-monitoring.asciidoc | 11 ++++-- .../monitoring/pause-export.asciidoc | 10 +++++ .../settings/monitoring-settings.asciidoc | 11 ++++++ .../xpack/monitoring/Monitoring.java | 1 + .../xpack/monitoring/MonitoringService.java | 38 +++++++++++++++++-- .../indices/IndexRecoveryCollectorTests.java | 2 +- 6 files changed, 64 insertions(+), 9 deletions(-) diff --git a/docs/reference/monitoring/configuring-monitoring.asciidoc b/docs/reference/monitoring/configuring-monitoring.asciidoc index 3bcfef2acbf..6708b791036 100644 --- a/docs/reference/monitoring/configuring-monitoring.asciidoc +++ b/docs/reference/monitoring/configuring-monitoring.asciidoc @@ -13,10 +13,13 @@ indices. You can also adjust how monitoring data is displayed. . To collect monitoring data about your {es} cluster: -.. Verify that the `xpack.monitoring.enabled` and -`xpack.monitoring.collection.enabled` settings are `true` on each node in the -cluster. By default, data collection is disabled. For more information, see -<>. +.. Verify that the `xpack.monitoring.enabled`, +`xpack.monitoring.collection.enabled`, and +`xpack.monitoring.elasticsearch.collection.enabled` settings are `true` on each +node in the cluster. By default xpack.monitoring.collection.enabled is disabled +(`false`), and that overrides xpack.monitoring.elasticsearch.collection.enabled, +which defaults to being enabled (`true`). Both settings can be set dynamically +at runtime. For more information, see <>. .. Optional: Specify which indices you want to monitor. + diff --git a/docs/reference/monitoring/pause-export.asciidoc b/docs/reference/monitoring/pause-export.asciidoc index 128e72a463c..7a8bc664ffc 100644 --- a/docs/reference/monitoring/pause-export.asciidoc +++ b/docs/reference/monitoring/pause-export.asciidoc @@ -16,6 +16,16 @@ monitoring data from other sources such as {kib}, Beats, and Logstash is ignored You can update this setting by using the {ref}/cluster-update-settings.html[Cluster Update Settings API]. +If you want to collect data from sources such as {kib}, Beats, and Logstash but +not collect data about your {es} cluster, you can disable data collection +just for {es}: + +[source,yaml] +--------------------------------------------------- +xpack.monitoring.collection.enabled: true +xpack.monitoring.elasticsearch.collection.enabled: false +--------------------------------------------------- + If you want to separately disable a specific exporter, you can specify the `enabled` setting (which defaults to `true`) per exporter. For example: diff --git a/docs/reference/settings/monitoring-settings.asciidoc b/docs/reference/settings/monitoring-settings.asciidoc index 2759944e615..a039084412c 100644 --- a/docs/reference/settings/monitoring-settings.asciidoc +++ b/docs/reference/settings/monitoring-settings.asciidoc @@ -66,6 +66,17 @@ option in `kibana.yml` to the same value. You can update this setting through the <>. +`xpack.monitoring.elasticsearch.collection.enabled`:: + +Controls whether statistics about your {es} cluster should be collected. Defaults to `true`. +This is different from xpack.monitoring.collection.enabled, which allows you to enable or disable +all monitoring collection. However, this setting simply disables the collection of Elasticsearch +data while still allowing other data (e.g., Kibana, Logstash, Beats, or APM Server monitoring data) +to pass through this cluster. ++ +You can update this setting through the +<>. + `xpack.monitoring.collection.cluster.stats.timeout`:: Sets the timeout for collecting the cluster statistics. Defaults to `10s`. diff --git a/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/Monitoring.java b/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/Monitoring.java index bb2ed76831d..027cb7de937 100644 --- a/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/Monitoring.java +++ b/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/Monitoring.java @@ -174,6 +174,7 @@ public class Monitoring extends Plugin implements ActionPlugin { settings.add(MonitoringField.HISTORY_DURATION); settings.add(CLEAN_WATCHER_HISTORY); settings.add(MonitoringService.ENABLED); + settings.add(MonitoringService.ELASTICSEARCH_COLLECTION_ENABLED); settings.add(MonitoringService.INTERVAL); settings.add(Collector.INDICES); settings.add(ClusterStatsCollector.CLUSTER_STATS_TIMEOUT); diff --git a/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/MonitoringService.java b/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/MonitoringService.java index 07d24826f86..073a4cf785c 100644 --- a/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/MonitoringService.java +++ b/x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/MonitoringService.java @@ -43,8 +43,21 @@ public class MonitoringService extends AbstractLifecycleComponent { */ public static final TimeValue MIN_INTERVAL = TimeValue.timeValueSeconds(1L); + /* + * Dynamically controls enabling or disabling the collection of Monitoring data only from Elasticsearch. + *

+ * This should only be used while transitioning to Metricbeat-based data collection for Elasticsearch with + * {@linkplain #ENABLED} set to {@code true}. By setting this to {@code false} and that value to {@code true}, + * Kibana, Logstash, Beats, and APM Server can all continue to report their stats through this cluster until they + * are transitioned to being monitored by Metricbeat as well. + */ + public static final Setting ELASTICSEARCH_COLLECTION_ENABLED = + Setting.boolSetting("xpack.monitoring.elasticsearch.collection.enabled", true, + Setting.Property.Dynamic, Setting.Property.NodeScope); + /** - * Dynamically controls enabling or disabling the collection of Monitoring data. + * Dynamically controls enabling or disabling the collection of Monitoring data from Elasticsearch as well as other products + * in the stack. */ public static final Setting ENABLED = Setting.boolSetting("xpack.monitoring.collection.enabled", false, @@ -68,6 +81,7 @@ public class MonitoringService extends AbstractLifecycleComponent { private final Set collectors; private final Exporters exporters; + private volatile boolean elasticsearchCollectionEnabled; private volatile boolean enabled; private volatile TimeValue interval; private volatile ThreadPool.Cancellable scheduler; @@ -79,13 +93,21 @@ public class MonitoringService extends AbstractLifecycleComponent { this.threadPool = Objects.requireNonNull(threadPool); this.collectors = Objects.requireNonNull(collectors); this.exporters = Objects.requireNonNull(exporters); + this.elasticsearchCollectionEnabled = ELASTICSEARCH_COLLECTION_ENABLED.get(settings); this.enabled = ENABLED.get(settings); this.interval = INTERVAL.get(settings); + clusterService.getClusterSettings() + .addSettingsUpdateConsumer(ELASTICSEARCH_COLLECTION_ENABLED, this::setElasticsearchCollectionEnabled); clusterService.getClusterSettings().addSettingsUpdateConsumer(ENABLED, this::setMonitoringActive); clusterService.getClusterSettings().addSettingsUpdateConsumer(INTERVAL, this::setInterval); } + void setElasticsearchCollectionEnabled(final boolean enabled) { + this.elasticsearchCollectionEnabled = enabled; + scheduleExecution(); + } + void setMonitoringActive(final boolean enabled) { this.enabled = enabled; scheduleExecution(); @@ -104,6 +126,14 @@ public class MonitoringService extends AbstractLifecycleComponent { return isStarted() && enabled; } + boolean isElasticsearchCollectionEnabled() { + return this.elasticsearchCollectionEnabled; + } + + boolean shouldScheduleExecution() { + return isElasticsearchCollectionEnabled() && isMonitoringActive(); + } + private String threadPoolName() { return ThreadPool.Names.GENERIC; } @@ -155,7 +185,7 @@ public class MonitoringService extends AbstractLifecycleComponent { if (scheduler != null) { cancelExecution(); } - if (isMonitoringActive()) { + if (shouldScheduleExecution()) { scheduler = threadPool.scheduleWithFixedDelay(monitor, interval, threadPoolName()); } } @@ -188,7 +218,7 @@ public class MonitoringService extends AbstractLifecycleComponent { @Override public void doRun() { - if (isMonitoringActive() == false) { + if (shouldScheduleExecution() == false) { logger.debug("monitoring execution is skipped"); return; } @@ -223,7 +253,7 @@ public class MonitoringService extends AbstractLifecycleComponent { new ParameterizedMessage("monitoring collector [{}] failed to collect data", collector.name()), e); } } - if (isMonitoringActive()) { + if (shouldScheduleExecution()) { exporters.export(results, ActionListener.wrap(r -> semaphore.release(), this::onFailure)); } else { semaphore.release(); diff --git a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndexRecoveryCollectorTests.java b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndexRecoveryCollectorTests.java index 47504736d26..f4484aa5ed7 100644 --- a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndexRecoveryCollectorTests.java +++ b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/indices/IndexRecoveryCollectorTests.java @@ -182,4 +182,4 @@ public class IndexRecoveryCollectorTests extends BaseCollectorTestCase { assertThat(recoveries.shardRecoveryStates().size(), equalTo(nbRecoveries)); } } -} \ No newline at end of file +}