11// @ts -ignore
22import blessed from 'blessed'
33import contrib from 'blessed-contrib'
4- import chalk from 'chalk'
5- // @ts -ignore
6- import chalkTable from 'chalk-table'
74import meow from 'meow'
85import ora from 'ora'
96
@@ -123,7 +120,6 @@ async function fetchOrgAnalyticsData (time: string, spinner: Ora, apiKey: string
123120 acc [ formattedDate ] . total_high_prevented += current . total_high_prevented
124121 acc [ formattedDate ] . total_medium_prevented += current . total_medium_prevented
125122 acc [ formattedDate ] . total_low_prevented += current . total_low_prevented
126- // acc[formattedDate].top_five_alert_types += current.top_five_alert_types
127123 } else {
128124 acc [ formattedDate ] = current
129125 acc [ formattedDate ] . created_at = formattedDate
@@ -132,39 +128,21 @@ async function fetchOrgAnalyticsData (time: string, spinner: Ora, apiKey: string
132128 return acc
133129 } , { } )
134130
135- // console.log(data)
136-
137- // const options = {
138- // columns: [
139- // { field: 'created_at', name: chalk.cyan('Date') },
140- // { field: 'total_critical_alerts', name: chalk.cyan('Critical alerts') },
141- // { field: 'total_high_alerts', name: chalk.cyan('High alerts') },
142- // { field: 'total_critical_added', name: chalk.cyan('Critical alerts added') },
143- // { field: 'total_high_added', name: chalk.cyan('High alerts added') },
144- // { field: 'total_critical_prevented', name: chalk.cyan('Critical alerts prevented') },
145- // { field: 'total_medium_prevented', name: chalk.cyan('Medium alerts prevented') },
146- // { field: 'total_low_prevented', name: chalk.cyan('Low alerts prevented') },
147- // ]
148- // }
149-
150- // console.log(chalk.bgMagenta.white.bold(`\n Analytics data at the organization level over the last ${time} days (indicated in total amount): \n`))
151- // console.log(`${chalkTable(options, Object.values(data))}\n`)
152-
153131 const screen = blessed . screen ( )
154132 // eslint-disable-next-line
155133 const grid = new contrib . grid ( { rows : 4 , cols : 4 , screen} )
156134
157- renderLineCharts ( grid , screen , 'Critical alerts' , [ 0 , 0 , 1 , 1.5 ] , data , 'total_critical_alerts' )
158- renderLineCharts ( grid , screen , 'High alerts' , [ 0 , 1.5 , 1 , 1.5 ] , data , 'total_high_alerts' )
159- renderLineCharts ( grid , screen , 'Critical alerts added to main' , [ 1 , 0 , 1 , 2 ] , data , 'total_critical_added' )
160- renderLineCharts ( grid , screen , 'High alerts added to main' , [ 1 , 2 , 1 , 2 ] , data , 'total_high_added' )
161- renderLineCharts ( grid , screen , 'Critical alerts prevented from main' , [ 2 , 0 , 1 , 2 ] , data , 'total_critical_prevented' )
162- renderLineCharts ( grid , screen , 'High alerts prevented to main' , [ 2 , 2 , 1 , 2 ] , data , 'total_high_prevented' )
135+ renderLineCharts ( grid , screen , 'Total critical alerts' , [ 0 , 0 , 1 , 2 ] , data , 'total_critical_alerts' )
136+ renderLineCharts ( grid , screen , 'Total high alerts' , [ 0 , 2 , 1 , 2 ] , data , 'total_high_alerts' )
137+ renderLineCharts ( grid , screen , 'Total critical alerts added to main' , [ 1 , 0 , 1 , 2 ] , data , 'total_critical_added' )
138+ renderLineCharts ( grid , screen , 'Total high alerts added to main' , [ 1 , 2 , 1 , 2 ] , data , 'total_high_added' )
139+ renderLineCharts ( grid , screen , 'Total critical alerts prevented from main' , [ 2 , 0 , 1 , 2 ] , data , 'total_critical_prevented' )
140+ renderLineCharts ( grid , screen , 'Total high alerts prevented from main' , [ 2 , 2 , 1 , 2 ] , data , 'total_high_prevented' )
163141
164142 const bar = grid . set ( 3 , 0 , 1 , 2 , contrib . bar ,
165143 { label : 'Top 5 alert types'
166144 , barWidth : 10
167- , barSpacing : 20
145+ , barSpacing : 17
168146 , xOffset : 0
169147 , maxHeight : 9 , barBgColor : 'magenta' } )
170148
@@ -192,48 +170,80 @@ async function fetchRepoAnalyticsData (repo: string, time: string, spinner: Ora,
192170 }
193171 spinner . stop ( )
194172
195- const formattedData = result . data . map ( d => {
196- const formattedDate = new Date ( d . created_at ) . toLocaleDateString ( )
197- return {
198- ...d ,
199- created_at : formattedDate ,
173+ const data = result . data . reduce ( ( acc : { [ key : string ] : any } , current ) => {
174+ const formattedDate = new Date ( current . created_at ) . toLocaleDateString ( )
175+
176+ if ( acc [ formattedDate ] ) {
177+ acc [ formattedDate ] . total_critical_alerts += current . total_critical_alerts
178+ acc [ formattedDate ] . total_high_alerts += current . total_high_alerts
179+ acc [ formattedDate ] . total_critical_added += current . total_critical_added
180+ acc [ formattedDate ] . total_high_added += current . total_high_added
181+ acc [ formattedDate ] . total_critical_prevented += current . total_critical_prevented
182+ acc [ formattedDate ] . total_high_prevented += current . total_high_prevented
183+ acc [ formattedDate ] . total_medium_prevented += current . total_medium_prevented
184+ acc [ formattedDate ] . total_low_prevented += current . total_low_prevented
185+ } else {
186+ acc [ formattedDate ] = current
187+ acc [ formattedDate ] . created_at = formattedDate
200188 }
201- } )
202- const data = { ...formattedData . flat ( 1 ) }
203-
204- const options = {
205- columns : [
206- { field : 'created_at' , name : chalk . cyan ( 'Date' ) } ,
207- { field : 'total_critical_alerts' , name : chalk . cyan ( 'Critical alerts' ) } ,
208- { field : 'total_high_alerts' , name : chalk . cyan ( 'High alerts' ) } ,
209- { field : 'total_critical_added' , name : chalk . cyan ( 'Critical alerts added' ) } ,
210- { field : 'total_high_added' , name : chalk . cyan ( 'High alerts added' ) } ,
211- { field : 'total_critical_prevented' , name : chalk . cyan ( 'Critical alerts prevented' ) } ,
212- { field : 'total_medium_prevented' , name : chalk . cyan ( 'Medium alerts prevented' ) } ,
213- { field : 'total_low_prevented' , name : chalk . cyan ( 'Low alerts prevented' ) } ,
214- ]
215- }
216189
217- console . log ( chalk . bgMagenta . white . bold ( `\n Analytics data for ${ repo } over the last ${ time } days: \n` ) )
218- console . log ( `${ chalkTable ( options , Object . values ( data ) ) } \n` )
219- }
190+ return acc
191+ } , { } )
192+
193+ const screen = blessed . screen ( )
194+ // eslint-disable-next-line
195+ const grid = new contrib . grid ( { rows : 4 , cols : 4 , screen} )
220196
197+ renderLineCharts ( grid , screen , 'Total critical alerts' , [ 0 , 0 , 1 , 2 ] , data , 'total_critical_alerts' )
198+ renderLineCharts ( grid , screen , 'Total high alerts' , [ 0 , 2 , 1 , 2 ] , data , 'total_high_alerts' )
199+ renderLineCharts ( grid , screen , 'Total critical alerts added to main' , [ 1 , 0 , 1 , 2 ] , data , 'total_critical_added' )
200+ renderLineCharts ( grid , screen , 'Total high alerts added to main' , [ 1 , 2 , 1 , 2 ] , data , 'total_high_added' )
201+ renderLineCharts ( grid , screen , 'Total critical alerts prevented from main' , [ 2 , 0 , 1 , 2 ] , data , 'total_critical_prevented' )
202+ renderLineCharts ( grid , screen , 'Total high alerts prevented from main' , [ 2 , 2 , 1 , 2 ] , data , 'total_high_prevented' )
221203
222- const renderLineCharts = ( grid : any , screen : any , title : string , coords : number [ ] , data : { [ key : string ] : { [ key : string ] : number | { } } } , label : string ) => {
204+ const bar = grid . set ( 3 , 0 , 1 , 2 , contrib . bar ,
205+ { label : 'Top 5 alert types'
206+ , barWidth : 10
207+ , barSpacing : 17
208+ , xOffset : 0
209+ , maxHeight : 9 , barBgColor : 'magenta' } )
210+
211+ screen . append ( bar ) //must append before setting data
212+
213+ const top5AlertTypes = Object . values ( data ) [ 0 ] . top_five_alert_types
214+
215+ bar . setData (
216+ { titles : Object . keys ( top5AlertTypes )
217+ , data : Object . values ( top5AlertTypes ) } )
218+
219+ screen . render ( )
220+
221+ screen . key ( [ 'escape' , 'q' , 'C-c' ] , function ( ) {
222+ return process . exit ( 0 ) ;
223+ } )
224+ }
225+
226+ const renderLineCharts = ( grid : any , screen : any , title : string , coords : number [ ] , data : { [ key : string ] : { [ key : string ] : number } } , label : string ) => {
223227 const formattedDates = Object . keys ( data ) . map ( d => `${ new Date ( d ) . getMonth ( ) + 1 } /${ new Date ( d ) . getDate ( ) } ` )
224228
225229 const alertsCounts = Object . values ( data ) . map ( d => d [ label ] )
226230
227231 const line = grid . set ( ...coords , contrib . line ,
228232 { style :
229- { line : "cyan"
230- , text : "cyan"
231- , baseline : "black" }
232- , xLabelPadding : 0
233- , xPadding : 0 ,
234- xOffset : 0 ,
235- legend : { width : 1 }
236- , label : title } )
233+ { line : "cyan" ,
234+ text : "cyan" ,
235+ baseline : "black"
236+ } ,
237+ xLabelPadding : 0 ,
238+ xPadding : 0 ,
239+ xOffset : 0 ,
240+ wholeNumbersOnly : true ,
241+ legend : {
242+ width : 1
243+ } ,
244+ label : title
245+ }
246+ )
237247
238248 screen . append ( line )
239249
0 commit comments