Skip to content

Commit b78fdbe

Browse files
committed
Validate index name time format setting at parse time (elastic#47911)
1 parent f1396b6 commit b78fdbe

File tree

2 files changed

+23
-12
lines changed
  • x-pack/plugin/monitoring/src

2 files changed

+23
-12
lines changed

x-pack/plugin/monitoring/src/main/java/org/elasticsearch/xpack/monitoring/exporter/Exporter.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.elasticsearch.license.XPackLicenseState;
1616
import org.elasticsearch.xpack.monitoring.exporter.http.HttpExporter;
1717

18-
import java.time.ZoneOffset;
1918
import java.util.Arrays;
2019
import java.util.Collections;
2120
import java.util.Iterator;
@@ -103,9 +102,14 @@ public Iterator<Setting<?>> settings() {
103102
/**
104103
* Every {@code Exporter} allows users to use a different index time format.
105104
*/
106-
private static final Setting.AffixSetting<String> INDEX_NAME_TIME_FORMAT_SETTING =
107-
Setting.affixKeySetting("xpack.monitoring.exporters.","index.name.time_format",
108-
key -> Setting.simpleString(key, Property.Dynamic, Property.NodeScope));
105+
static final Setting.AffixSetting<DateFormatter> INDEX_NAME_TIME_FORMAT_SETTING =
106+
Setting.affixKeySetting("xpack.monitoring.exporters.","index.name.time_format",
107+
key -> new Setting<DateFormatter>(
108+
key,
109+
Exporter.INDEX_FORMAT,
110+
DateFormatter::forPattern,
111+
Property.Dynamic,
112+
Property.NodeScope));
109113

110114
private static final String INDEX_FORMAT = "yyyy.MM.dd";
111115

@@ -151,14 +155,8 @@ public void close() {
151155
protected abstract void doClose();
152156

153157
protected static DateFormatter dateTimeFormatter(final Config config) {
154-
Setting<String> setting = INDEX_NAME_TIME_FORMAT_SETTING.getConcreteSettingForNamespace(config.name);
155-
String format = setting.exists(config.settings()) ? setting.get(config.settings()) : INDEX_FORMAT;
156-
try {
157-
return DateFormatter.forPattern(format).withZone(ZoneOffset.UTC);
158-
} catch (IllegalArgumentException e) {
159-
throw new SettingsException("[" + INDEX_NAME_TIME_FORMAT_SETTING.getKey() + "] invalid index name time format: ["
160-
+ format + "]", e);
161-
}
158+
Setting<DateFormatter> setting = INDEX_NAME_TIME_FORMAT_SETTING.getConcreteSettingForNamespace(config.name);
159+
return setting.get(config.settings());
162160
}
163161

164162
public static List<Setting.AffixSetting<?>> getSettings() {

x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/exporter/ExportersTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,19 @@ public void testHostsMustBeSetIfTypeIsHttp() {
111111
assertThat(e.getCause(), hasToString(containsString("host list for [" + prefix + ".host] is empty")));
112112
}
113113

114+
public void testIndexNameTimeFormatMustBeValid() {
115+
final String prefix = "xpack.monitoring.exporters.example";
116+
final String setting = ".index.name.time_format";
117+
final String value = "yyyy.MM.dd.j";
118+
final Settings settings = Settings.builder().put(prefix + setting, value).build();
119+
final IllegalArgumentException e = expectThrows(
120+
IllegalArgumentException.class,
121+
() -> Exporter.INDEX_NAME_TIME_FORMAT_SETTING.getConcreteSetting(prefix + setting).get(settings));
122+
assertThat(e, hasToString(containsString("Invalid format: [" + value + "]: Unknown pattern letter: j")));
123+
assertThat(e.getCause(), instanceOf(IllegalArgumentException.class));
124+
assertThat(e.getCause(), hasToString(containsString("Unknown pattern letter: j")));
125+
}
126+
114127
public void testExporterIndexPattern() {
115128
Exporter.Config config = mock(Exporter.Config.class);
116129
when(config.name()).thenReturn("anything");

0 commit comments

Comments
 (0)