From fa5ec0998ae822c87ca36b3c1fb638a0e8d380cf Mon Sep 17 00:00:00 2001 From: SubPointSupport Date: Thu, 7 Feb 2019 09:19:01 +1100 Subject: [PATCH] appinsights minor updates --- uplift.core/src/Uplift.AppInsights.ps1 | 203 ++++++++++++++++++------- uplift.core/src/Uplift.Core.ps1 | 6 + 2 files changed, 152 insertions(+), 57 deletions(-) diff --git a/uplift.core/src/Uplift.AppInsights.ps1 b/uplift.core/src/Uplift.AppInsights.ps1 index f527f73..6a806e6 100644 --- a/uplift.core/src/Uplift.AppInsights.ps1 +++ b/uplift.core/src/Uplift.AppInsights.ps1 @@ -6,8 +6,8 @@ ) $logCmdNames = @( - "Write-BuildInfoMessage" - "Write-UpliftMessage" + "Write-BuildDebugMessage" + "Write-UpliftDebugMessage" "Write-Host" ) @@ -29,60 +29,74 @@ function Confirm-UpliftUpliftAppInsightClient { ) + if(Test-UpliftNoAppInsight -eq $True) { + Write-UpliftAppInsighsMessage "[+] Skipping AppInsight setup" + return + } + # https://vnextengineer.azurewebsites.net/powershell-application-insights/ - $hereFolder = $PSScriptRoot + try { + if($null -ne $script:UpliftAppInsightClient) { + return; + } - $packageVersion = $env:UPLF_APPINSIGHTS_PACKAGE_VERSION; - if( [String]::IsNullOrEmpty($packageVersion) -eq $True ) { $packageVersion = '2.9.0' } + $hereFolder = $PSScriptRoot - Write-UpliftAppInsighsMessage "Ensuring AppInsight setup: v$packageVersion" + $packageVersion = $env:UPLF_APPINSIGHTS_PACKAGE_VERSION; + if( [String]::IsNullOrEmpty($packageVersion) -eq $True ) { $packageVersion = '2.9.0' } - $appInsightPackageUrl = "https://www.nuget.org/api/v2/package/Microsoft.ApplicationInsights/$packageVersion" + Write-UpliftAppInsighsMessage "Ensuring AppInsight setup: v$packageVersion" - $appInsightFolderPath = Join-Path $hereFolder "build-utils" - [System.IO.Directory]::CreateDirectory($appInsightFolderPath) | Out-Null + $appInsightPackageUrl = "https://www.nuget.org/api/v2/package/Microsoft.ApplicationInsights/$packageVersion" - $appInsightPackageFolderPath = Join-Path $hereFolder "build-utils/microsoft.applicationinsights" - [System.IO.Directory]::CreateDirectory($appInsightPackageFolderPath) | Out-Null + $appInsightFolderPath = Join-Path $hereFolder "build-utils" + [System.IO.Directory]::CreateDirectory($appInsightFolderPath) | Out-Null - $appInsightFilePath = Join-Path $appInsightFolderPath "microsoft.applicationinsights.zip" + $appInsightPackageFolderPath = Join-Path $hereFolder "build-utils/microsoft.applicationinsights" + [System.IO.Directory]::CreateDirectory($appInsightPackageFolderPath) | Out-Null - # download package - if( (Test-Path $appInsightFilePath) -eq $False) { - Write-UpliftAppInsighsMessage "[~] downloading AppInsight package for the first time" - Write-UpliftAppInsighsMessage " - src: $appInsightPackageUrl" + $appInsightFilePath = Join-Path $appInsightFolderPath "microsoft.applicationinsights.zip" - Invoke-WebRequest -Uri $appInsightPackageUrl ` - -OutFile $appInsightFilePath ` - -MaximumRedirection 10 ` - -UseBasicParsing - } else { - Write-UpliftAppInsighsMessage "[+] AppInsight package exists" - } + # download package + if( (Test-Path $appInsightFilePath) -eq $False) { + Write-UpliftAppInsighsMessage "[~] downloading AppInsight package for the first time" + Write-UpliftAppInsighsMessage " - src: $appInsightPackageUrl" - # unpack package - if( (Get-ChildItem $appInsightPackageFolderPath | Measure-Object).count -eq 0) { - Write-UpliftAppInsighsMessage "[+] Extracting AppInsight package" - Expand-Archive -Path $appInsightFilePath ` - -DestinationPath $appInsightPackageFolderPath ` - -Force ` - | Out-Null - } else { - Write-UpliftAppInsighsMessage "[+] AppInsight package is unpacked" - } + Invoke-WebRequest -Uri $appInsightPackageUrl ` + -OutFile $appInsightFilePath ` + -MaximumRedirection 10 ` + -UseBasicParsing + } else { + Write-UpliftAppInsighsMessage "[+] AppInsight package exists" + } + + # unpack package + if( (Get-ChildItem $appInsightPackageFolderPath | Measure-Object).count -eq 0) { + Write-UpliftAppInsighsMessage "[+] Extracting AppInsight package" + Expand-Archive -Path $appInsightFilePath ` + -DestinationPath $appInsightPackageFolderPath ` + -Force ` + | Out-Null + } else { + Write-UpliftAppInsighsMessage "[+] AppInsight package is unpacked" + } - # load package - $appInsightAssemblyPath = "$appInsightPackageFolderPath\lib\netstandard1.3\Microsoft.ApplicationInsights.dll" - [Reflection.Assembly]::LoadFile($appInsightAssemblyPath) | Out-Null + # load package + $appInsightAssemblyPath = "$appInsightPackageFolderPath\lib\netstandard1.3\Microsoft.ApplicationInsights.dll" + [Reflection.Assembly]::LoadFile($appInsightAssemblyPath) | Out-Null - $key = $env:UPLF_APPINSIGHTS_KEY - if([String]::IsNullOrEmpty($value) -eq $True) { $key = 'c297a2cc-8194-46ac-bf6b-46edd4c7d2c9' } + $key = $env:UPLF_APPINSIGHTS_KEY + if([String]::IsNullOrEmpty($value) -eq $True) { $key = 'c297a2cc-8194-46ac-bf6b-46edd4c7d2c9' } - $client = New-Object "Microsoft.ApplicationInsights.TelemetryClient" - $client.InstrumentationKey = $key + $client = New-Object "Microsoft.ApplicationInsights.TelemetryClient" + $client.InstrumentationKey = $key - $script:UpliftAppInsightClient = $client + $script:UpliftAppInsightClient = $client + } catch { + Write-UpliftAppInsighsMessage "[!] Failed to prepare ApplicationInsights client" + Write-UpliftAppInsighsMessage "[!] $_" + } } function Test-UpliftNoAppInsight() @@ -100,15 +114,27 @@ function New-UpliftTrackEvent { $metrics = $null ) - if( Test-UpliftNoAppInsight -eq $True) { - Write-UpliftAppInsighsMessage "[+] Skipping AppInsight event: $eventName" - return; - } + try { + if( Test-UpliftNoAppInsight -eq $True) { + Write-UpliftAppInsighsMessage "[+] Skipping AppInsight event: $eventName" + return; + } - Write-UpliftAppInsighsMessage "[+] AppInsight event: $eventName" + Confirm-UpliftUpliftAppInsightClient - $UpliftAppInsightClient.TrackEvent($eventName, $properties, $metrics) - $UpliftAppInsightClient.Flush() + if($null -ne $UpliftAppInsightClient) { + Write-UpliftAppInsighsMessage "[+] AppInsight event: $eventName" + + $eventProps = New-UpliftAppInsighsProperties $properties + $eventMetrics = New-UpliftAppInsighsMetrics $metrics + + $UpliftAppInsightClient.TrackEvent($eventName, $eventProps, $eventMetrics) + $UpliftAppInsightClient.Flush() + } + } catch { + Write-UpliftAppInsighsMessage "[!] Failed to track ApplicationInsights event" + Write-UpliftAppInsighsMessage "[!] $_" + } } function New-UpliftTrackException { @@ -121,15 +147,27 @@ function New-UpliftTrackException { $metrics = $null ) - if( Test-UpliftNoAppInsight -eq $True) { - Write-UpliftAppInsighsMessage "[+] Skipping AppInsight event: $eventName" - return; - } + try { + if( Test-UpliftNoAppInsight -eq $True) { + Write-UpliftAppInsighsMessage "[+] Skipping AppInsight event: $eventName" + return; + } + + Confirm-UpliftUpliftAppInsightClient - Write-UpliftAppInsighsMessage "[+] AppInsight exception: $exception" + if($null -ne $UpliftAppInsightClient) { + Write-UpliftAppInsighsMessage "[+] AppInsight exception: $exception" - $UpliftAppInsightClient.TrackException($exception, $properties, $metrics) - $UpliftAppInsightClient.Flush() + $eventProps = New-UpliftAppInsighsProperties $properties + $eventMetrics = New-UpliftAppInsighsMetrics $metrics + + $UpliftAppInsightClient.TrackException($exception, $eventProps, $eventMetrics) + $UpliftAppInsightClient.Flush() + } + } catch { + Write-UpliftAppInsighsMessage "[!] Failed to track ApplicationInsights exception" + Write-UpliftAppInsighsMessage "[!] $_" + } } function New-UpliftAppInsighsProperties { @@ -142,8 +180,59 @@ function New-UpliftAppInsighsProperties { $result = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" - foreach ($entry in $hash.GetEnumerator()) { - $result.Add($entry.Key, $entry.Value); + if($null -eq $hash) { + + # empty dictionary + $result = $result; + + } elseif ($hash -is [System.Collections.Hashtable]) { + + # convert incoming powershell hash into dictionary + foreach ($entry in $hash.GetEnumerator()) { + $result.Add($entry.Key, $entry.Value); + } + + } elseif ($hash -is [System.Collections.Generic.Dictionary[[String],[String]]]) { + + # that's the right type already + $result = $hash + + } else { + throw "Cannont convert type into Dictionary, type was: $($hash.GetType())" + } + + return $result +} + +function New-UpliftAppInsighsMetrics { + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Scope="Function")] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope="Function")] + + param( + $hash = @{} + ) + + $result = New-Object "System.Collections.Generic.Dictionary[[String],[Double]]" + + if($null -eq $hash) { + + # empty dictionary + $result = $result; + + } elseif($hash -is [System.Collections.Hashtable]) { + + # convert incoming powershell hash into dictionary + foreach ($entry in $hash.GetEnumerator()) { + $result.Add($entry.Key, $entry.Value); + } + + } elseif ($hash -is [System.Collections.Generic.Dictionary[[String],[Double]]]) { + + # that's the right type already + $result = $hash + + } else { + throw "Cannont convert type into Dictionary, type was: $($hash.GetType())" } return $result diff --git a/uplift.core/src/Uplift.Core.ps1 b/uplift.core/src/Uplift.Core.ps1 index c4a7989..5724513 100644 --- a/uplift.core/src/Uplift.Core.ps1 +++ b/uplift.core/src/Uplift.Core.ps1 @@ -24,6 +24,12 @@ function Write-UpliftMessage { if($level -eq "ERROR") { $messageColor = "Red" } if($level -eq "WARN") { $messageColor = "Yellow" } + if($ENV:UPLF_LOG_LEVEL -ne "DEBUG") { + if($level -eq "DEBUG" -or $level -eq "VERBOSE") { + return; + } + } + $level = $level.PadRight(7) # use [environment]::UserDomainName / [environment]::UserName