%ZOSVKR ;SF/KAK/RAK/JML - ZOSVKR - Collect RUM Statistics for Cache on VMS/Linux/Windows ;10/1/2020
;;8.0;KERNEL;**90,94,107,122,143,186,550,568,670,740**;3/1/2018;Build 6
;
RO(KMPVOPT) ; Record option resource usage in ^KMPTMP("KMPR"
;
N KMPVTYP S KMPVTYP=0 ; option
G EN
;
RP(KMPEVENT) ; Record protocol resource usage in ^KMPTMP("KMPR"
; Variable PRTCL = option_name^protocol_name
;
; quit if rum is turned off
Q:'$G(^%ZTSCH("LOGRSRC"))
;
N KMPVOPT,KMPVPROT
S KMPVOPT=$P(KMPEVENT,"^"),KMPVPROT=$P(KMPEVENT,"^",2)
Q:KMPVPROT=""
;
N KMPVTYP S KMPVTYP=1 ; protocol
G EN
;
RU(KMPEVENT,KMPVTYP,KMPVEXT) ;
;----------------------------------------------------------------------
; Set metrics into ^KMPTMP("KMPV","VBEM","DLY"
; Set negative number errors into ^KMPTMP("KMPV","VBEM","ERROR"
;
;Inputs: - MIRRORS RUM COLLECTOR
; KMPVOPT... Option name (may be option, protocol, rpc, etc.)
; KMPVTYP... type of option:
; 0 - Option
; 1 - Protocol
; 2 - RPC (Remote Procedure Call)
; 3 - HL7
; KMPVEXT... Possible: Extended option type - to identify requests from non-legacy sources
;
; ^KMPTMP("KMPV","VBEM","DLY"... Storage of data for current day
;
;NOTE: KMPV("NOKILL" is not "NEWED" or "KILLED" as it must exist between calls
; KMPV("NOKILL",node) contains stats that must exist between routine calls
; KMPV("NOKILL","KMPVIMP") persists M implementation to decrease overhead
; KMPV("NOKILL","KMPVVER") persists Version number to decrease overhead
;----------------------------------------------------------------------
;
Q:$G(KMPEVENT)=""
;
N KMPVOPT,KMPVPROT
S KMPVOPT=$P(KMPEVENT,"^"),KMPVPROT=$P(KMPEVENT,"^",2)
;
S KMPVTYP=+$G(KMPVTYP),KMPVEXT=+$G(KMPVEXT)
;
EN ;
;
N KMPVCSTAT,KMPVDIFF,KMPVH,KMPVHOUR,KMPVHRSEC,KMPVHTIME,KMPVI,KMPVMET
N KMPVMIN,KMPVNODE,KMPVPOPT,KMPVPSTAT,KMPVSINT,KMPVSLOT,Y
;
S KMPVSINT=$$GETVAL^KMPVCCFG("VBEM","COLLECTION INTERVAL",8969)
;
D GETENV^%ZOSV S KMPVNODE=$P(Y,U,3)_":"_$P($P(Y,U,4),":",2) ; IA 10097
I KMPVTYP I KMPVOPT="" S:$P($G(KMPV("NOKILL",KMPVNODE,$J)),U,10)["$LOGIN$" KMPVOPT="$LOGIN$"
I KMPVOPT="" Q:'+$G(^XUTL("XQ",$J,"T")) S KMPVOPT=$P($G(^XUTL("XQ",$J,^XUTL("XQ",$J,"T"))),U,2) Q:KMPVOPT=""
;
; KMPVCSTAT = current stats for this $job: cpu^lines^commands^GloRefs^ElapsedTime
S KMPVCSTAT=$$STATS()
Q:KMPVCSTAT=""
S $P(KMPVCSTAT,"^",5)=$ZTIMESTAMP
;
; KMPVPSTAT = previous stats for this $job
S KMPVPSTAT=$G(KMPV("NOKILL",KMPVNODE,$J,"STATS"))
S KMPVPOPT=$G(KMPV("NOKILL",KMPVNODE,$J,"OPT"))
;
; if previous option was tagged as being run from taskman(!)
; then mark current OPTion as running from taskman(!)
I $P(KMPVPOPT,"***")=("!"_KMPVOPT) S KMPVOPT="!"_KMPVOPT
;
; concatenate to KMPVCSTAT: ...^OPTion^option_type
S KMPV("NOKILL",KMPVNODE,$J,"STATS")=KMPVCSTAT
S KMPV("NOKILL",KMPVNODE,$J,"OPT")=$S(KMPVTYP=2:"`"_KMPVOPT,KMPVTYP=3:"&"_KMPVOPT,1:KMPVOPT)_"***"_$G(KMPVPROT)
;
; if option and login or taskman
I 'KMPVTYP I KMPVOPT="$LOGIN$"!(KMPVOPT="$STRT ZTMS$") Q
;
I KMPVOPT="$LOGOUT$"!(KMPVOPT="$STOP ZTMS$")!(KMPVOPT="XUPROGMODE") K KMPV("NOKILL",KMPVNODE,$J)
;
Q:KMPVPSTAT=""
; difference = current stats minus previous stats
; KMPVDIFF = KMPVCSTAT - KMPVPSTAT
; = cpu^lines^commands^GloRefs^ElapsedTime
F KMPVI=1:1:4 S $P(KMPVDIFF,"^",KMPVI)=$P(KMPVCSTAT,U,KMPVI)-$P(KMPVPSTAT,"^",KMPVI)
S $P(KMPVDIFF,U,5)=$$ETIME($P(KMPVCSTAT,U,5),$P(KMPVPSTAT,U,5))
;
S KMPVOPT=KMPVPOPT ; Setting data from previous call
;
S KMPVH=$H
S KMPVHRSEC=$ZT($P(KMPVH,",",2))
S KMPVHOUR=$P(KMPVHRSEC,":")
S KMPVMIN=$P(KMPVHRSEC,":",2)
S KMPVSLOT=+$P(KMPVMIN/KMPVSINT,".")
S KMPVHTIME=(KMPVHOUR*3600)+(KMPVSLOT*KMPVSINT*60) ; Same as KMPVVTCM using KMPVHANG.
;
S KMPVMET=$G(^KMPTMP("KMPV","VBEM","DLY",+KMPVH,KMPVNODE,KMPVHTIME,KMPVPOPT,$J))
S $P(KMPVMET,U)=$P(KMPVMET,U)+1
F KMPVI=2:1:6 S $P(KMPVMET,U,KMPVI)=$P(KMPVMET,U,KMPVI)+$P(KMPVDIFF,U,KMPVI-1)
F KMPVI=2:1:6 I $P(KMPVMET,U,KMPVI)<0 D Q
.S ^KMPTMP("KMPV","VBEM","ERROR",+KMPVH,KMPVNODE,KMPVHTIME,KMPVPOPT,$J)=KMPVMET
S ^KMPTMP("KMPV","VBEM","DLY",+KMPVH,KMPVNODE,KMPVHTIME,KMPVPOPT,$J)=KMPVMET
;
Q
;
STATS() ; return current stats for this $job
N KMPVCPU,KMPIMP,KMPVOS,KMPVPROC,KMPVRET,KMPVTCPU,KMPVV,KMPVVER,KMPVZH
;
S KMPVRET=""
; implementation name and version
I $G(KMPV("NOKILL","KMPVIMP"))="" D
.S KMPIMP=$$VERSION^%ZOSV(1) ; IA 10097
.S KMPIMP=$TR(KMPIMP,"cahe","CAHE")
.S KMPV("NOKILL","KMPVIMP")=KMPIMP
.S KMPV("NOKILL","KMPVVER")=$P($$VERSION^%ZOSV(0),".",1,2) ; IA 10097
; quit if not CACHE or IRIS
Q:(KMPV("NOKILL","KMPVIMP")'["CACHE")&(KMPV("NOKILL","KMPVIMP")'["IRIS") ""
; if version is greater than 2007
I KMPV("NOKILL","KMPVVER")>2007 D
.; RETURN = cpu^lines^commands^GloRefs
.S KMPVPROC=##class(%SYS.ProcessQuery).%OpenId($J)
.Q:KMPVPROC=""
.; cpu time
.S KMPVCPU=KMPVPROC.GetCPUTime()
.S KMPVTCPU=$P(KMPVCPU,",")+$P(KMPVCPU,",",2)
.S $P(KMPVRET,U)=KMPVTCPU
.; m commands - lines
.S $P(KMPVRET,U,2)=KMPVPROC.LinesExecuted
.; m commands - commands
.S $P(KMPVRET,U,3)=KMPVPROC.CommandsExecuted
.; global references
.S $P(KMPVRET,U,4)=KMPVPROC.GlobalReferences
.; current time UTC
.S $P(KMPVRET,U,5)=$ZTIMESTAMP
;
; if version is 4 or greater and not linux and not unknown
E D
.; operating system
.S KMPVOS=$$OS^%ZOSV ; IA 10097
.I (+KMPV("NOKILL","KMPVVER"))'<4&(KMPVOS'["UNIX")&(KMPVOS'["UNK") D
..S KMPVV=$V(-1,$J),KMPVZH=$ZU(171)
..; cpu time
..S $P(KMPVRET,U)=$P(KMPVZH,",")
..; m commands
..S $P(KMPVRET,U,2)=$P($P(KMPVV,U,7),",")
..; global references
..S $P(KMPVRET,U,4)=$P($P(KMPVV,U,7),",",2)
..; current time UTC
..S $P(KMPVRET,U,5)=$ZTIMESTAMP
;
Q KMPVRET
;
ETIME(KMPVCUR,KMPVPREV) ;Calculate elapsed time for event
N KMPVDAYS,KMPVETIME
; IF WITHIN SAME DAY
S KMPVETIME=""
I +KMPVCUR=+KMPVPREV D
.S KMPVETIME=$P(KMPVCUR,",",2)-$P(KMPVPREV,",",2)
; IF OVER CHANGE OF DAY
E D
.S KMPVETIME=$P(KMPVCUR,",",2)+(86400-$P(KMPVPREV,",",2))
.; IN CASE RUNS OVER 2 DAY BOUNDARIES
.S KMPVDAYS=(+KMPVCUR)-(+KMPVPREV)
.I KMPVDAYS>1 S KMPVETIME=KMPVETIME+((KMPVDAYS-1)*86400)
Q KMPVETIME