[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xentop: Dynamically expand some columns



>>> On 10/2/2014 at 11:05 AM, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> 
>>> wrote:

> On Thu, Oct 02, 2014 at 10:25:41AM -0600, Charles Arnold wrote:
>> >>> On 10/2/2014 at 10:10 AM, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> 
>> >>> wrote: 
>> > On 02/10/14 16:58, Charles Arnold wrote:
>> >> Allow certain xentop columns to automatically expand as the amount
>> >> of data reported gets larger.  The columns allowed to expand are:
>> >>
>> >> NETTX(k), NETRX(k), VBD_RD, VBD_WR, VBD_RSECT, VBD_WSECT
>> >>
>> >> Author: Markus Hauschild <Markus.Hauschild@xxxxxxxxxxxxxxxxxxxx>
>> >> Signed-off-by: Charles Arnold <carnold@xxxxxxxx>
>> > 
>> > In principle, very nice.  (I have wanted to see about doing this for a
>> > while now, but very far down the todo list)
>> > 
>> > How about the NAME field? 9 characters isn't enough for some people.
>> 
>> Sure, and any others that might need it.  But what to do about the '-f' flag
>> which says show me the full VM name but the flag doesn't adjust the entire
>> column.  By automatically showing the full name and adjusting the column
>> appropriately it makes this flag pointless (which I'm ok with). 
> 
> Perhaps this functionality should be under that option?
> 
> I am a bit hesistant about this as there are some users of xentop that
> use it for their monitoring. What I can't remember is if they use the
> batched mode or not - and if they scan for specific strings (and length).

Right.  The original patch came from a customer doing the monitoring
you describe.  In their case, they originally wanted the columns to be
aligned no matter how big the data got and to know that there would be
at least one white space between values.

> 
> This would (I think?) throw a wrench in that?

If someone were counting on there being an exact number of spaces for each 
column
then the patch might be a problem - but - they would still have an issue with 
the
existing code if for example the NET_TX data exceeded the hardcoded default 
width of
the column.  If they only care about white space separating the values then 
they should
be fine with this change.

If you think this is ok, I'll post another patch that includes the expansion 
for the VM name.
Or alternately post a patch that only automatically expands the VM name if '-f' 
is passed
(which allows the flag to continue to be relevant).

- Charles

> 
>> 
>> - Charles
>> 
>> >>
>> >> diff --git a/tools/xenstat/xentop/xentop.c b/tools/xenstat/xentop/xentop.c
>> >> index dd11927..d087665 100644
>> >> --- a/tools/xenstat/xentop/xentop.c
>> >> +++ b/tools/xenstat/xentop/xentop.c
>> >> @@ -27,6 +27,7 @@
>> >>  
>> >>  #include <ctype.h>
>> >>  #include <errno.h>
>> >> +#include <math.h>
>> >>  #include <stdio.h>
>> >>  #include <stdlib.h>
>> >>  #include <stdarg.h>
>> >> @@ -127,7 +128,8 @@ static int compare_vbd_rsect(xenstat_domain *domain1, 
>> > xenstat_domain *domain2);
>> >>  static void print_vbd_rsect(xenstat_domain *domain);
>> >>  static int compare_vbd_wsect(xenstat_domain *domain1, xenstat_domain 
>> > *domain2);
>> >>  static void print_vbd_wsect(xenstat_domain *domain);
>> >> -
>> >> +static void reset_field_widths(void);
>> >> +static void adjust_field_widths(xenstat_domain *domain);
>> >>  
>> >>  /* Section printing functions */
>> >>  static void do_summary(void);
>> >> @@ -623,7 +625,7 @@ static int compare_net_tx(xenstat_domain *domain1, 
>> > xenstat_domain *domain2)
>> >>  /* Prints number of total network tx bytes statistic */
>> >>  static void print_net_tx(xenstat_domain *domain)
>> >>  {
>> >> - print("%8llu", tot_net_bytes(domain, FALSE)/1024);
>> >> + print("%*llu", fields[FIELD_NET_TX-1].default_width, 
>> >> tot_net_bytes(domain, 
>> > FALSE)/1024);
>> >>  }
>> >>  
>> >>  /* Compares number of total network rx bytes of two domains, returning 
>> > -1,0,1
>> >> @@ -637,7 +639,7 @@ static int compare_net_rx(xenstat_domain *domain1, 
>> > xenstat_domain *domain2)
>> >>  /* Prints number of total network rx bytes statistic */
>> >>  static void print_net_rx(xenstat_domain *domain)
>> >>  {
>> >> - print("%8llu", tot_net_bytes(domain, TRUE)/1024);
>> >> + print("%*llu", fields[FIELD_NET_RX-1].default_width, 
>> >> tot_net_bytes(domain, 
>> > TRUE)/1024);
>> >>  }
>> >>  
>> >>  /* Gets number of total network bytes statistic, if rx true, then rx 
>> >> bytes
>> >> @@ -705,7 +707,7 @@ static int compare_vbd_rd(xenstat_domain *domain1, 
>> > xenstat_domain *domain2)
>> >>  /* Prints number of total VBD READ requests statistic */
>> >>  static void print_vbd_rd(xenstat_domain *domain)
>> >>  {
>> >> - print("%8llu", tot_vbd_reqs(domain, FIELD_VBD_RD));
>> >> + print("%*llu", fields[FIELD_VBD_RD-1].default_width, 
>> >> tot_vbd_reqs(domain, 
>> > FIELD_VBD_RD));
>> >>  }
>> >>  
>> >>  /* Compares number of total VBD WRITE requests of two domains,
>> >> @@ -719,7 +721,7 @@ static int compare_vbd_wr(xenstat_domain *domain1, 
>> > xenstat_domain *domain2)
>> >>  /* Prints number of total VBD WRITE requests statistic */
>> >>  static void print_vbd_wr(xenstat_domain *domain)
>> >>  {
>> >> - print("%8llu", tot_vbd_reqs(domain, FIELD_VBD_WR));
>> >> + print("%*llu", fields[FIELD_VBD_WR-1].default_width, 
>> >> tot_vbd_reqs(domain, 
>> > FIELD_VBD_WR));
>> >>  }
>> >>  
>> >>  /* Compares number of total VBD READ sectors of two domains,
>> >> @@ -733,7 +735,7 @@ static int compare_vbd_rsect(xenstat_domain *domain1, 
>> > xenstat_domain *domain2)
>> >>  /* Prints number of total VBD READ sectors statistic */
>> >>  static void print_vbd_rsect(xenstat_domain *domain)
>> >>  {
>> >> - print("%10llu", tot_vbd_reqs(domain, FIELD_VBD_RSECT));
>> >> + print("%*llu", fields[FIELD_VBD_RSECT-1].default_width, 
> tot_vbd_reqs(domain, 
>> > FIELD_VBD_RSECT));
>> >>  }
>> >>  
>> >>  /* Compares number of total VBD WRITE sectors of two domains,
>> >> @@ -747,7 +749,7 @@ static int compare_vbd_wsect(xenstat_domain *domain1, 
>> > xenstat_domain *domain2)
>> >>  /* Prints number of total VBD WRITE sectors statistic */
>> >>  static void print_vbd_wsect(xenstat_domain *domain)
>> >>  {
>> >> - print("%10llu", tot_vbd_reqs(domain, FIELD_VBD_WSECT));
>> >> + print("%*llu", fields[FIELD_VBD_WSECT-1].default_width, 
> tot_vbd_reqs(domain, 
>> > FIELD_VBD_WSECT));
>> >>  }
>> >>  
>> >>  
>> >> @@ -806,6 +808,48 @@ static void print_ssid(xenstat_domain *domain)
>> >>   print("%4u", xenstat_domain_ssid(domain));
>> >>  }
>> >>  
>> >> +/* Resets default_width for fields with potentially large numbers */
>> >> +void reset_field_widths(void)
>> >> +{
>> >> + fields[FIELD_NET_TX-1].default_width = 8;
>> >> + fields[FIELD_NET_RX-1].default_width = 8;
>> >> + fields[FIELD_VBD_RD-1].default_width = 8;
>> >> + fields[FIELD_VBD_WR-1].default_width = 8;
>> >> + fields[FIELD_VBD_RSECT-1].default_width = 10;
>> >> + fields[FIELD_VBD_WSECT-1].default_width = 10;
>> >> +}
>> >> +
>> >> +/* Adjusts default_width for fields with potentially large numbers */
>> >> +void adjust_field_widths(xenstat_domain *domain)
>> >> +{
>> >> + unsigned int length;
>> >> +
>> >> + length = (unsigned int)(log10(tot_net_bytes(domain, FALSE)/1024) + 1);
>> >> + if (length > fields[FIELD_NET_TX-1].default_width)
>> >> +         fields[FIELD_NET_TX-1].default_width = length;
>> >> +
>> >> + length = (unsigned int)(log10(tot_net_bytes(domain, TRUE)/1024) + 1);
>> >> + if (length > fields[FIELD_NET_RX-1].default_width)
>> >> +         fields[FIELD_NET_RX-1].default_width = length;
>> >> +
>> >> + length = (unsigned int)(log10(tot_vbd_reqs(domain, FIELD_VBD_RD)) + 1);
>> >> + if (length > fields[FIELD_VBD_RD-1].default_width)
>> >> +         fields[FIELD_VBD_RD-1].default_width = length;
>> >> +
>> >> + length = (unsigned int)(log10(tot_vbd_reqs(domain, FIELD_VBD_WR)) + 1);
>> >> + if (length > fields[FIELD_VBD_WR-1].default_width)
>> >> +         fields[FIELD_VBD_WR-1].default_width = length;
>> >> +
>> >> + length = (unsigned int)(log10(tot_vbd_reqs(domain, FIELD_VBD_RSECT)) + 
>> >> 1);
>> >> + if (length > fields[FIELD_VBD_RSECT-1].default_width)
>> >> +         fields[FIELD_VBD_RSECT-1].default_width = length;
>> >> +
>> >> + length = (unsigned int)(log10(tot_vbd_reqs(domain, FIELD_VBD_WSECT)) + 
>> >> 1);
>> >> + if (length > fields[FIELD_VBD_WSECT-1].default_width)
>> >> +         fields[FIELD_VBD_WSECT-1].default_width = length;
>> >> +}
>> >> +
>> >> +
>> >>  /* Section printing functions */
>> >>  /* Prints the top summary, above the domain table */
>> >>  void do_summary(void)
>> >> @@ -1088,6 +1132,12 @@ static void top(void)
>> >>   if(first_domain_index >= num_domains)
>> >>           first_domain_index = num_domains-1;
>> >>  
>> >> + /* Adjust default_width for fields with potentially large numbers */
>> >> + reset_field_widths();
>> >> + for (i = first_domain_index; i < num_domains; i++) {
>> >> +         adjust_field_widths(domains[i]);
>> >> + }
>> >> +
>> >>   for (i = first_domain_index; i < num_domains; i++) {
>> >>           if(!batch && current_row() == lines()-1)
>> >>                   break;
>> >>
>> >>
>> >> _______________________________________________
>> >> Xen-devel mailing list
>> >> Xen-devel@xxxxxxxxxxxxx
>> >> http://lists.xen.org/xen-devel
>> 
>> 
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxx
>> http://lists.xen.org/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.