Merge branch 'collectd-5.6' into collectd-5.7
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 7 Jul 2017 16:40:55 +0000 (18:40 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 7 Jul 2017 16:40:55 +0000 (18:40 +0200)
1  2 
src/apache.c
src/ascent.c
src/bind.c
src/curl.c
src/curl_json.c
src/curl_xml.c
src/nginx.c
src/write_http.c

diff --combined src/apache.c
@@@ -217,19 -217,19 +217,19 @@@ static int config_add(oconfig_item_t *c
    }
  
    if (status == 0) {
 -    user_data_t ud = {.data = st, .free_func = apache_free};
 -
      char callback_name[3 * DATA_MAX_NAME_LEN];
  
      ssnprintf(callback_name, sizeof(callback_name), "apache/%s/%s",
                (st->host != NULL) ? st->host : hostname_g,
                (st->name != NULL) ? st->name : "default");
  
 -    status = plugin_register_complex_read(/* group = */ NULL,
 -                                          /* name      = */ callback_name,
 -                                          /* callback  = */ apache_read_host,
 -                                          /* interval  = */ 0,
 -                                          /* user_data = */ &ud);
 +    status = plugin_register_complex_read(
 +        /* group = */ NULL,
 +        /* name      = */ callback_name,
 +        /* callback  = */ apache_read_host,
 +        /* interval  = */ 0, &(user_data_t){
 +                                 .data = st, .free_func = apache_free,
 +                             });
    }
  
    if (status != 0) {
@@@ -328,7 -328,6 +328,6 @@@ static int init_host(apache_t *st) /* {
  #endif
    }
  
-   curl_easy_setopt(st->curl, CURLOPT_URL, st->url);
    curl_easy_setopt(st->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(st->curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -357,8 -356,8 +356,8 @@@ static void submit_value(const char *ty
    vl.values = &value;
    vl.values_len = 1;
  
 -  sstrncpy(vl.host, (st->host != NULL) ? st->host : hostname_g,
 -           sizeof(vl.host));
 +  if (st->host != NULL)
 +    sstrncpy(vl.host, st->host, sizeof(vl.host));
  
    sstrncpy(vl.plugin, "apache", sizeof(vl.plugin));
    if (st->name != NULL)
  } /* void submit_value */
  
  static void submit_derive(const char *type, const char *type_instance,
 -                          derive_t c, apache_t *st) {
 -  value_t v;
 -  v.derive = c;
 -  submit_value(type, type_instance, v, st);
 +                          derive_t d, apache_t *st) {
 +  submit_value(type, type_instance, (value_t){.derive = d}, st);
  } /* void submit_derive */
  
  static void submit_gauge(const char *type, const char *type_instance, gauge_t g,
                           apache_t *st) {
 -  value_t v;
 -  v.gauge = g;
 -  submit_value(type, type_instance, v, st);
 +  submit_value(type, type_instance, (value_t){.gauge = g}, st);
  } /* void submit_gauge */
  
  static void submit_scoreboard(char *buf, apache_t *st) {
@@@ -510,6 -513,9 +509,9 @@@ static int apache_read_host(user_data_
    assert(st->curl != NULL);
  
    st->apache_buffer_fill = 0;
+   curl_easy_setopt(st->curl, CURLOPT_URL, st->url);
    if (curl_easy_perform(st->curl) != CURLE_OK) {
      ERROR("apache: curl_easy_perform failed: %s", st->apache_curl_error);
      return (-1);
diff --combined src/ascent.c
@@@ -110,10 -110,14 +110,10 @@@ static int config_keys_num = STATIC_ARR
  static int ascent_submit_gauge(const char *plugin_instance, /* {{{ */
                                 const char *type, const char *type_instance,
                                 gauge_t value) {
 -  value_t values[1];
    value_list_t vl = VALUE_LIST_INIT;
  
 -  values[0].gauge = value;
 -
 -  vl.values = values;
 +  vl.values = &(value_t){.gauge = value};
    vl.values_len = 1;
 -  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "ascent", sizeof(vl.plugin));
  
    if (plugin_instance != NULL)
@@@ -511,7 -515,6 +511,6 @@@ static int ascent_init(void) /* {{{ *
  #endif
    }
  
-   curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -554,6 -557,9 +553,9 @@@ static int ascent_read(void) /* {{{ *
    }
  
    ascent_buffer_fill = 0;
+   curl_easy_setopt(curl, CURLOPT_URL, url);
    if (curl_easy_perform(curl) != CURLE_OK) {
      ERROR("ascent plugin: curl_easy_perform failed: %s", ascent_curl_error);
      return (-1);
diff --combined src/bind.c
@@@ -138,7 -138,7 +138,7 @@@ static const translation_info_t nsstats
          {"ReqBadSIG", "dns_request", "BadSIG"},
          {"ReqTCP", "dns_request", "TCP"},
          /* Rejects */
 -        {"AuthQryRej", "dns_reject", "authorative"},
 +        {"AuthQryRej", "dns_reject", "authoritative"},
          {"RecQryRej", "dns_reject", "recursive"},
          {"XfrRej", "dns_reject", "transfer"},
          {"UpdateRej", "dns_reject", "update"},
          {"RespTSIG", "dns_response", "TSIG"},
          {"RespSIG0", "dns_response", "SIG0"},
          /* Queries */
 -        {"QryAuthAns", "dns_query", "authorative"},
 +        {"QryAuthAns", "dns_query", "authoritative"},
          {"QryNoauthAns", "dns_query", "nonauth"},
          {"QryReferral", "dns_query", "referral"},
          {"QryRecursion", "dns_query", "recursion"},
 -        {"QryDuplicate", "dns_query", "dupliate"},
 +        {"QryDuplicate", "dns_query", "duplicate"},
          {"QryDropped", "dns_query", "dropped"},
          {"QryFailure", "dns_query", "failure"},
          /* Response codes */
          {"QryFORMERR", "dns_rcode", "tx-FORMERR"},
          {"QryNXDOMAIN", "dns_rcode", "tx-NXDOMAIN"}
  #if 0
 -  { "XfrReqDone",      "type", "type_instance"       },
 -  { "UpdateReqFwd",    "type", "type_instance"       },
 -  { "UpdateRespFwd",   "type", "type_instance"       },
 -  { "UpdateFwdFail",   "type", "type_instance"       },
 -  { "UpdateDone",      "type", "type_instance"       },
 -  { "UpdateFail",      "type", "type_instance"       },
 -  { "UpdateBadPrereq", "type", "type_instance"       },
 +  { "XfrReqDone",      "type",         "type_instance" },
 +  { "UpdateReqFwd",    "type",         "type_instance" },
 +  { "UpdateRespFwd",   "type",         "type_instance" },
 +  { "UpdateFwdFail",   "type",         "type_instance" },
 +  { "UpdateDone",      "type",         "type_instance" },
 +  { "UpdateFail",      "type",         "type_instance" },
 +  { "UpdateBadPrereq", "type",         "type_instance" },
  #endif
  };
  static int nsstats_translation_table_length =
@@@ -246,12 -246,16 +246,12 @@@ static int memsummary_translation_table
  
  static void submit(time_t ts, const char *plugin_instance, /* {{{ */
                     const char *type, const char *type_instance, value_t value) {
 -  value_t values[1];
    value_list_t vl = VALUE_LIST_INIT;
  
 -  values[0] = value;
 -
 -  vl.values = values;
 +  vl.values = &value;
    vl.values_len = 1;
    if (config_parse_time)
      vl.time = TIME_T_TO_CDTIME_T(ts);
 -  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "bind", sizeof(vl.plugin));
    if (plugin_instance) {
      sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance));
@@@ -1598,7 -1602,6 +1598,6 @@@ static int bind_init(void) /* {{{ *
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, bind_curl_callback);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, bind_curl_error);
-   curl_easy_setopt(curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
  #ifdef HAVE_CURLOPT_TIMEOUT_MS
@@@ -1620,6 -1623,9 +1619,9 @@@ static int bind_read(void) /* {{{ *
    }
  
    bind_buffer_fill = 0;
+   curl_easy_setopt(curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
    if (curl_easy_perform(curl) != CURLE_OK) {
      ERROR("bind plugin: curl_easy_perform failed: %s", bind_curl_error);
      return (-1);
diff --combined src/curl.c
@@@ -347,7 -347,6 +347,6 @@@ static int cc_page_init_curl(web_page_
    curl_easy_setopt(wp->curl, CURLOPT_WRITEDATA, wp);
    curl_easy_setopt(wp->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf);
-   curl_easy_setopt(wp->curl, CURLOPT_URL, wp->url);
    curl_easy_setopt(wp->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(wp->curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -562,11 -561,15 +561,11 @@@ static int cc_init(void) /* {{{ *
  } /* }}} int cc_init */
  
  static void cc_submit(const web_page_t *wp, const web_match_t *wm, /* {{{ */
 -                      const cu_match_value_t *mv) {
 -  value_t values[1];
 +                      value_t value) {
    value_list_t vl = VALUE_LIST_INIT;
  
 -  values[0] = mv->value;
 -
 -  vl.values = values;
 +  vl.values = &value;
    vl.values_len = 1;
 -  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "curl", sizeof(vl.plugin));
    sstrncpy(vl.plugin_instance, wp->instance, sizeof(vl.plugin_instance));
    sstrncpy(vl.type, wm->type, sizeof(vl.type));
  
  static void cc_submit_response_code(const web_page_t *wp, long code) /* {{{ */
  {
 -  value_t values[1];
    value_list_t vl = VALUE_LIST_INIT;
  
 -  values[0].gauge = code;
 -
 -  vl.values = values;
 +  vl.values = &(value_t){.gauge = (gauge_t)code};
    vl.values_len = 1;
 -  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "curl", sizeof(vl.plugin));
    sstrncpy(vl.plugin_instance, wp->instance, sizeof(vl.plugin_instance));
    sstrncpy(vl.type, "response_code", sizeof(vl.type));
  } /* }}} void cc_submit_response_code */
  
  static void cc_submit_response_time(const web_page_t *wp, /* {{{ */
 -                                    cdtime_t response_time) {
 -  value_t values[1];
 +                                    gauge_t response_time) {
    value_list_t vl = VALUE_LIST_INIT;
  
 -  values[0].gauge = CDTIME_T_TO_DOUBLE(response_time);
 -
 -  vl.values = values;
 +  vl.values = &(value_t){.gauge = response_time};
    vl.values_len = 1;
 -  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "curl", sizeof(vl.plugin));
    sstrncpy(vl.plugin_instance, wp->instance, sizeof(vl.plugin_instance));
    sstrncpy(vl.type, "response_time", sizeof(vl.type));
@@@ -611,6 -622,9 +610,9 @@@ static int cc_read_page(web_page_t *wp
      start = cdtime();
  
    wp->buffer_fill = 0;
+   curl_easy_setopt(wp->curl, CURLOPT_URL, wp->url);
    status = curl_easy_perform(wp->curl);
    if (status != CURLE_OK) {
      ERROR("curl plugin: curl_easy_perform failed with status %i: %s", status,
    }
  
    if (wp->response_time)
 -    cc_submit_response_time(wp, cdtime() - start);
 +    cc_submit_response_time(wp, CDTIME_T_TO_DOUBLE(cdtime() - start));
    if (wp->stats != NULL)
      curl_stats_dispatch(wp->stats, wp->curl, hostname_g, "curl", wp->instance);
  
        continue;
      }
  
 -    cc_submit(wp, wm, mv);
 +    cc_submit(wp, wm, mv->value);
      match_value_reset(mv);
    } /* for (wm = wp->matches; wm != NULL; wm = wm->next) */
  
diff --combined src/curl_json.c
@@@ -562,7 -562,6 +562,6 @@@ static int cj_init_curl(cj_t *db) /* {{
    curl_easy_setopt(db->curl, CURLOPT_WRITEDATA, db);
    curl_easy_setopt(db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf);
-   curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
    curl_easy_setopt(db->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(db->curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -716,11 -715,10 +715,11 @@@ static int cj_config_add_url(oconfig_it
      cb_name = ssnprintf_alloc("curl_json-%s-%s", db->instance,
                                db->url ? db->url : db->sock);
  
 -    user_data_t ud = {.data = db, .free_func = cj_free};
 -
      plugin_register_complex_read(/* group = */ NULL, cb_name, cj_read,
 -                                 /* interval = */ db->interval, &ud);
 +                                 /* interval = */ db->interval,
 +                                 &(user_data_t){
 +                                     .data = db, .free_func = cj_free,
 +                                 });
      sfree(cb_name);
    } else {
      cj_free(db);
@@@ -841,12 -839,13 +840,13 @@@ static int cj_curl_perform(cj_t *db) /
    int status;
    long rc;
    char *url;
-   url = db->url;
+   curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
  
    status = curl_easy_perform(db->curl);
    if (status != CURLE_OK) {
      ERROR("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)",
-           status, db->curl_errbuf, url);
+           status, db->curl_errbuf, db->url);
      return (-1);
    }
    if (db->stats != NULL)
