11Function Get-LMLogMessage {
22
3- [CmdletBinding (DefaultParameterSetName = " Default " )]
3+ [CmdletBinding (DefaultParameterSetName = " Range-Async " )]
44 Param (
5+ [Parameter (Mandatory , ParameterSetName = ' Date-Sync' )]
6+ [Parameter (Mandatory , ParameterSetName = ' Date-Async' )]
57 [Datetime ]$StartDate ,
6-
8+
9+ [Parameter (Mandatory , ParameterSetName = ' Date-Sync' )]
10+ [Parameter (Mandatory , ParameterSetName = ' Date-Async' )]
711 [Datetime ]$EndDate ,
8-
9- [Parameter (ParameterSetName = ' Query' )]
12+
1013 [String ]$Query ,
11-
12- [ValidateSet (" 15min" , " 30min" , " 1hour" , " 3hour" , " 6hour" , " 12hour" , " 24hour" , " 3day" , " 7day" , " 1month" , " custom" )]
14+
15+ [Parameter (ParameterSetName = ' Range-Sync' )]
16+ [Parameter (ParameterSetName = ' Range-Async' )]
17+ [ValidateSet (" 15min" , " 30min" , " 1hour" , " 3hour" , " 6hour" , " 12hour" , " 24hour" , " 3day" , " 7day" , " 1month" )]
1318 [String ]$Range = " 15min" ,
14-
19+
1520 [Int ]$BatchSize = 300 ,
16-
21+
22+ [Parameter (ParameterSetName = ' Date-Async' )]
23+ [Parameter (ParameterSetName = ' Range-Async' )]
24+ [Int ]$MaxPages = 10 ,
25+
26+ [Parameter (ParameterSetName = ' Date-Async' )]
27+ [Parameter (ParameterSetName = ' Range-Async' )]
1728 [Switch ]$Async
1829 )
1930 # Check if we are logged in and have valid api creds
@@ -27,70 +38,65 @@ Function Get-LMLogMessage {
2738
2839 # Convert to epoch, if not set use defaults
2940 $CurrentTime = Get-Date
30- Switch ($Range ) {
31- " 15min" {
32- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddMinutes (-15 ))).ToUnixTimeMilliseconds()
33- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
34- }
35- " 30min" {
36- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddMinutes (-30 ))).ToUnixTimeMilliseconds()
37- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
38- }
39- " 1hour" {
40- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-1 ))).ToUnixTimeMilliseconds()
41- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
42- }
43- " 3hour" {
44- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-3 ))).ToUnixTimeMilliseconds()
45- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
46- }
47- " 6hour" {
48- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-6 ))).ToUnixTimeMilliseconds()
49- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
50- }
51- " 12hour" {
52- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-12 ))).ToUnixTimeMilliseconds()
53- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
54- }
55- " 24hour" {
56- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-1 ))).ToUnixTimeMilliseconds()
57- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
58- }
59- " 3day" {
60- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-3 ))).ToUnixTimeMilliseconds()
61- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
62- }
63- " 7day" {
64- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-7 ))).ToUnixTimeMilliseconds()
65- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
66- }
67- " 1month" {
68- $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-30 ))).ToUnixTimeMilliseconds()
69- $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
70- }
71- " custom" {
72- $StartTime = ([DateTimeOffset ]$ ($StartDate )).ToUnixTimeMilliseconds()
73- $EndTime = ([DateTimeOffset ]$ ($EndDate )).ToUnixTimeMilliseconds()
74- }
75- }
7641
77- # Build the base query
78- $BaseQuery = " _partition=default"
79-
80- # Add additional query parameters if specified
81- if ($Query ) {
82- $BaseQuery += " $Query "
42+ If ($StartDate -and $EndDate ) {
43+ $StartTime = ([DateTimeOffset ]$ ($StartDate )).ToUnixTimeMilliseconds()
44+ $EndTime = ([DateTimeOffset ]$ ($EndDate )).ToUnixTimeMilliseconds()
45+ }
46+ Else {
47+ Switch ($Range ) {
48+ " 15min" {
49+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddMinutes (-15 ))).ToUnixTimeMilliseconds()
50+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
51+ }
52+ " 30min" {
53+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddMinutes (-30 ))).ToUnixTimeMilliseconds()
54+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
55+ }
56+ " 1hour" {
57+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-1 ))).ToUnixTimeMilliseconds()
58+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
59+ }
60+ " 3hour" {
61+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-3 ))).ToUnixTimeMilliseconds()
62+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
63+ }
64+ " 6hour" {
65+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-6 ))).ToUnixTimeMilliseconds()
66+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
67+ }
68+ " 12hour" {
69+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddHours (-12 ))).ToUnixTimeMilliseconds()
70+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
71+ }
72+ " 24hour" {
73+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-1 ))).ToUnixTimeMilliseconds()
74+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
75+ }
76+ " 3day" {
77+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-3 ))).ToUnixTimeMilliseconds()
78+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
79+ }
80+ " 7day" {
81+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-7 ))).ToUnixTimeMilliseconds()
82+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
83+ }
84+ " 1month" {
85+ $StartTime = ([DateTimeOffset ]$ ($CurrentTime.AddDays (-30 ))).ToUnixTimeMilliseconds()
86+ $EndTime = ([DateTimeOffset ]$ ($CurrentTime )).ToUnixTimeMilliseconds()
87+ }
88+ }
8389 }
84-
8590
8691 # Build the payload
8792 $Data = @ {
8893 meta = @ {
8994 isAsync = $Async.ToBool ()
9095 perPageCount = $BatchSize
9196 queryId = $null
97+ queryType = $null
9298 filter = @ {
93- query = $BaseQuery
99+ query = $Query
94100 range = @ {
95101 startAtMS = $StartTime
96102 endAtMS = $EndTime
@@ -110,29 +116,49 @@ Function Get-LMLogMessage {
110116 # Issue request
111117 $Response = Invoke-RestMethod - Uri $Uri - Method " POST" - Headers $Headers [0 ] - WebSession $Headers [1 ] - Body $Body
112118
113- If (! $Async ) {
114- Return (Add-ObjectTypeInfo - InputObject $Response.data.byId.logs.PSObject.Properties.Value - TypeName " LogicMonitor.LMLogs" )
119+ If (! $Async ) {
120+ If ($Response.data.byId.logs.PSObject.Properties.Value ) {
121+ Return (Add-ObjectTypeInfo - InputObject $Response.data.byId.logs.PSObject.Properties.Value - TypeName " LogicMonitor.LMLogs" )
122+ }
123+ Else {
124+ Write-Information " No results found for query ($ ( $Query ) )"
125+ Return
126+ }
115127 }
116128
117129 # Handle async response
118- If ($Response.meta.queryId -and $Response.meta.progress -eq 0 ) {
130+ If ($Response.meta.queryId -and $Response.meta.progress -ne 1 ) {
119131 $QueryId = $Response.meta.queryId
120132 $Complete = $false
121133 $Results = @ ()
122-
134+ $Cursor = $null
135+ $Page = 0
123136 # Poll for completion
124137 While (! $Complete ) {
138+ $CompletionPercentage = [Math ]::Round($Response.meta.progress * 100 , 2 )
139+ Write-Information " Log message query ($ ( $QueryId ) ) is running, this may take some time. First pass scan $CompletionPercentage % complete, working on page $ ( $Page ) of results."
125140 Start-Sleep - Seconds 2
126141
127142 # Build the payload
128143 $Data = @ {
129144 meta = @ {
130145 isAsync = $Async.ToBool ()
131146 perPageCount = $BatchSize
132- queryType = " raw"
147+ queryType = " raw"
133148 queryId = $QueryId
134149 }
135150 }
151+ # 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
152+ If ($Cursor ) {
153+ $Data.meta.cursor = $Cursor
154+ $Data.meta.filter = @ {
155+ query = $Query
156+ range = @ {
157+ startAtMS = $StartTime
158+ endAtMS = $EndTime
159+ }
160+ }
161+ }
136162
137163 $Body = $Data | ConvertTo-Json - Depth 10
138164
@@ -144,13 +170,29 @@ Function Get-LMLogMessage {
144170 # Issue request
145171 $Response = Invoke-RestMethod - Uri $Uri - Method " POST" - Headers $Headers [0 ] - WebSession $Headers [1 ] - Body $Body
146172
147- $Results += $Response.data.byId.logs.PSObject.Properties.Value
148-
149- If ($Response.meta.progress -eq 1 ) {
150- $Complete = $true
173+ If ($Response.meta.progress -eq 1 ) {
174+ If ($Response.data.byId.logs.PSObject.Properties.Value ) {
175+ $Results += $Response.data.byId.logs.PSObject.Properties.Value
176+ $Cursor = $Response.meta.cursor
177+ $Page ++
178+ }
179+ If ($Response.meta.isLastPage -eq $true -or $Page -ge $MaxPages ) {
180+ $Complete = $true
181+ }
182+ }
183+ }
184+ If ($Results ) {
185+ If ($Page -eq $MaxPages ) {
186+ Write-Information " Max pages reached, stopping query. If you need more results, try increasing the MaxPages parameter."
151187 }
188+ Return (Add-ObjectTypeInfo - InputObject $Results - TypeName " LogicMonitor.LMLogs" )
152189 }
153- Return (Add-ObjectTypeInfo - InputObject $Results - TypeName " LogicMonitor.LMLogs" )
190+ Else {
191+ Write-Information " No results found for query ($ ( $QueryId ) )"
192+ }
193+ }
194+ Else {
195+ Write-Error " Error getting log messages: $ ( $Response ) "
154196 }
155197 }
156198 Catch [Exception ] {
0 commit comments