I'm working on a plugin, one of the functions of which is to accurate
track how much data is being sent to a given client, both for totals and
a per-UserAgent count.
This seems to mostly work, but I'm seeing some major discrepancies
between what the plugin is reporting and what is actually being sent out
(measured via collectd and iptables) when doing streaming (via youtube).
And these are major differences, the plugin reports 100GB for an hour
of youtube streaming, where my other counters should closer to 600MB.
The 600MB number seems about right for this sort of content.
The method I'm using to track the totals sent are to set a global hook
for TS_HTTP_SEND_RESPONSE_HDR_HOOK and then get and sum up the
TS_MIME_FIELD_CONTENT_LENGTH header. However with the youtube streaming
this will see much larger numbers for Content-Length than even what is
reported in the ATS log (via %<psql> in logs_xml.config).
Here's how I'm getting the content length in the hook attached to
TS_HTTP_SEND_RESPONSE_HDR_HOOK:
if (TSHttpTxnClientRespGet(txnp, &resp_bufp, &resp_loc) !=
TS_SUCCESS) {
LOG(LOG_ERROR,
"Error while retrieving resp header\n");
goto OUT;
}
/* Lookup the Content-Length field */
TSMLoc content_len_loc = TSMimeHdrFieldFind(resp_bufp, resp_loc,
TS_MIME_FIELD_CONTENT_LENGTH,
TS_MIME_LEN_CONTENT_LENGTH);
if (!content_len_loc) {
goto OUT;
}
int content_len_val_len;
const char *content_len_val =
TSMimeHdrFieldValueStringGet(resp_bufp, resp_loc,
content_len_loc, 0,
&content_len_val_len);
if (!content_len_val) {
LOG(LOG_ERROR, "Failed to get Content-Length value");
goto OUT;
}
This is clearly not working for streaming, is there a better way to get
the total size of the data being returned to the requesting client?
- Adam