sflow module and increasing useragent

Neil Mckee neil.mckee.ca at gmail.com
Thu Aug 11 23:13:50 UTC 2011


On Aug 11, 2011, at 2:46 PM, Mark Moseley wrote:

> On Wed, Aug 10, 2011 at 12:42 PM, Neil Mckee <neil.mckee.ca at gmail.com> wrote:
>> 
>> On Aug 10, 2011, at 9:55 AM, Mark Moseley wrote:
>> 
>>> On Tue, Aug 9, 2011 at 10:37 PM, Neil Mckee <neil.mckee.ca at gmail.com> wrote:
>>>> It looks like it may be (erroneously!) ignoring that limit and sending the whole user-agent string.  Thanks for pointing it out.
>>>> 
>>>> If you are using sflowtool to print the output at the collector then it's probably chopping the field there,  so you would just need to tweak sflowtool/src/sflow.h file and recompile sflowtool.
>>>> 
>>>> The user-agent can be kilobytes long in some cases.   How many bytes is enough?   Please submit comments to the HTTP thread on http://groups.google.com/group/sflow.
>>>> 
>>>> Neil
>>>> 
>>>> 
>>>> On Aug 9, 2011, at 6:21 PM, Mark Moseley wrote:
>>>> 
>>>>> If I wanted to increase the amount of bytes logged by the sflow module
>>>>> for the user agent to, say, 128 bytes, what would I need to change?
>>>>> 
>>>>> I tried changing this:
>>>>> 
>>>>> (in ngx_http_sflow.h)
>>>>> #define SFLHTTP_MAX_USERAGENT_LEN 128
>>>>> 
>>>>> but I still get the user agent truncated at 64 bytes. Nor does it seem
>>>>> like SFLHTTP_MAX_USERAGENT_LEN is used anywhere in the code (or any
>>>>> SFLHTTP_MAX_* define).
>>>>> 
>>>>> I'm sure I could whack on it long enough to get it to work, but I ask
>>>>> mainly because I don't want to cause some buffer/format/etc overflow
>>>>> somewhere else down the line. Thanks!
>>> 
>>> Thanks for the info. That did the trick. I wrongly assumed the limit
>>> was being applied in the module itself.
>>> 
>>> BTW, is there anywhere that has info on APIs for host sflow? I've been
>>> googling to no avail. The perl Net::sFlow module chokes badly
>>> (presumably just expecting standard sflow), and I've not been able to
>>> track down a python module (which is what I'm really interested in).
>>> Just asking since we have this thread going, but I can repost to the
>>> google group if you think it'd be better asked there. Thanks!
>> 
>> Do you mean you are looking for a Python equivalent of what sflowtool.c does?
>> 
>> The data is all XDR-encoded,  so you might start with Python's  "xdrlib".   However it may be easier and more compact to just unpack the data manually.  The C implementation for Ganglia-gmond is an example of that.  It is much more compact than sflowtool.c,  and might be a better place to start if you just want the sFlow-HOST structures:
>> http://ganglia.svn.sourceforge.net/viewvc/ganglia/trunk/monitor-core/gmond/sflow.c?revision=2638&view=markup
>> (see the "process_sflow_datagram()" function near the bottom.)
>> 
>> sFlow XDR specs that have been finalized are published here:
>> http://www.sflow.org/developers/specifications.php
>> 
>> Neil
>> 
>> P.S. The Perl library should be able to skip over structures it doesn't recognize,  so you might want to point that out to it's author(s).
> 
> Cool, thanks, I'll take a look at that -- though working with XDR
> looks like it could be somewhat painful :)
> 
> On a related note, I get a trickle of errors like this in the nginx error log:
> 
> sFlow agent error: sfl_agent_error: receiver: flow sample too big for datagram
> 
> which must be hitting the in-code limit of 1400 bytes. Would it be
> quite horrible if I were to bump up SFL_DEFAULT_DATAGRAM_SIZE over
> 1460? I'm assuming under normal conditions, it'll just fragment, which
> I'm ok with at the rate they're occurring now. But again, I'm worried
> about some data structure in the code (that my casual reading of the
> code isn't turning up) will overflow.

IT looks like you'd have to bump up both SFL_MAX_DATAGRAM_SIZE and SFL_DEFAULT_DATAGRAM_SIZE.  For example:

#define SFL_MAX_DATAGRAM_SIZE 3000
#define SFL_MIN_DATAGRAM_SIZE 200
#define SFL_DEFAULT_DATAGRAM_SIZE 3000

If you are not using jumbo frames and packet-loss-in-transit ever hits 50% then you might have a problem getting data through to the collector (just when you really needed it) so in the end the right solution is to apply the length-limits as proposed on the sFlow mailing list.  This can be done in sfwb_sample_http() at the point where the string lengths are filled in for the sample.  I intend to put that fix in very soon,  and add the  missing "X-Forwarded-For" and "req_bytes" fields too.   If you think there are any other fields or counters missing then now is a good time to chime in.

Neil

> 
> Cool module, btw!

:)

> 
> Thanks!
> 
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx



More information about the nginx mailing list