Explotando con Grafana nuestra granja de Citrix

Buenas, os dejo un post donde vemos cómo podemos explotar la información que almacena Citrix en sus bases de datos. Como me imagino que sabréis, Citrix almacena en BBDD los registros de lo que sucede en nuestra granja Citrix, pero eso sí, as much as you pay, as much as you get, o sea, que depende de la Edición que tengamos Citrix nos almacenará info en esas BBDD por 1 semana, o 1 mes o 1 año. Aquí veremos cómo hacer nuestros propios paneles con Grafana y sin límite de fechas!

Lo dicho, en este post veremos únicamente un ejemplo con las Sesiones de los usuarios, donde tendremos un historial de quién abrió qué y cuando, pero claro que también podemos visualizar el rendimiento de los servidores de Citrix, los Delivery Controller, los VDA… Así como los clientes, qué versión tienen, qué SO…

Así que si os suena, normalmente Citrix almacena en 3 distintas BBDD la información que nos muestra en sus consolas Studio o Director, la idea es hacer una cuarta BD donde nosotros almacenemos lo que nos interese, y esa BD será nuestro histórico, que será la que Grafana consulte, y así no perdamos historial y tengamos mucha más info y sobre todo personalizada para nosotros, únicamente con lo que queramos ver.

Antes de empezar, necesitaremos tener esta cuarta BD creada, lo podemos hacer desde SQL Server Management Studio (SSMS) con el siguiente código:

Create Table LogCitrix.dbo.Sesiones (FullName varchar(255),StartDate DATETIME,EndDate DATETIME,SessionIdleTime DATETIME,ConnectedViaIPAddress varchar(255),ConnectionID INT);


Lo siguiente, necesitaremos un fichero .BAT que ejecutaremos con la frecuencia que nos interese para que nos almacene en esta base de datos (la nuestra) la información y así luego la explotemos con Grafana. Este BAT normalmente lo ejecutaremos con el Programador de Tareas de Windows. Llamémosle por ejemplo LogCitrix.bat y este sería su contenido:

@echo off
sqlcmd -S NOMBRE_SERVIDOR_DELIVERY_CONTROLLER -i C:\LogCitrix\sessiones.sql -o C:\LogCitrix\sessiones.txt


Necesitaremos también el fichero .SQL que tiene las instrucciones de qué contenido y de qué tablas nos vamos a traer, en mi ejemplo, este se llama sessiones.sql, y este sería su contenido:

Insert Into logcitrix.dbo.sesiones
select U.FullName, S.Startdate, S.EndDate, S.SessionIdleTime, C.ConnectedViaIPAddress, C.id
FROM [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[Session] S, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[User] U, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[Connection] C
Where s.userid=U.id and S.currentconnectionid=c.id;

with sesionesCTE AS
(
SELECT *, ROW_NUMBER()OVER(PARTITION BY Connectionid ORDER BY Connectionid) AS RowNumber FROM logcitrix.dbo.sesiones
)
DELETE FROM sesionesCTE WHERE RowNumber > 1

Ý esto es lo que tendremos siguiendo el ejemplo anterior, vaya que lo dicho, esto es una tabla unicamente para las Sesiones de los Usuarios, donde vamos a ir guardando quién se conectó y cuando, cuándo cerró la sesión y desde donde se conectó. Ya os digo, que depende de los datos que queráis traer habrá que traer datos de otras tablas, que no lo pongo ahora para no complicaros la vida 😉

Histórico de Sesiones Citrix,

Y nada, con los datos ya almacenados, como siempre, deberemos crear un DataSource u Origen de Datos nuevo contra el servidor SQL en cuestión y la BD de Citrix que acabamos de crear, así podremos hacerle consultas. Para hacer la visualización en tabla, personalmente me gusta más usar el panel ‘Datatable Panel‘ de Brian Gann (veréis en el link lo fácil que se instala ese tipo de Panel), es que así podremos hacer filtros, búsquedas…

Y será tan sencillo como meter esta query:

SELECT [FullName] AS 'NOMBRE',
[StartDate] AS 'HORA INICIO',

case
when [SessionIdleTime] Is null then [EndDate]
when [enddate] IS not null and [SessionIdleTime] IS not null then [SessionIdleTime]
end as 'HORA FIN',
case

when [SessionIdleTime] Is null and [EndDate] IS not null then 'CIERRE USUARIO'
when [SessionIdleTime] Is not null and [EndDate] IS not null and DATEDIFF(hour,[SessionIdleTime],[enddate])>=2 then 'CIERRE POR INACTIVIDAD'
when [SessionIdleTime] Is not null and [EndDate] IS not null and DATEDIFF(hour,[SessionIdleTime],[enddate])<2 then 'CIERRE USUARIO'
end as 'TIPO CIERRE',

--[SessionIdleTime],

-- [EndDate],

case
when [ConnectedViaIPAddress] ='DIRECCION_IP_NETSCALER_GATEWAY' then 'FUERA OFICINA'
else 'OFICINA'
end as 'CONEXION DESDE'--,

-- [ConnectedViaIPAddress],
-- [ConnectionID]
FROM [LogCitrix].[dbo].[Sesiones]
where [FullName] <> 'Rubén Tercero García' and [StartDate]>'2019-09-23'
order by StartDate desc

Tiempos de Logon,

El tiempo de logon en entornos Citrix sabemos que es muy importante, si queremos, podemos visualizar lo que tardan en abrir sesiones los usuarios (y cuándo), en este caso por que usamos UPM y no FSLogix (que desaparece el problema de los perfiles móviles). Y esto en vez de consultarlo a esta BD de histórico, podemos preguntarlo directamente a las BBDD de producción de Citrix, en este caso a la de Monitoring (así que recordar, que esto necesitará otro DataSource creado en Grafana, contra la BD de producción). Quedando listo con esta Select:

SELECT
$__timeEpoch(S.Startdate),
S.logonduration as value,
U.FullName as metric
FROM
[NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[Session] S, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[User] U
WHERE
$__timeFilter(S.Startdate) and s.userid=U.id
ORDER BY
S.Startdate ASC

Apps abiertas,

Como último ejemplo os dejo una tabla donde podemos ir viendo las apps que van abriendo los usuarios, así tenemos algo de idea de qué pasa en nuestra granja. Hacemos un panel de tipo gráfico y en este caso mediante la siguiente Select lo tendríamos:

SELECT
$__timeEpoch(AI.Startdate),
1 as value,
--tata as metric,
A.PublishedName as metric
FROM
[NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[Session] S, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[User] U, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[Connection] C, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[application] A, [NOMBRE_BD_CITRIX_MONITORING].[MonitorData].[applicationinstance] AI

WHERE
$__timeFilter(S.Startdate) and s.userid=U.id and S.currentconnectionid=c.id and AI.sessionkey=S.sessionkey and A.id=AI.applicationid
ORDER BY
S.Startdate ASC

Este post la idea que tiene es eso, que sepáis que se pueden explotar cualquier base de datos que tengamos en nuestras organizaciones, y visualizar sus datos, otros ejemplos que tengo es eso, visualizaciones en quesito de qué versiones tienen los usuarios de Citrix Receiver/Citrix Workspace… O si tenéis un ERP, lo mismo, explotarlo y visualizar datos de Navision, SAP… o si tenéis un gestor de tiempos, estoy seguro que a vuestros jefes les encantaría tener reports en tiempo real con los datos que les interesa! Acordaros que también luego podéis exportar esto en un PDF bonito y que se envíe por correo electrónico de manera programada a los destinatarios que nos interese.

¡Espero os haya interesado!

Últimas entradas de Héctor Herrero (ver todo)