hace unos días, un cliente me pidió tener dashboards en grafana de su servidor DHCP para conocer y medir el servicio, por lo que me puse a investigar como podiamos obtener los datos del servidor DHCP y poder armar los tableros en grafana, por lo que en esta entrada les comento lo que hice:
Para este propósito usamos un script en PowerShell + Telegraf + Influxdb y Grafana.
1.- En el servidor DHCP arme un script en powershell y guardarlo con el nombre GetDHCPStats.ps1 en la siguiente ruta C:\Scripts el cual ejecuta los siguientes comandos:
Get-DhcpServerv4Scope: Devuelve la configuración del ámbito IPv4 de los ámbitos especificados
Get-DhcpServerv4ScopeStatistics: Obtener las estadísticas de alcance IPv4 correspondientes a los ID de alcance IPv4.
Get-DhcpServerv4ExclusionRange: Devuelve los rangos de direcciones IPv4 excluidos de los ID de alcance especificados.
Get-Service -Name DHCPServer: Otener el estado del servicio DHCP.
Aqui coloco el código desarrollado:
$scopes = Get-DhcpServerv4Scope
foreach ($scope in $scopes) {
$stats = Get-DhcpServerv4ScopeStatistics -ScopeId $scope.ScopeId
$exclusionRanges = Get-DhcpServerv4ExclusionRange -ScopeId $scope.ScopeId
$totalExcluidas = 0
foreach ($rango in $exclusionRanges) {
$startBytes = [System.Net.IPAddress]::Parse($rango.StartRange).GetAddressBytes()
$endBytes = [System.Net.IPAddress]::Parse($rango.EndRange).GetAddressBytes()
$startInt = ($startBytes[0] -shl 24) -bor ($startBytes[1] -shl 16) -bor ($startBytes[2] -shl 8) -bor $startBytes[3]
$endInt = ($endBytes[0] -shl 24) -bor ($endBytes[1] -shl 16) -bor ($endBytes[2] -shl 8) -bor $endBytes[3]
$totalExcluidas += $endInt - $startInt + 1
}
# Construcción correcta de campos (sin espacios)
$fields = @(
"start_range=`"$($scope.StartRange)`"",
"end_range=`"$($scope.EndRange)`"",
"addresses_free=$($stats.AddressesFree)",
"addresses_used=$($stats.AddressesInUse)",
"addresses_reserved=$($stats.Reserved)",
"addresses_excluded=$totalExcluidas",
"percentage_used=$($stats.PercentageInUse)"
) -join ','
# Línea única con formato válido
$line = "dhcp_scope,host=$env:COMPUTERNAME,scope_id=$($scope.ScopeId),subnetMask=$($scope.SubnetMask),name=$($scope.Name.Replace(' ','\ ')),state=$($scope.State),lease=$($scope.LeaseDuration) $fields"
Write-Output $line
}
# Estado del servicio
$service = Get-Service -Name DHCPServer
Write-Output "dhcp_service,host=$env:COMPUTERNAME status=`"$($service.Status)`""
2.- Configurar Telegraf para enviar los datos a servidor Influxdb
[[inputs.exec]]
commands = ["powershell -ExecutionPolicy Bypass -File C:\\Scripts\\GetDHCPStats.ps1"]
timeout = "10s"
data_format = "influx"
[[outputs.influxdb]]
urls = ["http://IP_InfluxDB:8086"] # Ej: http://192.168.1.100:8086
database = "dhcp_metrics" # Nombre de la base de datos
username = "usuario" # Opcional
password = "contraseña" # Opcional
Finalmente obtendremos este dashboard en nuestro grafana:
Nos vemos en la próxima!!!.