Uplift.AppInsights.ps1
function Write-UpliftAppInsighsMessage { [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingWriteHost", "", Scope = "Function")] param( $message ) $logCmdNames = @( "Write-BuildInfoMessage" "Write-UpliftMessage" "Write-Host" ) foreach ($logCmdNames in $logCmdNames) { $logCmmd = Get-Command $logCmdNames -ErrorAction SilentlyContinue if($null -ne $logCmmd) { & $logCmmd.Name $message break; } } } function Confirm-UpliftUpliftAppInsightClient { [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Scope="Function")] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope="Function")] param( ) # https://vnextengineer.azurewebsites.net/powershell-application-insights/ $hereFolder = $PSScriptRoot $packageVersion = $env:UPLF_APPINSIGHTS_PACKAGE_VERSION; if( [String]::IsNullOrEmpty($packageVersion) -eq $True ) { $packageVersion = '2.9.0' } Write-UpliftAppInsighsMessage "Ensuring AppInsight setup: v$packageVersion" $appInsightPackageUrl = "https://www.nuget.org/api/v2/package/Microsoft.ApplicationInsights/$packageVersion" $appInsightFolderPath = Join-Path $hereFolder "build-utils" [System.IO.Directory]::CreateDirectory($appInsightFolderPath) | Out-Null $appInsightPackageFolderPath = Join-Path $hereFolder "build-utils/microsoft.applicationinsights" [System.IO.Directory]::CreateDirectory($appInsightPackageFolderPath) | Out-Null $appInsightFilePath = Join-Path $appInsightFolderPath "microsoft.applicationinsights.zip" # download package if( (Test-Path $appInsightFilePath) -eq $False) { Write-UpliftAppInsighsMessage "[~] downloading AppInsight package for the first time" Write-UpliftAppInsighsMessage " - src: $appInsightPackageUrl" 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 $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 $script:UpliftAppInsightClient = $client } function Test-UpliftNoAppInsight() { return ($null -ne $env:UPLF_NO_APPINSIGHT) } function New-UpliftTrackEvent { [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Scope="Function")] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope="Function")] param( $eventName, $properties = $null, $metrics = $null ) if( Test-UpliftNoAppInsight -eq $True) { Write-UpliftAppInsighsMessage "[+] Skipping AppInsight event: $eventName" return; } Write-UpliftAppInsighsMessage "[+] AppInsight event: $eventName" $UpliftAppInsightClient.TrackEvent($eventName, $properties, $metrics) $UpliftAppInsightClient.Flush() } function New-UpliftTrackException { [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Scope="Function")] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope="Function")] param( $exception, $properties = $null, $metrics = $null ) if( Test-UpliftNoAppInsight -eq $True) { Write-UpliftAppInsighsMessage "[+] Skipping AppInsight event: $eventName" return; } Write-UpliftAppInsighsMessage "[+] AppInsight exception: $exception" $UpliftAppInsightClient.TrackException($exception, $properties, $metrics) $UpliftAppInsightClient.Flush() } function New-UpliftAppInsighsProperties { [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSShouldProcess", "", Scope="Function")] [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "", Scope="Function")] param( $hash = @{} ) $result = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" foreach ($entry in $hash.GetEnumerator()) { $result.Add($entry.Key, $entry.Value); } return $result } |