1
1
// @ts -ignore
2
2
import blessed from 'blessed'
3
3
import contrib from 'blessed-contrib'
4
- import chalk from 'chalk'
5
- // @ts -ignore
6
- import chalkTable from 'chalk-table'
7
4
import meow from 'meow'
8
5
import ora from 'ora'
9
6
@@ -123,7 +120,6 @@ async function fetchOrgAnalyticsData (time: string, spinner: Ora, apiKey: string
123
120
acc [ formattedDate ] . total_high_prevented += current . total_high_prevented
124
121
acc [ formattedDate ] . total_medium_prevented += current . total_medium_prevented
125
122
acc [ formattedDate ] . total_low_prevented += current . total_low_prevented
126
- // acc[formattedDate].top_five_alert_types += current.top_five_alert_types
127
123
} else {
128
124
acc [ formattedDate ] = current
129
125
acc [ formattedDate ] . created_at = formattedDate
@@ -132,39 +128,21 @@ async function fetchOrgAnalyticsData (time: string, spinner: Ora, apiKey: string
132
128
return acc
133
129
} , { } )
134
130
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
-
153
131
const screen = blessed . screen ( )
154
132
// eslint-disable-next-line
155
133
const grid = new contrib . grid ( { rows : 4 , cols : 4 , screen} )
156
134
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' )
163
141
164
142
const bar = grid . set ( 3 , 0 , 1 , 2 , contrib . bar ,
165
143
{ label : 'Top 5 alert types'
166
144
, barWidth : 10
167
- , barSpacing : 20
145
+ , barSpacing : 17
168
146
, xOffset : 0
169
147
, maxHeight : 9 , barBgColor : 'magenta' } )
170
148
@@ -192,48 +170,80 @@ async function fetchRepoAnalyticsData (repo: string, time: string, spinner: Ora,
192
170
}
193
171
spinner . stop ( )
194
172
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
200
188
}
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
- }
216
189
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} )
220
196
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' )
221
203
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 ) => {
223
227
const formattedDates = Object . keys ( data ) . map ( d => `${ new Date ( d ) . getMonth ( ) + 1 } /${ new Date ( d ) . getDate ( ) } ` )
224
228
225
229
const alertsCounts = Object . values ( data ) . map ( d => d [ label ] )
226
230
227
231
const line = grid . set ( ...coords , contrib . line ,
228
232
{ 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
+ )
237
247
238
248
screen . append ( line )
239
249
0 commit comments