nsmcp::AccessLogIngestor method summaryLocked (protected)

 <instance of nsmcp::AccessLogIngestor[i]> summaryLocked options

Defined in /usr/local/ns/tcl/nsmcp/lib/access-analytics.tcl

Parameters:
options (required)

Testcases:
No testcase defined.
Source code:
set requestedFrom [dict get $options from]; set requestedTo [dict get $options to]
dict set options from [expr {([dict get $options from]/60)*60}]
dict set options to [expr {(([dict get $options to]+59)/60)*60}]
set state [:state]
set result [dict merge $options [dict create server [ns_info server] requestCount 0 responseBytes 0 fallbackCount 0 pools {} methods {} statuses {} paths {} excludedPaths 0 timingCount 0 acceptTotal 0.0 queueTotal 0.0 filterTotal 0.0 runTotal 0.0 runMax 0.0 buckets {}]]
set counts [dict get $result buckets]
for {set slot [dict get $options from]} {$slot < [dict get $options to]} {incr slot [dict get $options bucketSeconds]} {
    set key [expr {($slot/[dict get $options bucketSeconds])*[dict get $options bucketSeconds]}]
    if {![dict exists $counts $key]} {dict set counts $key 0}
}
dict set result buckets $counts
set unread [expr {max(0,[dict get $state observedSize]-[dict get $state cursor])}]
set historyUnread [expr {[dict get $state historyEnd]-[dict get $state historyCursor]}]
set historyIncomplete [expr {$historyUnread>0 && [dict get $options from]<[dict get $state recentFrom]}]
set seekPending [expr {[dict get $state seek] ne ""}]
dict set result coverage [dict create updatedAt [dict get $state updatedAt] firstObserved [dict get $state firstObserved] latestObserved [dict get $state latestObserved]  sourceBytes [dict get $state observedSize] unreadBytes $unread scanIncomplete [expr {$seekPending || $historyIncomplete || ($unread>0 && ![dict get $state pending])}]  historyUnreadBytes $historyUnread totalUnreadBytes [expr {$unread+$historyUnread}]  processedBytes [expr {max(0,[dict get $state cursor]-$historyUnread)}]  historyIncomplete $historyIncomplete seekPending $seekPending  recentFrom [dict get $state recentFrom] initialOffset [dict get $state initialOffset]  seekMarginSeconds 300 completionOrderAssumed [expr {$historyUnread>0}] pending [dict get $state pending] generation [dict get $state generation] rotationGaps [dict get $state rotationGaps] lastRotationAt [dict get $state lastRotationAt]  malformed [dict get $state malformed] oversized [dict get $state oversized] retentionSeconds ${:retentionSeconds} minuteAligned true]
set retainedFrom [:retentionCutoff]
dict set result coverage retainedFrom $retainedFrom
set first [dict get $state firstObserved]
dict set result coverage windowComplete [expr {$first ne "" && $first <= [dict get $options from] &&
    [dict get $options from] >= $retainedFrom && $unread == 0 && !$historyIncomplete && !$seekPending &&
    ([dict get $state rotationGaps] == 0 || [dict get $options from] >= (([dict get $state lastRotationAt]+59)/60)*60) && [dict get $state malformed] == 0 && [dict get $state oversized] == 0}]
set reasons {}
if {$first eq ""} {lappend reasons no-observations} elseif {$first>[dict get $options from]} {lappend reasons unobserved-start}
if {[dict get $options from]<$retainedFrom} {lappend reasons retention}
if {$seekPending} {lappend reasons seeking}
if {$historyIncomplete} {lappend reasons historical-backfill}
if {$unread>0} {lappend reasons [expr {[dict get $state pending] ? "pending-line" : "live-tail"}]}
if {[dict get $state rotationGaps]>0 && [dict get $options from]<(([dict get $state lastRotationAt]+59)/60)*60} {lappend reasons rotation}
if {[dict get $state malformed]>0} {lappend reasons cumulative-parse-errors}
if {[dict get $state oversized]>0} {lappend reasons cumulative-oversized-records}
set completion [dict get $state latestCompletionObserved]
set age {}
if {$completion ne ""} {set age [expr {max(0,[dict get $state updatedAt]-$completion)}]}
dict set result coverage requestedFrom $requestedFrom
dict set result coverage requestedTo $requestedTo
dict set result coverage roundedTailSeconds [expr {[dict get $options to]-$requestedTo}]
dict set result coverage latestCompletionObserved $completion
dict set result coverage completionObservationAgeSeconds $age
dict set result coverage sourceCaughtUp [expr {$unread==0 || [dict get $state pending]}]
dict set result coverage liveTailIncomplete [expr {$unread>0 && ![dict get $state pending]}]
dict set result coverage historicalBackfillPending [expr {$historyUnread>0}]
dict set result coverage parseErrorScopeUnknown [expr {[dict get $state malformed]>0}]
dict set result coverage oversizedScopeUnknown [expr {[dict get $state oversized]>0}]
dict set result coverage lastMalformedAt [dict get $state lastMalformedAt]
dict set result coverage incompleteReasons $reasons
dict set result pathCountsComplete [expr {[dict get $result excludedPaths]==0}]
return $result
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: