Analizando estadísticas de generación de logs de transacciones

Hola a todos, en la entrada de hoy voy a comentar como recolectar información de generación de logs de transacciones en un entorno de Exchange, utilizando como referencia un artículo públicado en nuestro Blog oficial en Inglés. (No aceptes imitaciones :-p )

La información recolectada, nos permitirá extraer una referencia de la carga actual en las bases de datos. Esta información es muy útil para realizar cálculos de capacidad, previendo así el crecimiento del entorno y los evolutivos necesarios para mantener los requerimientos de servicio.

La recolección de los datos se realizará mediante un script llamado GetTransactionLogStats.ps1 cortesía de nuestro compañero Mike Hendrickson. (Thanks Mike)

Requerimientos

  • El script soporta versiones Exchange 2010 o superiores.
  • Remote powershell debe estar habilitado en los servidores en cuestión y configurado para permitir las conexiones desde la máquina donde se lanzará el script en cuestión.

Parámetros

El script dispone de los siguientes parámetros:

  • Gather: Con este modificador capturaremos las transacciones generadas que posteriormente analizaremos. Si omitimos este modificador se debe utilizar -Analyze
  • Analyze: Con este modificador analizaremos la información ya capturada anteriormente. Si omitimos este modificador se debe utilizar -Gather
  • ResetStats: Este modificador se utilizará para limpiar el fichero de recolección, solo se utiliza en el modo Gather
  • WorkingDirectory: El modificador indica donde se alojará el fichero de recolección, en caso de omitirlo el script utilizara el directorio de trabajo de powershell (No tiene por qué coincidir con el directorio donde está alojado el script).
  • LogDirectoryOut: El modificador indica donde se alojarán los ficheros de salida generados a través del proceso Analyze, en el caso se omitir el modificador la salida se alojará en la ruta especificada mediante WorkingDirectory

Utilización

Teniendo en cuenta los parámetros comentados, os adjunto varios ejemplos de uso del script:

  • Recolectar información de los servidores "server1" y "server2"
    •  .\GetTransactionLogStats.ps1 -Gather -TargetServers “server1″,”server2”
  • Recolectar información especificando el directorio de recolección y forzando la limpieza del fichero de recolección si este existe
    • .\GetTransactionLogStats.ps1 -Gather -TargetServers “server1″,”server2” -WorkingDirectory “C:\GetTransactionLogStats” -ResetStats
  • Lanzar el script en modo análisis indicando la ubicación donde se alojarán los ficheros de salida generados
    • .\GetTransactionLogStats.ps1 -Analyze -LogDirectoryOut “C:\GetTransactionLogStats\LogsOut"

 

Fichero de salida generado en el modo recolección " Gather"

  1. Logstats.csv - Una vez recolectada la información, el fichero de recolección generado tendrá un contenido tal como se muestra en la imagen, como podéis ver es un fichero separado por comas que está compuesto por la siguientes columnas:
    • Databasename: Nombre de la base de datos
    • Servername: Nombre del servidor
    • LogGeneration: Número de logs generados
    • Timecollected: Hora en la que se ha recogido la información

