Citrix XenApp Session Statistics

This template lists Top 10 Citrix Sessions for Latency and RTT values. It needs to be assigned to Citrix XenApp Session Servers.

Requirements:

  • WMI credentials are required to access Citrix XenApp Session servers.
  • WMI access should be allowed from SolarWinds polling engine server to Citrix XenApp Session servers.
  • Script runs locally on SolarWinds server and executes WMI query remotely. "root\citrix\EUEM" WMI namespace must exist on your servers.

Output:

  • Script has two components: "Top 10 Latency" and "Top 10 RTT"
  • Each component returns 10 message and statistic pairs sorted by the monitored metric in descending order.
  • Statistic shows the current metric value in milliseconds
  • Message shows the Session ID and Username detail
  • Template does not have threshold values configured, this can be configured for each component based on monitoring requirements
  • If WMI query does not return any value or access is not allowed, then the component returns "No Data" in the message field 

This image shows sample output:

Summary View Display:

If the template is assigned to all Citrix XenApp Session servers, then a "Citrix" application summary can be defined.

This figure shows sample widgets configured using "Custom Query" widgets:

These are the custom SWQL queries used in these widgets:

Session Latency - SWQL query:

SELECT S.NODE as [Server Name], M.MSG as [Session Information], S.STAT as [Latency (ms)] 
, case when S.STAT>=500 then '/Orion/images/StatusIcons/Small-Critical.gif'
       when S.STAT>=200 then '/Orion/images/StatusIcons/Small-Warning.gif'
       else '/Orion/images/StatusIcons/Small-Up.gif'
  end as [_IconFor_Latency (ms)]
FROM
(
    SELECT 
    n.Caption AS NODE,
    a.Name AS APP,
    c.ComponentName AS CMPNT, 
    de.AvgNumericData AS STAT, 
    de.StringData AS MSG,
    de.ColumnLabel as LBL
    FROM
    Orion.APM.Component(nolock=true) c 
    JOIN Orion.APM.CurrentComponentStatus(nolock=true) ccs ON c.ComponentID = ccs.ComponentID 
    JOIN Orion.APM.DynamicEvidence(nolock=true) de ON de.ComponentStatusID = ccs.ComponentStatusID
    JOIN Orion.APM.Application(nolock=true) a ON c.ApplicationID = a.ApplicationID
    JOIN Orion.Nodes(nolock=true) n ON a.NodeID = n.NodeID 
    WHERE
    de.AvgNumericData IS NOT NULL 
    AND a.Name='Citrix XenApp Session Statistics'
    AND c.Name='Top 10 Latency'
) s
INNER JOIN
(
    SELECT 
    n.Caption AS NODE,
    a.Name AS APP,
    c.ComponentName AS CMPNT, 
    de.AvgNumericData AS STAT, 
    de.StringData AS MSG,
    de.ColumnLabel as LBL
    FROM
    Orion.APM.Component(nolock=true) c 
    JOIN Orion.APM.CurrentComponentStatus(nolock=true) ccs ON c.ComponentID = ccs.ComponentID 
    JOIN Orion.APM.DynamicEvidence(nolock=true) de ON de.ComponentStatusID = ccs.ComponentStatusID
    JOIN Orion.APM.Application(nolock=true) a ON c.ApplicationID = a.ApplicationID
    JOIN Orion.Nodes(nolock=true) n ON a.NodeID = n.NodeID 
    WHERE
    de.AvgNumericData IS NULL 
    AND a.Name='Citrix XenApp Session Statistics'
    AND c.Name='Top 10 Latency'
) m ON s.Node=m.Node and s.App=m.App and s.cmpnt=m.cmpnt and s.lbl=m.lbl
order by S.STAT desc

Session RTT - SWQL query:

SELECT S.NODE as [Server Name], M.MSG as [Session Information], S.STAT as [RTT (ms)] 
, case when S.STAT>=500 then '/Orion/images/StatusIcons/Small-Critical.gif'
       when S.STAT>=200 then '/Orion/images/StatusIcons/Small-Warning.gif'
       else '/Orion/images/StatusIcons/Small-Up.gif'
  end as [_IconFor_RTT (ms)]
FROM
(
    SELECT 
    n.Caption AS NODE,
    a.Name AS APP,
    c.ComponentName AS CMPNT, 
    de.AvgNumericData AS STAT, 
    de.StringData AS MSG,
    de.ColumnLabel as LBL
    FROM
    Orion.APM.Component(nolock=true) c 
    JOIN Orion.APM.CurrentComponentStatus(nolock=true) ccs ON c.ComponentID = ccs.ComponentID 
    JOIN Orion.APM.DynamicEvidence(nolock=true) de ON de.ComponentStatusID = ccs.ComponentStatusID
    JOIN Orion.APM.Application(nolock=true) a ON c.ApplicationID = a.ApplicationID
    JOIN Orion.Nodes(nolock=true) n ON a.NodeID = n.NodeID 
    WHERE
    de.AvgNumericData IS NOT NULL 
    AND a.Name='Citrix XenApp Session Statistics'
    AND c.Name='Top 10 RTT'
) s
INNER JOIN
(
    SELECT 
    n.Caption AS NODE,
    a.Name AS APP,
    c.ComponentName AS CMPNT, 
    de.AvgNumericData AS STAT, 
    de.StringData AS MSG,
    de.ColumnLabel as LBL
    FROM
    Orion.APM.Component(nolock=true) c 
    JOIN Orion.APM.CurrentComponentStatus(nolock=true) ccs ON c.ComponentID = ccs.ComponentID 
    JOIN Orion.APM.DynamicEvidence(nolock=true) de ON de.ComponentStatusID = ccs.ComponentStatusID
    JOIN Orion.APM.Application(nolock=true) a ON c.ApplicationID = a.ApplicationID
    JOIN Orion.Nodes(nolock=true) n ON a.NodeID = n.NodeID 
    WHERE
    de.AvgNumericData IS NULL 
    AND a.Name='Citrix XenApp Session Statistics'
    AND c.Name='Top 10 RTT'
) m ON s.Node=m.Node and s.App=m.App and s.cmpnt=m.cmpnt and s.lbl=m.lbl
order by S.STAT desc

Ecmel Ozdemir

Prosperon - UK SolarWinds Partners

Installation | Consultancy | Training | Licenses