如何使用Nutanix PowerShell API筛选过去24小时内的未解决告警
实现方案
核心思路
提前计算对应时间范围的Unix微秒阈值,在拉取告警阶段就完成过滤,避免全量拉取告警后再做二次处理,既简化逻辑也提升运行效率。
具体修改步骤
1. 预定义全局时间阈值
在遍历集群的循环外先计算好需要的时间阈值,避免循环内重复计算:
# 加载凭证和集群列表的原有逻辑保留 $MyNTNXCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ntnxuserid, (Get-Content $NTNXCredPassPath | ConvertTo-SecureString ) $NTNXClusterList = import-csv -Path C:\path_to_list_of_clusters\ntnxclusters_list.csv # 新增:预计算时间阈值 $unixEpoch = [DateTime]::new(1970,1,1,0,0,0,[DateTimeKind]::Utc) # 按需调整时间范围:这里同时给出24小时和2小时的阈值,可根据需求切换 $threshold24hUtc = (Get-Date).AddDays(-1).ToUniversalTime() $threshold2hUtc = (Get-Date).AddHours(-2).ToUniversalTime() # 转成和接口返回字段一致的微秒级Unix时间戳 $threshold24hUnixUsec = ($threshold24hUtc - $unixEpoch).TotalSeconds * 1000000 $threshold2hUnixUsec = ($threshold2hUtc - $unixEpoch).TotalSeconds * 1000000 # 定义时区,提到循环外避免重复加载 $myTimeZone=[System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time") $NTNXAlertArray = @()
2. 拉取告警时增加时间过滤条件
修改Get-NTNXAlert后的过滤逻辑,仅保留符合时间要求的未解决告警:
foreach($NTNXAlertCluster in $NTNXClusterList){ $NTNXCluster = $NTNXAlertCluster.Name Connect-NutanixCluster -Server $NTNXCluster -UserName $MyNTNXCredential.UserName -Password $MyNTNXCredential.Password -AcceptInvalidSSLCerts -ForcedConnection # 新增时间过滤条件:如果要筛选2小时内的告警,把下面的$threshold24hUnixUsec换成$threshold2hUnixUsec即可 # 如果要按最后发生时间过滤,把createdTimeStampInUsecs换成lastOccurrenceTimeStampInUsecs $GetNTNXAlert = Get-NTNXAlert | Where-Object { $_.resolved -ne $true -and $_.createdTimeStampInUsecs -ge $threshold24hUnixUsec } | Select-Object alertTitle, message, severity, categories, impact, resolved, createdTimeStampInUsecs, lastOccurrenceTimeStampInUsecs foreach($alert in $GetNTNXAlert){ $NTNXAlertTitle = $alert.alertTitle $NTNXAlertMessage = $Alert.message $NTNXAlertSeverity = $Alert.severity $NTNXAlertCategories = $Alert.categories $NTNXAlertImpact = $Alert.impact $NTNXAlertResolved = $Alert.resolved $NTNXAlertCreated = $alert.createdTimeStampInUsecs $NTNXLastOccurance= $Alert.lastOccurrenceTimeStampInUsecs # 转换时间后补充时区转换逻辑 $NTNXCreatedDateTime = (New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0).AddSeconds([math]::Floor($NTNXAlertCreated/1000000)) $NTNXCreatedDateTime = [System.TimeZoneInfo]::ConvertTimeFromUtc($NTNXCreatedDateTime, $myTimeZone) $NTNXLastOccuranceDateTime = (New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0).AddSeconds([math]::Floor($NTNXLastOccurance/1000000)) $NTNXLastOccuranceDateTime = [System.TimeZoneInfo]::ConvertTimeFromUtc($NTNXLastOccuranceDateTime, $myTimeZone) $NTNXAlertArray += [PSCUSTOMOBJECT]@{ "Nutanix Cluster" = $NTNXCluster "Nutanix Alert Title" = $NTNXAlertTitle "Nutanix Alert Message" = $NTNXAlertMessage "Nutanix Alert Severity" = $NTNXAlertSeverity "Nutanix Alert Category" = $NTNXAlertCategories "Nutanix Alert Impact" = $NTNXAlertImpact "Nutanix Alert Resolved" = $NTNXAlertResolved "Nutanix Alert Created" = $NTNXCreatedDateTime "Nutanix Alert Last Occurred" = $NTNXLastOccuranceDateTime } } } $NTNXAlertHTML = $NTNXAlertArray | ConvertTo-HTML -Fragment -PreContent "<h3>NTNX Alerts</h3>"
可选调整说明
- 如果需要同时展示24小时和2小时的告警,可在生成HTML前对
$NTNXAlertArray做二次筛选,用DateTime字段比较更直观:# 筛选过去2小时内发生的告警 $alert2hList = $NTNXAlertArray | Where-Object { $_."Nutanix Alert Last Occurred" -ge (Get-Date).AddHours(-2) } $alert2hHTML = $alert2hList | ConvertTo-HTML -Fragment -PreContent "<h3>过去2小时NTNX告警</h3>" - 时间过滤维度可根据需求切换为创建时间/最后发生时间,只需要修改过滤时对应的字段即可。
内容的提问来源于stack exchange,提问作者Devante
相关产品推荐
相关产品推荐

