joewiz
3/13/2015 - 4:17 AM

Examine query duration from JMX logs collected by monex #existdb

Examine query duration from JMX logs collected by monex #existdb

xquery version "3.0";

(: Examine query duration from JMX logs collected by monex :)

declare namespace jmx="http://exist-db.org/jmx";

declare function local:milliseconds-to-time($timestamp as xs:long) as xs:dateTime {
    let $days := xs:int($timestamp div 1000 div 24 div 60 div 60)
    let $remainder := $timestamp - ($days * 24 * 60 * 60 * 1000)
    let $hours := xs:int($remainder div 1000 div 60 div 60)
    let $remainder := $remainder - ($hours * 60 * 60 * 1000)
    let $minutes := xs:int($remainder div 1000 div 60)
    let $remainder := $remainder - ($minutes * 60 * 1000)
    let $seconds := xs:int($remainder div 1000)
    let $millis := format-number($remainder - ($seconds * 1000), "000")
    return
        xs:dateTime("1970-01-01T00:00:00Z") + 
        xs:dayTimeDuration("P" || $days || "DT" || $hours || "H" || $minutes || "M" || $seconds || "." || $millis || "S")
};

(:
 : Include only queries slower than 30s: [xs:integer(jmx:mostRecentExecutionDuration) gt 30000]
 : Exclude /historicaldocuments:         [not(starts-with(jmx:requestURI, '/historical'))] 
 :)
let $recent-queries := collection('/db/apps/monex/data')//jmx:RecentQueryHistory/jmx:row[xs:integer(jmx:mostRecentExecutionDuration) gt 30000]
let $ordered-queries :=
    for $query in $recent-queries
    let $duration := xs:long($query/jmx:mostRecentExecutionDuration)
    let $timestamp := $query/jmx:mostRecentExecutionTime
    (:
    Slowest first, regardless of day:    order by $duration descending
    Reverse chronological:               order by $timestamp descending
    :)
    order by $timestamp descending
    return $query
for $query in subsequence($ordered-queries, 1, 100)
return 
    element result {
        element duration {$query/jmx:mostRecentExecutionDuration/string()},
        element timestamp {local:milliseconds-to-time($query/jmx:mostRecentExecutionTime)},
        element uri {$query/jmx:requestURI/string()}
    }