Article
· Mai 29 4m de lecture

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 jour
select {fn SUBSTRING(timeprocessed,1,10)} AS day, count(*) MessagesThisDay 
FROM Ens.MessageHeader
where TargetConfigName = 'HS.Hub.Push.Evaluator' 
GROUP BY {fn SUBSTRING(timeprocessed,1,10)}
ORDER BY day ASC
-- Requête SQL pour rechercher des messages de longue durée via des composants particuliers
SELECT PReq.SessionID as SessionId, 
  PReq.TimeCreated as pReqTimeCreated, 
  PRes.TimeCreated as pResTimeCreated, 
  {fn TIMESTAMPDIFF(SQL_TSI_SECOND, PReq.TimeCreated,PRes.TimeCreated)} as TimeDelay
FROM (
  SELECT ID, SessionId, TimeCreated
  FROM Ens.MessageHeader
  WHERE MessageBodyClassName = 'HS.Message.PatientSearchRequest'
  AND SourceConfigName = 'HS.Hub.MPI.Manager'
  AND TargetConfigName = 'HUB'
) as PReq
INNER JOIN (
  SELECT ID, 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)} > 1
ORDER BY 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
INNER JOIN Ens.MessageHeader as mh on l.SessionId = mh.SessionId
INNER JOIN 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’erreurs
SELECT substring(text,1,80) as AbbreviatedError, count(*) as NumTheseErrors
FROM Ens_Util.Log
WHERE Type = 'Error'
AND TimeLogged > '2022-03-03 00:00:00' -- when the last batch started
AND TimeLogged < '2022-03-03 16:00:00' -- when we estimate this batch might end
GROUP BY substring(text,1,80)
ORDER BY 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'
Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer