Skip to content

Commit 591feb2

Browse files
opensearch-trigger-bot[bot]github-actions[bot]
authored andcommitted
Feature findings enhancemnt (#1427) (#1457)
* added support for param in Finding API * added detectionType as param for Findings API enhancements * added searchString param in FIndingsAPI * adding addiional params findingIds, startTime and endTime --------- (cherry picked from commit 2420c2c) Signed-off-by: Riya Saxena <[email protected]> Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent dde6aab commit 591feb2

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

alerting/src/main/kotlin/org/opensearch/alerting/resthandler/RestGetFindingsAction.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class RestGetFindingsAction : BaseRestHandler() {
4545
val size = request.paramAsInt("size", 20)
4646
val startIndex = request.paramAsInt("startIndex", 0)
4747
val searchString = request.param("searchString", "")
48+
val severity: String? = request.param("severity", "ALL")
49+
val detectionType: String? = request.param("detectionType", "rules")
4850

4951
val table = Table(
5052
sortOrder,
@@ -57,7 +59,9 @@ class RestGetFindingsAction : BaseRestHandler() {
5759

5860
val getFindingsSearchRequest = GetFindingsRequest(
5961
findingID,
60-
table
62+
table,
63+
severity,
64+
detectionType
6165
)
6266
return RestChannelConsumer {
6367
channel ->

alerting/src/main/kotlin/org/opensearch/alerting/transport/TransportGetFindingsAction.kt

+65-1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ class TransportGetFindingsSearchAction @Inject constructor(
8585
val getFindingsRequest = request as? GetFindingsRequest
8686
?: recreateObject(request) { GetFindingsRequest(it) }
8787
val tableProp = getFindingsRequest.table
88+
val severity = getFindingsRequest.severity
89+
val detectionType = getFindingsRequest.detectionType
90+
val searchString = tableProp.searchString
8891

8992
val sortBuilder = SortBuilders
9093
.fieldSort(tableProp.sortString)
@@ -107,12 +110,74 @@ class TransportGetFindingsSearchAction @Inject constructor(
107110
queryBuilder.filter(QueryBuilders.termQuery("_id", getFindingsRequest.findingId))
108111
}
109112

113+
if (!getFindingsRequest.findingIds.isNullOrEmpty()) {
114+
queryBuilder.filter(QueryBuilders.termsQuery("id", getFindingsRequest.findingIds))
115+
}
116+
110117
if (getFindingsRequest.monitorId != null) {
111118
queryBuilder.filter(QueryBuilders.termQuery("monitor_id", getFindingsRequest.monitorId))
112119
} else if (getFindingsRequest.monitorIds.isNullOrEmpty() == false) {
113120
queryBuilder.filter(QueryBuilders.termsQuery("monitor_id", getFindingsRequest.monitorIds))
114121
}
115122

123+
if (getFindingsRequest.startTime != null && getFindingsRequest.endTime != null) {
124+
val startTime = getFindingsRequest.startTime!!.toEpochMilli()
125+
val endTime = getFindingsRequest.endTime!!.toEpochMilli()
126+
val timeRangeQuery = QueryBuilders.rangeQuery("timestamp")
127+
.from(startTime) // Greater than or equal to start time
128+
.to(endTime) // Less than or equal to end time
129+
queryBuilder.filter(timeRangeQuery)
130+
}
131+
132+
if (!detectionType.isNullOrBlank()) {
133+
val nestedQueryBuilder = QueryBuilders.nestedQuery(
134+
"queries",
135+
when {
136+
detectionType.equals("threat", ignoreCase = true) -> {
137+
QueryBuilders.boolQuery().filter(
138+
QueryBuilders.prefixQuery("queries.id", "threat_intel_")
139+
)
140+
}
141+
else -> {
142+
QueryBuilders.boolQuery().mustNot(
143+
QueryBuilders.prefixQuery("queries.id", "threat_intel_")
144+
)
145+
}
146+
},
147+
ScoreMode.None
148+
)
149+
150+
// Add the nestedQueryBuilder to the main queryBuilder
151+
queryBuilder.must(nestedQueryBuilder)
152+
}
153+
154+
if (!searchString.isNullOrBlank()) {
155+
queryBuilder
156+
.should(QueryBuilders.matchQuery("index", searchString))
157+
.should(
158+
QueryBuilders.nestedQuery(
159+
"queries",
160+
QueryBuilders.matchQuery("queries.tags", searchString),
161+
ScoreMode.None
162+
)
163+
)
164+
.should(QueryBuilders.regexpQuery("monitor_name", searchString + ".*"))
165+
.minimumShouldMatch(1)
166+
}
167+
168+
if (!severity.isNullOrBlank()) {
169+
queryBuilder
170+
.must(
171+
QueryBuilders.nestedQuery(
172+
"queries",
173+
QueryBuilders.boolQuery().should(
174+
QueryBuilders.matchQuery("queries.tags", severity)
175+
),
176+
ScoreMode.None
177+
)
178+
)
179+
}
180+
116181
if (!tableProp.searchString.isNullOrBlank()) {
117182
queryBuilder
118183
.should(
@@ -134,7 +199,6 @@ class TransportGetFindingsSearchAction @Inject constructor(
134199
)
135200
)
136201
}
137-
138202
searchSourceBuilder.query(queryBuilder)
139203

140204
client.threadPool().threadContext.stashContext().use {

0 commit comments

Comments
 (0)