|
@@ -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.
|
|
|
+ * <p>
|
|
|
+ * 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<Boolean> 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<Boolean> ENABLED =
|
|
|
Setting.boolSetting("xpack.monitoring.collection.enabled", false,
|
|
@@ -68,6 +81,7 @@ public class MonitoringService extends AbstractLifecycleComponent {
|
|
|
private final Set<Collector> 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();
|