Skip to content

Commit

Permalink
Update Get-LMLogMessage.ps1
Browse files Browse the repository at this point in the history
  • Loading branch information
stevevillardi committed Feb 13, 2025
1 parent 6d2a441 commit bb36d78
Showing 1 changed file with 114 additions and 72 deletions.
186 changes: 114 additions & 72 deletions Public/Get-LMLogMessage.ps1
Original file line number Diff line number Diff line change
@@ -1,19 +1,30 @@
Function Get-LMLogMessage {

[CmdletBinding(DefaultParameterSetName = "Default")]
[CmdletBinding(DefaultParameterSetName = "Range-Async")]
Param (
[Parameter(Mandatory, ParameterSetName = 'Date-Sync')]
[Parameter(Mandatory, ParameterSetName = 'Date-Async')]
[Datetime]$StartDate,


[Parameter(Mandatory, ParameterSetName = 'Date-Sync')]
[Parameter(Mandatory, ParameterSetName = 'Date-Async')]
[Datetime]$EndDate,

[Parameter(ParameterSetName = 'Query')]

[String]$Query,

[ValidateSet("15min", "30min", "1hour", "3hour", "6hour", "12hour", "24hour", "3day", "7day", "1month", "custom")]

[Parameter(ParameterSetName = 'Range-Sync')]
[Parameter(ParameterSetName = 'Range-Async')]
[ValidateSet("15min", "30min", "1hour", "3hour", "6hour", "12hour", "24hour", "3day", "7day", "1month")]
[String]$Range = "15min",

[Int]$BatchSize = 300,


[Parameter(ParameterSetName = 'Date-Async')]
[Parameter(ParameterSetName = 'Range-Async')]
[Int]$MaxPages = 10,

[Parameter(ParameterSetName = 'Date-Async')]
[Parameter(ParameterSetName = 'Range-Async')]
[Switch]$Async
)
#Check if we are logged in and have valid api creds
Expand All @@ -27,70 +38,65 @@ Function Get-LMLogMessage {

#Convert to epoch, if not set use defaults
$CurrentTime = Get-Date
Switch ($Range) {
"15min" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddMinutes(-15))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"30min" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddMinutes(-30))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"1hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-1))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"3hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-3))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"6hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-6))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"12hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-12))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"24hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-1))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"3day" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-3))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"7day" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-7))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"1month" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-30))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"custom" {
$StartTime = ([DateTimeOffset]$($StartDate)).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($EndDate)).ToUnixTimeMilliseconds()
}
}

# Build the base query
$BaseQuery = "_partition=default"

# Add additional query parameters if specified
if ($Query) {
$BaseQuery += " $Query"
If ($StartDate -and $EndDate) {
$StartTime = ([DateTimeOffset]$($StartDate)).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($EndDate)).ToUnixTimeMilliseconds()
}
Else {
Switch ($Range) {
"15min" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddMinutes(-15))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"30min" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddMinutes(-30))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"1hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-1))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"3hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-3))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"6hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-6))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"12hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddHours(-12))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"24hour" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-1))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"3day" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-3))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"7day" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-7))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
"1month" {
$StartTime = ([DateTimeOffset]$($CurrentTime.AddDays(-30))).ToUnixTimeMilliseconds()
$EndTime = ([DateTimeOffset]$($CurrentTime)).ToUnixTimeMilliseconds()
}
}
}


# Build the payload
$Data = @{
meta = @{
isAsync = $Async.ToBool()
perPageCount = $BatchSize
queryId = $null
queryType = $null
filter = @{
query = $BaseQuery
query = $Query
range = @{
startAtMS = $StartTime
endAtMS = $EndTime
Expand All @@ -110,29 +116,49 @@ Function Get-LMLogMessage {
# Issue request
$Response = Invoke-RestMethod -Uri $Uri -Method "POST" -Headers $Headers[0] -WebSession $Headers[1] -Body $Body

If(!$Async) {
Return (Add-ObjectTypeInfo -InputObject $Response.data.byId.logs.PSObject.Properties.Value -TypeName "LogicMonitor.LMLogs")
If (!$Async) {
If ($Response.data.byId.logs.PSObject.Properties.Value) {
Return (Add-ObjectTypeInfo -InputObject $Response.data.byId.logs.PSObject.Properties.Value -TypeName "LogicMonitor.LMLogs")
}
Else {
Write-Information "No results found for query ($($Query))"
Return
}
}

# Handle async response
If ($Response.meta.queryId -and $Response.meta.progress -eq 0) {
If ($Response.meta.queryId -and $Response.meta.progress -ne 1) {
$QueryId = $Response.meta.queryId
$Complete = $false
$Results = @()

$Cursor = $null
$Page = 0
# Poll for completion
While (!$Complete) {
$CompletionPercentage = [Math]::Round($Response.meta.progress * 100, 2)
Write-Information "Log message query ($($QueryId)) is running, this may take some time. First pass scan $CompletionPercentage% complete, working on page $($Page) of results."
Start-Sleep -Seconds 2

# Build the payload
$Data = @{
meta = @{
isAsync = $Async.ToBool()
perPageCount = $BatchSize
queryType = "raw"
queryType = "raw"
queryId = $QueryId
}
}
#cursor is used to build the pagination, using the chunk path and index to build the cursor on the next bucket that needs to be scanned
If ($Cursor) {
$Data.meta.cursor = $Cursor
$Data.meta.filter = @{
query = $Query
range = @{
startAtMS = $StartTime
endAtMS = $EndTime
}
}
}

$Body = $Data | ConvertTo-Json -Depth 10

Expand All @@ -144,13 +170,29 @@ Function Get-LMLogMessage {
# Issue request
$Response = Invoke-RestMethod -Uri $Uri -Method "POST" -Headers $Headers[0] -WebSession $Headers[1] -Body $Body

$Results += $Response.data.byId.logs.PSObject.Properties.Value

If($Response.meta.progress -eq 1) {
$Complete = $true
If ($Response.meta.progress -eq 1) {
If ($Response.data.byId.logs.PSObject.Properties.Value) {
$Results += $Response.data.byId.logs.PSObject.Properties.Value
$Cursor = $Response.meta.cursor
$Page++
}
If ($Response.meta.isLastPage -eq $true -or $Page -ge $MaxPages) {
$Complete = $true
}
}
}
If ($Results) {
If ($Page -eq $MaxPages) {
Write-Information "Max pages reached, stopping query. If you need more results, try increasing the MaxPages parameter."
}
Return (Add-ObjectTypeInfo -InputObject $Results -TypeName "LogicMonitor.LMLogs")
}
Return (Add-ObjectTypeInfo -InputObject $Results -TypeName "LogicMonitor.LMLogs")
Else {
Write-Information "No results found for query ($($QueryId))"
}
}
Else {
Write-Error "Error getting log messages: $($Response)"
}
}
Catch [Exception] {
Expand Down

0 comments on commit bb36d78

Please sign in to comment.