write_http: adapt the behaviour of Timeout option
authorMarc Fournier <marc.fournier@camptocamp.com>
Wed, 25 Mar 2015 23:01:54 +0000 (00:01 +0100)
committerMarc Fournier <marc.fournier@camptocamp.com>
Wed, 25 Mar 2015 23:55:21 +0000 (00:55 +0100)
- rename PostTimeoutSec parameter to Timeout

- change Timeout to take milliseconds rather than seconds, for the sake
  of consistency: collectd allow working at the sub-second scale if need
  be, so it's a shame to restrain this here.

- do *not* set the default timeout to the value of Interval. Rationale:
  what matters here is that each POST request completes before the send
  buffer fills up again. How fast the send buffer fills up completely
  depends on how much data is collected. Interval is unrelated to this,
  and unlike read plugins, I don't think it makes a good value to use as
  the default timeout.

src/collectd.conf.pod
src/write_http.c

index a0d6f89..092f0b5 100644 (file)
@@ -7149,10 +7149,18 @@ and aborted.
 Sets bytes per second value for B<LowSpeedLimit> to make a decission if
 connection is too slow. Default value is C<100>.
 
-=item B<PostTimeoutSec> I<Seconds>
+=item B<Timeout> I<Timeout>
+
+Sets the maximum time in milliseconds given for HTTP POST operations to
+complete. When this limit is reached, the POST operation will be aborted, and
+all the data in the current send buffer will probably be lost. Defaults to 0,
+which means the connection never times out.
 
-If defined, provided positive integer value will be used to set maximum time
-in seconds that you allow for transfer(http post) operation to take.
+The C<write_http> plugin regularly submits the collected values to the HTTP
+server. How frequently this happens depends on how much data you are collecting
+and the size of B<BufferSize>. The optimal value to set B<Timeout> to is
+slightly below this interval, which you can estimate by monitoring the network
+traffic between collectd and the HTTP server.
 
 =back
 
index 0e1bc73..2c59d64 100644 (file)
@@ -63,7 +63,7 @@ struct wh_callback_s
         _Bool abort_on_slow;
         int   low_limit_bytes;
         time_t interval;
-        int post_timeout;
+        int timeout;
 
 #define WH_FORMAT_COMMAND 0
 #define WH_FORMAT_JSON    1
@@ -133,8 +133,8 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */
                 curl_easy_setopt (cb->curl, CURLOPT_LOW_SPEED_TIME, cb->interval);
         }
 
-        if (cb->post_timeout > 0)
-                curl_easy_setopt (cb->curl, CURLOPT_TIMEOUT, cb->post_timeout);
+        if (cb->timeout > 0)
+                curl_easy_setopt (cb->curl, CURLOPT_TIMEOUT_MS, cb->timeout);
 
         curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L);
         curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
@@ -539,7 +539,7 @@ static int wh_config_node (oconfig_item_t *ci) /* {{{ */
         cb->format = WH_FORMAT_COMMAND;
         cb->sslversion = CURL_SSLVERSION_DEFAULT;
         cb->low_limit_bytes = WH_DEFAULT_LOW_LIMIT_BYTES_PER_SEC;
-        cb->post_timeout = 0;
+        cb->timeout = 0;
 
         pthread_mutex_init (&cb->send_lock, /* attr = */ NULL);
 
@@ -611,8 +611,8 @@ static int wh_config_node (oconfig_item_t *ci) /* {{{ */
                         cf_util_get_boolean (child,&cb->abort_on_slow);
                 else if (strcasecmp ("LowLimitBytesPerSec", child->key) == 0)
                         cf_util_get_int (child, &cb->low_limit_bytes);
-                else if (strcasecmp ("PostTimeoutSec", child->key) == 0)
-                        cf_util_get_int (child, &cb->post_timeout);
+                else if (strcasecmp ("Timeout", child->key) == 0)
+                        cf_util_get_int (child, &cb->timeout);
                 else
                 {
                         ERROR ("write_http plugin: Invalid configuration "
@@ -631,10 +631,6 @@ static int wh_config_node (oconfig_item_t *ci) /* {{{ */
         if (cb->abort_on_slow)
                 cb->interval = CDTIME_T_TO_TIME_T(plugin_get_interval());
 
-        if (cb->post_timeout == 0)
-                //setting default timeout to plugin interval.
-                cb->post_timeout = CDTIME_T_TO_TIME_T(plugin_get_interval());
-
         /* Determine send_buffer_size. */
         cb->send_buffer_size = WRITE_HTTP_DEFAULT_BUFFER_SIZE;
         if (buffer_size >= 1024)