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 */
  }
}
static void
send_individual_metric(noit_websocket_closure_t *wcl, const char *metric_string, size_t len)
{
#ifdef HAVE_WSLAY
  noit_metric_message_t message;
  char *json = NULL;
  size_t json_len = 0;

  int rval = noit_message_decoder_parse_line(metric_string, len, &message.id.id, &message.id.name,
                                             &message.id.name_len, &message.value, mtev_false);
  if (rval < 0) {
    return;
  }

  message.type = metric_string[0];

  if (wcl->use_filter == mtev_true) {
    for (int i = 0; i < wcl->filter_count; i++) {
      if (message.id.name_len > 0 &&
        strncmp(wcl->filters[i], message.id.name, message.id.name_len) == 0) {
        noit_metric_to_json(&message, &json, &json_len, mtev_false);
        mtev_http_websocket_queue_msg(wcl->restc->http_ctx,
                                      WSLAY_TEXT_FRAME,
                                      (const unsigned char *)json, json_len);
        free(json);
        break;
      }
    }
  } else {
        noit_metric_to_json(&message, &json, &json_len, mtev_false);
        mtev_http_websocket_queue_msg(wcl->restc->http_ctx,
                                      WSLAY_TEXT_FRAME,
                                      (const unsigned char *)json, json_len);
        free(json);
  }
#endif
}
mtev_http_websocket_queue_msg(wcl->restc->http_ctx,
                              WSLAY_TEXT_FRAME,
                              (const unsigned char *)heartbeat_str, heartbeat_str_len);
#endif
}

static int
send_individual_metric(noit_websocket_closure_t *wcl, const char *metric_string, size_t len)
{
#ifdef HAVE_WSLAY
  noit_metric_message_t message = { .original_message = (char *)metric_string, .original_message_len = len };
  char *json = NULL;
  size_t json_len = 0;
  int sent = 0;

  int rval = noit_message_decoder_parse_line(&message, mtev_false);
  if (rval < 0) {
    noit_metric_message_clear(&message);
    return sent;
  }

  message.type = metric_string[0];

  if (wcl->use_filter == mtev_true) {
    for (int i = 0; i < wcl->filter_count; i++) {
      if ((message.id.name_len_with_tags > 0) &&
          (strlen(wcl->filters[i]) == message.id.name_len_with_tags) &&
          (0 == memcmp(wcl->filters[i], message.id.name, message.id.name_len_with_tags))) {
        noit_metric_to_json(&message, &json, &json_len, mtev_false);
        mtev_http_websocket_queue_msg(wcl->restc->http_ctx,
                                      WSLAY_TEXT_FRAME,