May 4th, 2012

Using Performance Counters with the Out-GridView Cmdlet

Doctor Scripto
Scripter

Summary: Microsoft Scripting Guy, Ed Wilson demonstrates how to use the Out-GridView cmdlet with performance counter information.

Hey, Scripting Guy! Question Hey, Scripting Guy! I have a question, and hopefully you will not think it is a stupid one. During the 2012 Scripting Games, one of the events had to do with using performance counters. I thought that was a pretty good idea, so I started playing around with them. Then I saw your blogs about using the Out-GridView cmdlet, and I thought it would make sense to combine the two: performance counters and the Out-GridView cmdlet. The problem is that it seems to not work. So is this a known bug, or was it never intended to work together at all?

—CT

Hey, Scripting Guy! Answer Hello CT,

Microsoft Scripting Guy, Ed Wilson, is here. Today is an awesome day. I had a great meeting with the TechEd Connect Zone people about the Scripting Guys booth at Microsoft TechEd 2012. TechEd 2012 will be in Orlando, Florida in the United States, and it will run June 11–14. I grew up in Florida, and I am excited to have the chance to go “home” again. In fact, the Scripting Wife and I are going to maximize our time in the sunshine state. I am speaking at SQL Saturday in Pensacola, Florida on June 9 on the way to Orlando. On the way home, we are stopping in Jacksonville, Florida on June 16 where I will be speaking at the Jacksonville IT Pro Camp.  

The problem of Out-GridView and performance info

CT, using the Out-GridView cmdlet to view performance information in an easy-to-manipulate grid control is not a bad idea, and certainly, it works. The problem is that you need to understand a bit more about the underlying performance objects that are returned by the Get-Counter cmdlet.

Note   I have written a number of blogs about using Windows PowerShell and performance counters. Please refer to this list of blog posts for additional information about this extremely important subject.

CT, if you pipe the direct results of the Get-Counter cmdlet to the Out-GridView cmdlet, you end up with a complex object in the CounterSamples field. This effectively limits what you can do with the grid control. Here is an example of what you are probably attempting to do (I have used ogv as an alias for the Out-GridView cmdlet).

Get-Counter -ListSet processor | Get-Counter | ogv

The resulting grid control is shown here. Note that when I attempt to use the filter for the grid control, nothing filters based on the string User. This indicates the inability of the grid control to effectively filter output.

Image of command output

Examine the members of the object

To provide the Get-GridView cmdlet with access to the specific counter information, it is first required to determine where the information resides. To look inside the PerformanceCounterSampleSet merely demands piping the result from the Get-Counter cmdlet to the Get-Member cmdlet. When we examine the members of the PerformanceCounterSampleSet object, two properties appear promising. The members of the PerformanceCounterSampleSet object are shown here.

PS C:\> Get-Counter -ListSet processor | Get-Counter -MaxSamples 1 | Get-Member

 

   TypeName: Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet

 

Name           MemberType     Definition

—-           ———-     ———-

Equals         Method         bool Equals(System.Object obj)

GetHashCode    Method         int GetHashCode()

GetType        Method         type GetType()

ToString       Method         string ToString()

CounterSamples Property       Microsoft.PowerShell.Commands.GetCounter.Performanc…

Timestamp      Property       System.DateTime Timestamp {get;set;}

