@@ -39,6 +39,7 @@ import {
3939 onIncidentFiltersSelect ,
4040 parseUrlParams ,
4141 updateBrowserUrl ,
42+ DAY_MS ,
4243} from './utils' ;
4344import { groupAlertsForTable , convertToAlerts } from './processAlerts' ;
4445import { CompressArrowsAltIcon , CompressIcon , FilterIcon } from '@patternfly/react-icons' ;
@@ -231,52 +232,58 @@ const IncidentsPage = () => {
231232 } , [ incidentsActiveFilters . days ] ) ;
232233
233234 useEffect ( ( ) => {
234- ( async ( ) => {
235- const currentTime = incidentsLastRefreshTime ;
236- Promise . all (
237- timeRanges . map ( async ( range ) => {
238- const response = await fetchDataForIncidentsAndAlerts (
239- safeFetch ,
240- range ,
241- createAlertsQuery ( incidentForAlertProcessing ) ,
242- ) ;
243- return response . data . result ;
244- } ) ,
245- )
246- . then ( ( results ) => {
247- const prometheusResults = results . flat ( ) ;
248- const alerts = convertToAlerts (
249- prometheusResults ,
250- incidentForAlertProcessing ,
251- currentTime ,
252- ) ;
235+ if ( incidentForAlertProcessing . length === 0 ) {
236+ return ;
237+ }
238+
239+ const currentTime = incidentsLastRefreshTime ;
240+
241+ // Always fetch 15 days of alert data so firstTimestamp is computed from full history
242+ const fetchTimeRanges = getIncidentsTimeRanges ( 15 * DAY_MS , currentTime ) ;
243+
244+ Promise . all (
245+ fetchTimeRanges . map ( async ( range ) => {
246+ const response = await fetchDataForIncidentsAndAlerts (
247+ safeFetch ,
248+ range ,
249+ createAlertsQuery ( incidentForAlertProcessing ) ,
250+ ) ;
251+ return response . data . result ;
252+ } ) ,
253+ )
254+ . then ( ( alertsResults ) => {
255+ const prometheusResults = alertsResults . flat ( ) ;
256+ const alerts = convertToAlerts (
257+ prometheusResults ,
258+ incidentForAlertProcessing ,
259+ currentTime ,
260+ daysSpan ,
261+ ) ;
262+ dispatch (
263+ setAlertsData ( {
264+ alertsData : alerts ,
265+ } ) ,
266+ ) ;
267+ if ( rules && alerts ) {
253268 dispatch (
254- setAlertsData ( {
255- alertsData : alerts ,
269+ setAlertsTableData ( {
270+ alertsTableData : groupAlertsForTable ( alerts , rules ) ,
256271 } ) ,
257272 ) ;
258- if ( rules && alerts ) {
259- dispatch (
260- setAlertsTableData ( {
261- alertsTableData : groupAlertsForTable ( alerts , rules ) ,
262- } ) ,
263- ) ;
264- }
265- if ( ! isEmpty ( filteredData ) ) {
266- dispatch ( setAlertsAreLoading ( { alertsAreLoading : false } ) ) ;
267- } else {
268- dispatch ( setAlertsAreLoading ( { alertsAreLoading : true } ) ) ;
269- }
270- } )
271- . catch ( ( err ) => {
272- // eslint-disable-next-line no-console
273- console . log ( err ) ;
274-
273+ }
274+ if ( alerts . length > 0 ) {
275275 dispatch ( setAlertsAreLoading ( { alertsAreLoading : false } ) ) ;
276- setLoadError ( err ) ;
277- } ) ;
278- } ) ( ) ;
279- } , [ incidentForAlertProcessing ] ) ;
276+ } else {
277+ dispatch ( setAlertsAreLoading ( { alertsAreLoading : true } ) ) ;
278+ }
279+ } )
280+ . catch ( ( err ) => {
281+ // eslint-disable-next-line no-console
282+ console . error ( err ) ;
283+ dispatch ( setAlertsAreLoading ( { alertsAreLoading : false } ) ) ;
284+ setLoadError ( err ) ;
285+ } ) ;
286+ } , [ incidentForAlertProcessing , rules , daysSpan ] ) ;
280287
281288 useEffect ( ( ) => {
282289 if ( ! isInitialized ) return ;
@@ -293,30 +300,34 @@ const IncidentsPage = () => {
293300 ? incidentsActiveFilters . days [ 0 ] . split ( ' ' ) [ 0 ] + 'd'
294301 : '' ,
295302 ) ;
296- const calculatedTimeRanges = getIncidentsTimeRanges ( daysDuration , currentTime ) ;
297303
298304 const isGroupSelected = ! ! selectedGroupId ;
299305 const incidentsQuery = isGroupSelected
300306 ? `cluster_health_components_map{group_id='${ selectedGroupId } '}`
301307 : 'cluster_health_components_map' ;
302308
309+ // Always fetch 15 days of data so firstTimestamp is computed from full history
310+ const fetchTimeRanges = getIncidentsTimeRanges ( 15 * DAY_MS , currentTime ) ;
311+
303312 Promise . all (
304- calculatedTimeRanges . map ( async ( range ) => {
313+ fetchTimeRanges . map ( async ( range ) => {
305314 const response = await fetchDataForIncidentsAndAlerts ( safeFetch , range , incidentsQuery ) ;
306315 return response . data . result ;
307316 } ) ,
308317 )
309- . then ( ( results ) => {
310- const prometheusResults = results . flat ( ) ;
311- const incidents = convertToIncidents ( prometheusResults , currentTime ) ;
318+ . then ( ( incidentsResults ) => {
319+ const prometheusResults = incidentsResults . flat ( ) ;
320+ const incidents = convertToIncidents ( prometheusResults , currentTime , daysDuration ) ;
312321
313322 // Update the raw, unfiltered incidents state
314323 dispatch ( setIncidents ( { incidents } ) ) ;
315324
325+ const filteredData = filterIncident ( incidentsActiveFilters , incidents ) ;
326+
316327 // Filter the incidents and dispatch
317328 dispatch (
318329 setFilteredIncidentsData ( {
319- filteredIncidentsData : filterIncident ( incidentsActiveFilters , incidents ) ,
330+ filteredIncidentsData : filteredData ,
320331 } ) ,
321332 ) ;
322333
0 commit comments