Découvrir des indices en interrogeant les tables de messages d'interopérabilité
Lorsque nous utilisons InterSystems IRIS comme moteur d'interopérabilité, nous savons et aimons tous à quel point il est facile d'utiliser le Message Viewer pour examiner les traces des messages et voir exactement ce qui se passe dans votre production. Lorsqu’un système traite des millions de messages par jour, vous ne savez peut-être pas exactement par où commencer votre enquête.
Au cours de mes années de soutien aux productions IRIS, je me retrouve souvent à enquêter sur des choses comme...
- Quel type de throughput ce flux de travail a-t-il ?
- Où est le bottleneck ?
- Quelles sont mes erreurs les plus courantes ?
L’un de mes endroits préférés pour rechercher des indices est la table d’en-tête de message, qui stocke les métadonnées de chaque message transitant par le système. Ce sont les mêmes messages qui apparaissent dans la visionneuse de messages et dans les traces visuelles.
J'ai constitué une collection de requêtes SQL pratiques et j'aimerais les partager avec vous. Mes exemples proviennent principalement de cas d'utilisation de HealthShare ou d'IRIS for Health, mais ils peuvent être facilement adaptés à votre flux de travail...
-- Requête SQL pour trouver le nombre de messages via un composant par jourselect {fn SUBSTRING(timeprocessed,1,10)} ASday, count(*) MessagesThisDay
FROM Ens.MessageHeader
where TargetConfigName = 'HS.Hub.Push.Evaluator'GROUPBY {fn SUBSTRING(timeprocessed,1,10)}
ORDERBYdayASC-- Requête SQL pour rechercher des messages de longue durée via des composants particuliersSELECT PReq.SessionID as SessionId,
PReq.TimeCreated as pReqTimeCreated,
PRes.TimeCreated as pResTimeCreated,
{fn TIMESTAMPDIFF(SQL_TSI_SECOND, PReq.TimeCreated,PRes.TimeCreated)} as TimeDelay
FROM (
SELECTID, SessionId, TimeCreated
FROM Ens.MessageHeader
WHERE MessageBodyClassName = 'HS.Message.PatientSearchRequest'
AND SourceConfigName = 'HS.Hub.MPI.Manager'
AND TargetConfigName = 'HUB'
) as PReq
INNERJOIN (
SELECTID, SessionId, TimeCreated
FROM Ens.MessageHeader
WHERE MessageBodyClassName = 'HS.Message.PatientSearchResponse'
AND SourceConfigName = 'HS.Hub.MPI.Manager'
AND TargetConfigName = 'HS.IHE.PIX.Manager.Process'
) as PRes on pReq.SessionId = PRes.SessionId
WHERE {fn TIMESTAMPDIFF(SQL_TSI_SECOND, PReq.TimeCreated,PRes.TimeCreated)} > 1ORDERBY SessionId desc----------------------------------------------------------/*-- Requête pour trouver le message de bottleneck via un composant particulier
-- définissez votre seuil pour "combien de temps est trop long (par exemple 20 secondes)
-- recherchez des groupes de messages plus longs que cela (par exemple, le premier cluster a commencé à 3:22:00, puis il y a eu un deuxième cluster à 5:15:30)
-- dans chaque cluster, regardez le premier message de ce cluster (chronologiquement). Il s’agit probablement du message du bottleneck, et tous les messages qui le suivent sont victimes de son bottleneck.
*/SELECT %NOLOCK req.TargetConfigName, req.MessageBodyClassName, req.SessionId, req.TimeCreated, req.TimeProcessed, {fn TIMESTAMPDIFF(SQL_TSI_SECOND, req.TimeCreated, req.TimeProcessed)} as TimeToProcess
FROM Ens.MessageHeader AS req
WHERE req.TargetConfigName = 'HS.Hub.Management.Operations'AND req.TimeCreated BETWEEN'2021-04-21 00:00:00'AND'2021-04-21 11:00:00'AND {fn TIMESTAMPDIFF(SQL_TSI_SECOND, req.TimeCreated, req.TimeProcessed)} > 20/* Si vous recherchez une erreur particulière, essayez celle-ci. Elle analyse le journal des erreurs de l'Ensemble à la recherche des entrées « Object to Load not found », puis renvoie certains champs clés du message PatientSearchRequest correspondant. */SELECT l.SessionId, mh.MessageBodyID, mh.TimeCreated, psr.SearchMode, psr.RequestingUser, psr.FirstName, psr.MiddleName, psr.LastName, psr.SSN, psr.Sex, psr.DOB
FROM Ens_Util.Log as l
INNERJOIN Ens.MessageHeader as mh on l.SessionId = mh.SessionId
INNERJOIN HS_Message.PatientSearchRequest as psr on mh.MessageBodyID = psr.ID
WHERE l.Type = 'Error'AND l.ConfigName = 'HSPI.Server.APIOperation'AND l.Text like'ERROR #5809: Object to Load not found%'AND mh.MessageBodyClassName = 'HS.Message.PatientSearchRequest'AND mh.SourceConfigName = 'HSPI.Server.APIWebService'AND mh.TargetConfigName = 'HSPI.Server.APIOperation'-- Analysez le journal des erreurs Ensemble pour une période particulière. Comptez les différents types d’erreursSELECTsubstring(text,1,80) as AbbreviatedError, count(*) as NumTheseErrors
FROM Ens_Util.Log
WHEREType = 'Error'AND TimeLogged > '2022-03-03 00:00:00'-- when the last batch startedAND TimeLogged < '2022-03-03 16:00:00'-- when we estimate this batch might endGROUPBYsubstring(text,1,80)
ORDERBY NumTheseErrors desc-- Recherchez le temps de traitement de la passerelle pour chaque paire StreameltRequest / ECRFetchResponse
SELECT sr.Gateway,request.sessionid, response.sessionid, request.timecreated AS starttime, response.timecreated AS stoptime,
datediff(ms,request.timecreated,response.timecreated) AS ProcessingTime,
Avg(datediff(ms,request.timecreated,response.timecreated)) AS AverageProcessingTimeAllGateways
FROM Ens.MessageHeader request
INNER JOIN Ens.MessageHeader AS response ON response.correspondingmessageid = request.id
INNER JOIN HS_Message.StreamletRequest AS sr ON sr.ID = request.MessageBodyId
WHERE request.messagebodyclassname = 'HS.Message.StreamletRequest'
AND response.messagebodyclassname = 'HS.Message.ECRFetchResponse'