15
15
*/
16
16
17
17
import React , { useState , useEffect } from 'react'
18
- import { not , Progressing , ToastManager , ToastVariantType , useAsync , useTheme } from '@devtron-labs/devtron-fe-common-lib'
18
+ import {
19
+ not ,
20
+ Progressing ,
21
+ ToastManager ,
22
+ ToastVariantType ,
23
+ useAsync ,
24
+ useTheme ,
25
+ } from '@devtron-labs/devtron-fe-common-lib'
19
26
import { useParams , Link , NavLink } from 'react-router-dom'
20
27
import moment , { Moment } from 'moment'
21
28
import Tippy from '@tippyjs/react'
22
- import {
23
- getIframeSrc ,
24
- ThroughputSelect ,
25
- getCalendarValue ,
26
- isK8sVersionValid ,
27
- LatencySelect ,
28
- AppInfo ,
29
- } from './utils'
29
+ import { getIframeSrc , ThroughputSelect , getCalendarValue , isK8sVersionValid , LatencySelect , AppInfo } from './utils'
30
30
import {
31
31
ChartTypes ,
32
32
AppMetricsTab ,
@@ -61,13 +61,15 @@ import { ModuleStatus } from '../../../v2/devtronStackManager/DevtronStackManage
61
61
import { APP_METRICS_CALENDAR_INPUT_DATE_FORMAT } from './constants'
62
62
import { AppDetails } from '@Components/app/types'
63
63
64
- export const AppMetrics : React . FC < {
65
- appName : string
66
- environment
67
- podMap : Map < string , any >
68
- k8sVersion
69
- addExtraSpace : boolean
70
- } & Pick < AppDetails , 'dataSourceId' > > = ( { appName, podMap, k8sVersion, addExtraSpace, environment, dataSourceId } ) => {
64
+ export const AppMetrics : React . FC <
65
+ {
66
+ appName : string
67
+ environment
68
+ podMap : Map < string , any >
69
+ k8sVersion
70
+ addExtraSpace : boolean
71
+ } & Pick < AppDetails , 'grafanaDataSourceId' >
72
+ > = ( { appName, podMap, k8sVersion, addExtraSpace, environment, grafanaDataSourceId } ) => {
71
73
const { appTheme } = useTheme ( )
72
74
const { appMetrics, infraMetrics } = environment
73
75
const [ calendar , setDateRange ] = useState < { startDate : Moment ; endDate : Moment } > ( {
@@ -79,7 +81,7 @@ export const AppMetrics: React.FC<{
79
81
endDate : 'now' ,
80
82
} )
81
83
const [ datasource , setDatasource ] = useState < {
82
- isLoading : boolean ,
84
+ isLoading : boolean
83
85
isConfigured : boolean
84
86
isHealthy : boolean
85
87
dataSourceName : string
@@ -145,24 +147,29 @@ export const AppMetrics: React.FC<{
145
147
146
148
async function checkDatasource ( ) {
147
149
try {
148
- let datasourceConfiguredRes
149
- let datasourceHealthyRes
150
- let hostUrlRes
151
-
152
- hostUrlRes = await getHostURLConfiguration ( )
150
+ const hostUrlRes = await getHostURLConfiguration ( )
153
151
setHostURLConfig ( hostUrlRes . result )
154
- datasourceConfiguredRes = await isDatasourceConfigured ( dataSourceId )
155
152
156
- if ( datasourceConfiguredRes . id ) {
157
- datasourceHealthyRes = await isDatasourceHealthy ( datasourceConfiguredRes . id )
153
+ if ( grafanaDataSourceId ) {
154
+ const [ datasourceConfiguredRes , datasourceHealthyRes ] = await Promise . all ( [
155
+ isDatasourceConfigured ( grafanaDataSourceId ) ,
156
+ isDatasourceHealthy ( grafanaDataSourceId ) ,
157
+ ] )
158
+
159
+ setDatasource ( {
160
+ isLoading : false ,
161
+ isConfigured : ! ! grafanaDataSourceId ,
162
+ isHealthy : datasourceHealthyRes ?. status . toLowerCase ( ) === 'success' ,
163
+ dataSourceName : datasourceConfiguredRes ?. name || '' ,
164
+ } )
165
+ } else {
166
+ setDatasource ( {
167
+ isLoading : false ,
168
+ isConfigured : false ,
169
+ isHealthy : false ,
170
+ dataSourceName : '' ,
171
+ } )
158
172
}
159
-
160
- setDatasource ( {
161
- isLoading : false ,
162
- isConfigured : ! ! datasourceConfiguredRes . id ,
163
- isHealthy : datasourceHealthyRes ?. status . toLowerCase ( ) === 'success' ,
164
- dataSourceName : datasourceConfiguredRes . name ,
165
- } )
166
173
} catch ( error ) {
167
174
setDatasource ( {
168
175
...datasource ,
@@ -184,10 +191,11 @@ export const AppMetrics: React.FC<{
184
191
setCalendarValue ( str )
185
192
}
186
193
187
- const getIframeSrcWrapper : GraphModalProps [ 'getIframeSrcWrapper' ] = ( params ) => getIframeSrc ( {
188
- ...params ,
189
- grafanaTheme : appTheme ,
190
- } )
194
+ const getIframeSrcWrapper : GraphModalProps [ 'getIframeSrcWrapper' ] = ( params ) =>
195
+ getIframeSrc ( {
196
+ ...params ,
197
+ grafanaTheme : appTheme ,
198
+ } )
191
199
192
200
function handleStatusChange ( selected ) : void {
193
201
if ( ! isK8sVersionValid ( k8sVersion ) ) {
@@ -206,7 +214,7 @@ export const AppMetrics: React.FC<{
206
214
calendarInputs,
207
215
tab,
208
216
isLegendRequired : true ,
209
- statusCode : selected . value
217
+ statusCode : selected . value ,
210
218
} )
211
219
setStatusCode ( selected . value )
212
220
setGraphs ( {
@@ -227,7 +235,13 @@ export const AppMetrics: React.FC<{
227
235
k8sVersion,
228
236
}
229
237
const latency = getIframeSrcWrapper ( {
230
- appInfo, chartName : ChartType . Latency , calendarInputs, tab, isLegendRequired : true , statusCode : undefined , latency : selected . value
238
+ appInfo,
239
+ chartName : ChartType . Latency ,
240
+ calendarInputs,
241
+ tab,
242
+ isLegendRequired : true ,
243
+ statusCode : undefined ,
244
+ latency : selected . value ,
231
245
} )
232
246
setLatency ( selected . value )
233
247
setGraphs ( {
@@ -259,10 +273,18 @@ export const AppMetrics: React.FC<{
259
273
k8sVersion,
260
274
}
261
275
const cpu = getIframeSrcWrapper ( {
262
- appInfo, chartName : ChartType . Cpu , calendarInputs, tab : newTab , isLegendRequired : true
276
+ appInfo,
277
+ chartName : ChartType . Cpu ,
278
+ calendarInputs,
279
+ tab : newTab ,
280
+ isLegendRequired : true ,
263
281
} )
264
282
const ram = getIframeSrcWrapper ( {
265
- appInfo, chartName : ChartType . Ram , calendarInputs, tab : newTab , isLegendRequired : true
283
+ appInfo,
284
+ chartName : ChartType . Ram ,
285
+ calendarInputs,
286
+ tab : newTab ,
287
+ isLegendRequired : true ,
266
288
} )
267
289
const latency = getIframeSrcWrapper ( {
268
290
appInfo,
@@ -279,7 +301,7 @@ export const AppMetrics: React.FC<{
279
301
calendarInputs,
280
302
tab : newTab ,
281
303
isLegendRequired : true ,
282
- statusCode : StatusType . Throughput
304
+ statusCode : StatusType . Throughput ,
283
305
} )
284
306
setGraphs ( {
285
307
cpu,
@@ -309,6 +331,7 @@ export const AppMetrics: React.FC<{
309
331
if (
310
332
! datasource . isConfigured ||
311
333
! datasource . isHealthy ||
334
+ ! datasource . dataSourceName ||
312
335
! hostURLConfig ||
313
336
hostURLConfig . value !== window . location . origin
314
337
) {
@@ -323,10 +346,7 @@ export const AppMetrics: React.FC<{
323
346
}
324
347
325
348
return (
326
- < section
327
- data-testid = "app-metrices-wrapper"
328
- className = "app-summary bg__primary pl-24 pr-24 pb-20 w-100"
329
- >
349
+ < section data-testid = "app-metrices-wrapper" className = "app-summary bg__primary pl-24 pr-24 pb-20 w-100" >
330
350
{ ( appMetrics || infraMetrics ) && (
331
351
< div className = "flex" style = { { justifyContent : 'space-between' , height : '68px' } } >
332
352
< span className = "fs-14 fw-6 cn-7 flex left mr-9" >
@@ -528,10 +548,7 @@ const EnableAppMetrics = () => {
528
548
529
549
const MonitoringModuleNotInstalled = ( { addSpace } : { addSpace : string } ) => {
530
550
return (
531
- < div
532
- data-testid = "app-metrices-wrapper"
533
- className = { `bcv-1 w-100 pt-18 pb-18 pl-20 pr-20 ${ addSpace } ` }
534
- >
551
+ < div data-testid = "app-metrices-wrapper" className = { `bcv-1 w-100 pt-18 pb-18 pl-20 pr-20 ${ addSpace } ` } >
535
552
< div className = "flex left w-100 lh-20" >
536
553
< span className = "fs-14 fw-6 cv-5 flex left mr-16" >
537
554
< GraphIcon className = "mr-8 fcv-5 icon-dim-20" />
0 commit comments