Skip to content
This repository was archived by the owner on Mar 19, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 146 additions & 57 deletions uplift.core/src/Uplift.AppInsights.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
)

$logCmdNames = @(
"Write-BuildInfoMessage"
"Write-UpliftMessage"
"Write-BuildDebugMessage"
"Write-UpliftDebugMessage"
"Write-Host"
)

Expand All @@ -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()
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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<string,string>, 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<string,double>, type was: $($hash.GetType())"
}

return $result
Expand Down
6 changes: 6 additions & 0 deletions uplift.core/src/Uplift.Core.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down