lunes, 14 de abril de 2025

DHCP Windows Server - Dashboard Grafana

 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: 

Dashboard DHCP

 Nos vemos en la próxima!!!.