@@ -37,6 +37,7 @@ import {
37
37
incidentsSearchQuery ,
38
38
issuesForConditionsQuery ,
39
39
statusesFromGuidsArray ,
40
+ workloadsStatusesQuery ,
40
41
} from '../../queries' ;
41
42
import {
42
43
addSignalStatuses ,
@@ -45,8 +46,11 @@ import {
45
46
batchAlertConditionsByAccount ,
46
47
batchedIncidentIdsFromIssuesQuery ,
47
48
entitiesDetailsFromQueryResults ,
49
+ fifteenMinutesAgo ,
50
+ getWorstWorkloadStatusValue ,
48
51
guidsToArray ,
49
52
incidentsFromIncidentsBlocks ,
53
+ isWorkload ,
50
54
signalDetailsObject ,
51
55
statusFromStatuses ,
52
56
threeDaysAgo ,
@@ -61,7 +65,6 @@ import {
61
65
UI_CONTENT ,
62
66
ALERT_STATUSES ,
63
67
MAX_PARAMS_IN_QUERY ,
64
- WORKLOAD_TYPE ,
65
68
} from '../../constants' ;
66
69
import { useDebugLogger } from '../../hooks' ;
67
70
@@ -121,11 +124,11 @@ const Stages = forwardRef(
121
124
async ( entitiesGuids , timeWindow , isForCache ) => {
122
125
setIsLoading ?. ( true ) ;
123
126
clearTimeout ( entitiesStatusTimeoutId . current ) ;
124
- const entitesGuidsArray = guidsToArray (
127
+ const entitiesGuidsArray = guidsToArray (
125
128
{ entitiesGuids } ,
126
129
MAX_PARAMS_IN_QUERY
127
130
) ;
128
- const query = statusesFromGuidsArray ( entitesGuidsArray , timeWindow ) ;
131
+ const query = statusesFromGuidsArray ( entitiesGuidsArray , timeWindow ) ;
129
132
debugString ( query , 'Entities query' ) ;
130
133
const { data : { actor = { } } = { } , error } = await NerdGraphQuery . query (
131
134
{
@@ -144,66 +147,6 @@ const Stages = forwardRef(
144
147
return ;
145
148
}
146
149
const entitiesStatusesObj = entitiesDetailsFromQueryResults ( actor ) ;
147
- const { workloads, workloadEntities } = Object . keys (
148
- entitiesStatusesObj
149
- ) . reduce (
150
- ( acc , cur ) => {
151
- const { type : t , relatedEntities } = entitiesStatusesObj [ cur ] ;
152
- if ( t === WORKLOAD_TYPE && relatedEntities ?. results ?. length ) {
153
- const { workloadEntitiesGuids, guidsWOStatus } =
154
- relatedEntities . results . reduce (
155
- ( { workloadEntitiesGuids, guidsWOStatus } , re ) => {
156
- const g = re ?. target ?. entity ?. guid ;
157
- if ( ! g ) return { workloadEntitiesGuids, guidsWOStatus } ;
158
- return {
159
- workloadEntitiesGuids : [ ...workloadEntitiesGuids , g ] ,
160
- guidsWOStatus :
161
- g in entitiesStatusesObj || guidsWOStatus . includes ( g )
162
- ? guidsWOStatus
163
- : [ ...guidsWOStatus , g ] ,
164
- } ;
165
- } ,
166
- {
167
- workloadEntitiesGuids : [ ] ,
168
- guidsWOStatus : acc . workloadEntities ,
169
- }
170
- ) ;
171
- return {
172
- ...acc ,
173
- workloads : {
174
- ...acc . workloads ,
175
- [ cur ] : workloadEntitiesGuids ,
176
- } ,
177
- workloadEntities : guidsWOStatus ,
178
- } ;
179
- } else {
180
- return acc ;
181
- }
182
- } ,
183
- { workloads : { } , workloadEntities : [ ] }
184
- ) ;
185
- if ( Object . keys ( workloads ) . length && workloadEntities . length ) {
186
- const workloadEntitiesStatuses = await fetchEntitiesStatus (
187
- workloadEntities ,
188
- timeWindow ,
189
- true
190
- ) ;
191
- const key =
192
- timeWindow ?. start && timeWindow ?. end
193
- ? 'alertViolations'
194
- : 'recentAlertViolations' ;
195
- Object . keys ( workloads ) . forEach ( ( wlg ) => {
196
- entitiesStatusesObj [ wlg ] [ key ] = workloads [ wlg ] ?. reduce (
197
- ( acc , cur ) => [
198
- ...acc ,
199
- ...( entitesGuidsArray [ cur ] ?. [ key ] ||
200
- workloadEntitiesStatuses [ cur ] ?. [ key ] ||
201
- [ ] ) ,
202
- ] ,
203
- entitiesStatusesObj [ wlg ] [ key ] || [ ]
204
- ) ;
205
- } ) ;
206
- }
207
150
208
151
if ( isForCache ) return entitiesStatusesObj ;
209
152
if ( statusTimeoutDelay . current && ! timeWindow ) {
@@ -535,14 +478,71 @@ const Stages = forwardRef(
535
478
}
536
479
setIsLoading ( true ) ;
537
480
481
+ const { [ SIGNAL_TYPES . ENTITY ] : entitiesGuids = [ ] } = guids ;
482
+ const workloads = entitiesGuids ?. reduce ( ( acc , cur ) => {
483
+ const [ acctId , domain , type ] = atob ( cur ) ?. split ( '|' ) || [ ] ;
484
+ return acctId && isWorkload ( { domain, type } )
485
+ ? {
486
+ ...acc ,
487
+ [ acctId ] : [ ...( acc [ acctId ] || [ ] ) , cur ] ,
488
+ }
489
+ : acc ;
490
+ } , { } ) ;
491
+ let workloadsStatuses = { } ;
492
+ if ( Object . keys ( workloads ) ?. length ) {
493
+ const { data : { actor : w = { } } = { } , error } =
494
+ await NerdGraphQuery . query ( {
495
+ query : workloadsStatusesQuery ( workloads , {
496
+ start : fifteenMinutesAgo ( timeBands ?. [ 0 ] ?. start ) ,
497
+ end : timeBands ?. [ timeBands . length - 1 ] ?. end ,
498
+ } ) ,
499
+ } ) ;
500
+ if ( ! error && w ) {
501
+ workloadsStatuses = Object . keys ( w ) ?. reduce ( ( acc , key ) => {
502
+ if ( key === '__typename' ) return acc ;
503
+ const r = w [ key ] . results || [ ] ;
504
+ return {
505
+ ...acc ,
506
+ ...r . reduce (
507
+ ( acc2 , { statusValueCode, timestamp, workloadGuid } ) => ( {
508
+ ...acc2 ,
509
+ [ workloadGuid ] : [
510
+ ...( acc2 [ workloadGuid ] || [ ] ) ,
511
+ { statusValueCode, timestamp } ,
512
+ ] ,
513
+ } ) ,
514
+ { }
515
+ ) ,
516
+ } ;
517
+ } , { } ) ;
518
+ }
519
+ }
520
+
538
521
timeBands . forEach ( async ( timeWindow , idx ) => {
539
522
const { key, alertsStatusesObj } = timeBandsDataArray [ idx ] || { } ;
540
523
const timeWindowCachedData = timeBandDataCache . current . get ( key ) ;
541
524
if ( ! timeWindowCachedData ) {
542
- const { [ SIGNAL_TYPES . ENTITY ] : entitiesGuids = [ ] } = guids ;
543
- const entitiesStatusesObj = entitiesGuids . length
525
+ let entitiesStatusesObj = entitiesGuids . length
544
526
? await fetchEntitiesStatus ( entitiesGuids , timeWindow , true )
545
527
: { } ;
528
+ entitiesStatusesObj = Object . keys ( entitiesStatusesObj ) ?. reduce (
529
+ ( acc , cur ) => {
530
+ const e = entitiesStatusesObj [ cur ] ;
531
+ if ( isWorkload ( e ) )
532
+ return {
533
+ ...acc ,
534
+ [ cur ] : {
535
+ ...e ,
536
+ statusValueCode : getWorstWorkloadStatusValue (
537
+ workloadsStatuses [ e . guid ] ,
538
+ timeWindow
539
+ ) ,
540
+ } ,
541
+ } ;
542
+ return { ...acc , [ cur ] : e } ;
543
+ } ,
544
+ { }
545
+ ) ;
546
546
const timeWindowStatuses = {
547
547
[ SIGNAL_TYPES . ENTITY ] : entitiesStatusesObj ,
548
548
[ SIGNAL_TYPES . ALERT ] : alertsStatusesObj ,
0 commit comments