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

KMPMCMRT.m

Go to the documentation of this file.
  1. KMPMCMRT ;ATL/JML - Collect HL7/HLO counts for the VistA Message Count Monitor ;2/1/2023
  1. ;;4.0;CAPACITY MANAGEMENT;**1,2,3,4**;3/1/2018;Build 36
  1. ;
  1. ; Reference to $$HTFM^XLFDT in ICR #10103
  1. ; Reference to $$WORKDAY^XUWORKDY in ICR #10046
  1. ; Reference to GETENV^%ZOSV, EC^%ZOSV and LGR^%ZOSV in ICR #10097
  1. ; Reference to $ESTACK, $ETRAP, ^%ZTER and UNWIND^%ZTER in ICR #1621
  1. ;
  1. RUN ; Collect metrics per configured interval and store in ^KMPTMP("KMPV","VMCM","DLY" -- CALLED VIA CACHE TASK MANAGER
  1. ;
  1. ;
  1. N $ESTACK,$ETRAP S $ETRAP="D ^%ZTER Q"
  1. I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969,"I") D RU^%ZOSVKR("KMP VMCM DRIVER")
  1. N KMPD,KMPPARMS,KMPFMDAY,KMPH,KMPNDTYP,KMPSC,KMPVCHKH,KMPVH,KMPVHANG,KMPVNODE,KMPVSINF,KMPVSINT,KMPVSTOP,KMPVTEST
  1. N KMPDST,KMPETSO,KMPINST,KMPTIMES,KMPUTCE,KMPUTCO,KMPWORK
  1. N Y,ZTDESC,ZTDTH,ZTRTN,ZTSAVE
  1. ; ALWAYS - verify data is not building past configured number of days - if so for any reason, delete it
  1. D PURGEDLY^KMPVCBG("VMCM")
  1. ; Quit if monitor is not turned on
  1. I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969)'="ON" D Q
  1. .I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969,"I") D RU^%ZOSVKR("KMP VMCM DRIVER END")
  1. ; Environment Check
  1. ; if TEST system - quit if system is a front end OR allow test=no
  1. ; if PROD system - quit if system is a front end AND allow test=no
  1. S KMPVTEST=$$GETVAL^KMPVCCFG("VMCM","ALLOW TEST SYSTEM",8969,"I")
  1. D GETENV^%ZOSV S KMPVNODE=$P(Y,U,3)_":"_$P($P(Y,U,4),":",2) ;supported by ICR #10097
  1. I $$PROD^KMPVCCFG'="prod" I ($$ISBENODE^KMPVCCFG(KMPVNODE)=0)!(KMPVTEST=0) Q
  1. I $$PROD^KMPVCCFG="prod" I ($$ISBENODE^KMPVCCFG(KMPVNODE)=0)&(KMPVTEST=0) Q
  1. ;
  1. S KMPVSTOP=0,KMPVCHKH=+$H
  1. S KMPVSINF=$$SITEINFO^KMPVCCFG()
  1. S KMPSC=$P(KMPVSINF,"^",5)
  1. S KMPH=$H,KMPD=$P(KMPH,","),KMPFMDAY=+$$HTFM^XLFDT(KMPH,1) ;supported by ICR #10103
  1. S KMPWORK=$$WORKDAY^XUWORKDY(KMPFMDAY) ;supported by ICR #10046
  1. S KMPINST=$P(KMPVNODE,":",2),KMPNDTYP=$$NODETYPE^KMPUTLW(KMPINST)
  1. S KMPPARMS("KMPVCHKH")=KMPVCHKH,KMPPARMS("KMPVSINF")=KMPVSINF
  1. S KMPPARMS("KMPSC")=KMPSC,KMPPARMS("KMPH")=KMPH
  1. S KMPPARMS("KMPD")=KMPD,KMPPARMS("KMPFMDAY")=KMPFMDAY
  1. S KMPPARMS("KMPINST")=KMPINST,KMPPARMS("KMPNDTYP")=KMPNDTYP
  1. S KMPPARMS("KMPWORK")=KMPWORK
  1. F D Q:KMPVSTOP
  1. .I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969)'="ON" S KMPVSTOP=1 Q ; RUN FLAG SET TO 0
  1. .S KMPVH=$H
  1. .I KMPVH>KMPVCHKH SET KMPVSTOP=1 Q
  1. .S KMPVSINT=$$GETVAL^KMPVCCFG("VMCM","COLLECTION INTERVAL",8969)
  1. .S KMPVHANG=KMPVSINT*60
  1. .S KMPPARMS("KMPVH")=KMPVH,KMPPARMS("KMPVSINT")=KMPVSINT
  1. .M ^KMPTMP("KMPV","VMCM",KMPVNODE,"PARMS")=KMPPARMS
  1. .J COLLECT(KMPVNODE)
  1. .H KMPVHANG
  1. I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969,"I") D RU^%ZOSVKR("KMP VMCM DRIVER END")
  1. Q
  1. ;
  1. COLLECT(KMPVNODE) ;
  1. N $ES,$ETRAP S $ETRAP="D ^%ZTER Q"
  1. I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969,"I") D RU^%ZOSVKR("KMP VMCM COLLECTOR")
  1. N B,KMPARR,KMPARR1,KMPCURR,KMPDELTA,KMPDEV,KMPETS,KMPHLOIN,KMPHLOUT,KMPNDTYP,KMPINST,KMPPETS,KMPPREV,KMPVLIEN,KMPVLLINE,KMPVLN,KMPVLNAME
  1. N KMPVLPROC,KMPVLRECV,KMPVLSEND,KMPVLSENT,KMPVLSTATE,KMPVTIME
  1. ;
  1. K ^KMPTMP("KMPV","VMCM","TRANSMIT")
  1. M KMPPARMS=^KMPTMP("KMPV","VMCM",KMPVNODE,"PARMS")
  1. M KMPARR=^KMPTMP("KMPV","VMCM","PREVIOUS")
  1. S KMPVCHKH=KMPPARMS("KMPVCHKH"),KMPVSINF=KMPPARMS("KMPVSINF")
  1. S KMPSC=KMPPARMS("KMPSC"),KMPH=KMPPARMS("KMPH")
  1. S KMPD=KMPPARMS("KMPD"),KMPFMDAY=KMPPARMS("KMPFMDAY")
  1. S KMPWORK=KMPPARMS("KMPWORK")
  1. S KMPVH=KMPPARMS("KMPVH"),KMPVSINT=KMPPARMS("KMPVSINT")
  1. S KMPINST=KMPPARMS("KMPINST"),KMPNDTYP=KMPPARMS("KMPNDTYP")
  1. S KMPVLN=1,B="|",U="^"
  1. S KMPVTIME=$$SLOT^KMPVCCFG(KMPVH,KMPVSINT,"HOROLOG")
  1. S KMPTIMES=$$TSTAMP^KMPUTLW(+KMPVH_","_KMPVTIME,"HOROLOG",1) ; yyy-mm-dd hh:mm:ssZts
  1. S KMPETSO=$P(KMPTIMES,"^"),KMPUTCO=$P(KMPTIMES,"^",2)
  1. S KMPUTCE=$P(KMPTIMES,"^",3),KMPDST=$P(KMPTIMES,"^",4)
  1. S (KMPVLIEN,KMPVLLINE,KMPVLNAME,KMPVLSTATE)=""
  1. S (KMPVLRECV,KMPVLPROC,KMPVLSEND,KMPVLSENT)=0
  1. F S KMPVLIEN=$O(^HLCS(870,KMPVLIEN)) Q:KMPVLIEN="" D
  1. .I $D(^HLCS(870,KMPVLIEN,0)) D
  1. ..S KMPVLLINE=$G(^HLCS(870,KMPVLIEN,0))
  1. ..S KMPVLNAME=$P(KMPVLLINE,"^",1),KMPDEV=$P(KMPVLLINE,"^",4)
  1. ..I KMPVLNAME="" S KMPVLNAME="Unknown_"_KMPVLIEN
  1. ..S KMPVLSTATE=$P(KMPVLLINE,"^",5)
  1. ..S KMPVLRECV=+$G(^HLCS(870,KMPVLIEN,"IN QUEUE BACK POINTER"))
  1. ..S KMPVLPROC=+$G(^HLCS(870,KMPVLIEN,"IN QUEUE FRONT POINTER"))
  1. ..S KMPVLSEND=+$G(^HLCS(870,KMPVLIEN,"OUT QUEUE BACK POINTER"))
  1. ..S KMPVLSENT=+$G(^HLCS(870,KMPVLIEN,"OUT QUEUE FRONT POINTER"))
  1. ..;
  1. ..S KMPCURR=KMPVLRECV_"^"_KMPVLPROC_"^"_KMPVLSEND_"^"_KMPVLSENT_"^"_$P($$TSTAMP^KMPUTLW($H,"HOROLOG",0),"^",1)
  1. ..S KMPPREV=$G(KMPARR(KMPVLNAME)) ; VAL VAL VAL VAL TIME
  1. ..S KMPARR1(KMPVLNAME)=KMPCURR
  1. ..Q:KMPPREV=""
  1. ..; CALCULATE DELTA
  1. ..S KMPDELTA=$$CALCDELT(KMPCURR,KMPPREV)
  1. ..; S INTO TRANSIT GLOBAL
  1. ..S ^KMPTMP("KMPV","VMCM","TRANSMIT",$J,KMPVLN)=KMPVLNAME_B_KMPVLSTATE_B_KMPDEV_B_KMPDELTA,KMPVLN=KMPVLN+1
  1. ; Add HLO metrics
  1. S KMPHLOIN=$$HLODAILY("IN"),KMPHLOUT=$$HLODAILY("OUT")
  1. I $D(KMPARR) S ^KMPTMP("KMPV","VMCM","TRANSMIT",$J,KMPVLN)="HLO"_B_B_B_KMPHLOIN_B_B_KMPHLOUT_B
  1. ;
  1. K ^KMPTMP("KMPV","VMCM","PREVIOUS")
  1. M ^KMPTMP("KMPV","VMCM","PREVIOUS")=KMPARR1
  1. ;
  1. ; quit if no data to transmit.
  1. N KMPCNT,KMPDARR,KMPDATA,KMPDONE,KMPJMSG,KMPJSON,KMPLI,KMPMAX,KMPSTAT,KMPTI
  1. I '$D(^KMPTMP("KMPV","VMCM","TRANSMIT",$J)) D Q
  1. .I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969,"I") D RU^%ZOSVKR("KMP VMCM COLLECTOR END")
  1. S KMPTI="",KMPMAX=40000
  1. S KMPLI=$O(^KMPTMP("KMPV","VMCM","TRANSMIT",$J,""),-1)
  1. S KMPDONE=0
  1. F D Q:KMPDONE
  1. .N KMPDARR,KMPJMSG,KMPJSON
  1. .S KMPJSON=##class(%DynamicObject).%New()
  1. .S KMPJSON.Function="VMCM"
  1. .S KMPJMSG=##class(%DynamicObject).%New()
  1. .D SITE^KMPUTLW(KMPJSON)
  1. .S KMPJMSG.Timestamp=KMPETSO,KMPJMSG.UtcOdbc=KMPUTCO
  1. .S KMPJMSG.UtcEpoch=KMPUTCE,KMPJMSG.IsDst=KMPDST
  1. .S KMPJMSG.Workday=KMPWORK,KMPJMSG.Instance=KMPINST
  1. .S KMPJMSG.Node=$P(KMPVNODE,":"),KMPJMSG.NodeType=KMPNDTYP
  1. .S KMPJMSG.Date=$$SHORTDAT^KMPUTLW(KMPD,"HOROLOG")
  1. .S KMPJSON.MessageData=KMPJMSG
  1. .S KMPDARR=##class(%DynamicArray).%New()
  1. .S KMPCNT=0
  1. .F S KMPTI=$O(^KMPTMP("KMPV","VMCM","TRANSMIT",$J,KMPTI)) Q:KMPTI=""!(KMPCNT>KMPMAX) D
  1. ..S KMPDATA=$G(^KMPTMP("KMPV","VMCM","TRANSMIT",$J,KMPTI))
  1. ..D KMPDARR.%Push(KMPDATA)
  1. ..I KMPTI>=KMPLI S KMPDONE=1
  1. ..S KMPCNT=KMPCNT+1
  1. .S KMPJSON.Details=KMPDARR
  1. .S KMPSTAT=$$POST^KMPUTLW(KMPJSON,"/messagecount",,"VMCM")
  1. .I +KMPSTAT'=200 S KMPSTAT=$$POST^KMPUTLW(KMPJSON,"/messagecount",,"VMCM")
  1. .S ^XTMP("KMP "_KMPFMDAY,"VMCM","HTTP",KMPVNODE,$P($H,",",2))=KMPSTAT
  1. .I +KMPSTAT'=200 D SETRETRY
  1. K ^KMPTMP("KMPV","VMCM","TRANSMIT",$J)
  1. I $$GETVAL^KMPVCCFG("VMCM","ONOFF",8969,"I") D RU^%ZOSVKR("KMP VMCM COLLECTOR END")
  1. Q
  1. ;
  1. HLODAILY(KMPDIR) ;
  1. N KMPHLO,KMPHLOD,KMPHLOTS,KMPMIN,KMPVHRAP,KMPVHSAP,KMPVHTIME,KMPVHTODAY,KMPVHTOTAL,KMPVHTYPE
  1. S KMPVHTOTAL=0
  1. S KMPVHTODAY=$$DT^XLFDT
  1. S KMPVHTIME=KMPVHTODAY-.0001
  1. F S KMPVHTIME=$O(^HLSTATS(KMPDIR,"HOURLY",KMPVHTIME)) Q:'KMPVHTIME Q:((KMPVHTIME\1)>KMPVHTODAY) D
  1. .S KMPVHSAP=""
  1. .F S KMPVHSAP=$O(^HLSTATS(KMPDIR,"HOURLY",KMPVHTIME,KMPVHSAP)) Q:KMPVHSAP="" D
  1. ..Q:KMPVHSAP="ACCEPT ACK"
  1. ..S KMPVHRAP=""
  1. ..F S KMPVHRAP=$O(^HLSTATS(KMPDIR,"HOURLY",KMPVHTIME,KMPVHSAP,KMPVHRAP)) Q:KMPVHRAP="" D
  1. ...S KMPVHTYPE=""
  1. ...F S KMPVHTYPE=$O(^HLSTATS(KMPDIR,"HOURLY",KMPVHTIME,KMPVHSAP,KMPVHRAP,KMPVHTYPE)) Q:KMPVHTYPE="" D
  1. ....S KMPVHTOTAL=KMPVHTOTAL+$G(^HLSTATS(KMPDIR,"HOURLY",KMPVHTIME,KMPVHSAP,KMPVHRAP,KMPVHTYPE))
  1. S KMPHLOTS=$P($$TSTAMP^KMPUTLW($H,"HOROLOG",0),"^")
  1. ; SET CUR INTO ARRAY
  1. S KMPARR1("HLO",KMPDIR)=KMPVHTOTAL_"^"_KMPHLOTS
  1. I '$D(KMPARR) Q ""
  1. ; Get previous
  1. S KMPHLO=KMPARR("HLO",KMPDIR)
  1. ; CALC TIME DIFF
  1. S KMPMIN=$system.SQL.DATEDIFF("mi",$P(KMPHLO,"^",2),KMPHLOTS)
  1. I KMPMIN=0 S KMPMIN=1
  1. ; CALC NUMBER DIFF
  1. S KMPHLOD=$FN((KMPVHTOTAL-$P(KMPHLO,"^",1))/KMPMIN,"",0)
  1. ; RETURN VALUE
  1. Q KMPHLOD
  1. ;
  1. CALCDELT(KMPCURR,KMPPREV) ;
  1. N KMPCTS,KMPI,KMPMIN,KMPPTS,KMPDELT
  1. S KMPCTS=$P(KMPCURR,"^",5),KMPPTS=$P(KMPPREV,"^",5)
  1. S KMPMIN=$system.SQL.DATEDIFF("mi",KMPPTS,KMPCTS)
  1. I KMPMIN=0 S KMPMIN=1
  1. F KMPI=1:1:4 S $P(KMPDELT,"|",KMPI)=$FN(($P(KMPCURR,"^",KMPI)-$P(KMPPREV,"^",KMPI))/KMPMIN,"",0)
  1. Q KMPDELT
  1. ;
  1. SETRETRY ;
  1. N KMPTEXT
  1. S KMPTEXT("SUBJECT")="VSM FAILED SEND: VMCM at "_KMPJSON.Site.SiteCode
  1. S KMPTEXT(1)="Status Code: "_+KMPSTAT
  1. S KMPTEXT(2)="Status Text: "_$P(KMPSTAT,"^",2)
  1. S KMPTEXT(3)="Response Time: "_$P(KMPSTAT,"^",3)
  1. S KMPTEXT(4)="Node: "_KMPVNODE
  1. D INFOMSG^KMPUTLW(.KMPTEXT)
  1. S ^KMPTMP("KMPV","VMCM","RETRY",KMPVNODE,+$H,$H)=KMPJSON.%ToJSON()
  1. Q
  1. ;
  1. RETRY ; retry failed POSTS
  1. N KMPDAY,KMPI,KMPJSON,KMPSTAT,KMPVNODE,Y
  1. ;
  1. D GETENV^%ZOSV S KMPVNODE=$P(Y,"^",3)_":"_$P($P(Y,"^",4),":",2) ;supported by ICR #10097
  1. S KMPDAY=""
  1. F S KMPDAY=$O(^KMPTMP("KMPV","VMCM","RETRY",KMPVNODE,KMPDAY)) Q:KMPDAY="" D
  1. .S KMPI=""
  1. .F S KMPI=$O(^KMPTMP("KMPV","VMCM","RETRY",KMPVNODE,KMPDAY,KMPI)) Q:KMPI="" D
  1. ..S KMPJSON=$G(^KMPTMP("KMPV","VMCM","RETRY",KMPVNODE,KMPDAY,KMPI))
  1. ..S KMPSTAT=$$POST^KMPUTLW({}.%FromJSON(KMPJSON),"/messagecount",,"VMCM")
  1. ..I +KMPSTAT=200 K ^KMPTMP("KMPV","VMCM","RETRY",KMPVNODE,KMPDAY,KMPI)
  1. ..H $R(10)
  1. Q