diff --combined src/curl_xml.c
@@@ -602,13 -602,15 +602,15 @@@ static int cx_curl_perform(cx_t *db, CU
    long rc;
    char *ptr;
    char *url;
-   url = db->url;
  
    db->buffer_fill = 0;
+   curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
    status = curl_easy_perform(curl);
    if (status != CURLE_OK) {
      ERROR("curl_xml plugin: curl_easy_perform failed with status %i: %s (%s)",
-           status, db->curl_errbuf, url);
+           status, db->curl_errbuf, db->url);
      return (-1);
    }
    if (db->stats != NULL)
@@@ -817,7 -819,6 +819,6 @@@ static int cx_init_curl(cx_t *db) /* {{
    curl_easy_setopt(db->curl, CURLOPT_WRITEDATA, db);
    curl_easy_setopt(db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf);
-   curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
    curl_easy_setopt(db->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(db->curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -966,11 -967,10 +967,11 @@@ static int cx_config_add_url(oconfig_it
  
      cb_name = ssnprintf_alloc("curl_xml-%s-%s", db->instance, db->url);
  
 -    user_data_t ud = {.data = db, .free_func = cx_free};
 -
      plugin_register_complex_read(/* group = */ "curl_xml", cb_name, cx_read,
 -                                 /* interval = */ 0, &ud);
 +                                 /* interval = */ 0,
 +                                 &(user_data_t){
 +                                     .data = db, .free_func = cx_free,
 +                                 });
      sfree(cb_name);
    } else {
      cx_free(db);
diff --combined src/nginx.c
@@@ -133,10 -133,6 +133,6 @@@ static int init(void) 
  #endif
    }
  
