Thanks Rich.  This got me thinking a little about how the same thing might be 
done only in a more generic way rather than just sequentially numbered metrics. 
 I am wondering if, rather than looping through numbers, we actually tried to 
do some pattern matching over the known metrics.  For every known metric that 
matches a metric pattern found in a collection_group, the metric name is 
constructed and the metric is added using the add_metric_series() function.  Of 
course it would also have to do some kind of substitution for the metric title 
as well.  This could simplify some of the metric configurations.

Brad

>>> On 8/26/2008 at 8:08 AM, in message <[EMAIL PROTECTED]>, Rich Paul
<[EMAIL PROTECTED]> wrote:
> I did a hack to allow a single config file to work across all of my
> hosts, even though I needed mod_multicpu and had different numbers of
> processors on different machines.
> 
> The hack I did was as follows:
> 
> When gmond found a metric name which contained one or more (#) pound
> signs, I converted the metric name to a sprintf string, as follows:
> 
> 
> cpu_###_idle => cpu_%03d_idle
> cpu_#_idle => cpu_%d_idle.
> 
> I then iteratively applied the config in question, stopping the first
> time I got an error.
> 
> This would, of course, work only when the variants were numbered, zero
> based, and consecutive, but it is very useful to me.
> 
> What I added to gmond.c was:
>> +const char *make_fmt(const char * const src_in) {
>> +    char *pos=strchr(src_in,'#');
>> +    if(!pos)
>> +            return 0;
>> +
>> +  {
>> +    const char *src = src_in;
>> +    static char fmt[1024];
>> +    static char * const end = fmt+sizeof(fmt)-1;
>> +    char *dst=fmt;
>> +    while(src!=pos && dst!=end) {
>> +      if((*dst++ = *src++)=='%' && dst!=end)
>> +        *dst++='%';
>> +    }
>> +    if(dst!=end)
>> +      *dst++='%';
>> +    if(dst!=end)
>> +      *dst++='0';
>> +    {
>> +      int pad=1;
>> +      while(*++src == '#')
>> +        ++pad;
>> +      dst+=snprintf(dst,end-dst,"%d",pad);
>> +    }
>> +    if(dst!=end)
>> +      *dst++='d';
>> +    while(dst!=end) {
>> +      switch(*dst++ = *src++) {
>> +        case 0:
>> +          return fmt;
>> +        case '#':
>> +          err_quit(">1 series of '#' in \"%s\"",src_in);
>> +        case '%':
>> +          if(dst!=end)
>> +            *dst++='%';
>> +          break;
>> +        default:
>> +          break;
>> +      }
>> +    }
>> +    err_quit("fmt string for \"%s\" too long",src_in);
>> +  }
>> +    /* not reached */
>> +    return 0;
>> +}
>> +double add_metric_series( 
>> +    Ganglia_collection_group *group, 
>> +    const char *name,
>> +    const char *title,
>> +    float value_threshold
>> +)
>> +{
>> +    const char *fmt=make_fmt(name);
>> +    if(!fmt)
>> +            return add_metric(group,name,title,value_threshold);
>> +  {
>> +    char dname[strlen(fmt)+16];
>> +    size_t idx;
>> +    double res=0.0;
>> +    for(idx=0;idx<64;idx++) {
>> +      snprintf(dname,sizeof(dname),fmt,idx);
>> +      // the first time through, we do not precheck the metric, so that
>> +      // if a series does not yield ANY valid metrics, we get an error.
>> +      if(idx && !apr_hash_get( metric_callbacks, dname, APR_HASH_KEY_STRING 
> ))
>> +        break;
>> +      res+=add_metric(group,dname,title,value_threshold);
>> +    }
>> +    return res;
>> +  }
>> +}
> 
> and I changed the call to add_metric to call add_metric_series instead.
> 
> Sorry for no more reasonable patch, but I made other changes, so can't
> do a CVS diff.
> 
> This might, however, be useful to somebody else, so I thought I'd pass
> the idea around.
> 
> Regards,
> Rich
> 
> -------------------------------------------------------------------------
> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
> Build the coolest Linux based applications with Moblin SDK & win great prizes
> Grand prize is a trip for two to an Open Source event anywhere in the world
> http://moblin-contest.org/redirect.php?banner_id=100&url=/ 
> _______________________________________________
> Ganglia-developers mailing list
> Ganglia-developers@lists.sourceforge.net 
> https://lists.sourceforge.net/lists/listinfo/ganglia-developers 



-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ganglia-developers mailing list
Ganglia-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ganglia-developers

Reply via email to