Thanks for the explanation, Peter.  That makes a lot of sense.

-Bill

On 11/5/07, Peter Tribble <peter.tribble at gmail.com> wrote:
> On Nov 5, 2007 7:19 PM, William Fretts-Saxton
> <william.fretts.saxton at sun.com> wrote:
> > I'm trying to duplicate the following kstat code in jkstat:
> >
> > # kstat -p cpu_stat:::execpgin
> > cpu_stat:0:cpu_stat0:execpgin   57553
> > cpu_stat:1:cpu_stat1:execpgin   53963
> >
> > It doesn't look like you can use a filter to directly gather the kstat 
> > information using jkstat.  The filter's "getKstats()" method returns a Set 
> > of Kstats, with the module, instance, and name variables populated, but the 
> > actual Map of statistics is empty.
>
> This is deliberate, in a way. The idea is (a) to keep the code small
> and (b) to keep
> the code fast. One of the consequences of (b) is to avoid retrieving
> the actual statistics
> unless you're sure you need to. (Actually getting the data is many
> times more expensive
> than simply enumerating which statistics exist.) Add constraint (a) to
> that and there's
> only one set of calls to enumerate, and they don't return any data. At
> some point in
> the past I did have calls that returned Kstats with data and others
> that returned
> you Kstats without data. I cleaned it up to reduce the variety and
> make things more
> consistent.
>
> I could have made the wrong choices, of course. That's entirely
> possible, especially
> as I've based the design largely on the usage patterns that I've
> tended to use myself.
>
> I'm willing to do something different if it's worthwhile, though.
>
> > So, in order to actually get the statistics, I had to create the filter, 
> > get the Set of "empty" Kstats, then run "getKstat()" on each of them to 
> > actually get the statistic data.
>
> That's the idea.
>
> (I usually end up doing this over and over to continually update the display.)
>
> > Is there a better way to do this?  My java code is below:
> > <pre>
> > // Initialize JKstat and filter
> > JKstat jkstat = new JKstat();
> > KstatFilter ksf = new KstatFilter(jkstat);
> > ksf.addFilter("cpu_stat:::");
> >
> > // Get the list of empty Kstats
> > Set <Kstat> vfilter = ksf.getKstats();
> >
> > // Now iterate through them
> > Iterator kItr = vfilter.iterator();
> > while(kItr.hasNext()) {
> >
> >     Kstat kstat = (Kstat)kItr.next();
> >
> >     // Use empty Kstat module, instance, and name data to get the statistic 
> > information
> >     Kstat kstat2 = 
> > jkstat.getKstat(kstat.getModule(),kstat.getInst(),kstat.getName());
> >     Map <String, KstatData> kstat2Map = kstat2.getMap();
> >     KstatData execpgin2Data = kstat2Map.get("execpgin");
> >     System.out.println(kstat2.getTriplet() + ":execpgin: " +
> >         (Long)execpginData2.getData());
> >
> > }
>
> I would use a slightly shorter idiom:
>
>         JKstat jkstat = new JKstat();
>         KstatFilter ksf = new KstatFilter(jkstat);
>         ksf.addFilter("cpu_stat:::");
>         for (Kstat kstat : ksf.getKstats()) {
>             Kstat kstat2 = jkstat.getKstat(kstat);
>             System.out.println(kstat2.getTriplet() + ":execpgin: " +
>                                kstat2.longData("execpgin"));
>         }
>
> Pulling a long out of the statistics Map is such a common operation that
> there's a shortcut. (Which has no sanity checking really.)
>
> --
> -Peter Tribble
> http://www.petertribble.co.uk/ - http://ptribble.blogspot.com/
> _______________________________________________
> observability-discuss mailing list
> observability-discuss at opensolaris.org
>

Reply via email to