Skip to content

Commit aa94115

Browse files
EzzhevNikitaAlexander Smolyakov
and
Alexander Smolyakov
authored
Added telemetry for MSBuildV1 task (microsoft#15512)
* Added telemetry for MSBuildV1 task * Remove extra code * Move to stopwatch from meaure-command * Resolved comments * Bumped XamarinAndroid version * Fix test * Fix VSBuild tests * Add missed semicolon Co-authored-by: Alexander Smolyakov <[email protected]> * Change let to const * Bump Xamarin android Co-authored-by: Alexander Smolyakov <[email protected]>
1 parent b493386 commit aa94115

15 files changed

+128
-14
lines changed

Tasks/Common/MSBuildHelpers/MSBuildHelpers.psm1

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Import-VstsLocStrings "$PSScriptRoot\module.json"
44
. $PSScriptRoot\ArgumentFunctions
55
. $PSScriptRoot\InvokeFunctions
66
. $PSScriptRoot\PathFunctions
7+
. $PSScriptRoot\TelemetryHelper
78
Export-ModuleMember -Function @(
89
# Argument functions.
910
'Format-MSBuildArguments'
@@ -14,4 +15,6 @@ Export-ModuleMember -Function @(
1415
'Get-SolutionFiles'
1516
'Get-VisualStudio'
1617
'Select-MSBuildPath'
18+
# Telemetry emiter
19+
'EmitTelemetry'
1720
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function EmitTelemetry {
2+
[CmdletBinding()]
3+
param(
4+
[Parameter(Mandatory = $true)]
5+
[PSCustomObject]$TelemetryPayload,
6+
[Parameter(Mandatory = $true)]
7+
[string]$TaskName)
8+
9+
try {
10+
Assert-VstsAgent -Minimum '2.120.0'
11+
12+
$telemetryJson = ConvertTo-Json $TelemetryPayload -Compress
13+
14+
Write-Host "##vso[telemetry.publish area=TaskHub;feature=$TaskName]$telemetryJson"
15+
} catch {
16+
Write-Verbose "Failed to publish java telemetry: $errors"
17+
}
18+
}

Tasks/MSBuildV1/MSBuild.ps1

+25-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22
param()
33

44
Trace-VstsEnteringInvocation $MyInvocation
5+
$msbuildTelemetry = [PSCustomObject]@{
6+
MSBuildVersion = ""
7+
MSBuildArguments = ""
8+
MSBuildLocationMethod = ""
9+
Platform = ""
10+
Configuration = ""
11+
MSBuildExecutionTimeSeconds = ""
12+
}
13+
14+
# Import the helpers.
15+
Import-Module -Name $PSScriptRoot\ps_modules\MSBuildHelpers\MSBuildHelpers.psm1
16+
517
try {
618
Import-VstsLocStrings "$PSScriptRoot\Task.json"
719

@@ -24,8 +36,11 @@ try {
2436
[string]$msBuildVersion = Get-VstsInput -Name MSBuildVersion
2537
[string]$msBuildArchitecture = Get-VstsInput -Name MSBuildArchitecture
2638

27-
# Import the helpers.
28-
Import-Module -Name $PSScriptRoot\ps_modules\MSBuildHelpers\MSBuildHelpers.psm1
39+
$msbuildTelemetry.MSBuildVersion = "$msBuildVersion"
40+
$msbuildTelemetry.MSBuildArguments = "$msBuildArguments"
41+
$msbuildTelemetry.MSBuildLocationMethod = "$msBuildLocationMethod"
42+
$msbuildTelemetry.Platform = "$platform"
43+
$msbuildTelemetry.Configuration = "$configuration"
2944

3045
# Resolve match patterns.
3146
$solutionFiles = Get-SolutionFiles -Solution $solution
@@ -44,7 +59,14 @@ try {
4459
$global:ErrorActionPreference = 'Continue'
4560

4661
# Build each solution.
62+
$stopwatch = New-Object System.Diagnostics.Stopwatch
63+
$stopwatch.Start()
64+
4765
Invoke-BuildTools -NuGetRestore:$restoreNuGetPackages -SolutionFiles $solutionFiles -MSBuildLocation $msBuildLocation -MSBuildArguments $msBuildArguments -Clean:$clean -NoTimelineLogger:(!$logProjectEvents) -CreateLogFile:$createLogFile -LogFileVerbosity:$logFileVerbosity
66+
67+
$stopwatch.Stop()
68+
$msbuildTelemetry.MSBuildExecutionTimeSeconds = $stopwatch.ElapsedMilliseconds / 1000
4869
} finally {
70+
EmitTelemetry -TelemetryPayload $msbuildTelemetry -TaskName "MSBuildV1"
4971
Trace-VstsLeavingInvocation $MyInvocation
50-
}
72+
}

Tasks/MSBuildV1/Tests/PassesArguments.ps1

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ param()
66
Register-Mock Trace-VstsEnteringInvocation
77
Register-Mock Trace-VstsLeavingInvocation
88
Register-Mock Import-VstsLocStrings
9+
Register-Mock EmitTelemetry
910
$variableSets = @(
1011
@{ Clean = $false ; MaximumCpuCount = $false ; RestoreNugetPackages = $false ; LogProjectEvents = $false ; CreateLogFile = $false ; LogFileVerbosity = '' ; Debug = $false }
1112
@{ Clean = $false ; MaximumCpuCount = $false ; RestoreNugetPackages = $false ; LogProjectEvents = $false ; CreateLogFile = $true ; LogFileVerbosity = '' ; Debug = $false }

Tasks/MSBuildV1/msbuild.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import path = require('path');
22
import tl = require('azure-pipelines-task-lib/task');
33
import { ToolRunner } from 'azure-pipelines-task-lib/toolrunner';
44
import msbuildHelpers = require('msbuildhelpers/msbuildhelpers');
5+
import { TelemetryPayload, emitTelemetry } from './telemetryHelper';
56

67
async function run() {
8+
const telemetry = {} as TelemetryPayload;
79
try {
810
tl.setResourcePath(path.join(__dirname, 'task.json'));
911

@@ -14,6 +16,11 @@ async function run() {
1416
let msbuildArguments: string = tl.getInput('msbuildArguments');
1517
let clean: boolean = tl.getBoolInput('clean');
1618

19+
// pass inputs to telemetry object
20+
telemetry.configuration = configuration;
21+
telemetry.platform = platform;
22+
telemetry.msBuildArguments = msbuildArguments;
23+
1724
let logsolutionEvents: boolean = tl.getBoolInput('logsolutionEvents');
1825
if (logsolutionEvents) {
1926
tl.warning(tl.loc('RecordProjectDetailsOnlySupportedOnWindows'));
@@ -28,15 +35,17 @@ async function run() {
2835
if (!msbuildLocationMethod) {
2936
msbuildLocationMethod = 'version';
3037
}
38+
telemetry.msBuildLocationMethod = msbuildLocationMethod;
3139

3240
let msbuildTool: string;
3341
if (msbuildLocationMethod === 'version') {
3442
let msbuildVersion: string = tl.getInput('msbuildVersion');
43+
telemetry.msBuildVersion = msbuildVersion;
3544
msbuildTool = await msbuildHelpers.getMSBuildPath(msbuildVersion);
3645
}
3746
if (msbuildLocationMethod === 'location') {
3847
msbuildTool = tl.getInput('msbuildLocation');
39-
}
48+
}
4049

4150
let filesList: string[] = tl.findMatch(null, solution, { followSymbolicLinks: false, followSpecifiedSymbolicLink: false, allowBrokenSymbolicLinks: false }, { matchBase: true });
4251
for (let file of filesList) {
@@ -59,10 +68,18 @@ async function run() {
5968
if (msbuildArguments) {
6069
buildTool.line(msbuildArguments);
6170
}
71+
72+
const startExecTime = new Date().getTime();
6273
await buildTool.exec();
74+
const endExecTime = new Date().getTime();
75+
76+
const executionTime = (endExecTime - startExecTime) / 1000; // need to convert from milliseconds to seconds
77+
telemetry.msbuildExectionTimeSeconds = executionTime;
6378
}
6479
} catch (err) {
6580
tl.setResult(tl.TaskResult.Failed, err);
81+
} finally {
82+
emitTelemetry(telemetry);
6683
}
6784
}
6885

Tasks/MSBuildV1/task.loc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,4 @@
188188
"CreateLogFileOnlySupportedOnWindows": "ms-resource:loc.messages.CreateLogFileOnlySupportedOnWindows",
189189
"MSB_BuildToolNotFound": "ms-resource:loc.messages.MSB_BuildToolNotFound"
190190
}
191-
}
191+
}

Tasks/MSBuildV1/telemetryHelper.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import tl = require('azure-pipelines-task-lib/task');
2+
import * as semver from 'semver';
3+
4+
export interface TelemetryPayload {
5+
msBuildVersion: string;
6+
msBuildArguments: string;
7+
msBuildLocationMethod: string;
8+
platform: string;
9+
configuration: string;
10+
msbuildExectionTimeSeconds: number;
11+
}
12+
13+
export function emitTelemetry(telemetryData: TelemetryPayload) {
14+
try {
15+
let agentVersion = tl.getVariable('Agent.Version');
16+
if (semver.gte(agentVersion, '2.120.0')) {
17+
let telemetry = JSON.stringify(telemetryData);
18+
19+
console.log(`##vso[telemetry.publish area=TaskHub;feature=MSBuildV1]${telemetry}`);
20+
} else {
21+
tl.debug(`Agent version of ( ${agentVersion} ) does not meet minimum requirements for telemetry`);
22+
}
23+
} catch (err) {
24+
tl.debug(`Unable to log telemetry. Err:( ${err} )`);
25+
}
26+
}

Tasks/VSBuildV1/Tests/MapsVSVersions.ps1

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Register-Mock Get-VstsTaskVariable { $false } -- -Name System.Debug -AsBool
77
Register-Mock Get-SolutionFiles
88
Register-Mock Format-MSBuildArguments
99
Register-Mock Invoke-BuildTools
10+
Register-Mock EmitTelemetry
1011
$mappings = @(
1112
@{ VSVersion = '' ; MSBuildVersion = '14.0' }
1213
@{ VSVersion = '17.0' ; MSBuildVersion = '17.0' }

Tasks/VSBuildV1/Tests/PassesArguments.ps1

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ foreach ($variableSet in $variableSets) {
2323
Unregister-Mock Select-MSBuildPath
2424
Unregister-Mock Format-MSBuildArguments
2525
Unregister-Mock Invoke-BuildTools
26+
Register-Mock EmitTelemetry
2627
Register-Mock Get-VstsInput { $variableSet.VSVersion } -- -Name VSVersion
2728
Register-Mock Get-VstsInput { 'Some input architecture' } -- -Name MSBuildArchitecture
2829
Register-Mock Get-VstsInput { 'Some input arguments' } -- -Name MSBuildArgs

Tasks/VSBuildV1/Tests/ThrowsIfUnknownVSVersion.ps1

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ param()
44
# Arrange.
55
. $PSScriptRoot\..\..\..\Tests\lib\Initialize-Test.ps1
66
Register-Mock Get-SolutionFiles
7+
Register-Mock EmitTelemetry
78
Register-Mock Get-VstsInput { '14.0' } -- -Name VSVersion
89
Register-Mock Get-VstsInput { 'Some input architecture' } -- -Name MSBuildArchitecture
910
Register-Mock Get-VstsInput { 'Some input arguments' } -- -Name MSBuildArgs

Tasks/VSBuildV1/Tests/WarnsIfDeprecatedInputSpecified.ps1

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Register-Mock Select-MSBuildPath
2222
Register-Mock Format-MSBuildArguments
2323
Register-Mock Invoke-BuildTools { 'Some build output' }
2424
Register-Mock Write-Warning
25+
Register-Mock EmitTelemetry
2526

2627
# Act.
2728
$output = & $PSScriptRoot\..\VSBuild.ps1

Tasks/VSBuildV1/VSBuild.ps1

+28-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22
param()
33

44
Trace-VstsEnteringInvocation $MyInvocation
5+
$vsBuildTelemetry = [PSCustomObject]@{
6+
VsVersion = ""
7+
MSBuildArguments = ""
8+
CustomVersion = ""
9+
Platform = ""
10+
Configuration = ""
11+
MSBuildExecutionTimeSeconds = ""
12+
}
13+
14+
# Import the helpers.
15+
. $PSScriptRoot\Get-VSPath.ps1
16+
. $PSScriptRoot\Select-VSVersion.ps1
17+
Import-Module -Name $PSScriptRoot\ps_modules\MSBuildHelpers\MSBuildHelpers.psm1
18+
519
try {
620
Import-VstsLocStrings "$PSScriptRoot\Task.json"
721

@@ -40,10 +54,12 @@ try {
4054
$msBuildVersion = $null
4155
}
4256

43-
# Import the helpers.
44-
. $PSScriptRoot\Get-VSPath.ps1
45-
. $PSScriptRoot\Select-VSVersion.ps1
46-
Import-Module -Name $PSScriptRoot\ps_modules\MSBuildHelpers\MSBuildHelpers.psm1
57+
$vsBuildTelemetry.VsVersion = "$vsVersion"
58+
$vsBuildTelemetry.MSBuildArguments = "$msBuildArgs"
59+
$vsBuildTelemetry.CustomVersion = "$customVersion"
60+
$vsBuildTelemetry.Platform = "$platform"
61+
$vsBuildTelemetry.Configuration = "$configuration"
62+
$vsBuildTelemetry.MSBuildExecutionTimeSeconds = ""
4763

4864
# Resolve match patterns.
4965
$solutionFiles = Get-SolutionFiles -Solution $Solution
@@ -53,7 +69,7 @@ try {
5369
$vsVersion = Select-VSVersion -PreferredVersion $customVersion
5470
} else {
5571
$vsVersion = Select-VSVersion -PreferredVersion $vsVersion
56-
}
72+
}
5773

5874
# Translate to MSBuild version.
5975
$msBuildVersion = $null;
@@ -82,8 +98,15 @@ try {
8298
# "Write-VstsSetResult" on nuget.exe/msbuild.exe failure.
8399
$global:ErrorActionPreference = 'Continue'
84100

101+
$stopwatch = New-Object System.Diagnostics.Stopwatch
102+
$stopwatch.Start()
103+
85104
# Build each solution.
86105
Invoke-BuildTools -NuGetRestore:$RestoreNuGetPackages -SolutionFiles $solutionFiles -MSBuildLocation $MSBuildLocation -MSBuildArguments $MSBuildArgs -Clean:$Clean -NoTimelineLogger:(!$LogProjectEvents) -CreateLogFile:$createLogFile -LogFileVerbosity:$logFileVerbosity -IsDefaultLoggerEnabled:$enableDefaultLogger
106+
107+
$stopwatch.Stop()
108+
$vsBuildTelemetry.MSBuildExecutionTimeSeconds = $stopwatch.ElapsedMilliseconds / 1000
87109
} finally {
110+
EmitTelemetry -TelemetryPayload $vsBuildTelemetry -TaskName "VSBuildV1"
88111
Trace-VstsLeavingInvocation $MyInvocation
89112
}

Tasks/VSBuildV1/task.loc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,4 @@
186186
"VSVersion0NotFoundFallbackVersion1": "ms-resource:loc.messages.VSVersion0NotFoundFallbackVersion1",
187187
"VSVersion15NotFound": "ms-resource:loc.messages.VSVersion15NotFound"
188188
}
189-
}
189+
}

Tasks/XamarinAndroidV1/task.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"version": {
1414
"Major": 1,
1515
"Minor": 197,
16-
"Patch": 0
16+
"Patch": 1
1717
},
1818
"demands": [
1919
"MSBuild",

Tasks/XamarinAndroidV1/task.loc.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"version": {
1414
"Major": 1,
1515
"Minor": 197,
16-
"Patch": 0
16+
"Patch": 1
1717
},
1818
"demands": [
1919
"MSBuild",
@@ -253,4 +253,4 @@
253253
"XamarinAndroidSucceeded": "ms-resource:loc.messages.XamarinAndroidSucceeded",
254254
"MSB_BuildToolNotFound": "ms-resource:loc.messages.MSB_BuildToolNotFound"
255255
}
256-
}
256+
}

0 commit comments

Comments
 (0)