-   if (url != NULL) {
-     curl_easy_setopt(curl, CURLOPT_URL, url);
-   }
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -182,8 -178,10 +178,8 @@@ static void submit(const char *type, co
      return;
  
    vl.values = values;
 -  vl.values_len = 1;
 -  sstrncpy(vl.host, hostname_g, sizeof(vl.host));
 +  vl.values_len = STATIC_ARRAY_SIZE(values);
    sstrncpy(vl.plugin, "nginx", sizeof(vl.plugin));
 -  sstrncpy(vl.plugin_instance, "", sizeof(vl.plugin_instance));
    sstrncpy(vl.type, type, sizeof(vl.type));
  
    if (inst != NULL)
@@@ -207,6 -205,9 +203,9 @@@ static int nginx_read(void) 
      return (-1);
  
    nginx_buffer_len = 0;
+   curl_easy_setopt(curl, CURLOPT_URL, url);
    if (curl_easy_perform(curl) != CURLE_OK) {
      WARNING("nginx plugin: curl_easy_perform failed: %s", nginx_curl_error);
      return (-1);
    /*
     * Active connections: 291
     * server accepts handled requests
 -   *  16630948 16630948 31070465
 +   *  101059015 100422216 347910649
     * Reading: 6 Writing: 179 Waiting: 106
     */
    for (int i = 0; i < lines_num; i++) {
        } else if ((atoll(fields[0]) != 0) && (atoll(fields[1]) != 0) &&
                   (atoll(fields[2]) != 0)) {
          submit("connections", "accepted", atoll(fields[0]));
 +        /* TODO: The legacy metric "handled", which is the sum of "accepted" and
 +         * "failed", is reported for backwards compatibility only. Remove in the
 +         * next major version. */
          submit("connections", "handled", atoll(fields[1]));
 +        submit("connections", "failed", (atoll(fields[0]) - atoll(fields[1])));
          submit("nginx_requests", NULL, atoll(fields[2]));
        }
      } else if (fields_num == 6) {
diff --combined src/write_http.c
@@@ -114,6 -114,7 +114,7 @@@ static int wh_post_nolock(wh_callback_
  {
    int status = 0;
  
+   curl_easy_setopt(cb->curl, CURLOPT_URL, cb->location);
    curl_easy_setopt(cb->curl, CURLOPT_POSTFIELDS, data);
    status = curl_easy_perform(cb->curl);
  
@@@ -163,7 -164,6 +164,6 @@@ static int wh_callback_init(wh_callback
    curl_easy_setopt(cb->curl, CURLOPT_HTTPHEADER, cb->headers);
  
    curl_easy_setopt(cb->curl, CURLOPT_ERRORBUFFER, cb->curl_errbuf);
-   curl_easy_setopt(cb->curl, CURLOPT_URL, cb->location);
    curl_easy_setopt(cb->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(cb->curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -390,9 -390,6 +390,9 @@@ static int wh_write_command(const data_
    }
    assert(command_len < cb->send_buffer_free);
  
 +  /* Make scan-build happy. */
 +  assert(cb->send_buffer != NULL);
 +
    /* `command_len + 1' because `command_len' does not include the
     * trailing null byte. Neither does `send_buffer_fill'. */
    memcpy(cb->send_buffer + cb->send_buffer_fill, command, command_len + 1);