11// Licensed to the .NET Foundation under one or more agreements.
22// The .NET Foundation licenses this file to you under the MIT license.
33
4- #nullable disable
5-
64using System . Globalization ;
75using Microsoft . Build . Framework ;
86using Microsoft . DotNet . Cli . Telemetry ;
@@ -15,7 +13,7 @@ public sealed class MSBuildLogger : INodeLogger
1513{
1614 private readonly IFirstTimeUseNoticeSentinel _sentinel =
1715 new FirstTimeUseNoticeSentinel ( ) ;
18- private readonly ITelemetry _telemetry ;
16+ private readonly ITelemetry ? _telemetry = null ;
1917
2018 internal const string TargetFrameworkTelemetryEventName = "targetframeworkeval" ;
2119 internal const string BuildTelemetryEventName = "build" ;
@@ -54,7 +52,7 @@ public MSBuildLogger()
5452 {
5553 try
5654 {
57- string sessionId =
55+ string ? sessionId =
5856 Environment . GetEnvironmentVariable ( MSBuildForwardingApp . TelemetrySessionIdEnvironmentVariableName ) ;
5957
6058 if ( sessionId != null )
@@ -105,34 +103,13 @@ public void Initialize(IEventSource eventSource)
105103 }
106104 }
107105
108- internal static void FormatAndSend ( ITelemetry telemetry , TelemetryEventArgs args )
106+ internal static void FormatAndSend ( ITelemetry ? telemetry , TelemetryEventArgs args )
109107 {
110108 switch ( args . EventName )
111109 {
112110 case TargetFrameworkTelemetryEventName :
113- {
114- var newEventName = $ "msbuild/{ TargetFrameworkTelemetryEventName } ";
115- Dictionary < string , string > maskedProperties = [ ] ;
116-
117- foreach ( var key in new [ ] {
118- TargetFrameworkVersionTelemetryPropertyKey ,
119- RuntimeIdentifierTelemetryPropertyKey ,
120- SelfContainedTelemetryPropertyKey ,
121- UseApphostTelemetryPropertyKey ,
122- OutputTypeTelemetryPropertyKey ,
123- UseArtifactsOutputTelemetryPropertyKey ,
124- ArtifactsPathLocationTypeTelemetryPropertyKey
125- } )
126- {
127- if ( args . Properties . TryGetValue ( key , out string value ) )
128- {
129- maskedProperties . Add ( key , Sha256Hasher . HashWithNormalizedCasing ( value ) ) ;
130- }
131- }
132-
133- telemetry . TrackEvent ( newEventName , maskedProperties , measurements : null ) ;
134- break ;
135- }
111+ TrackEvent ( telemetry , $ "msbuild/{ TargetFrameworkTelemetryEventName } ", args . Properties , [ ] , [ ] ) ;
112+ break ;
136113 case BuildTelemetryEventName :
137114 TrackEvent ( telemetry , $ "msbuild/{ BuildTelemetryEventName } ", args . Properties ,
138115 toBeHashed : [ "ProjectPath" , "BuildTarget" ] ,
@@ -174,33 +151,44 @@ internal static void FormatAndSend(ITelemetry telemetry, TelemetryEventArgs args
174151 }
175152 }
176153
177- private static void TrackEvent ( ITelemetry telemetry , string eventName , IDictionary < string , string > eventProperties , string [ ] toBeHashed , string [ ] toBeMeasured )
154+ private static void TrackEvent ( ITelemetry ? telemetry , string eventName , IDictionary < string , string ? > eventProperties , string [ ] ? toBeHashed , string [ ] ? toBeMeasured )
178155 {
179- Dictionary < string , string > properties = null ;
180- Dictionary < string , double > measurements = null ;
156+ if ( telemetry == null || ! telemetry . Enabled )
157+ {
158+ return ;
159+ }
160+
161+ Dictionary < string , string ? > ? properties = null ;
162+ Dictionary < string , double > ? measurements = null ;
181163
182- foreach ( var propertyToBeHashed in toBeHashed )
164+ if ( toBeHashed is not null )
183165 {
184- if ( eventProperties . TryGetValue ( propertyToBeHashed , out string value ) )
166+ foreach ( var propertyToBeHashed in toBeHashed )
185167 {
186- // Lets lazy allocate in case there is tons of telemetry
187- properties ??= new Dictionary < string , string > ( eventProperties ) ;
188- properties [ propertyToBeHashed ] = Sha256Hasher . HashWithNormalizedCasing ( value ) ;
168+ if ( eventProperties . TryGetValue ( propertyToBeHashed , out var value ) )
169+ {
170+ // Lets lazy allocate in case there is tons of telemetry
171+ properties ??= new Dictionary < string , string ? > ( eventProperties ) ;
172+ properties [ propertyToBeHashed ] = Sha256Hasher . HashWithNormalizedCasing ( value ! ) ;
173+ }
189174 }
190175 }
191176
192- foreach ( var propertyToBeMeasured in toBeMeasured )
177+ if ( toBeMeasured is not null )
193178 {
194- if ( eventProperties . TryGetValue ( propertyToBeMeasured , out string value ) )
179+ foreach ( var propertyToBeMeasured in toBeMeasured )
195180 {
196- // Lets lazy allocate in case there is tons of telemetry
197- properties ??= new Dictionary < string , string > ( eventProperties ) ;
198- properties . Remove ( propertyToBeMeasured ) ;
199- if ( double . TryParse ( value , CultureInfo . InvariantCulture , out double realValue ) )
181+ if ( eventProperties . TryGetValue ( propertyToBeMeasured , out string ? value ) )
200182 {
201183 // Lets lazy allocate in case there is tons of telemetry
202- measurements ??= [ ] ;
203- measurements [ propertyToBeMeasured ] = realValue ;
184+ properties ??= new Dictionary < string , string ? > ( eventProperties ) ;
185+ properties . Remove ( propertyToBeMeasured ) ;
186+ if ( double . TryParse ( value , CultureInfo . InvariantCulture , out double realValue ) )
187+ {
188+ // Lets lazy allocate in case there is tons of telemetry
189+ measurements ??= [ ] ;
190+ measurements [ propertyToBeMeasured ] = realValue ;
191+ }
204192 }
205193 }
206194 }
@@ -226,6 +214,5 @@ public void Shutdown()
226214 }
227215
228216 public LoggerVerbosity Verbosity { get ; set ; }
229-
230- public string Parameters { get ; set ; }
217+ public string ? Parameters { get ; set ; }
231218}
0 commit comments