Changeset 8c720f9a4bd5979520e9c7ec00d9bea8d305391b

Show
Ignore:
Timestamp:
12/08/10 05:31:12 (3 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1291786272 +0000
git-parent:

[ef66c597dd4703603001731c680a7d276cbaa174]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1291786272 +0000
Message:

this is a big patch. adds an optional extended-id. you should upgrade your iep first, then your stratcon, then your noits. This is most certainly a flag-day, *but* the feature is off by default... refs #331

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/Makefile.in

    r5fbae1c r8c720f9  
    7676        noit_console_complete.o noit_xml.o \ 
    7777        noit_conf.o noit_http.o noit_rest.o noit_tokenizer.o \ 
    78         noit_capabilities_listener.o noit_module.o
     78        noit_capabilities_listener.o noit_module.o noit_check_tools.o
    7979        stratcon_realtime_http.o \ 
    8080        stratcon_jlog_streamer.o stratcon_datastore.o \ 
  • src/java/com/omniti/reconnoiter/event/NoitCheck.java

    r54eb3fe r8c720f9  
    2929  public NoitCheck(String[] parts) throws Exception { 
    3030    super(parts); 
     31    String id[] = extended_id_split(parts[3]); 
    3132    noit = parts[1]; 
    32     uuid = parts[3]; 
     33    uuid = id[3]; 
    3334    target = parts[4]; 
    3435    module = parts[5]; 
  • src/java/com/omniti/reconnoiter/event/NoitEvent.java

    r54eb3fe r8c720f9  
    1717    super(parts); 
    1818  } 
     19  public String[] extended_id_split(String id) { 
     20    String parts[] = { null, null, null, null }; /* target,module,name,uuid */ 
     21    if(id.length() <= 36) { 
     22      parts[3] = id; 
     23      return parts; 
     24    } 
     25    parts[3] = id.substring(id.length() - 36); 
     26    int p1 = id.indexOf('`'); 
     27    if(p1 < 0) return parts; 
     28    parts[0] = id.substring(0,p1); 
     29    int p2 = id.indexOf('`', p1+1); 
     30    if(p2 < 0) return parts; 
     31    parts[1] = id.substring(p1+1,p2); 
     32    parts[2] = id.substring(p2+1,id.length()-37); 
     33    return parts; 
     34  } 
    1935  public void handle(EventHandler eh) { 
    2036    eh.getService().getEPRuntime().sendEvent(this); 
  • src/java/com/omniti/reconnoiter/event/NoitMetricNumeric.java

    r5cffd17 r8c720f9  
    1313public class NoitMetricNumeric extends NoitEvent { 
    1414    private String uuid; 
     15    private String check_target; 
     16    private String check_module; 
     17    private String check_name; 
    1518    private String name; 
    1619    private long time; 
     
    2730   public NoitMetricNumeric(String[] parts) throws Exception { 
    2831      super(parts); 
     32      String id[] = extended_id_split(parts[3]); 
    2933      noit = parts[1]; 
    3034      time = timeToLong(parts[2]); 
    31       uuid = parts[3]; 
     35      check_target = id[0]; 
     36      check_module = id[1]; 
     37      check_name = id[2]; 
     38      uuid = id[3]; 
    3239      name = parts[4]; 
    3340      value = null; 
     
    4653    public Double getValue() { return value; } 
    4754    public String getNoit() { return noit; } 
     55    public String getCheck_target() { return check_target; } 
     56    public String getCheck_module() { return check_module; } 
     57    public String getCheck_name() { return check_name; } 
    4858 
    4959    public int getLength() { 
  • src/java/com/omniti/reconnoiter/event/NoitMetricText.java

    r54eb3fe r8c720f9  
    1717   String message; 
    1818   String noit; 
     19   String check_target; 
     20   String check_module; 
     21   String check_name; 
    1922 
    2023   public String getPrefix() { 
     
    2730    public NoitMetricText(String[] parts) throws Exception { 
    2831      super(parts); 
     32      String id[] = extended_id_split(parts[3]); 
    2933      noit = parts[1]; 
    30       uuid = parts[3]; 
     34      check_target = id[0]; 
     35      check_module = id[1]; 
     36      check_name = id[2]; 
     37      uuid = id[3]; 
    3138      name = parts[4]; 
    3239      message = parts[6].equals("[[null]]") ? null : parts[6]; 
     
    3845    public String getMessage() { return message; } 
    3946    public String getNoit() { return noit; } 
    40  
     47    public String getCheck_target() { return check_target; } 
     48    public String getCheck_module() { return check_module; } 
     49    public String getCheck_name() { return check_name; } 
    4150 
    4251    public int getLength() { 
  • src/java/com/omniti/reconnoiter/event/NoitStatus.java

    r54eb3fe r8c720f9  
    1919  Double duration; 
    2020  String noit; 
     21  String check_target; 
     22  String check_module; 
     23  String check_name; 
    2124 
    2225  public String getPrefix() { 
     
    3033  public NoitStatus(String[] parts) throws Exception { 
    3134    super(parts); 
     35    String id[] = extended_id_split(parts[3]); 
    3236    noit = parts[1]; 
    33     uuid = parts[3]; 
     37    check_target = id[0]; 
     38    check_module = id[1]; 
     39    check_name = id[2]; 
     40    uuid = id[3]; 
    3441    state = parts[4]; 
    3542    availability = parts[5]; 
     
    4653  public Double getDuration() { return duration; } 
    4754  public String getNoit() { return noit; } 
     55  public String getCheck_target() { return check_target; } 
     56  public String getCheck_module() { return check_module; } 
     57  public String getCheck_name() { return check_name; } 
    4858 
    4959  public int getLength() { 
  • src/noit.conf.in

    r16e8c85 r8c720f9  
    4747    </components> 
    4848    <feeds> 
     49      <config><extended_id>off</extended_id></config> 
    4950      <outlet name="feed"/> 
    5051      <log name="check"/> 
  • src/noit_check.c

    r9c846a2 r8c720f9  
    754754} 
    755755 
     756int 
     757noit_check_xpath(char *xpath, int len, 
     758                 const char *base, const char *arg) { 
     759  uuid_t checkid; 
     760  int base_trailing_slash; 
     761  char argcopy[1024], *target, *module, *name; 
     762 
     763  base_trailing_slash = (base[strlen(base)-1] == '/'); 
     764  xpath[0] = '\0'; 
     765  argcopy[0] = '\0'; 
     766  if(arg) strlcpy(argcopy, arg, sizeof(argcopy)); 
     767 
     768  if(uuid_parse(argcopy, checkid) == 0) { 
     769    /* If they kill by uuid, we'll seek and destroy -- find it anywhere */ 
     770    snprintf(xpath, len, "/noit/checks%s%s/check[@uuid=\"%s\"]", 
     771             base, base_trailing_slash ? "" : "/", argcopy); 
     772  } 
     773  else if((module = strchr(argcopy, '`')) != NULL) { 
     774    noit_check_t *check; 
     775    char uuid_str[37]; 
     776    target = argcopy; 
     777    *module++ = '\0'; 
     778    if((name = strchr(module+1, '`')) == NULL) 
     779      name = module; 
     780    else 
     781      name++; 
     782    check = noit_poller_lookup_by_name(target, name); 
     783    if(!check) { 
     784      return -1; 
     785    } 
     786    uuid_unparse_lower(check->checkid, uuid_str); 
     787    snprintf(xpath, len, "/noit/checks%s%s/check[@uuid=\"%s\"]", 
     788             base, base_trailing_slash ? "" : "/", uuid_str); 
     789  } 
     790  return strlen(xpath); 
     791} 
     792 
    756793void 
    757794noit_check_stats_clear(stats_t *s) { 
  • src/noit_check.h

    r95623e8 r8c720f9  
    200200  noit_poller_lookup_by_name(char *target, char *name); 
    201201 
     202API_EXPORT(int) 
     203  noit_check_xpath(char *xpath, int len, 
     204                   const char *base, const char *arg); 
     205 
    202206API_EXPORT(void) 
    203207  noit_check_stats_clear(stats_t *s); 
     
    237241API_EXPORT(void) noit_check_log_status(noit_check_t *check); 
    238242API_EXPORT(void) noit_check_log_metrics(noit_check_t *check); 
     243API_EXPORT(void) noit_check_extended_id_split(const char *in, int len, 
     244                                              char *target, int target_len, 
     245                                              char *module, int module_len, 
     246                                              char *name, int name_len, 
     247                                              char *uuid, int uuid_len); 
     248 
    239249 
    240250API_EXPORT(char *) 
  • src/noit_check_log.c

    r2c35111 r8c720f9  
    6060#define SECPART(a) ((unsigned long)(a)->tv_sec) 
    6161#define MSECPART(a) ((unsigned long)((a)->tv_usec / 1000)) 
     62#define MAKE_CHECK_UUID_STR(uuid_str, len, ls, check) do { \ 
     63  noit_boolean extended_id = noit_false; \ 
     64  const char *v; \ 
     65  v = noit_log_stream_get_property(ls, "extended_id"); \ 
     66  if(v && !strcmp(v, "on")) extended_id = noit_true; \ 
     67  uuid_str[0] = '\0'; \ 
     68  if(extended_id) { \ 
     69    strlcat(uuid_str, check->target, len-37); \ 
     70    strlcat(uuid_str, "`", len-37); \ 
     71    strlcat(uuid_str, check->module, len-37); \ 
     72    strlcat(uuid_str, "`", len-37); \ 
     73    strlcat(uuid_str, check->name, len-37); \ 
     74    strlcat(uuid_str, "`", len-37); \ 
     75  } \ 
     76  uuid_unparse_lower(check->checkid, uuid_str + strlen(uuid_str)); \ 
     77} while(0) 
    6278 
    6379static void 
     
    92108                      noit_check_t *check) { 
    93109  struct timeval __now; 
    94   char uuid_str[37]; 
    95  
    96   uuid_unparse_lower(check->checkid, uuid_str); 
     110  char uuid_str[256*3+37]; 
     111  SETUP_LOG(check, ); 
     112  MAKE_CHECK_UUID_STR(uuid_str, sizeof(uuid_str), check_log, check); 
     113 
    97114  gettimeofday(&__now, NULL); 
    98115  return noit_log(ls, &__now, __FILE__, __LINE__, 
     
    115132                       noit_check_t *check) { 
    116133  stats_t *c; 
    117   char uuid_str[37]; 
    118  
    119   uuid_unparse_lower(check->checkid, uuid_str); 
     134  char uuid_str[256*3+37]; 
     135  SETUP_LOG(status, ); 
     136  MAKE_CHECK_UUID_STR(uuid_str, sizeof(uuid_str), status_log, check); 
     137 
    120138  c = &check->stats.current; 
    121139  return noit_log(ls, &c->whence, __FILE__, __LINE__, 
     
    136154  int rv = 0; 
    137155  int srv; 
    138   char uuid_str[37]; 
     156  char uuid_str[256*3+37]; 
    139157  noit_hash_iter iter = NOIT_HASH_ITER_ZERO; 
    140158  const char *key; 
     
    142160  stats_t *c; 
    143161  void *vm; 
    144  
    145   uuid_unparse_lower(check->checkid, uuid_str); 
     162  SETUP_LOG(metrics, ); 
     163  MAKE_CHECK_UUID_STR(uuid_str, sizeof(uuid_str), metrics_log, check); 
     164 
    146165  c = &check->stats.current; 
    147166  while(noit_hash_next(&c->metrics, &iter, &key, &klen, &vm)) { 
  • src/noit_check_tools.c

    r8135eae r8c720f9  
    219219} 
    220220 
    221 int 
    222 noit_check_xpath(char *xpath, int len, 
    223                  const char *base, const char *arg) { 
    224   uuid_t checkid; 
    225   int base_trailing_slash; 
    226   char argcopy[1024], *target, *module, *name; 
    227  
    228   base_trailing_slash = (base[strlen(base)-1] == '/'); 
    229   xpath[0] = '\0'; 
    230   argcopy[0] = '\0'; 
    231   if(arg) strlcpy(argcopy, arg, sizeof(argcopy)); 
    232  
    233   if(uuid_parse(argcopy, checkid) == 0) { 
    234     /* If they kill by uuid, we'll seek and destroy -- find it anywhere */ 
    235     snprintf(xpath, len, "/noit/checks%s%s/check[@uuid=\"%s\"]", 
    236              base, base_trailing_slash ? "" : "/", argcopy); 
     221void 
     222noit_check_extended_id_split(const char *in, int len, 
     223                             char *target, int target_len, 
     224                             char *module, int module_len, 
     225                             char *name, int name_len, 
     226                             char *uuid, int uuid_len) { 
     227  if(target) *target = '\0'; 
     228  if(module) *module = '\0'; 
     229  if(name) *name = '\0'; 
     230  if(uuid) *uuid = '\0'; 
     231  if(len >= UUID_STR_LEN) { 
     232    memcpy(uuid, in + len - UUID_STR_LEN, UUID_STR_LEN); 
     233    uuid[UUID_STR_LEN] = '\0'; 
    237234  } 
    238   else if((module = strchr(argcopy, '`')) != NULL) { 
    239     noit_check_t *check; 
    240     char uuid_str[37]; 
    241     target = argcopy; 
    242     *module++ = '\0'; 
    243     if((name = strchr(module+1, '`')) == NULL) 
    244       name = module; 
    245     else 
    246       name++; 
    247     check = noit_poller_lookup_by_name(target, name); 
    248     if(!check) { 
    249       return -1; 
    250     } 
    251     uuid_unparse_lower(check->checkid, uuid_str); 
    252     snprintf(xpath, len, "/noit/checks%s%s/check[@uuid=\"%s\"]", 
    253              base, base_trailing_slash ? "" : "/", uuid_str); 
     235  if(len > UUID_STR_LEN) { 
     236    const char *tcp = in; 
     237    const char *mcp, *ncp, *ucp; 
     238    /* find the end of the target */ 
     239    mcp = strchr(tcp,'`'); 
     240    if(!mcp) return; 
     241    /* copy in the target */ 
     242    if(target_len > mcp-tcp) { 
     243      memcpy(target,tcp,mcp-tcp); 
     244      target[mcp-tcp] = '\0'; 
     245    } 
     246    mcp++; 
     247    ncp = strchr(mcp,'`'); 
     248    if(!ncp) return; 
     249    /* copy in the module */ 
     250    if(module_len > ncp-mcp) { 
     251      memcpy(module,mcp,ncp-mcp); 
     252      module[ncp-mcp] = '\0'; 
     253    } 
     254    ncp++; 
     255    /* copy in the name */ 
     256    ucp = in + len - UUID_STR_LEN - 1; 
     257    if(ncp < ucp) { 
     258      if(name_len > ucp-ncp) { 
     259        memcpy(name, ncp, ucp-ncp); 
     260        name[ucp-ncp] = '\0'; 
     261      } 
     262    } 
    254263  } 
    255   return strlen(xpath); 
    256264} 
    257265 
  • src/noit_check_tools.h

    rd38990d r8c720f9  
    7979API_EXPORT(void) 
    8080  noit_check_release_attrs(noit_hash_table *attrs); 
    81 API_EXPORT(int) 
    82   noit_check_xpath(char *xpath, int len, 
    83                    const char *base, const char *arg); 
    84  
    8581 
    8682#endif 
  • src/noit_conf.c

    rdb7317d r8c720f9  
    10021002    } 
    10031003    config = noit_conf_get_hash(log_configs[i], 
    1004                                 "ancestor-or-self::node()/config/*"); 
     1004                                "ancestor-or-self::node()/config"); 
    10051005    ls = noit_log_stream_new(name, type[0] ? type : NULL, 
    10061006                             path[0] ? path : NULL, NULL, config); 
  • src/stratcon_datastore.c

    rcb978e5 r8c720f9  
    712712        d->whence = (time_t)strtoul(token, NULL, 10); 
    713713        PROCESS_NEXT_FIELD(token, len); 
     714        /* uuid is last 36 bytes */ 
     715        if(len > 36) { token += (len-36); len = 36; } 
    714716        sid = uuid_to_sid(token, remote_cn); 
    715717        if(sid == 0) goto bad_row; 
     
    728730        d->whence = (time_t)strtoul(token, NULL, 10); 
    729731        PROCESS_NEXT_FIELD(token, len); 
     732        /* uuid is last 36 bytes */ 
     733        if(len > 36) { token += (len-36); len = 36; } 
    730734        sid = uuid_to_sid(token, remote_cn); 
    731735        if(sid == 0) goto bad_row; 
     
    743747        d->whence = (time_t)strtoul(token, NULL, 10); 
    744748        PROCESS_NEXT_FIELD(token, len); 
     749        /* uuid is last 36 bytes */ 
     750        if(len > 36) { token += (len-36); len = 36; } 
    745751        sid = uuid_to_sid(token, remote_cn); 
    746752        if(sid == 0) goto bad_row; 
     
    14171423                           const char *remote_cn, char *line) { 
    14181424  interim_journal_t *ij = NULL; 
    1419   char uuid_str[UUID_STR_LEN+1], *cp
     1425  char uuid_str[UUID_STR_LEN+1], *cp1, *cp2
    14201426  const char *fqdn = NULL, *dsn = NULL; 
    14211427  int storagenode_id = 0; 
     
    14271433    case 'S': 
    14281434    case 'M': 
    1429       if(line[1] == '\t' && (cp = strchr(line+2, '\t')) != NULL) { 
    1430         strlcpy(uuid_str, cp + 1, sizeof(uuid_str)); 
     1435      if(line[1] == '\t' && (cp1 = strchr(line+2, '\t')) != NULL && 
     1436         (cp2 = strchr(cp1+1, '\t')) != NULL && 
     1437         (cp2-cp1 >= UUID_STR_LEN)) { 
     1438        strlcpy(uuid_str, cp2 - UUID_STR_LEN, sizeof(uuid_str)); 
    14311439        if(!uuid_parse(uuid_str, checkid)) { 
    14321440          storage_node_quick_lookup(uuid_str, remote_cn, NULL, 
  • src/stratcon_realtime_http.c

    rfa84adf r8c720f9  
    4242#include "noit_http.h" 
    4343#include "noit_rest.h" 
     44#include "noit_check.h" 
    4445#include "noit_livestream_listener.h" 
    4546#include "stratcon_realtime_http.h" 
     
    159160  scp = buff; 
    160161  PROCESS_NEXT_FIELD(token,len); /* Skip the leader */ 
    161   if(buff[0] == 'M') { 
     162  if(buff[1] == '\t' && (buff[0] == 'M' || buff[0] == 'S')) { 
     163    char target[256], module[256], name[256], uuid_str[UUID_STR_LEN+1]; 
    162164    noit_hash_iter iter = NOIT_HASH_ITER_ZERO; 
    163165    const char *key; 
    164166    int klen, i=0; 
    165167    void *vval; 
     168    char type[2] = { '\0', '\0' }; 
     169    type[0] = buff[0]; 
    166170 
    167171#define ra_write(a,b) if(noit_http_response_append(ctx, a, b) == noit_false) BAIL_HTTP_WRITE 
     
    176180    /* Time */ 
    177181    noit_hash_store(&json, "script_id", 9, strdup(s_inc_id)); 
    178     noit_hash_store(&json, "type", 4, strdup("M")); 
     182    noit_hash_store(&json, "type", 4, strdup(type)); 
    179183    PROCESS_NEXT_FIELD(token,len); 
    180184    noit_hash_store(&json, "time", 4, noit__strndup(token, len)); 
    181185    /* UUID */ 
    182186    PROCESS_NEXT_FIELD(token,len); 
    183     noit_hash_store(&json, "id", 2, noit__strndup(token, len)); 
    184     /* name */ 
    185     PROCESS_NEXT_FIELD(token,len); 
    186     noit_hash_store(&json, "metric_name", 11, noit__strndup(token, len)); 
    187     /* type */ 
    188     PROCESS_NEXT_FIELD(token,len); 
    189     noit_hash_store(&json, "metric_type", 11, noit__strndup(token, len)); 
    190     /* value */ 
    191     PROCESS_LAST_FIELD(token,len); /* value */ 
    192     noit_hash_store(&json, "value", 5, noit__strndup(token, len)); 
     187    noit_check_extended_id_split(token, len, target, sizeof(target), 
     188                                 module, sizeof(module), name, sizeof(name), 
     189                                 uuid_str, sizeof(uuid_str)); 
     190    if(*uuid_str) 
     191      noit_hash_store(&json, "id", 2, 
     192                      noit__strndup(uuid_str, strlen(uuid_str))); 
     193    if(*target) 
     194      noit_hash_store(&json, "check_target", 12, 
     195                      noit__strndup(target, strlen(target))); 
     196    if(*module) 
     197      noit_hash_store(&json, "check_module", 12, 
     198                      noit__strndup(module, strlen(module))); 
     199    if(*name) 
     200      noit_hash_store(&json, "check_name", 10, 
     201                      noit__strndup(name, strlen(name))); 
     202    if(buff[0] == 'M') { 
     203      /* name */ 
     204      PROCESS_NEXT_FIELD(token,len); 
     205      noit_hash_store(&json, "metric_name", 11, noit__strndup(token, len)); 
     206      /* type */ 
     207      PROCESS_NEXT_FIELD(token,len); 
     208      noit_hash_store(&json, "metric_type", 11, noit__strndup(token, len)); 
     209      /* value */ 
     210      PROCESS_LAST_FIELD(token,len); /* value */ 
     211      noit_hash_store(&json, "value", 5, noit__strndup(token, len)); 
     212    } 
     213    else if(buff[0] == 'S') { 
     214      /* state */ 
     215      PROCESS_NEXT_FIELD(token,len); 
     216      noit_hash_store(&json, "check_state", 11, noit__strndup(token, len)); 
     217      /* availability */ 
     218      PROCESS_NEXT_FIELD(token,len); 
     219      noit_hash_store(&json, "check_availability", 18, noit__strndup(token, len)); 
     220      /* duration */ 
     221      PROCESS_NEXT_FIELD(token,len); 
     222      noit_hash_store(&json, "check_duration_ms", 17, noit__strndup(token, len)); 
     223      /* status */ 
     224      PROCESS_LAST_FIELD(token,len); 
     225      noit_hash_store(&json, "status_message", 14, noit__strndup(token, len)); 
     226    } 
    193227 
    194228    memset(&iter, 0, sizeof(iter)); 
     
    196230      char *val = (char *)vval; 
    197231      if(i++) ra_write(",", 1); 
    198       ra_write("'", 1); 
     232      ra_write("\"", 1); 
    199233      ra_write(key, klen); 
    200       ra_write("':\"", 3); 
     234      ra_write("\":\"", 3); 
    201235      while(*val) { 
    202236        if(*val == '\"' || *val == '\\') { 
  • src/utils/noit_log.c

    r6d9d06e r8c720f9  
    506506} 
    507507 
     508const char * 
     509noit_log_stream_get_property(noit_log_stream_t ls, 
     510                             const char *prop) { 
     511  const char *v; 
     512  if(ls && ls->config && 
     513     noit_hash_retr_str(ls->config, prop, strlen(prop), &v)) 
     514    return v; 
     515  return NULL; 
     516} 
     517 
     518void 
     519noit_log_stream_set_property(noit_log_stream_t ls, 
     520                             const char *prop, const char *v) { 
     521  if(!ls) return; 
     522  if(!ls->config) { 
     523    ls->config = calloc(1, sizeof(*ls->config)); 
     524    noit_hash_init(ls->config); 
     525  } 
     526  noit_hash_replace(ls->config, prop, strlen(prop), (void *)v, free, free); 
     527} 
     528 
    508529noit_log_stream_t 
    509530noit_log_stream_new_on_fd(const char *name, int fd, noit_hash_table *config) { 
  • src/utils/noit_log.h

    rdb7317d r8c720f9  
    103103API_EXPORT(size_t) noit_log_stream_size(noit_log_stream_t ls); 
    104104API_EXPORT(size_t) noit_log_stream_written(noit_log_stream_t ls); 
     105API_EXPORT(const char *) noit_log_stream_get_property(noit_log_stream_t ls, 
     106                                                      const char *); 
     107API_EXPORT(void) noit_log_stream_set_property(noit_log_stream_t ls, 
     108                                              const char *, const char *); 
    105109API_EXPORT(void) noit_log_stream_free(noit_log_stream_t ls); 
    106110API_EXPORT(int) noit_vlog(noit_log_stream_t ls, struct timeval *,