[7.x] Slow log must use separate underlying logger for each index BACKPORT(#47234) (#48176)

* Slow log must use separate underlying logger for each index (#47234)

SlowLog instances should not share the same underlying logger, as it would cause different indexes override each other levels. When creating underlying logger, unique per index identifier should be used. Name + IndexSettings.UUID

Closes #42432
This commit is contained in:
Przemyslaw Gomulka 2019-10-17 20:04:57 +02:00 committed by GitHub
parent 04e3316408
commit 02d18f5c1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 11 deletions

View File

@ -56,8 +56,6 @@ public final class IndexingSlowLog implements IndexingOperationListener {
*/
private int maxSourceCharsToLog;
private SlowLogLevel level;
private final Logger indexLogger;
private static final String INDEX_INDEXING_SLOWLOG_PREFIX = "index.indexing.slowlog";
@ -94,7 +92,7 @@ public final class IndexingSlowLog implements IndexingOperationListener {
}, Property.Dynamic, Property.IndexScope);
IndexingSlowLog(IndexSettings indexSettings) {
this.indexLogger = LogManager.getLogger(INDEX_INDEXING_SLOWLOG_PREFIX + ".index");
this.indexLogger = LogManager.getLogger(INDEX_INDEXING_SLOWLOG_PREFIX + ".index." + indexSettings.getUUID());
this.index = indexSettings.getIndex();
indexSettings.getScopedSettings().addSettingsUpdateConsumer(INDEX_INDEXING_SLOWLOG_REFORMAT_SETTING, this::setReformat);
@ -123,7 +121,6 @@ public final class IndexingSlowLog implements IndexingOperationListener {
}
private void setLevel(SlowLogLevel level) {
this.level = level;
Loggers.setLevel(this.indexLogger, level.name());
}
@ -261,7 +258,7 @@ public final class IndexingSlowLog implements IndexingOperationListener {
}
SlowLogLevel getLevel() {
return level;
return SlowLogLevel.parse(indexLogger.getLevel().name());
}
}

View File

@ -50,8 +50,6 @@ public final class SearchSlowLog implements SearchOperationListener {
private long fetchDebugThreshold;
private long fetchTraceThreshold;
private SlowLogLevel level;
private final Logger queryLogger;
private final Logger fetchLogger;
@ -88,8 +86,8 @@ public final class SearchSlowLog implements SearchOperationListener {
public SearchSlowLog(IndexSettings indexSettings) {
this.queryLogger = LogManager.getLogger(INDEX_SEARCH_SLOWLOG_PREFIX + ".query");
this.fetchLogger = LogManager.getLogger(INDEX_SEARCH_SLOWLOG_PREFIX + ".fetch");
this.queryLogger = LogManager.getLogger(INDEX_SEARCH_SLOWLOG_PREFIX + ".query." + indexSettings.getUUID());
this.fetchLogger = LogManager.getLogger(INDEX_SEARCH_SLOWLOG_PREFIX + ".fetch." + indexSettings.getUUID());
indexSettings.getScopedSettings().addSettingsUpdateConsumer(INDEX_SEARCH_SLOWLOG_THRESHOLD_QUERY_WARN_SETTING,
this::setQueryWarnThreshold);
@ -122,7 +120,6 @@ public final class SearchSlowLog implements SearchOperationListener {
}
private void setLevel(SlowLogLevel level) {
this.level = level;
Loggers.setLevel(queryLogger, level.name());
Loggers.setLevel(fetchLogger, level.name());
}
@ -297,6 +294,7 @@ public final class SearchSlowLog implements SearchOperationListener {
}
SlowLogLevel getLevel() {
return level;
assert queryLogger.getLevel().equals(fetchLogger.getLevel());
return SlowLogLevel.parse(queryLogger.getLevel().name());
}
}

View File

@ -23,6 +23,7 @@ import com.fasterxml.jackson.core.JsonParseException;
import org.apache.lucene.document.NumericDocValuesField;
import org.elasticsearch.Version;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.UUIDs;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.settings.Settings;
@ -199,6 +200,25 @@ public class IndexingSlowLogTests extends ESTestCase {
assertThat(cause, hasToString(containsString("No enum constant org.elasticsearch.index.SlowLogLevel.NOT A LEVEL")));
}
assertEquals(SlowLogLevel.TRACE, log.getLevel());
metaData = newIndexMeta("index", Settings.builder()
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
.put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())
.put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_LEVEL_SETTING.getKey(), SlowLogLevel.DEBUG)
.build());
settings = new IndexSettings(metaData, Settings.EMPTY);
IndexingSlowLog debugLog = new IndexingSlowLog(settings);
metaData = newIndexMeta("index", Settings.builder()
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
.put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())
.put(IndexingSlowLog.INDEX_INDEXING_SLOWLOG_LEVEL_SETTING.getKey(), SlowLogLevel.INFO)
.build());
settings = new IndexSettings(metaData, Settings.EMPTY);
IndexingSlowLog infoLog = new IndexingSlowLog(settings);
assertEquals(SlowLogLevel.DEBUG, debugLog.getLevel());
assertEquals(SlowLogLevel.INFO, infoLog.getLevel());
}
public void testSetLevels() {

View File

@ -22,6 +22,7 @@ package org.elasticsearch.index;
import org.elasticsearch.Version;
import org.elasticsearch.action.search.SearchTask;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.UUIDs;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.util.BigArrays;
@ -190,6 +191,25 @@ public class SearchSlowLogTests extends ESSingleNodeTestCase {
assertThat(cause, hasToString(containsString("No enum constant org.elasticsearch.index.SlowLogLevel.NOT A LEVEL")));
}
assertEquals(SlowLogLevel.TRACE, log.getLevel());
metaData = newIndexMeta("index", Settings.builder()
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
.put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())
.put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_LEVEL.getKey(), SlowLogLevel.DEBUG)
.build());
settings = new IndexSettings(metaData, Settings.EMPTY);
SearchSlowLog debugLog = new SearchSlowLog(settings);
metaData = newIndexMeta("index", Settings.builder()
.put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
.put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())
.put(SearchSlowLog.INDEX_SEARCH_SLOWLOG_LEVEL.getKey(), SlowLogLevel.INFO)
.build());
settings = new IndexSettings(metaData, Settings.EMPTY);
SearchSlowLog infoLog = new SearchSlowLog(settings);
assertEquals(SlowLogLevel.DEBUG, debugLog.getLevel());
assertEquals(SlowLogLevel.INFO, infoLog.getLevel());
}
public void testSetQueryLevels() {