Skip to main content

Monitorización

Monitorización mediante Contadores de Rendimiento

Partiendo de la base de que ya tenemos instalado y configurado tanto Pandora como el sistema a monitorizar, vamos a explicar como obtener información sobre el estado del servidor SQL en general, desde actividad de los diferentes servicios así como contadores a raiz de Powershell que mediante diferentes cmdlets se encargará de realizar comprobaciones sobre elementos críticos de nuestros sistemas.

Para este caso instalaremos tanto un agente software de Pandora como los diferentes plugins de agente Powershell en la máquina en cuestión.

Para hacer que el agente software de Pandora que tenemos instalado en nuestro servidor a monitorizar ejecute dicho script, debemos editar el archivo de configuración del agente y hacer la llamada al plugin mediante el token de configuración module_plugin.

Podemos editar el archivo de configuración del agente de Pandora desde la consola de administración de Pandora FMS o simplemente sobreescribiendo el pandora_agent.conf dependiendo si esta activado remote_config o no.

Introduciremos lo siguiente al final del archivo de configuración por ejemplo:

# Agent Plugins for SQL Monitoring
module_plugin "<ruta-powershell>\powershell.exe" -command C:\'<rutaplugin>\Pandora_Plugin_PerfCounter_vx.y.ps1' -list C:\'<ruta-listado>\counters.txt'
2> counter_plugin.error

** El plugin PerfCounter.ps1 no se incluye en el .zip pero si se encuentra disponible en el .zip correspondiente subido al servidor con el nombre PerfCounter.

Guardamos el archivo y reiniciamos el agente de Pandora.

Hay que tener en cuenta la redirección de errores del plugin a un log de errores, sobre todo debido al timeout de ejecución de los cmdlets cuando se tiene que procesar gran cantidad de información en poco tiempo.

En el supuesto de que quisieramos generar un módulo por cada uno de los contadores de la máquina, el cmdlet tendría que procesar una media de 20000 contadores de una sola vez, y ya que hasta que no ha procesado todo el listado de contadores no muestra la información, todo el tiempo desde que procesa la información hasta que la presenta, el cmdlet Powershell saca un mensaje de error tras otro avisando que el contador de la lista no se ha encontrado.

Esto es debido a que el cmdlet Powershell entiende que si ha pasado “x” tiempo desde la petición de la información del contador y esta información no ha sido presentada en el output, entonces no se ha podido encontrar la información que andaba buscando, cuando en realidad ésta sí ha sido encontrada, solo que aún no ha sido presentada.

Para evitar incrementar el log sin control y aun así recibir todos los errores ocurridos durante la ejecución del plugin en el último intervalo (por si hay algún error real), hacer la redirección usando el símbolo “2>” tal como viene especificado en la línea que se debe introducir al archivo de configuración.

Una vez configurado, nos encargamos de distribuir los ficheros necesarios mediante file collections o copiandolos en la carpeta correspondiente del agente.

Una de las característica mas potentes del plugin en Powershell es la posibilidad de especificar en vez de ir creando uno a uno módulos para cada contador de rendimiento, seleccionar todos los contadores especificados en una lista, para que el plugin haga una única comprobación y genere automática un módulo para todos los estos contadores, optimizando lo máximo posible el tiempo necesario para extraer toda la información. Dicha lista la deberemos situar en la misma carpeta donde se encuentra el plugin, con el nombre counters.txt Veamos un ejemplo de su contenido:

\SQLServer:Access Methods\Full Scans/sec
\SQLServer:Access Methods\Range Scans/sec
\SQLServer:Access Methods\Probe Scans/sec
\SQLServer:Access Methods\Scan Point Revalidations/sec

Conteniendo counters.txt estos contadores, el plugin hará un módulo por cada uno de ellos. Si un contador tiene varias instancias, como en el caso de (*), el plugin hará un módulo por cada una de las instancias del contador.

Monitorización de instancias SQL

En una arquitectura clúster activo/pasivo con instancias remotas, accesibles desde los nodos SQL Server, es posible, haciendo uso de la consola de administración Powershell de SQL Server, realizar chequeos de disponibilidad de dichas instancias desde estos nodos, así como extraer información sobre el rendimiento y el estado de las bases de datos almacenadas en aquellas instancias levantadas, desde los nodos activos del clúster.

En el caso de los nodos pasivos, la monitorización se limita a los chequeos de disponibilidad de instancias, para indicar si dicho nodo permanece pasivo o pasa a estado activo y mientras tanto, no intentará conectar contra las instancias ni devolverá información alguna sobre su estado.

