Пример #1
0
static void
update_check(noit_check_t *check, const char *key, char type,
             double diff, double sample) {
  u_int32_t one = 1, cnt = 1;
  char buff[256];
  statsd_closure_t *ccl;
  stats_t *inprogress;
  metric_t *m;

  if (sample == 0.0) return; /* would be a div-by-zero */
  if (check->closure == NULL) return;
  ccl = check->closure;

  inprogress = noit_check_get_stats_inprogress(check);
  /* First key counts */
  snprintf(buff, sizeof(buff), "%s`count", key);
  m = noit_stats_get_metric(check, inprogress, buff);
  if(!m) ccl->stats_count++;
  if(m && m->metric_type == METRIC_UINT32 && m->metric_value.I != NULL) {
    (*m->metric_value.I)++;
    cnt = *m->metric_value.I;
    check_stats_set_metric_hook_invoke(check, inprogress, m);
  }
  else
    noit_stats_set_metric(check, buff, METRIC_UINT32, &one);

  /* Next the actual data */
  if(type == 'c') {
    double v = diff * (1.0 / sample) / (check->period / 1000.0);
    snprintf(buff, sizeof(buff), "%s`rate", key);
    m = noit_stats_get_metric(check, inprogress, buff);
    if(m && m->metric_type == METRIC_DOUBLE && m->metric_value.n != NULL) {
      (*m->metric_value.n) += v;
      check_stats_set_metric_hook_invoke(check, inprogress, m);
    }
    else
      noit_stats_set_metric(check, buff, METRIC_DOUBLE, &v);
  }

  snprintf(buff, sizeof(buff), "%s`%s", key,
           (type == 'c') ? "counter" : (type == 'g') ? "gauge" : "timing");
  m = noit_stats_get_metric(check, inprogress, buff);
  if(m && m->metric_type == METRIC_DOUBLE && m->metric_value.n != NULL) {
    if(type == 'c') (*m->metric_value.n) += (diff * (1.0/sample));
    else {
      double new_avg = ((double)(cnt - 1) * (*m->metric_value.n) + diff) / (double)cnt;
      (*m->metric_value.n) = new_avg;
    }
    check_stats_set_metric_hook_invoke(check, inprogress, m);
  }
  else
    noit_stats_set_metric(check, buff, METRIC_DOUBLE, &diff);
}
Пример #2
0
static void
update_check(noit_check_t *check, const char *key, char type,
             double diff, double sample) {
  u_int32_t one = 1;
  char buff[256];
  statsd_closure_t *ccl;
  metric_t *m;

  if (check->closure == NULL) return;
  ccl = check->closure;

  /* First key counts */
  snprintf(buff, sizeof(buff), "%s`count", key);
  m = noit_stats_get_metric(check, &ccl->current, buff);
  if(!m) ccl->stats_count++;
  if(m && m->metric_type == METRIC_UINT32 && m->metric_value.I != NULL) {
    (*m->metric_value.I)++;
    check_stats_set_metric_hook_invoke(check, &ccl->current, m);
  }
  else
    noit_stats_set_metric(check, &ccl->current, buff, METRIC_UINT32, &one);

  /* Next the actual data */
  if(type == 'c') {
    double v = diff * (1.0 / sample) / (check->period / 1000.0);
    snprintf(buff, sizeof(buff), "%s`rate", key);
    m = noit_stats_get_metric(check, &ccl->current, buff);
    if(m && m->metric_type == METRIC_DOUBLE && m->metric_value.n != NULL) {
      (*m->metric_value.n) += v;
      check_stats_set_metric_hook_invoke(check, &ccl->current, m);
    }
    else
      noit_stats_set_metric(check, &ccl->current, buff, METRIC_DOUBLE, &v);
  }

  snprintf(buff, sizeof(buff), "%s`%s", key,
           (type == 'c') ? "counter" : (type == 'g') ? "gauge" : "timing");
  m = noit_stats_get_metric(check, &ccl->current, buff);
  if(m && m->metric_type == METRIC_DOUBLE && m->metric_value.n != NULL) {
    (*m->metric_value.n) = diff;
    check_stats_set_metric_hook_invoke(check, &ccl->current, m);
  }
  else
    noit_stats_set_metric(check, &ccl->current, buff, METRIC_DOUBLE, &diff);
}