Changeset 58f90423160bc5252603326f4eabcbe2b6fee79b

Show
Ignore:
Timestamp:
07/07/11 19:53:16 (3 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1310068396 -0400
git-parent:

[6b7bec911ad60ccd8e558dab8fd3147427bdc640]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1310068396 -0400
Message:

make streaming work

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/stratcon_realtime_http.c

    r65abbae r58f9042  
    4343#include "noit_rest.h" 
    4444#include "noit_check.h" 
     45#include "noit_check_log_helpers.h" 
    4546#include "noit_livestream_listener.h" 
    4647#include "stratcon_realtime_http.h" 
     
    119120} 
    120121int 
    121 stratcon_line_to_javascript(noit_http_session_ctx *ctx, char *buff, 
    122                             u_int32_t inc_id) { 
     122stratcon_line_to_javascript(noit_http_session_ctx *ctx, char *in_buff, 
     123                            u_int32_t *inc_id) { 
    123124  char buffer[1024]; 
    124   char *scp, *ecp, *token
    125   int len
     125  char *scp, *ecp, *token, *buff
     126  int i, len, cnt
    126127  const char *v, *cb = NULL; 
    127128  noit_hash_table json = NOIT_HASH_EMPTY; 
    128129  noit_http_request *req = noit_http_session_request(ctx); 
    129130  char s_inc_id[42]; 
    130  
    131   snprintf(s_inc_id, sizeof(s_inc_id), "script-%08x", inc_id); 
    132   
     131  char **outrows = NULL; 
     132 
    133133  cb = noit_http_request_querystring(req, "cb");  
    134134  for(v = cb; v && *v; v++) 
     
    143143 
    144144#define BAIL_HTTP_WRITE do { \ 
     145  if(outrows) { \ 
     146    for(i=0;i<cnt;i++) if(outrows[i]) free(outrows[i]); \ 
     147    free(outrows); \ 
     148  } \ 
    145149  noit_hash_destroy(&json, NULL, free); \ 
    146150  noitL(noit_error, "javascript emit failed: %s:%s:%d\n", \ 
     
    167171} while(0) 
    168172 
    169   scp = buff; 
    170   PROCESS_NEXT_FIELD(token,len); /* Skip the leader */ 
    171   if(buff[1] == '\t' && (buff[0] == 'M' || buff[0] == 'S')) { 
    172     char target[256], module[256], name[256], uuid_str[UUID_STR_LEN+1]; 
    173     noit_http_request *req = noit_http_session_request(ctx); 
    174     noit_hash_table *qs; 
    175     noit_hash_iter iter = NOIT_HASH_ITER_ZERO; 
    176     const char *key; 
    177     int klen, i=0; 
    178     void *vval; 
    179     char type[2] = { '\0', '\0' }; 
    180     type[0] = buff[0]; 
     173  noitL(noit_error, "recv(%s)\n", in_buff); 
     174  if(in_buff[0] == 'B' && in_buff[1] != '\0' && in_buff[2] == '\t') { 
     175    cnt = noit_check_log_b_to_sm(in_buff, strlen(in_buff), &outrows); 
     176  } 
     177  else { 
     178    cnt = 1; 
     179    outrows = malloc(sizeof(*outrows)); 
     180    outrows[0] = strdup(in_buff); 
     181  } 
     182  for(i=0; i<cnt; i++) { 
     183    buff = outrows[i]; 
     184    if(!buff) continue; 
     185    noitL(noit_error, "recv_xlt(%s)\n", buff); 
     186    scp = buff; 
     187    PROCESS_NEXT_FIELD(token,len); /* Skip the leader */ 
     188    if(buff[1] == '\t' && (buff[0] == 'M' || buff[0] == 'S')) { 
     189      char target[256], module[256], name[256], uuid_str[UUID_STR_LEN+1]; 
     190      noit_http_request *req = noit_http_session_request(ctx); 
     191      noit_hash_table *qs; 
     192      noit_hash_iter iter = NOIT_HASH_ITER_ZERO; 
     193      const char *key; 
     194      int klen, i=0; 
     195      void *vval; 
     196      char type[2] = { '\0', '\0' }; 
     197      type[0] = buff[0]; 
    181198 
    182199#define ra_write(a,b) if(noit_http_response_append(ctx, a, b) == noit_false) BAIL_HTTP_WRITE 
    183200 
    184     snprintf(buffer, sizeof(buffer), "<script id=\"%s\">%s({", s_inc_id, cb); 
    185     ra_write(buffer, strlen(buffer)); 
    186  
    187     qs = noit_http_request_querystring_table(req); 
    188     while(noit_hash_next(qs, &iter, &key, &klen, &vval)) { 
    189       if(!strcmp(key, "cb")) continue; 
    190       noit_hash_store(&json, key, klen, strdup(vval ?(char *)vval : "true")); 
    191     } 
    192     /* Time */ 
    193     noit_hash_store(&json, "script_id", 9, strdup(s_inc_id)); 
    194     noit_hash_store(&json, "type", 4, strdup(type)); 
    195     PROCESS_NEXT_FIELD(token,len); 
    196     noit_hash_store(&json, "time", 4, noit__strndup(token, len)); 
    197     /* UUID */ 
    198     PROCESS_NEXT_FIELD(token,len); 
    199     noit_check_extended_id_split(token, len, target, sizeof(target), 
    200                                  module, sizeof(module), name, sizeof(name), 
    201                                  uuid_str, sizeof(uuid_str)); 
    202     if(*uuid_str) 
    203       noit_hash_store(&json, "id", 2, 
    204                       noit__strndup(uuid_str, strlen(uuid_str))); 
    205     if(*target) 
    206       noit_hash_store(&json, "check_target", 12, 
    207                       noit__strndup(target, strlen(target))); 
    208     if(*module) 
    209       noit_hash_store(&json, "check_module", 12, 
    210                       noit__strndup(module, strlen(module))); 
    211     if(*name) 
    212       noit_hash_store(&json, "check_name", 10, 
    213                       noit__strndup(name, strlen(name))); 
    214     if(buff[0] == 'M') { 
    215       /* name */ 
     201      snprintf(s_inc_id, sizeof(s_inc_id), "script-%08x", (*inc_id)++); 
     202      snprintf(buffer, sizeof(buffer), "<script id=\"%s\">%s({", s_inc_id, cb); 
     203      ra_write(buffer, strlen(buffer)); 
     204 
     205      qs = noit_http_request_querystring_table(req); 
     206      while(noit_hash_next(qs, &iter, &key, &klen, &vval)) { 
     207        if(!strcmp(key, "cb")) continue; 
     208        noit_hash_store(&json, key, klen, strdup(vval ?(char *)vval : "true")); 
     209      } 
     210      /* Time */ 
     211      noit_hash_store(&json, "script_id", 9, strdup(s_inc_id)); 
     212      noit_hash_store(&json, "type", 4, strdup(type)); 
    216213      PROCESS_NEXT_FIELD(token,len); 
    217       noit_hash_store(&json, "metric_name", 11, noit__strndup(token, len)); 
    218       /* type */ 
     214      noit_hash_store(&json, "time", 4, noit__strndup(token, len)); 
     215      /* UUID */ 
    219216      PROCESS_NEXT_FIELD(token,len); 
    220       noit_hash_store(&json, "metric_type", 11, noit__strndup(token, len)); 
    221       /* value */ 
    222       PROCESS_LAST_FIELD(token,len); /* value */ 
    223       noit_hash_store(&json, "value", 5, noit__strndup(token, len)); 
    224     } 
    225     else if(buff[0] == 'S') { 
    226       /* state */ 
    227       PROCESS_NEXT_FIELD(token,len); 
    228       noit_hash_store(&json, "check_state", 11, noit__strndup(token, len)); 
    229       /* availability */ 
    230       PROCESS_NEXT_FIELD(token,len); 
    231       noit_hash_store(&json, "check_availability", 18, noit__strndup(token, len)); 
    232       /* duration */ 
    233       PROCESS_NEXT_FIELD(token,len); 
    234       noit_hash_store(&json, "check_duration_ms", 17, noit__strndup(token, len)); 
    235       /* status */ 
    236       PROCESS_LAST_FIELD(token,len); 
    237       noit_hash_store(&json, "status_message", 14, noit__strndup(token, len)); 
    238     } 
    239  
    240     memset(&iter, 0, sizeof(iter)); 
    241     while(noit_hash_next(&json, &iter, &key, &klen, &vval)) { 
    242       char *val = (char *)vval; 
    243       if(i++) ra_write(",", 1); 
    244       ra_write("\"", 1); 
    245       ra_write(key, klen); 
    246       ra_write("\":\"", 3); 
    247       while(*val) { 
    248         if(*val == '\"' || *val == '\\') { 
    249           ra_write((char *)"\\", 1); 
     217      noit_check_extended_id_split(token, len, target, sizeof(target), 
     218                                   module, sizeof(module), name, sizeof(name), 
     219                                   uuid_str, sizeof(uuid_str)); 
     220      if(*uuid_str) 
     221        noit_hash_store(&json, "id", 2, 
     222                        noit__strndup(uuid_str, strlen(uuid_str))); 
     223      if(*target) 
     224        noit_hash_store(&json, "check_target", 12, 
     225                        noit__strndup(target, strlen(target))); 
     226      if(*module) 
     227        noit_hash_store(&json, "check_module", 12, 
     228                        noit__strndup(module, strlen(module))); 
     229      if(*name) 
     230        noit_hash_store(&json, "check_name", 10, 
     231                        noit__strndup(name, strlen(name))); 
     232      if(buff[0] == 'M') { 
     233        /* name */ 
     234        PROCESS_NEXT_FIELD(token,len); 
     235        noit_hash_store(&json, "metric_name", 11, noit__strndup(token, len)); 
     236        /* type */ 
     237        PROCESS_NEXT_FIELD(token,len); 
     238        noit_hash_store(&json, "metric_type", 11, noit__strndup(token, len)); 
     239        /* value */ 
     240        PROCESS_LAST_FIELD(token,len); /* value */ 
     241        noit_hash_store(&json, "value", 5, noit__strndup(token, len)); 
     242      } 
     243      else if(buff[0] == 'S') { 
     244        /* state */ 
     245        PROCESS_NEXT_FIELD(token,len); 
     246        noit_hash_store(&json, "check_state", 11, noit__strndup(token, len)); 
     247        /* availability */ 
     248        PROCESS_NEXT_FIELD(token,len); 
     249        noit_hash_store(&json, "check_availability", 18, noit__strndup(token, len)); 
     250        /* duration */ 
     251        PROCESS_NEXT_FIELD(token,len); 
     252        noit_hash_store(&json, "check_duration_ms", 17, noit__strndup(token, len)); 
     253        /* status */ 
     254        PROCESS_LAST_FIELD(token,len); 
     255        noit_hash_store(&json, "status_message", 14, noit__strndup(token, len)); 
     256      } 
     257 
     258      memset(&iter, 0, sizeof(iter)); 
     259      while(noit_hash_next(&json, &iter, &key, &klen, &vval)) { 
     260        char *val = (char *)vval; 
     261        if(i++) ra_write(",", 1); 
     262        ra_write("\"", 1); 
     263        ra_write(key, klen); 
     264        ra_write("\":\"", 3); 
     265        while(*val) { 
     266          if(*val == '\"' || *val == '\\') { 
     267            ra_write((char *)"\\", 1); 
     268          } 
     269          if(isprint(*val)) { 
     270            ra_write((char *)val, 1); 
     271          } 
     272          else { 
     273            char od[5]; 
     274            snprintf(od, sizeof(od), "\\%03o", *((unsigned char *)val)); 
     275            ra_write(od, strlen(od)); 
     276          } 
     277          val++; 
    250278        } 
    251         if(isprint(*val)) { 
    252           ra_write((char *)val, 1); 
    253         } 
    254         else { 
    255           char od[5]; 
    256           snprintf(od, sizeof(od), "\\%03o", *((unsigned char *)val)); 
    257           ra_write(od, strlen(od)); 
    258         } 
    259         val++; 
     279        ra_write("\"", 1); 
    260280      } 
    261       ra_write("\"", 1); 
    262     } 
    263     snprintf(buffer, sizeof(buffer), "});</script>\n"); 
    264     ra_write(buffer, strlen(buffer)); 
    265  
    266     if(noit_http_response_flush(ctx, noit_false) == noit_false) BAIL_HTTP_WRITE; 
    267   } 
    268  
    269   noit_hash_destroy(&json, NULL, free); 
     281      snprintf(buffer, sizeof(buffer), "});</script>\n"); 
     282      ra_write(buffer, strlen(buffer)); 
     283 
     284      if(noit_http_response_flush(ctx, noit_false) == noit_false) BAIL_HTTP_WRITE; 
     285    } 
     286 
     287    noit_hash_destroy(&json, NULL, free); 
     288    memset(&json, 0, sizeof(json)); 
     289  } 
     290  if(outrows) { 
     291    for(i=0;i<cnt;i++) if(outrows[i]) free(outrows[i]); 
     292    free(outrows); 
     293  } 
     294 
    270295  return 0; 
    271296 
     
    444469      case REALTIME_HTTP_WANT_BODY: 
    445470        FULLREAD(e, ctx, ctx->body_len); 
    446         if(stratcon_line_to_javascript(ctx->ctx, ctx->buffer, ctx->hack_inc_id++)) goto socket_error; 
     471        if(stratcon_line_to_javascript(ctx->ctx, ctx->buffer, &ctx->hack_inc_id)) goto socket_error; 
    447472        free(ctx->buffer); ctx->buffer = NULL; 
    448473        ctx->state = REALTIME_HTTP_WANT_HEADER;