This script will monitor the available free space on the Cluster Shared Volumes and if they fall below a set threshold it will send a webhook alert or an email.

You can call this in the task scheduler of a cluster node member.

I wrote this after I noticed that most monitoring tools don't see Cluster Shared Volumes and can't be used to warn if you are running out of space.

Updated: Added switch and input parameters to choose between an email alert or a webhook POST.

 

 

PowerShell
Edit|Remove
param( 
[Parameter(ParameterSetName='webhook')][switch]$webhook, 
[Parameter(ParameterSetName='webhook',Mandatory=$true)][string]$Uri, 
[Parameter(ParameterSetName='email')][switch]$Email, 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$smtpServer = 'smtp.contoso.com', 
[Parameter(ParameterSetName='email',Mandatory=$false)][int]$smtpPort = '25', 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$mailFrom = 'no-reply@contoso.com', 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$mailTo = 'exampe@contoso.com', 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$subject = '[Warning] Free Space on Cluster Storage Volume is low' 
) 
 
<#  
.Synopsis  
   Checks the available space on cluster Shared Volumes and sends an alert if free space is below set threshold.  
.DESCRIPTION  
   Riccardo Toni: 2018/06/27  
   Version 1.1  
   Checks free CSV space and sends a webhook or email alert if available space falls below a set threshold.  
.EXAMPLE  
   Run the script as a (elevated) scheduled task on a member node of the Hyper-V Cluster. 
   .\Get-ClusterStorageVolumeFreeSpace.ps1 -WebHook -Uri 'https://webhook.example.com/apikey' 
.EXAMPLE 
    To send an email alert instead of a webhook POST: 
    .\Get-ClusterStorageVolumeFreeSpace.ps1 -Email 
#>  
  
# Percent of freespace on CSV to trigger an alert.  
[int]$MinFree = 75  
  
Import-Module FailoverClusters  
  
$clustername = Get-Cluster  
  
$objs = @() 
$CurrentFree = @{}  
  
$csvs = Get-ClusterSharedVolume  
foreach ( $csv in $csvs )  
{  
    $csvinfos = $csv | select -Property Name -ExpandProperty SharedVolumeInfo  
    foreach ( $csvinfo in $csvinfos )  
    {  
        $obj = New-Object PSObject -Property @{  
            Name        = $csv.Name  
            Path        = $csvinfo.FriendlyVolumeName  
            Size        = $csvinfo.Partition.Size  
            FreeSpace   = $csvinfo.Partition.FreeSpace  
            UsedSpace   = $csvinfo.Partition.UsedSpace  
            PercentFree = $csvinfo.Partition.PercentFree  
        }  
 
        $objs +$obj 
 
        if ($webhook) 
        { 
            # Sends Webhook Alert 
            if ($($obj.PercentFree) -lt $MinFree) 
            {  
                $notificationPayload = @{ text=”WARNING: Free space on $($obj.Name) CSV is below warning threshold - Current free space: $($obj.PercentFree)%” }  
                Invoke-RestMethod -Uri $uri -Method Post -Body (ConvertTo-Json $notificationPayload)    
            } 
        } 
 
        if ($email) 
        { 
            # Sends Email Alert 
            if ($($obj.PercentFree) -lt $MinFree) 
            {  
                $body = "WARNING: Free space on $($obj.Name) CSV is below warning threshold." 
                $body +"<br></br>" 
                $body +"<b>Current free space: $($obj.PercentFree)%" 
 
                Send-MailMessage -From $mailFrom -Subject $subject -To $mailTo -SmtpServer $smtpServer -Port $smtpPort -Body $body -BodyAsHtml  
 
            } 
             
        } 
    }  
}