创建性能计数器 PowerShell:指定类别的计数器布局无效

Posted

技术标签:

【中文标题】创建性能计数器 PowerShell:指定类别的计数器布局无效【英文标题】:Create Peformance Counters PowerShell: The Counter layout for the Category specified is invalid 【发布时间】:2017-11-17 22:21:20 【问题描述】:

我正在尝试使用 PowerShell 创建性能计数器,但由于我使用了 AverageCount64 而出现以下错误:

"指定类别的计数器布局无效,计数器 类型:AverageCount64、AverageTimer32、CounterMultiTimer、 CounterMultiTimerInverse, CounterMultiTimer100Ns、CounterMultiTimer100NsInverse、RawFraction 或 SampleFraction 必须紧跟任何碱基 计数器类型:AverageBase、CounterMultiBase、RawBase 或 SampleBase。"

我知道我需要为 AverageCount64 类型添加 AverageBase,但不确定如何在我的代码中添加它,特别是因为我有不需要 AverageBase 的类型 (RateOfCountsPerSecond64):

    $AnalyticsCollection = New-Object System.Diagnostics.CounterCreationDataCollection
    $AnalyticsCollection.Add( (New-Object $ccdTypeName "Aggregation | Total Aggregation Errors / sec", "The total number of interactions which could not be aggregated due to an exception.", RateOfCountsPerSecond64) )    
    $AnalyticsCollection.Add( (New-Object $ccdTypeName "Aggregation | Average Check Out Time - History (ms)", "Average time it takes to obtain a work item from a range scheduler while rebuilding the reporting database.", AverageCount64) )
    $AnalyticsCollection.Add( (New-Object $ccdTypeName "Collection | Total Visits / sec", "The total number of visits per second that are registered by the system.", RateOfCountsPerSecond64 ) )        
    $AnalyticsCollection.Add( (New-Object $ccdTypeName "Aggregation | Average Check In Time - History (ms)", "Average time it takes to mark a work item as completed in a range scheduler while rebuilding the reporting database.", AverageCount64) )
    [System.Diagnostics.PerformanceCounterCategory]::Create("My Counters", "I love my performance counters", [Diagnostics.PerformanceCounterCategoryType]::MultiInstance, $AnalyticsCollection) | out-null

【问题讨论】:

【参考方案1】:

这可能会让您有所作为。 T 属于 [System.Diagnostics.CounterCreationData] 类型,如果您先创建该对象,则可以将其放入 Analytics 集合中。错误消息似乎表明您需要在创建计数器时添加基本类型。所以我稍微改变了你的最后一行。从枚举中特别添加 RawFraction 的基本类型。

$t = [System.Diagnostics.CounterCreationData]::new()
$t.CounterName = 'test'             
$t.CounterHelp = 'help me'          
$t.CounterType =  [System.Diagnostics.PerformanceCounterType]::AverageCount64  
$AnalyticsCollection.Add($t)
[System.Diagnostics.PerformanceCounterCategory]::Create('myCounters', 'OK Get Counting', [System.Diagnostics.PerformanceCounterCategoryType]::MultiInstance, $AnalyticsCollection, [System.Diagnostics.PerformanceCountertype]::RawFraction)

我还使用这个博客来帮助我理解该做什么。我希望这可以为您指明解决方案的方向。祝你好运 Windows Performance Counter Types

【讨论】:

谢谢。我的实际收藏超过 70 个计数器,有些需要 AverageBase,有些则不需要。这对混合类型的多个计数器如何工作? 我认为每次添加都可以指定底层计数器的类型,无论是 Averagebase 还是 Rawfraction。因此,您只需围绕添加编写一个循环,并更改您添加到 AnalyticsCollection 变量中的每个项目需要使用的类型。

以上是关于创建性能计数器 PowerShell:指定类别的计数器布局无效的主要内容,如果未能解决你的问题,请参考以下文章

类别不存在。在为 Ram 使用创建性能计数器时

RawFraction 性能计数器即使在删除性能类别后仍保持其状态

如何对性能计数器类别进行版本控制?

在服务中删除和创建性能计数器时,它可能会挂起该服务

使用 powershell 获得计数器性能

如何使用Powershell脚本获取Azure VM来宾指标(性能计数器)