Adicionalmente, desde el servidor de Pandora se pueden definir chequeos ICMP contra las Ips de servicio de las instancias remotas para asegurar su conectividad.

Con este propósito se ha desarrollado un plugin Powershell al que, indicando una lista de instancias a monitorizar buscará en la lista de servicios del nodo, por cada instancia, si el servicio SQL Server de dicha instancia se encuentra levantado (en el caso del nodo activo) y en tal caso tratará de establecer conexión con el combo IP\nombreinstancia a la hora de recabar información
sobre el estado de las BBDD alojadas en dicha instancia. Si se especifica, también extraerá el estado de todos los servicios del nodo relacionados con SQL.

Los parámetros de este plugin son los siguientes:

 -select all All local instances and services are checked (not to be used in clusters)
 -select list Instances from the list are checked
 -select services All local services are checked
 -list Provides a path for a list with instances to check
Usage example: .\Pandora_Plugin_SQL_v1.0.ps1 -select all -list instances.txt 2>
plugin_error.log

Para el correcto funcionamiento del plugin cabe destacar que:

– El modo “select all” sólo deberá usarse en servidores SQL cuyas instancias son todas locales.
– En el caso de instancias ubicadas en servidores remotos, no se puede resolver el hostname de la máquina donde está ubicada la instancia remota del servidor SQL, luego para conectar con la instancia se hará mediante el combo IP\nombreinstancia.
Ejemplo de instancias.txt:

10.93.6.81\MSSQLSERVER
10.93.6.85\ESTGCDBP008
10.93.6.86\ESTGCDBP008
10.93.6.89\ESTGCDBP008

Necesitamos tener instalado y funcionando para la correcta ejecución de este plugin el comando invoke-sqlcmd. Para su instalación y correcto funcionamiento seguir estos pasos:

1.-Instalar SQL Server 2008 R2 Management Objects --> Para ello hay que descargar la utilidad Microsoft Web Platform Installer http://www.microsoft.com/web/downloads/platform.aspx.

Ejecutarlo y sobre la seccion de Productos buscar SQL Server 2008 R2 Management Objects, cuando aparezca añadir la opción para instalar.

2.- Instalación Windows PowerShell Extensions for SQL Server -->
https://docs.microsoft.com/es-es/sql/powershell/download-sql-server-ps-module?view=sql-server-ver15

Para probar que la ejecución del comando invoke-sqlcmd en powershell va a funcionar correctamente, ejecutamos estos comandos anteriormente en una consola powershell:

Add-PSSnapin SqlServerCmdletSnapin100

Add-PSSnapin SqlServerProviderSnapin100

y despues ejecutamos el comando invoke-sqlcmd.

En el caso de que se trate de windows 2012 bastará con ejecutar este comando en powershell, para
añadirlo:

Import-Module SqlPs

Monitorización Querys SQL ( Tiempo o dato Query)

Junto a este documento se añade un script de ejemplo para monitorizar querys sql así como eltiempo que tardan en ejecutarse estas querys.

Script para sacar resultado de una query:

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
invoke-sqlcmd -ServerInstance <HOSTNAME>\<INSTANCE_NAME>
-Username Usuario -Password -Query “query” -Database
<DATABASE_NAME>

Una vez generado el script que llamaremos sql_query.ps1, esta será la configuración de los módulos a configurar dependiendo de lo que querramos obtener, si el resultado de la query o el tiempo que tarda en ejecutarse.

module_begin
module_name Query result
module_type generic_data_string
module_exec powershell.exe <PATH>/sql_query.ps1
module_end

Script para resultado tiempo ejecución de una query, lo llamamos sql_time.ps1

Add-PSSnapin SqlServerCmdletSnapin100
Add-PSSnapin SqlServerProviderSnapin100
$var1=echo $( (( ((get-date).Minute * 60) + ((get-date).second)
)*1000) + (get-date).Millisecond )
$command=invoke-sqlcmd -ServerInstance
<HOSTNAME>\<INSTANCE_NAME> -Username Usuario -Password -Query
“query” -Database
$var2=echo $( (( ((get-date).Minute * 60) + ((get-date).second)
)*1000) + (get-date).Millisecond )
$var3 = ($var2 - $var1) / 1000
echo $var3

Este script directamente nos devuelve el tiempo en segundos que tarda la query en ejecutarse.

Para añadirlo al agente, bastará con la siguiente configuración:

module_begin
module_name Query result
module_type generic_data
module_exec powershell.exe <PATH>/sql_time.ps1
module_end