Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ZOSVKRO

ZOSVKRO.m

Go to the documentation of this file.
%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