static void
handle_metric_buffer(const char *payload, int payload_len,
    int has_noit) {

  if (payload_len <= 0) {
    return;
  }

  switch (payload[0]) {
    case 'C':
    case 'D':
    case 'S':
    case 'H':
    case 'M':
      {
        // mtev_fq will free the fq_msg -> copy the payload
        char *copy = mtev__strndup(payload, payload_len);
        noit_metric_message_t *message = calloc(1, sizeof(noit_metric_message_t));

        message->type = copy[0];
        message->original_message = copy;
        message->original_message_len = payload_len;
        noit_metric_director_message_ref(message);

        int rv = noit_message_decoder_parse_line(copy, payload_len,
            &message->id.id, &message->id.name,
            &message->id.name_len, &message->value, has_noit);

        if(rv == 1) {
          distribute_message(message);
        }

        noit_metric_director_message_deref(message);
      }
      break;
    case 'B':
      {
        int n_metrics, i;
        char **metrics = NULL;
        n_metrics = noit_check_log_b_to_sm((const char *)payload, payload_len,
            &metrics, has_noit);
        for(i = 0; i < n_metrics; i++) {
          handle_metric_buffer(metrics[i], strlen(metrics[i]), false);
          free(metrics[i]);
        }
        free(metrics);
      }
      break;
    default: ;
      /* ignored */
  }
}
Exemple #2
0
static int
reflect_message_fragment(struct client *cl)
{
    ssize_t rc;
    char *msg;

    /* do read */
    rc = read(cl->fd, read_buf, sizeof(read_buf));
    if (rc == -1) {
        if (errno == EAGAIN || errno == EINTR)
            return 0;
        return -1;
    } else if (rc == 0)
        return -1;

    cl->rbuf = uim_helper_buffer_append(cl->rbuf, read_buf, rc);

    while ((msg = uim_helper_buffer_get_message(cl->rbuf))) {
        distribute_message(msg, cl);
        free(msg);
    }

    return 1;
}