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

ZOSVKRV.m

Go to the documentation of this file.
  1. %ZOSVKR ;SF/KAK/RAK - Collect RUM Statistics for VAX-DSM;8/20/99 08:44 ;3/10/00 07:42 [ 04/02/2003 8:29 AM ]
  1. ;;8.0;KERNEL;**1005,1007**;APR 1, 2003
  1. ;;8.0;KERNEL;**90,94,107,122,143**;Jul 21, 1998
  1. ;
  1. RO(OPT) ; Record option resource usage in ^XTMP("KMPR","JOB"
  1. ;
  1. N KMPRTYP S KMPRTYP=0 ; option
  1. G EN
  1. ;
  1. RP(PRTCL) ; Record protocol resource usage in ^XTMP("KMPR","JOB"
  1. ;
  1. ; Variable PRTCL = option_name^protocol_name
  1. N OPT
  1. S OPT=$P(PRTCL,"^"),PRTCL=$P(PRTCL,"^",2) Q:PRTCL=""
  1. N KMPRTYP S KMPRTYP=1 ; protocol
  1. G EN
  1. ;
  1. RU(KMPROPT,KMPRTYP,KMPRSTAT) ;-- set resource usage into ^XTMP("KMPR","JOB"
  1. ;-----------------------------------------------------------------------
  1. ; KMPROPT... Option name (may be option, protocol, rpc, etc.).
  1. ; KMPRTYP... Type of option:
  1. ; 0 - Option.
  1. ; 1 - Protocol.
  1. ; 2 - RPC (Remote Procedure Call).
  1. ; 3 - HL7.
  1. ; KMPRSTAT.. Status (for future use). 1 - start
  1. ; 2 - stop
  1. ;-----------------------------------------------------------------------
  1. ;
  1. Q:$G(KMPROPT)=""
  1. S KMPRTYP=+$G(KMPRTYP)
  1. S KMPRSTAT=$G(KMPRSTAT)
  1. ;
  1. N OPT,PRTCL
  1. ;
  1. ; OPT = option name.
  1. ; PRTCL = protocol name (optional).
  1. S OPT=$P(KMPROPT,"^"),PRTCL=$P(KMPROPT,"^",2)
  1. ;
  1. EN ;
  1. ; C........ comma (,)
  1. ; CURRENT.. current stats
  1. ; DATE..... date in fileman format
  1. ; DIFF..... difference (CURRENT minus PREV)
  1. ; DOW...... day of week
  1. ; HDATE.... date/time in $h format
  1. ; NODE..... current node
  1. ; PRIMETM.. prime time or non-prime time
  1. ; PREV..... previous stats
  1. ;
  1. N ARRAY,C,CURRENT,CURRHR,DATE,DIFF,DOW,HDATE,I,NODE,PREV,PREVHR
  1. N PRIMETM,TIME,Y
  1. ; quit if not in "PROD" uci.
  1. S Y="" X $G(^%ZOSF("UCI")) Q:Y'[$G(^%ZOSF("PROD"))
  1. S C=",",NODE=$P($ZC(%GETSYI),C,4),U="^"
  1. I KMPRTYP I OPT="" S:$P($G(^XTMP("KMPR","JOB",NODE,$J)),U,10)["$LOGIN$" OPT="$LOGIN$"
  1. I OPT="" Q:'+$G(^XUTL("XQ",$J,"T")) S OPT=$P($G(^XUTL("XQ",$J,^XUTL("XQ",$J,"T"))),U,2) Q:OPT=""
  1. ;
  1. ; CURRENT = current stats for this $job.
  1. ; cpu^dio^bio^pg_fault^cmd^glo^$H_date^$H_sec^ascii_time
  1. S CURRENT=$$STATS Q:CURRENT=""
  1. ; concatenate ^OPTion^option_type
  1. S CURRENT=CURRENT_U_$S(KMPRTYP=2:"`"_OPT,KMPRTYP=3:"&"_OPT,1:OPT)_"***"_$G(PRTCL)_U_$G(XQT)
  1. ; if option and login or taskman.
  1. I 'KMPRTYP I OPT="$LOGIN$"!(OPT="$STRT ZTMS$") S ^XTMP("KMPR","JOB",NODE,$J)=CURRENT Q
  1. ;
  1. ; PREV = previous stats for this $job.
  1. S PREV=$G(^XTMP("KMPR","JOB",NODE,$J)) S ^($J)=CURRENT
  1. I OPT="$LOGOUT$"!(OPT="$STOP ZTMS$")!(OPT="XUPROGMODE") K ^XTMP("KMPR","JOB",NODE,$J)
  1. Q:PREV=""
  1. ; check for negative numbers for m commands and glo references
  1. F I=5,6 D
  1. .S:$P(CURRENT,U,I)<0 $P(CURRENT,U,I)=$P(CURRENT,U,I)+(2**32)
  1. .S:$P(PREV,U,I)<0 $P(PREV,U,I)=$P(PREV,U,I)+(2**32)
  1. ;
  1. S $P(CURRENT,U,7)=$P(CURRENT,U,7)-$P(PREV,U,7)*86400+$P(CURRENT,U,8)
  1. S HDATE=$P(PREV,U,7),$P(PREV,U,7)=$P(PREV,U,8)
  1. ; quit if not $h
  1. Q:'HDATE
  1. ;
  1. ; DIFF = CURRENT - PREV (current stats minus previous stats)
  1. ; cpu^dio^bio^pg_fault^cmd^glo^elapsed_sec^option_type
  1. F I=1:1:7 S $P(DIFF,U,I)=$P(CURRENT,U,I)-$P(PREV,U,I)
  1. ; option name time
  1. S OPT=$P(PREV,U,10),TIME=$P($P(PREV,U,8),".")
  1. ; date in fm format.
  1. S DATE=$$HTFM^XLFDT(HDATE),DATE=$P(DATE,".")
  1. ; day of week.
  1. S DOW=$$DOW^XLFDT(DATE,1)
  1. ; PRIMETM = 0: non-prime time
  1. ; 1: prime time
  1. S PRIMETM=0
  1. ; prime time if not saturday or sunday or holiday
  1. ; if after 8am and before 5pm.
  1. I DOW>0&(DOW<6)&('$G(^HOLIDAY(DATE,0))) I TIME>28799&(TIME<61201) S PRIMETM=1
  1. ; global location for data storage.
  1. S ARRAY=$NA(^XTMP("KMPR","DLY",NODE,HDATE,OPT,$J,PRIMETM))
  1. ; daily stats by $j.
  1. F I=1:1:7 S $P(@ARRAY,U,I)=$P($G(@ARRAY),U,I)+$P(DIFF,U,I)
  1. ; 8th piece is count.
  1. S $P(@ARRAY,U,8)=$P(@ARRAY,U,8)+1
  1. ; keep track of hours with activity - this will be used to determine
  1. ; actual hours of activity when moving data to file 8971.1
  1. S DATE=$$HTFM^XLFDT(HDATE_","_TIME)
  1. ;S TIME=+$E($P(DATE,".",2),1,2),DATE=$P(DATE,".")
  1. ; hour for 'previous' dat.
  1. S PREVHR=+$E($P(DATE,".",2),1,2),DATE=$P(DATE,".")
  1. ; current hour.
  1. S CURRHR=+$E($P($$HTFM^XLFDT($H),".",2),1,2)
  1. ; record all hours this option ran.
  1. F TIME=PREVHR:1:CURRHR D
  1. .; because of zero hour add 1 to time. this will offset each hour by 1.
  1. .S:DATE $P(^XTMP("KMPR","HOURS",DATE,NODE),U,(TIME+1))=1
  1. ;
  1. Q
  1. ;
  1. STATS() ;-- extrinsic - return current stats for this $job
  1. N C,H,KMPRCMD,KMPRGLO,ZH
  1. S C="," ;,ZH=$ZH,H=$P(ZH,C,3)
  1. D JT
  1. Q:KMPRCMD="" ""
  1. S ZH=$ZH,H=$P(ZH,C,3),H=$E(H,13,23),H=$P($H,C)_C_($P(H,":")*3600+($P(H,":",2)*60)+$P(H,":",3))
  1. ;
  1. ; current stats for this $job.
  1. ; cpu^dio^bio^pg_fault^cmd^glo^$H_date^$H_sec^ascii_time
  1. Q $P(ZH,C)_U_$P(ZH,C,7)_U_$P(ZH,C,8)_U_$P(ZH,C,4)_U_KMPRCMD_U_KMPRGLO_U_$P(H,C)_U_$P(H,C,2)_U_$P(ZH,C,3)
  1. ;
  1. JT ; Calculate the Job Table (%KMPRJT) for this job
  1. ; %KMPRJT should be made a system wide variable
  1. ;
  1. N %GLSBASE,%JOB,%JOBSIZ,%JOBTAB,%MAXPROC,%PID,%SMSTART,%TYPE,KMPROUT,X
  1. ;
  1. ; Return the current number of commands and global references
  1. ; KMPRCMD and KMPRGLO equal to null if NOT successful
  1. S (KMPRCMD,KMPRGLO)="",KMPROUT=0,U="^"
  1. ;
  1. ; Check for correct Job Table (%KMPRJT) for this job
  1. I $D(%KMPRJT) I $V(%KMPRJT+20)=$J S %TYPE="DSM" D USER G EXIT
  1. S %SMSTART=$V($ZK(GLS$SMSTART)) G:'%SMSTART EXIT
  1. S %GLSBASE=$V($V(0)+44)
  1. S %JOBTAB=%SMSTART+$V(%SMSTART+$V(%GLSBASE+124)),%JOBSIZ=$V(%GLSBASE+128)
  1. S %MAXPROC=$V($V(%GLSBASE+84)+%SMSTART)
  1. ;
  1. ; Go through Job Table looking for this process
  1. F %JOB=1:1:%MAXPROC Q:KMPROUT S %KMPRJT=%JOB*%JOBSIZ+%JOBTAB D
  1. .I $V(%KMPRJT+20) S %PID=$V(%KMPRJT+20),%TYPE="DSM" I %PID=$J D USER S KMPROUT=1
  1. ;
  1. EXIT ;
  1. S X=^%ZOSF("ERRTN"),@^%ZOSF("TRAP")
  1. Q
  1. ;
  1. USER ;
  1. ; Watch for NONEXPR process
  1. S X="UERR^%ZOSVKR",@^%ZOSF("TRAP")
  1. ;
  1. ; Process improperly exited DSM
  1. I %TYPE="DSM",$V(%KMPRJT+$ZK(JOB_B_FLAGS),-1,1)\$ZK(JOB_M_EXITED)#2 G IMPROP
  1. ;
  1. ; Get commands and global references from job table
  1. S KMPRCMD=$V(%KMPRJT),KMPRGLO=$V(%KMPRJT+12)
  1. Q
  1. UERR ;
  1. ; Ignore NONEXPR (improperly exited DSM process) and SUSPENDED process
  1. I $ZE["NONEXPR"!($ZE["SUSPENDED") Q
  1. ZQ
  1. IMPROP ;
  1. ; Ignore improperly exited DSM process
  1. Q