Skip to content

Commit e44e5d4

Browse files
riysaxen-amznjowg-amazonsbcd90eirsep
authored
Backport changes and Integ test fix (#935)
* Fix duplicate ecs mappings which returns incorrect log index field in mapping view API (#786) (#788) * field mapping changes Signed-off-by: Joanne Wang <[email protected]> * add integ test Signed-off-by: Joanne Wang <[email protected]> * turn unmappedfieldaliases as set and add integ test Signed-off-by: Joanne Wang <[email protected]> * add comments Signed-off-by: Joanne Wang <[email protected]> * fix integ tests Signed-off-by: Joanne Wang <[email protected]> * moved logic to method for better readability Signed-off-by: Joanne Wang <[email protected]> --------- Signed-off-by: Joanne Wang <[email protected]> * support object fields in aggregation based sigma rules (#789) Signed-off-by: Subhobrata Dey <[email protected]> * Pass rule field names in doc level queries during monitor/creation. Remove blocking actionGet() calls (#873) * pass query field names in doc level queries during monitor creation/updation Signed-off-by: Surya Sashank Nistala <[email protected]> * remove actionGet() and change get index mapping call to event driven flow Signed-off-by: Surya Sashank Nistala <[email protected]> * fix chained findings monitor Signed-off-by: Surya Sashank Nistala <[email protected]> * add finding mappings Signed-off-by: Surya Sashank Nistala <[email protected]> * remove test messages from logs Signed-off-by: Surya Sashank Nistala <[email protected]> * revert build.gradle change Signed-off-by: Surya Sashank Nistala <[email protected]> --------- Signed-off-by: Surya Sashank Nistala <[email protected]> * version bump Signed-off-by: Surya Sashank Nistala <[email protected]> * AggregationBackendTests fix Signed-off-by: Riya Saxena <[email protected]> --------- Signed-off-by: Joanne Wang <[email protected]> Signed-off-by: Subhobrata Dey <[email protected]> Signed-off-by: Surya Sashank Nistala <[email protected]> Signed-off-by: Riya Saxena <[email protected]> Co-authored-by: Joanne Wang <[email protected]> Co-authored-by: Subhobrata Dey <[email protected]> Co-authored-by: Surya Sashank Nistala <[email protected]>
1 parent 7fbe7c0 commit e44e5d4

File tree

12 files changed

+1233
-344
lines changed

12 files changed

+1233
-344
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.opensearch.gradle.test.RestIntegTestTask
66

77
buildscript {
88
ext {
9-
opensearch_version = System.getProperty("opensearch.version", "2.9.0-SNAPSHOT")
9+
opensearch_version = System.getProperty("opensearch.version", "2.9.1-SNAPSHOT")
1010
isSnapshot = "true" == System.getProperty("build.snapshot", "true")
1111
buildVersionQualifier = System.getProperty("build.version_qualifier", "")
1212
version_tokens = opensearch_version.tokenize('-')

src/main/generated/org/opensearch/securityanalytics/rules/condition/aggregation/AggregationLexer.java

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -129,50 +129,50 @@ public AggregationLexer(CharStream input) {
129129
"\u0001\u000f\u0001\u000f\u0000\u0000\u0010\u0001\u0001\u0003\u0002\u0005"+
130130
"\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n"+
131131
"\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010\u0001"+
132-
"\u0000\u0004\u0001\u000009\u0004\u0000**AZ__az\u0004\u000009AZ__az\u0003"+
133-
"\u0000\t\n\f\r n\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001"+
134-
"\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001"+
135-
"\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000"+
136-
"\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000"+
137-
"\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000"+
138-
"\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000"+
139-
"\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000"+
140-
"\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000"+
141-
"\u0000\u0001!\u0001\u0000\u0000\u0000\u0003#\u0001\u0000\u0000\u0000\u0005"+
142-
"&\u0001\u0000\u0000\u0000\u0007(\u0001\u0000\u0000\u0000\t+\u0001\u0000"+
143-
"\u0000\u0000\u000b.\u0001\u0000\u0000\u0000\r4\u0001\u0000\u0000\u0000"+
144-
"\u000f8\u0001\u0000\u0000\u0000\u0011<\u0001\u0000\u0000\u0000\u0013@"+
145-
"\u0001\u0000\u0000\u0000\u0015D\u0001\u0000\u0000\u0000\u0017G\u0001\u0000"+
146-
"\u0000\u0000\u0019I\u0001\u0000\u0000\u0000\u001bL\u0001\u0000\u0000\u0000"+
147-
"\u001d[\u0001\u0000\u0000\u0000\u001fc\u0001\u0000\u0000\u0000!\"\u0005"+
148-
">\u0000\u0000\"\u0002\u0001\u0000\u0000\u0000#$\u0005>\u0000\u0000$%\u0005"+
149-
"=\u0000\u0000%\u0004\u0001\u0000\u0000\u0000&\'\u0005<\u0000\u0000\'\u0006"+
150-
"\u0001\u0000\u0000\u0000()\u0005<\u0000\u0000)*\u0005=\u0000\u0000*\b"+
151-
"\u0001\u0000\u0000\u0000+,\u0005=\u0000\u0000,-\u0005=\u0000\u0000-\n"+
152-
"\u0001\u0000\u0000\u0000./\u0005c\u0000\u0000/0\u0005o\u0000\u000001\u0005"+
153-
"u\u0000\u000012\u0005n\u0000\u000023\u0005t\u0000\u00003\f\u0001\u0000"+
154-
"\u0000\u000045\u0005s\u0000\u000056\u0005u\u0000\u000067\u0005m\u0000"+
155-
"\u00007\u000e\u0001\u0000\u0000\u000089\u0005m\u0000\u00009:\u0005i\u0000"+
156-
"\u0000:;\u0005n\u0000\u0000;\u0010\u0001\u0000\u0000\u0000<=\u0005m\u0000"+
157-
"\u0000=>\u0005a\u0000\u0000>?\u0005x\u0000\u0000?\u0012\u0001\u0000\u0000"+
158-
"\u0000@A\u0005a\u0000\u0000AB\u0005v\u0000\u0000BC\u0005g\u0000\u0000"+
159-
"C\u0014\u0001\u0000\u0000\u0000DE\u0005b\u0000\u0000EF\u0005y\u0000\u0000"+
160-
"F\u0016\u0001\u0000\u0000\u0000GH\u0005(\u0000\u0000H\u0018\u0001\u0000"+
161-
"\u0000\u0000IJ\u0005)\u0000\u0000J\u001a\u0001\u0000\u0000\u0000KM\u0005"+
162-
"-\u0000\u0000LK\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000\u0000MO\u0001"+
163-
"\u0000\u0000\u0000NP\u0007\u0000\u0000\u0000ON\u0001\u0000\u0000\u0000"+
164-
"PQ\u0001\u0000\u0000\u0000QO\u0001\u0000\u0000\u0000QR\u0001\u0000\u0000"+
165-
"\u0000RY\u0001\u0000\u0000\u0000SU\u0005.\u0000\u0000TV\u0007\u0000\u0000"+
166-
"\u0000UT\u0001\u0000\u0000\u0000VW\u0001\u0000\u0000\u0000WU\u0001\u0000"+
167-
"\u0000\u0000WX\u0001\u0000\u0000\u0000XZ\u0001\u0000\u0000\u0000YS\u0001"+
168-
"\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Z\u001c\u0001\u0000\u0000"+
169-
"\u0000[_\u0007\u0001\u0000\u0000\\^\u0007\u0002\u0000\u0000]\\\u0001\u0000"+
170-
"\u0000\u0000^a\u0001\u0000\u0000\u0000_]\u0001\u0000\u0000\u0000_`\u0001"+
171-
"\u0000\u0000\u0000`\u001e\u0001\u0000\u0000\u0000a_\u0001\u0000\u0000"+
172-
"\u0000bd\u0007\u0003\u0000\u0000cb\u0001\u0000\u0000\u0000de\u0001\u0000"+
173-
"\u0000\u0000ec\u0001\u0000\u0000\u0000ef\u0001\u0000\u0000\u0000fg\u0001"+
174-
"\u0000\u0000\u0000gh\u0006\u000f\u0000\u0000h \u0001\u0000\u0000\u0000"+
175-
"\u0007\u0000LQWY_e\u0001\u0006\u0000\u0000";
132+
"\u0000\u0004\u0001\u000009\u0005\u0000**..AZ__az\u0005\u0000..09AZ__a"+
133+
"z\u0003\u0000\t\n\f\r n\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003"+
134+
"\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007"+
135+
"\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001"+
136+
"\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000"+
137+
"\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000"+
138+
"\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000"+
139+
"\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000"+
140+
"\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000"+
141+
"\u0000\u0000\u0001!\u0001\u0000\u0000\u0000\u0003#\u0001\u0000\u0000\u0000"+
142+
"\u0005&\u0001\u0000\u0000\u0000\u0007(\u0001\u0000\u0000\u0000\t+\u0001"+
143+
"\u0000\u0000\u0000\u000b.\u0001\u0000\u0000\u0000\r4\u0001\u0000\u0000"+
144+
"\u0000\u000f8\u0001\u0000\u0000\u0000\u0011<\u0001\u0000\u0000\u0000\u0013"+
145+
"@\u0001\u0000\u0000\u0000\u0015D\u0001\u0000\u0000\u0000\u0017G\u0001"+
146+
"\u0000\u0000\u0000\u0019I\u0001\u0000\u0000\u0000\u001bL\u0001\u0000\u0000"+
147+
"\u0000\u001d[\u0001\u0000\u0000\u0000\u001fc\u0001\u0000\u0000\u0000!"+
148+
"\"\u0005>\u0000\u0000\"\u0002\u0001\u0000\u0000\u0000#$\u0005>\u0000\u0000"+
149+
"$%\u0005=\u0000\u0000%\u0004\u0001\u0000\u0000\u0000&\'\u0005<\u0000\u0000"+
150+
"\'\u0006\u0001\u0000\u0000\u0000()\u0005<\u0000\u0000)*\u0005=\u0000\u0000"+
151+
"*\b\u0001\u0000\u0000\u0000+,\u0005=\u0000\u0000,-\u0005=\u0000\u0000"+
152+
"-\n\u0001\u0000\u0000\u0000./\u0005c\u0000\u0000/0\u0005o\u0000\u0000"+
153+
"01\u0005u\u0000\u000012\u0005n\u0000\u000023\u0005t\u0000\u00003\f\u0001"+
154+
"\u0000\u0000\u000045\u0005s\u0000\u000056\u0005u\u0000\u000067\u0005m"+
155+
"\u0000\u00007\u000e\u0001\u0000\u0000\u000089\u0005m\u0000\u00009:\u0005"+
156+
"i\u0000\u0000:;\u0005n\u0000\u0000;\u0010\u0001\u0000\u0000\u0000<=\u0005"+
157+
"m\u0000\u0000=>\u0005a\u0000\u0000>?\u0005x\u0000\u0000?\u0012\u0001\u0000"+
158+
"\u0000\u0000@A\u0005a\u0000\u0000AB\u0005v\u0000\u0000BC\u0005g\u0000"+
159+
"\u0000C\u0014\u0001\u0000\u0000\u0000DE\u0005b\u0000\u0000EF\u0005y\u0000"+
160+
"\u0000F\u0016\u0001\u0000\u0000\u0000GH\u0005(\u0000\u0000H\u0018\u0001"+
161+
"\u0000\u0000\u0000IJ\u0005)\u0000\u0000J\u001a\u0001\u0000\u0000\u0000"+
162+
"KM\u0005-\u0000\u0000LK\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000\u0000"+
163+
"MO\u0001\u0000\u0000\u0000NP\u0007\u0000\u0000\u0000ON\u0001\u0000\u0000"+
164+
"\u0000PQ\u0001\u0000\u0000\u0000QO\u0001\u0000\u0000\u0000QR\u0001\u0000"+
165+
"\u0000\u0000RY\u0001\u0000\u0000\u0000SU\u0005.\u0000\u0000TV\u0007\u0000"+
166+
"\u0000\u0000UT\u0001\u0000\u0000\u0000VW\u0001\u0000\u0000\u0000WU\u0001"+
167+
"\u0000\u0000\u0000WX\u0001\u0000\u0000\u0000XZ\u0001\u0000\u0000\u0000"+
168+
"YS\u0001\u0000\u0000\u0000YZ\u0001\u0000\u0000\u0000Z\u001c\u0001\u0000"+
169+
"\u0000\u0000[_\u0007\u0001\u0000\u0000\\^\u0007\u0002\u0000\u0000]\\\u0001"+
170+
"\u0000\u0000\u0000^a\u0001\u0000\u0000\u0000_]\u0001\u0000\u0000\u0000"+
171+
"_`\u0001\u0000\u0000\u0000`\u001e\u0001\u0000\u0000\u0000a_\u0001\u0000"+
172+
"\u0000\u0000bd\u0007\u0003\u0000\u0000cb\u0001\u0000\u0000\u0000de\u0001"+
173+
"\u0000\u0000\u0000ec\u0001\u0000\u0000\u0000ef\u0001\u0000\u0000\u0000"+
174+
"fg\u0001\u0000\u0000\u0000gh\u0006\u000f\u0000\u0000h \u0001\u0000\u0000"+
175+
"\u0000\u0007\u0000LQWY_e\u0001\u0006\u0000\u0000";
176176
public static final ATN _ATN =
177177
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
178178
static {

src/main/grammars/Aggregation.g4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ RPAREN : ')' ;
2121

2222
DECIMAL : '-'?[0-9]+('.'[0-9]+)? ;
2323

24-
IDENTIFIER : [a-zA-Z*_][a-zA-Z_0-9]* ;
24+
IDENTIFIER : [a-zA-Z*_.][a-zA-Z_0-9.]* ;
2525
WS : [ \r\t\u000C\n]+ -> skip ;
2626

2727
comparison_expr : comparison_operand comp_operator comparison_operand # ComparisonExpressionWithOperator

src/main/java/org/opensearch/securityanalytics/mapper/MapperService.java

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,9 @@
55

66
package org.opensearch.securityanalytics.mapper;
77

8-
import java.io.IOException;
9-
import java.util.ArrayList;
10-
import java.util.Collection;
11-
import java.util.HashMap;
12-
import java.util.HashSet;
13-
import java.util.List;
14-
import java.util.Map;
15-
import java.util.Optional;
16-
import java.util.Set;
17-
import java.util.stream.Collectors;
188
import org.apache.commons.lang3.tuple.Pair;
199
import org.apache.logging.log4j.LogManager;
2010
import org.apache.logging.log4j.Logger;
21-
import org.opensearch.OpenSearchStatusException;
2211
import org.opensearch.action.ActionListener;
2312
import org.opensearch.action.admin.indices.get.GetIndexRequest;
2413
import org.opensearch.action.admin.indices.get.GetIndexResponse;
@@ -44,6 +33,16 @@
4433
import org.opensearch.securityanalytics.util.IndexUtils;
4534
import org.opensearch.securityanalytics.util.SecurityAnalyticsException;
4635

36+
import java.io.IOException;
37+
import java.util.ArrayList;
38+
import java.util.Collection;
39+
import java.util.HashMap;
40+
import java.util.HashSet;
41+
import java.util.List;
42+
import java.util.Map;
43+
import java.util.Optional;
44+
import java.util.Set;
45+
import java.util.stream.Collectors;
4746

4847
import static org.opensearch.securityanalytics.mapper.MapperUtils.PATH;
4948
import static org.opensearch.securityanalytics.mapper.MapperUtils.PROPERTIES;
@@ -78,9 +77,11 @@ public void createMappingAction(String indexName, String logType, String aliasMa
7877
// since you can't update documents in non-write indices
7978
String index = indexName;
8079
boolean shouldUpsertIndexTemplate = IndexUtils.isConcreteIndex(indexName, this.clusterService.state()) == false;
81-
if (IndexUtils.isDataStream(indexName, this.clusterService.state())) {
80+
if (IndexUtils.isDataStream(indexName, this.clusterService.state()) || IndexUtils.isAlias(indexName, this.clusterService.state())) {
81+
log.debug("{} is an alias or datastream. Fetching write index for create mapping action.", indexName);
8282
String writeIndex = IndexUtils.getWriteIndex(indexName, this.clusterService.state());
8383
if (writeIndex != null) {
84+
log.debug("Write index for {} is {}", indexName, writeIndex);
8485
index = writeIndex;
8586
}
8687
}
@@ -92,6 +93,7 @@ public void onResponse(GetMappingsResponse getMappingsResponse) {
9293
applyAliasMappings(getMappingsResponse.getMappings(), logType, aliasMappings, partial, new ActionListener<>() {
9394
@Override
9495
public void onResponse(Collection<CreateMappingResult> createMappingResponse) {
96+
log.debug("Completed create mappings for {}", indexName);
9597
// We will return ack==false if one of the requests returned that
9698
// else return ack==true
9799
Optional<AcknowledgedResponse> notAckd = createMappingResponse.stream()
@@ -110,6 +112,7 @@ public void onResponse(Collection<CreateMappingResult> createMappingResponse) {
110112

111113
@Override
112114
public void onFailure(Exception e) {
115+
log.debug("Failed to create mappings for {}", indexName );
113116
actionListener.onFailure(e);
114117
}
115118
});
@@ -478,13 +481,16 @@ public void onResponse(GetMappingsResponse getMappingsResponse) {
478481
String rawPath = requiredField.getRawField();
479482
String ocsfPath = requiredField.getOcsf();
480483
if (allFieldsFromIndex.contains(rawPath)) {
481-
if (alias != null) {
482-
// Maintain list of found paths in index
483-
applyableAliases.add(alias);
484-
} else {
485-
applyableAliases.add(rawPath);
484+
// if the alias was already added into applyable aliases, then skip to avoid duplicates
485+
if (!applyableAliases.contains(alias) && !applyableAliases.contains(rawPath)) {
486+
if (alias != null) {
487+
// Maintain list of found paths in index
488+
applyableAliases.add(alias);
489+
} else {
490+
applyableAliases.add(rawPath);
491+
}
492+
pathsOfApplyableAliases.add(rawPath);
486493
}
487-
pathsOfApplyableAliases.add(rawPath);
488494
} else if (allFieldsFromIndex.contains(ocsfPath)) {
489495
applyableAliases.add(alias);
490496
pathsOfApplyableAliases.add(ocsfPath);
@@ -498,13 +504,23 @@ public void onResponse(GetMappingsResponse getMappingsResponse) {
498504
}
499505
}
500506

507+
// turn unmappedFieldAliases into a set to remove duplicates
508+
Set<String> setOfUnmappedFieldAliases = new HashSet<>(unmappedFieldAliases);
509+
510+
// filter out aliases that were included in applyableAliases already
511+
List<String> filteredUnmappedFieldAliases = setOfUnmappedFieldAliases.stream()
512+
.filter(e -> false == applyableAliases.contains(e))
513+
.collect(Collectors.toList());
514+
501515
Map<String, Map<String, String>> aliasMappingFields = new HashMap<>();
502516
XContentBuilder aliasMappingsObj = XContentFactory.jsonBuilder().startObject();
503517
for (LogType.Mapping mapping: requiredFields) {
504518
if (allFieldsFromIndex.contains(mapping.getOcsf())) {
505519
aliasMappingFields.put(mapping.getEcs(), Map.of("type", "alias", "path", mapping.getOcsf()));
506520
} else if (mapping.getEcs() != null) {
507-
aliasMappingFields.put(mapping.getEcs(), Map.of("type", "alias", "path", mapping.getRawField()));
521+
shouldUpdateEcsMappingAndMaybeUpdates(mapping, aliasMappingFields, pathsOfApplyableAliases);
522+
} else if (mapping.getEcs() == null) {
523+
aliasMappingFields.put(mapping.getRawField(), Map.of("type", "alias", "path", mapping.getRawField()));
508524
}
509525
}
510526
aliasMappingsObj.field("properties", aliasMappingFields);
@@ -519,7 +535,7 @@ public void onResponse(GetMappingsResponse getMappingsResponse) {
519535
.collect(Collectors.toList());
520536

521537
actionListener.onResponse(
522-
new GetMappingsViewResponse(aliasMappings, unmappedIndexFields, unmappedFieldAliases)
538+
new GetMappingsViewResponse(aliasMappings, unmappedIndexFields, filteredUnmappedFieldAliases)
523539
);
524540
} catch (Exception e) {
525541
actionListener.onFailure(e);
@@ -533,6 +549,26 @@ public void onFailure(Exception e) {
533549
});
534550
}
535551

552+
/**
553+
* Only updates the alias mapping fields if the ecs key has not been mapped yet
554+
* or if pathOfApplyableAliases contains the raw field
555+
*
556+
* @param mapping
557+
* @param aliasMappingFields
558+
* @param pathsOfApplyableAliases
559+
*/
560+
private static void shouldUpdateEcsMappingAndMaybeUpdates(LogType.Mapping mapping, Map<String, Map<String, String>> aliasMappingFields, List<String> pathsOfApplyableAliases) {
561+
// check if aliasMappingFields already contains a key
562+
if (aliasMappingFields.containsKey(mapping.getEcs())) {
563+
// if the pathOfApplyableAliases contains the raw field, then override the existing map
564+
if (pathsOfApplyableAliases.contains(mapping.getRawField())) {
565+
aliasMappingFields.put(mapping.getEcs(), Map.of("type", "alias", "path", mapping.getRawField()));
566+
}
567+
} else {
568+
aliasMappingFields.put(mapping.getEcs(), Map.of("type", "alias", "path", mapping.getRawField()));
569+
}
570+
}
571+
536572
/**
537573
* Given index name, resolves it to single concrete index, depending on what initial <code>indexName</code> is.
538574
* In case of Datastream or Alias, WriteIndex would be returned. In case of index pattern, newest index by creation date would be returned.

src/main/java/org/opensearch/securityanalytics/mapper/MapperUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
55

66
package org.opensearch.securityanalytics.mapper;
77

8+
import org.apache.commons.lang3.tuple.Pair;
9+
import org.opensearch.cluster.metadata.MappingMetadata;
10+
import org.opensearch.securityanalytics.util.SecurityAnalyticsException;
11+
812
import java.io.IOException;
913
import java.util.ArrayList;
1014
import java.util.HashMap;
1115
import java.util.List;
1216
import java.util.Locale;
1317
import java.util.Map;
1418
import java.util.Set;
15-
import org.apache.commons.lang3.tuple.Pair;
16-
import org.opensearch.cluster.metadata.MappingMetadata;
17-
import org.opensearch.securityanalytics.util.SecurityAnalyticsException;
1819

1920
public class MapperUtils {
2021

@@ -246,7 +247,6 @@ public void onError(String error) {
246247
}
247248
});
248249
mappingsTraverser.traverse();
249-
250250
return presentPathsMappings;
251251
}
252252
}

src/main/java/org/opensearch/securityanalytics/rules/backend/AggregationBuilders.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public static AggregationBuilder getAggregationBuilderByFunction(String aggregat
4646
aggregationBuilder = new TermsAggregationBuilder(name).field(name);
4747
break;
4848
case "count":
49-
aggregationBuilder = new ValueCountAggregationBuilder(name).field(name);
49+
aggregationBuilder = new ValueCountAggregationBuilder(name.replace(".", "_")).field(name);
5050
break;
5151
default:
5252
throw new NotImplementedException(String.format(Locale.getDefault(), "Aggregation %s not supported by the backend", aggregationFunction));

0 commit comments

Comments
 (0)