@@ -18,12 +18,16 @@ import {LogFileWriter} from '../writers/LogWriter';
1818import { LogEventListener , LogEventLogger } from '../listeners/LogEventListener' ;
1919import { ProgressEventListener } from '../listeners/ProgressEventListener' ;
2020import { BundleName , getMessage } from '../messages' ;
21+ import { TelemetryEmitter } from "../Telemetry" ;
22+ import { TelemetryEventListener } from "../listeners/TelemetryEventListener" ;
23+ import * as Constants from '../../Constants' ;
2124
2225export type RunDependencies = {
2326 configFactory : CodeAnalyzerConfigFactory ;
2427 pluginsFactory : EnginePluginsFactory ;
2528 logEventListeners : LogEventListener [ ] ;
2629 progressListeners : ProgressEventListener [ ] ;
30+ telemetryEmitter : TelemetryEmitter ;
2731 writer : ResultsWriter ;
2832 resultsViewer : ResultsViewer ;
2933 actionSummaryViewer : RunActionSummaryViewer ;
@@ -56,6 +60,8 @@ export class RunAction {
5660 // LogEventListeners should start listening as soon as the Core is instantiated, since Core can start emitting
5761 // events they listen for basically immediately.
5862 this . dependencies . logEventListeners . forEach ( listener => listener . listen ( core ) ) ;
63+ const telemetryListener : TelemetryEventListener = new TelemetryEventListener ( this . dependencies . telemetryEmitter ) ;
64+ telemetryListener . listen ( core ) ;
5965 const enginePlugins = this . dependencies . pluginsFactory . create ( ) ;
6066 const enginePluginModules = config . getCustomEnginePluginModules ( ) ;
6167 const addEnginePromises : Promise < void > [ ] = [
@@ -71,10 +77,12 @@ export class RunAction {
7177 const ruleSelection : RuleSelection = await core . selectRules ( input [ 'rule-selector' ] , { workspace} ) ;
7278 const runOptions : RunOptions = { workspace} ;
7379 const results : RunResults = await core . run ( ruleSelection , runOptions ) ;
80+ this . emitEngineTelemetry ( ruleSelection , results , enginePlugins . flatMap ( p => p . getAvailableEngineNames ( ) ) ) ;
7481 // After Core is done running, the listeners need to be told to stop, since some of them have persistent UI elements
7582 // or file handlers that must be gracefully ended.
7683 this . dependencies . progressListeners . forEach ( listener => listener . stopListening ( ) ) ;
7784 this . dependencies . logEventListeners . forEach ( listener => listener . stopListening ( ) ) ;
85+ telemetryListener . stopListening ( ) ;
7886 this . dependencies . writer . write ( results ) ;
7987 this . dependencies . resultsViewer . view ( results ) ;
8088 this . dependencies . actionSummaryViewer . viewPostExecutionSummary ( results , logWriter . getLogDestination ( ) , input [ 'output-file' ] ) ;
@@ -88,6 +96,26 @@ export class RunAction {
8896 public static createAction ( dependencies : RunDependencies ) : RunAction {
8997 return new RunAction ( dependencies ) ;
9098 }
99+
100+ private emitEngineTelemetry ( ruleSelection : RuleSelection , results : RunResults , coreEngineNames : string [ ] ) : void {
101+ const selectedEngineNames : Set < string > = new Set ( ruleSelection . getEngineNames ( ) ) ;
102+ for ( const coreEngineName of coreEngineNames ) {
103+ if ( ! selectedEngineNames . has ( coreEngineName ) ) {
104+ continue ;
105+ }
106+ this . dependencies . telemetryEmitter . emitTelemetry ( 'RunAction' , Constants . TelemetryEventName , {
107+ sfcaEvent : Constants . CliTelemetryEvents . ENGINE_SELECTION ,
108+ engine : coreEngineName ,
109+ ruleCount : ruleSelection . getRulesFor ( coreEngineName ) . length
110+ } ) ;
111+
112+ this . dependencies . telemetryEmitter . emitTelemetry ( 'RunAction' , Constants . TelemetryEventName , {
113+ sfcaEvent : Constants . CliTelemetryEvents . ENGINE_EXECUTION ,
114+ engine : coreEngineName ,
115+ violationCount : results . getEngineRunResults ( coreEngineName ) . getViolationCount ( )
116+ } ) ;
117+ }
118+ }
91119}
92120
93121function throwErrorIfSevThresholdExceeded ( threshold : SeverityLevel , results : RunResults ) : void {
0 commit comments