Havia algum tempo eu sentia falta de uma solução própria para fazer coleta de contadores diversos dos servidores que administro, a dois meses venho trabalhando forte em scripts Powershell e finalmente cheguei a uma solução definitiva, robusta e muito flexível.
Interessante para aprender como usar WMI, mas acredito que poderiamos enxugar bastante :
1 - Da uma olhadinha na SQLPSX , la tem um modulo que eu escrevi para coleta de dados. Voce configura XML´s para todos seus servidores com os contadres e com uma linha voce starta a coleta para todos eles, EM MODO ASSINCRONO.
2 - Neste codigo poderiamos usando a Out-DataTable e Write-DataTable , também da SQLPSX, :
$Counters = @(
'\PhysicalDisk(*)\Avg. Disk Queue Length',
'\Processor(*)\% Processor Time'
'\Memory\Available MBytes'
'\LogicalDisk(*)\% Free Space'
'\SQLServer:Buffer Manager\Buffer cache hit ratio'
'\SQLServer:Buffer Manager\Target pages'
'\SQLServer:Buffer Manager\Page life expectancy'
)
Get-Counter -Counter $Counters -computername (get-content c:\temp\Servers.txt) `
| select -ExpandProperty countersamples `
| select @{E={$_.Path};L="Name"},
@{E={$_.CookedValue};L="Value"},
@{E={(Get-Date -Format "yyyy/MM/dd hh:mm:ss")};L = "Date"} ,
@{E={($_.path).Split('\')[2]};L = "Server"} `
| Out-DataTable | Write-DataTable -Database model -ServerInstance R2d2 -TableName TB_CONTADORESWMI
Voce pode colocar um while e ir inserindo :
while ($true){
}
Netse exemplo Estou fazendo de modo sincrono, usando um .txt com todos os servers no parametro computer name.Mas eu firmamente aconselho a fazer este tipo de operação em modo assincrono, usando background jobs ou runspaces, como é o modulo da SQLPSX :)