nsmcp::AccessDiagnosticTool method trafficTriples (protected)

 <instance of nsmcp::AccessDiagnosticTool[i]> trafficTriples state \
    duration complete

Defined in /usr/local/ns/tcl/nsmcp/traffic-tools.tcl

Parameters:
state (required)
duration (required)
complete (required)

Testcases:
No testcase defined.
Source code:
set fields [list scope string examined-selected-records windowComplete boolean false scanComplete boolean $complete]
foreach key {requestCount status503Count successfulCount successfulTimingCount successfulRunTotal unknownPeerCount untrackedSourceRecords unknownUserAgentCount untrackedUserAgentRecords} {
    lappend fields $key number [dict get $state $key]
}
set authentication {}
if {[dict exists $state authenticationStates]} {
    dict for {name row} [dict get $state authenticationStates] {
        set entry {}
        dict for {key value} $row {
            lappend entry $key number $value
        }
        lappend authentication $name object $entry
    }
}
lappend fields authenticationStates object $authentication
set requests [dict get $state requestCount]
lappend fields durationSeconds number $duration requestRate number [expr {$requests/double($duration)}]  successfulTimingMissingCount number [expr {[dict get $state successfulCount]-[dict get $state successfulTimingCount]}]
set peerReasons {}
if {[dict get $state unknownPeerCount]} {
    lappend peerReasons 0 string missing-or-invalid-peer-fields
}
if {[dict get $state untrackedSourceRecords]} {
    lappend peerReasons 1 string source-cardinality-limit
}
set uaReasons {}
if {[dict get $state unknownUserAgentCount]} {
    lappend uaReasons 0 string missing-user-agent-fields
}
if {[dict get $state untrackedUserAgentRecords]} {
    lappend uaReasons 1 string user-agent-cardinality-or-length-limit
}
set counts [lsort -integer -decreasing [dict values [dict get $state sources]]]
set known [dict size [dict get $state sources]]
lappend fields distinctKnownSources number $known  observedPeerCountsComplete boolean [expr {$peerReasons eq ""}] peerCountsIncompleteReasons array $peerReasons  observedUserAgentCountsComplete boolean [expr {$uaReasons eq ""}] userAgentCountsIncompleteReasons array $uaReasons  sourceLimit number ${:maxAggregateSources} userAgentLimit number ${:maxAggregateUserAgents}
if {$peerReasons eq ""} {
    lappend fields distinctSources number $known
} else {
    lappend fields distinctSources null {}
}
set buckets {1 0 2-5 0 6-10 0 11-100 0 101-1000 0 1001+ 0}
foreach count $counts {
    set bucket [expr {$count==1 ? "1" : ($count<=5 ? "2-5" : ($count<=10 ? "6-10" : ($count<=100 ? "11-100" : ($count<=1000 ? "101-1000" : "1001+"))))}]
    dict incr buckets $bucket
}
set histogram {}
dict for {key count} $buckets {
    lappend histogram $key number $count
}
lappend fields sourcesByRequestCount object $histogram
set top {}
set rank 0
set sum 0
foreach count [lrange $counts 0 9] {
    incr sum $count
    lappend top $rank object [list rank number [expr {$rank+1}] requestCount number $count  requestRate number [expr {$count/double($duration)}] share number [expr {$requests ? $count/double($requests) : 0.0}]]
    incr rank
}
lappend fields topSources array $top topTenSourceShare number [expr {$requests ? $sum/double($requests) : 0.0}]
set rankings {}
foreach {label metric} {byRequests requestCount by503 status503Count bySuccessfulRuntime successfulRunTotal} {
    set ordered {}
    dict for {ua row} [dict get $state agents] {
        lappend ordered [list [dict get $row $metric] $ua $row]
    }
    set output {}
    set i 0
    foreach item [lrange [lsort -real -decreasing -index 0 $ordered] 0 19] {
        lassign $item value ua row
        set entry [list userAgent string $ua]
        dict for {key count} $row {
            lappend entry $key number $count
        }
        lappend output $i object $entry
        incr i
    }
    lappend rankings $label array $output
}
lappend fields userAgents object $rankings distinctKnownUserAgents number [dict size [dict get $state agents]]  rankingLimit number 20 omittedRankedUserAgents number [expr {max(0,[dict size [dict get $state agents]]-20)}]  limitations string {Counts cover examined records selected by window, path and category, before evidence truncation. Rankings cover tracked redacted User-Agents, not verified bots. Source keys and addresses are never disclosed. Unknown fields and cardinality limits make observed distributions partial. Seek assumptions and rotations still limit time-window coverage; observed completeness is not window completeness. Rates use the requested window duration, not a rolling burst. Successful runtime is summed 2xx handler time, not CPU time.}
return $fields
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: