Changeset 7ae62b9ec2b5f252357a0d80446c0ad5ad6dd7fa

Show
Ignore:
Timestamp:
01/27/12 02:32:49 (3 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1327631569 -0500
git-parent:

[14748d7c2d9bb7457d44bf98a24b5f03860e2b63]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1327631569 -0500
Message:

support snmp type coercion... BAD VENDORS... BAD.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • docs/config/modules/snmp.xml

    r23dea7e r7ae62b9  
    9797          </variablelist> 
    9898          <para>Defines a metric to query.  Key oid_foo will establish a metric called foo.  The value of the parameter should be an OID either in decimal notation or MIB name.</para> 
     99        </listitem> 
     100      </varlistentry> 
     101    </variablelist> 
     102    <variablelist> 
     103      <varlistentry> 
     104        <term>type_.+</term> 
     105        <listitem> 
     106          <variablelist> 
     107            <varlistentry> 
     108              <term>required</term> 
     109              <listitem> 
     110                <para>optional</para> 
     111              </listitem> 
     112            </varlistentry> 
     113            <varlistentry> 
     114              <term>allowed</term> 
     115              <listitem> 
     116                <para>.+</para> 
     117              </listitem> 
     118            </varlistentry> 
     119          </variablelist> 
     120          <para>Defines a coercion for a metric type.  The name of the metric must identically match one of the oid_(.+) patterns. The value can be either one of the single letter codes in the metric_type_t enum or the following string variants: guess, int32, uint32, int64, uint64, double, string.</para> 
    99121        </listitem> 
    100122      </varlistentry> 
  • src/modules/snmp.c

    rdfec968 r7ae62b9  
    145145     oid oid[MAX_OID_LEN]; 
    146146     size_t oidlen; 
     147     metric_type_t type_override; 
     148     noit_boolean type_should_override; 
    147149  } *oids; 
    148150  int noids; 
     
    257259      continue; 
    258260    } 
    259      
     261 
    260262#define SETM(a,b) noit_stats_set_metric(&current, \ 
    261263                                        info->oids[oid_idx].confname, a, b) 
    262     switch(vars->type) { 
    263       case ASN_OCTET_STR: 
    264         sp = malloc(1 + vars->val_len); 
    265         memcpy(sp, vars->val.string, vars->val_len); 
    266         sp[vars->val_len] = '\0'; 
    267         SETM(METRIC_STRING, sp); 
    268         free(sp); 
    269         break; 
    270       case ASN_INTEGER: 
    271       case ASN_GAUGE: 
    272         SETM(METRIC_INT32, vars->val.integer); 
    273         break; 
    274       case ASN_TIMETICKS: 
    275       case ASN_COUNTER: 
    276         SETM(METRIC_UINT32, vars->val.integer); 
    277         break; 
    278       case ASN_INTEGER64: 
    279         printI64(varbuff, vars->val.counter64); 
    280         i64 = strtoll(varbuff, &endptr, 10); 
    281         SETM(METRIC_INT64, (varbuff == endptr) ? NULL : &i64); 
    282         break; 
    283       case ASN_COUNTER64: 
    284         printU64(varbuff, vars->val.counter64); 
    285         u64 = strtoull(varbuff, &endptr, 10); 
    286         SETM(METRIC_UINT64, (varbuff == endptr) ? NULL : &u64); 
    287         break; 
    288       case ASN_FLOAT: 
    289         if(vars->val.floatVal) float_conv = *(vars->val.floatVal); 
    290         SETM(METRIC_DOUBLE, vars->val.floatVal ? &float_conv : NULL); 
    291         break; 
    292       case ASN_DOUBLE: 
    293         SETM(METRIC_DOUBLE, vars->val.doubleVal); 
    294         break; 
    295       case SNMP_NOSUCHOBJECT: 
    296       case SNMP_NOSUCHINSTANCE: 
    297         SETM(METRIC_STRING, NULL); 
    298         break; 
    299       default: 
    300         snprint_variable(varbuff, sizeof(varbuff), vars->name, vars->name_length, vars); 
    301         /* Advance passed the first space and use that unless there 
    302          * is no space or we have no more string left. 
    303          */ 
    304         sp = strchr(varbuff, ' '); 
    305         if(sp) sp++; 
    306         SETM(METRIC_STRING, (sp && *sp) ? sp : NULL); 
     264    if(info->oids[oid_idx].type_should_override) { 
     265      snprint_value(varbuff, sizeof(varbuff), vars->name, vars->name_length, vars); 
     266      sp = strchr(varbuff, ' '); 
     267      if(sp) sp++; 
     268      noit_stats_set_metric_coerce(&current, info->oids[oid_idx].confname, 
     269                                   info->oids[oid_idx].type_override, 
     270                                   sp); 
     271    } 
     272    else { 
     273      switch(vars->type) { 
     274        case ASN_OCTET_STR: 
     275          sp = malloc(1 + vars->val_len); 
     276          memcpy(sp, vars->val.string, vars->val_len); 
     277          sp[vars->val_len] = '\0'; 
     278          SETM(METRIC_STRING, sp); 
     279          free(sp); 
     280          break; 
     281        case ASN_INTEGER: 
     282        case ASN_GAUGE: 
     283          SETM(METRIC_INT32, vars->val.integer); 
     284          break; 
     285        case ASN_TIMETICKS: 
     286        case ASN_COUNTER: 
     287          SETM(METRIC_UINT32, vars->val.integer); 
     288          break; 
     289        case ASN_INTEGER64: 
     290          printI64(varbuff, vars->val.counter64); 
     291          i64 = strtoll(varbuff, &endptr, 10); 
     292          SETM(METRIC_INT64, (varbuff == endptr) ? NULL : &i64); 
     293          break; 
     294        case ASN_COUNTER64: 
     295          printU64(varbuff, vars->val.counter64); 
     296          u64 = strtoull(varbuff, &endptr, 10); 
     297          SETM(METRIC_UINT64, (varbuff == endptr) ? NULL : &u64); 
     298          break; 
     299        case ASN_FLOAT: 
     300          if(vars->val.floatVal) float_conv = *(vars->val.floatVal); 
     301          SETM(METRIC_DOUBLE, vars->val.floatVal ? &float_conv : NULL); 
     302          break; 
     303        case ASN_DOUBLE: 
     304          SETM(METRIC_DOUBLE, vars->val.doubleVal); 
     305          break; 
     306        case SNMP_NOSUCHOBJECT: 
     307        case SNMP_NOSUCHINSTANCE: 
     308          SETM(METRIC_STRING, NULL); 
     309          break; 
     310        default: 
     311          snprint_variable(varbuff, sizeof(varbuff), vars->name, vars->name_length, vars); 
     312          /* Advance passed the first space and use that unless there 
     313           * is no space or we have no more string left. 
     314           */ 
     315          sp = strchr(varbuff, ' '); 
     316          if(sp) sp++; 
     317          SETM(METRIC_STRING, (sp && *sp) ? sp : NULL); 
     318      } 
    307319    } 
    308320    nresults++; 
     
    857869  while(noit_hash_next_str(check->config, &iter, &name, &klen, &value)) { 
    858870    if(!strncasecmp(name, "oid_", 4)) { 
    859       char oidbuff[128]; 
     871      const char *type_override; 
     872      char oidbuff[128], typestr[256]; 
    860873      name += 4; 
    861874      info->oids[i].confname = strdup(name); 
     
    868881      else 
    869882        get_node(oidbuff, info->oids[i].oid, &info->oids[i].oidlen); 
     883      snprintf(typestr, sizeof(typestr), "type_%s", name); 
     884      if(noit_hash_retr_str(check->config, typestr, strlen(typestr), 
     885                            &type_override)) { 
     886        int type_enum_fake = *type_override; 
     887 
     888        if(!strcasecmp(type_override, "guess")) 
     889          type_enum_fake = METRIC_GUESS; 
     890        else if(!strcasecmp(type_override, "int32")) 
     891          type_enum_fake = METRIC_INT32; 
     892        else if(!strcasecmp(type_override, "uint32")) 
     893          type_enum_fake = METRIC_UINT32; 
     894        else if(!strcasecmp(type_override, "int64")) 
     895          type_enum_fake = METRIC_INT64; 
     896        else if(!strcasecmp(type_override, "uint64")) 
     897          type_enum_fake = METRIC_UINT64; 
     898        else if(!strcasecmp(type_override, "double")) 
     899          type_enum_fake = METRIC_DOUBLE; 
     900        else if(!strcasecmp(type_override, "string")) 
     901          type_enum_fake = METRIC_STRING; 
     902 
     903        switch(type_enum_fake) { 
     904          case METRIC_GUESS: 
     905          case METRIC_INT32: case METRIC_UINT32: 
     906          case METRIC_INT64: case METRIC_UINT64: 
     907          case METRIC_DOUBLE: case METRIC_STRING: 
     908            info->oids[i].type_override = *type_override; 
     909            info->oids[i].type_should_override = noit_true; 
     910          default: break; 
     911        } 
     912      } 
    870913      snmp_add_null_var(req, info->oids[i].oid, info->oids[i].oidlen); 
    871914      i++; 
  • src/modules/snmp.xml

    r0500158 r7ae62b9  
    1717               required="optional" 
    1818               allowed=".+">Defines a metric to query.  Key oid_foo will establish a metric called foo.  The value of the parameter should be an OID either in decimal notation or MIB name.</parameter> 
     19    <parameter name="type_.+" 
     20               required="optional" 
     21               allowed=".+">Defines a coercion for a metric type.  The name of the metric must identically match one of the oid_(.+) patterns. The value can be either one of the single letter codes in the metric_type_t enum or the following string variants: guess, int32, uint32, int64, uint64, double, string.</parameter> 
    1922  </checkconfig> 
    2023  <examples>