imageFicheros de salida generado en el modo análisis " Analyze"

  1. LogGenByHour.csv - Este fichero de salida generado por el proceso de análisis, se utiliza para identificar el ratio horario de generación de logs en la calculadora de requerimientos de Exchange "Exchange Server Role Requirements Calculator" y está compuesto por las siguientes columnas:
    • Hour: La hora en la que se ha recolectado el estado del log. Sus valores son entre 0 - 23
    • LogsGenerated: El número total de logs creados durante esa hora para todos los días presentes en el fichero analizado "LogStats.csv"
    • HourToDailyLogGenRatio: El ratio de todos los registros en esa hora en particular. La suma de valores de esta columna durante las 24h de la tabla debe ser 1 y se puede copiar directamente en la calculadora de requisitos.
    • NumberofHourlySamples: El número de muestras horarias que se utilizaron para calcular el valor de cada hora.
    • AvgLogGenPerHour: El número medio de transacciones generadas por base de datos por horaimage
  2. LogGenByDB.csv - Este fichero contiene las estadísticas de generación de transacciones por cada base de datos durante el proceso de recolección. Esta información puede utilizarse para identificar si la base de datos, servidor o grupo de disponibilidad está sobre o subutilizado en comparación con el resto, y está compuesto por las siguientes columnas:
    • DatabaseNAme: Nombre de la base de datos monitorizada
    • LogsGenerated: El número total de transacciones creadas por las copia primaria de la base de datos durante el proceso de recollección
    • LogGenToTotalRatio: El ratio de logs generados por esta base de datos en comparación con las transacciones realizadas por todas las bases de datos
    • NumberofHours: El numero de muestras horarias que fueron capturadas para esta base de datos
    • LogsGeneratedPerHour: La número medio de transacciones generadas por hora para esta base de datos.image
  3. LogGenByDBByHour.csv - El fichero es similar al LogGenByDB.csv, pero contiene información acerca del ratio de generación de transacciones por hora para cada base de datos, y está compuesto por las siguientes columnas:
    • DatabaseName:  Nombre de la base de datos monitorizada
    • Hour: La hora en la que se ha recolectado el estado de las transacciones. Sus valores són entre 0 - 23
    • LogsGenerated: El número total de transacciones creadas por la copia primaria de la base de datos durante el proceso de recollección
    • HourToDailyLogGenRatioForDB: El ratio de transacciones generadas durante esta hora en esta base de datos comparado con el total de logs generados para esta base de datos

image

Ejecutar la recolección con una tarea programada

De cara a obtener un muestreo útil, sería recommendable recoger la información cada hora, la forma más sencilla de hacerlo es ejecutar el script mediante una tarea programada. La manera de hacerlo es crear una archivo por lotes que llame al powershell.exe y que este a su vez lance el script "GetTransactionLogStats.ps1", este archivo por lotes debe ser ejecutado desde una tarea programada que nos permitirá establecer la frecuencia de ejecución.

Aqui tenéis un ejemplo de comando que debería utilizarse en el fichero por lotes:

powershell.exe -noninteractive -noprofile -command “& {C:\LogStats\GetTransactionLogStats.ps1 -Gather -TargetServers “server1”,”server2” -WorkingDirectory C:\LogStats}”

Se debe tener en cuenta que en este ejemplo la secuencia de commandos se encuentra en C:\logstats, la misma ruta que el directorio de trabajo del propio script, para que si la tarea programada se ejecuta en una ubicación alternativa (por defecto c:\windows\system32\) el script sepa donde leer y escribir el fichero de recollección logstats.csv. El commando no carga ningún snapin the exchange, ya que el script no utiliza ningún commando específico de Exchange.

 

Generación de informes utilizando la información recolectada

Una vez recolectada toda la información que hemos mencionado durante el post, solo queda pasarla a un formato más entendible, ya sea de cara a presentar un informe ejecutivo o simplemente obtener una gráfica para valorar la situación de un vistazo rápido, como se suele decir: "Una imagen vale más que mil palabras"

Como apunte, me gustaría comentar que para mantener un histórico de ficheros LogGenxx.csv debemos implementar algún script que mueva (move-item) los ficheros generados durante el día en una carpeta de trabajo diferente, para evitar que los ficheros se sobreescriban.

Aquí os dejo unas líneas de ejemplo para generar una carpeta con la fecha de ayer y mover todos los ficheros con fecha de ayer a dicha carpeta:

New-Item -path "c:\logstats\$((Get-Date).AddDays(-1) | Get-Date -Format ddMMyyyy)" -type directory

Get-ChildItem -Path "C:\logstats" -filter "*.csv" | ? {$_.LastWriteTime -lt (Get-date)} | Move-Item -path "C:\logstats\$((Get-Date).AddDays(-1) | Get-Date -Format ddMMyyyy)"

 

Siguendo con el tratamiento de la información recolectada, en este punto tenemos varias opciones al gusto del consumidor para manejar estos datos, yo personalmente creo que la opción más sencilla es procesar todos estos datos a través de "Power BI Desktop" el cual nos permitirá establecer una "plantilla" de visualización de datos para poder obtener un gráfico dinámico periódico utilizando como origen los ficheros que generamos/alojamos en esa máquina de administración donde se lanza el script.

Espero poder ampliar información a este respecto en próximas actualizaciones.