Readings       ScriptProperty System.Object Readings {get=$strPaths = “”…

The first property that appears promising is the Readings property. To examine further the Readings property, expand it and send the output to the Get-Member cmdlet. This technique is shown here.

PS C:\> Get-Counter -ListSet processor | Get-Counter -MaxSamples 1 | select -ExpandProperty readings | Get-Member

 

   TypeName: System.String

 

Name             MemberType            Definition

—-             ———-            ———-

Clone            Method                System.Object Clone()

CompareTo        Method                int CompareTo(System.Object value), int Co…

Contains         Method                bool Contains(string value)

CopyTo           Method                System.Void CopyTo(int sourceIndex, char[]…

EndsWith         Method                bool EndsWith(string value), bool EndsWith…

Equals           Method                bool Equals(System.Object obj), bool Equal…

GetEnumerator    Method                System.CharEnumerator GetEnumerator()

GetHashCode      Method                int GetHashCode()

GetType          Method                type GetType()

GetTypeCode      Method                System.TypeCode GetTypeCode()

IndexOf          Method                int IndexOf(char value), int IndexOf(char …

IndexOfAny       Method                int IndexOfAny(char[] anyOf), int IndexOfA…

Insert           Method                string Insert(int startIndex, string value)

IsNormalized     Method                bool IsNormalized(), bool IsNormalized(Sys…

LastIndexOf      Method                int LastIndexOf(char value), int LastIndex…

LastIndexOfAny   Method                int LastIndexOfAny(char[] anyOf), int Last…

Normalize        Method                string Normalize(), string Normalize(Syste…

PadLeft          Method                string PadLeft(int totalWidth), string Pad…

PadRight         Method                string PadRight(int totalWidth), string Pa…

Remove           Method                string Remove(int startIndex, int count), …

Replace          Method                string Replace(char oldChar, char newChar)…

Split            Method                string[] Split(Params char[] separator), s…

StartsWith       Method                bool StartsWith(string value), bool Starts…

Substring        Method                string Substring(int startIndex), string S…

ToCharArray      Method                char[] ToCharArray(), char[] ToCharArray(i…

ToLower          Method                string ToLower(), string ToLower(System.Gl…

ToLowerInvariant Method                string ToLowerInvariant()

ToString         Method                string ToString(), string ToString(System….

ToUpper          Method                string ToUpper(), string ToUpper(System.Gl…

ToUpperInvariant Method                string ToUpperInvariant()

Trim             Method                string Trim(Params char[] trimChars), stri…

TrimEnd          Method                string TrimEnd(Params char[] trimChars)

TrimStart        Method                string TrimStart(Params char[] trimChars)

Chars            ParameterizedProperty char Chars(int index) {get;}

Length           Property              System.Int32 Length {get;}

As you can see, the resulting objects are strings. The conversion to a string might be useful in some situations, but it does not facilitate additional processing as easily as a different type of object. Therefore, examine the CounterSamples property. When it is piped to the Get-Member cmdlet, the CounterSamples property appears much more interesting than a simple string. This technique is shown here.

PS C:\> Get-Counter -ListSet processor | Get-Counter -MaxSamples 1 | select -ExpandProperty countersamples | Get-Member -MemberType property

 

   TypeName: Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample

 

Name             MemberType Definition

—-             ———- ———-

CookedValue      Property   System.Double CookedValue {get;set;}

CounterType      Property   System.Diagnostics.PerformanceCounterType CounterType…

DefaultScale     Property   System.UInt32 DefaultScale {get;set;}

InstanceName     Property   System.String InstanceName {get;set;}

MultipleCount    Property   System.UInt32 MultipleCount {get;set;}

Path             Property   System.String Path {get;set;}

RawValue         Property   System.UInt64 RawValue {get;set;}

SecondValue      Property   System.UInt64 SecondValue {get;set;}

Status           Property   System.UInt32 Status {get;set;}

TimeBase         Property   System.UInt64 TimeBase {get;set;}

Timestamp        Property   System.DateTime Timestamp {get;set;}

Timestamp100NSec Property   System.UInt64 Timestamp100NSec {get;set;}

 

To test the CounterSamples property to see if it contains the requisite information, use the command that is shown here.

Get-Counter -ListSet processor | Get-Counter -MaxSamples 1 | select -ExpandProperty countersamples  | select path, timestamp, cookedvalue

When the command runs, it displays the output shown here.

Image of command output

To permit working with multiple performance counter sets, store the information that is gathered into a variable. When the variable contains the performance information, pipe the output to the Out-GridView cmdlet. (The % sign is an alias for the Foreach-Object cmdlet and ogv is an alias for Out-GridView).

$sample = Get-Counter -ListSet processor | Get-Counter -SampleInterval 1 -MaxSamples 10

$sample | % { $_.countersamples } | select path, timestamp, cookedvalue | ogv

When the grid-view control appears, use either the quick Filter or the Add Criteria technique to parse the resulting performance information. The following image illustrates using the Add Criteria technique to find only cooked values that are greater than 100 and paths that contain the word interrupts. Because the performance counter paths are very descriptive, it is easy to find the desired information.

Image of command output

CT, that is all there is to using the Out-GridView cmdlet with performance counter information. Join me tomorrow for the Weekend Scripter.

I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.

Ed Wilson, Microsoft Scripting Guy 

Author

The "Scripting Guys" is a historical title passed from scripter to scripter. The current revision has morphed into our good friend Doctor Scripto who has been with us since the very beginning.

0 comments

Discussion are closed.