PR created (not complete yet, not ready for merge): https://github.com/rsyslog/rsyslog/pull/931
Have a quick look to get a feel for namespaced reporting of dyn-stats counters. On Fri, Mar 25, 2016 at 4:25 PM, singh.janmejay <[email protected]> wrote: > Cool. Will fix both stats representation and foreach in one PR. > On Mar 25, 2016 3:10 PM, "Rainer Gerhards" <[email protected]> wrote: > >> ACK! Please go, let's set aside my probably too strong concerns. I am >> perfectly happy when you say it's a small change and glad you do it! >> >> Rainer >> >> Sent from phone, thus brief. >> Am 25.03.2016 06:21 schrieb "David Lang" <[email protected]>: >> >> > As I understand Rainer, go . >> > >> > David Lang >> > >> > On Fri, 25 Mar 2016, singh.janmejay wrote: >> > >> > Makes sense. So final call on foreach? Go or no-go? >> >> On Mar 25, 2016 2:38 AM, "David Lang" <[email protected]> wrote: >> >> >> >> Just a note, the dynastats output line needs this as well as the bucket >> >>> line. >> >>> >> >>> This isn't remote-input, but it needs the same ability to iterate over >> >>> things. >> >>> >> >>> example: >> >>> >> >>> >> >>> >> >>> >> {"name":"global","origin":"dynstats","message_framing.ops_overflow":0,"message_framing.new_metric_add":5,"message_framing.no_metric":0,"message_framing.metrics_purged":0,"message_framing.ops_ignored":0,"message_framing.purge_triggered":0,"msgs_per_host.ops_overflow":0,"msgs_per_host.new_metric_add":0,"msgs_per_host.no_metric":0,"msgs_per_host.metrics_purged":0,"msgs_per_host.ops_ignored":0,"msgs_per_host.purge_triggered":0,"msgs_per_edge_relay.ops_overflow":0,"msgs_per_edge_relay.new_metric_add":0,"msgs_per_edge_relay.no_metric":0,"msgs_per_edge_relay.metrics_purged":0,"msgs_per_edge_relay.ops_ignored":0,"msgs_per_edge_relay.purge_triggered":0,"msgs_per_core_relay.ops_overflow":0,"msgs_per_core_relay.new_metric_add":0,"msgs_per_core_relay.no_metric":0,"msgs_per_core_relay.metrics_purged":0,"msgs_per_core_relay.ops_ignored":0,"msgs_per_core_relay.purge_triggered":0,"msgs_per_program.ops_overflow":0,"msgs_per_program.new_metric_add":0,"msgs_per_program.no_metric":0,"msgs_pe >> ! >> >>> >> >> r_ >> > >> >> p! >> >> >> >>> >> >>> >> >>> >> rogram.metrics_purged":0,"msgs_per_program.ops_ignored":0,"msgs_per_program.purge_triggered":0,"msgs_per_tag.ops_overflow":0,"msgs_per_tag.new_metric_add":0,"msgs_per_tag.no_metric":0,"msgs_per_tag.metrics_purged":0,"msgs_per_tag.ops_ignored":0,"msgs_per_tag.purge_triggered":0} >> >>> >> >>> David Lang >> >>> >> >>> On Wed, 23 Mar 2016, singh.janmejay wrote: >> >>> >> >>> Date: Wed, 23 Mar 2016 09:10:47 +0530 >> >>> >> >>>> From: singh.janmejay <[email protected]> >> >>>> Reply-To: rsyslog-users <[email protected]> >> >>>> To: rsyslog-users <[email protected]> >> >>>> Subject: Re: [rsyslog] dynastats JSON output need work >> >>>> >> >>>> Agree, if most of us like it, I can implement foreach for objects. As >> of >> >>>> now I use omprog to call a script which uses jq and awk to make it >> >>>> opentsdb >> >>>> and redis friendly. I could have used omredis if foreach worked for >> >>>> objects. >> >>>> >> >>>> Let us conclude. >> >>>> >> >>>> @Rainer any thoughts on foreach for object? >> >>>> On Mar 23, 2016 1:56 AM, "David Lang" <[email protected]> wrote: >> >>>> >> >>>> On Wed, 23 Mar 2016, singh.janmejay wrote: >> >>>> >> >>>>> >> >>>>> Makes sense. >> >>>>> >> >>>>> >> >>>>>> ..."counters":["a":80,"b":67] won't work, I think you meant >> >>>>>> ..."counters": [{"a" : 80}, {"b": 67}]. >> >>>>>> >> >>>>>> >> >>>>>> ahh, showing my lack of knowledge of JSON :-) talking things >> through: >> >>>>> >> >>>>> so our choices are: >> >>>>> >> >>>>> "counters": [{"a":80},{"b":67}] >> >>>>> vs >> >>>>> "counters": {"a":80,"b":67} >> >>>>> >> >>>>> running these through jq gives >> >>>>> >> >>>>> { >> >>>>> "counters": [ >> >>>>> { >> >>>>> "a": 80 >> >>>>> }, >> >>>>> { >> >>>>> "b": 67 >> >>>>> } >> >>>>> ] >> >>>>> } >> >>>>> >> >>>>> vs >> >>>>> >> >>>>> { >> >>>>> "counters": { >> >>>>> "a": 80, >> >>>>> "b": 67 >> >>>>> } >> >>>>> } >> >>>>> >> >>>>> or to reference a >> >>>>> .counters[0].a >> >>>>> vs >> >>>>> .counters.a >> >>>>> >> >>>>> The latter seems to clearly be the cleaner and more logical one to >> me. >> >>>>> >> >>>>> Does this seem sane? >> >>>>> >> >>>>> But to use it, we need a variation of foreach that gives the object >> >>>>> name >> >>>>> as well as the object contents. >> >>>>> >> >>>>> David Lang >> >>>>> >> >>>>> So it boils down to foreach handling object or not. >> >>>>> >> >>>>> >> >>>>>> Thoughts? >> >>>>>> >> >>>>>> On Wed, Mar 23, 2016 at 1:18 AM, David Lang <[email protected]> wrote: >> >>>>>> >> >>>>>> On Wed, 23 Mar 2016, singh.janmejay wrote: >> >>>>>> >> >>>>>>> >> >>>>>>> What about wrapDynamicObjects="on|off"? That is required >> regardless, >> >>>>>>> >> >>>>>>> right? (if we want to preserve backward compatibility). Unless we >> >>>>>>>> choose to change it anyway (which im fine with). >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>> I think the fact that data from the log could overwrite name or >> >>>>>>> origin >> >>>>>>> is a >> >>>>>>> fatal flaw and the existing format should not be allowed. So I >> think >> >>>>>>> we >> >>>>>>> should break backwards compatibility here (if it was more >> >>>>>>> established, >> >>>>>>> I'd >> >>>>>>> be much more reluctant to do so, but at this point, I think it's >> only >> >>>>>>> early >> >>>>>>> adopters who are using it) >> >>>>>>> >> >>>>>>> So if we are always going to push things down one level, the only >> >>>>>>> question >> >>>>>>> is the format >> >>>>>>> >> >>>>>>> {"name":"h","origin":"dynstats.bucket"},"counters":{"a":80,"b":67}} >> >>>>>>> >> >>>>>>> vs >> >>>>>>> >> >>>>>>> {"name":"h","origin":"dynstats.bucket"},"counters":["a":80,"b":67]} >> >>>>>>> >> >>>>>>> or the horrible >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>>> >> {"name":"h","origin":"dynstats.bucket"},"counters":[{"name":"a","value":80},{"name":"b","value":67}]} >> >>>>>>> >> >>>>>>> I really want to avoid this third one. I'd say it's probably better >> >>>>>>> to >> >>>>>>> have >> >>>>>>> to use an external script to process things than make the third >> one a >> >>>>>>> standard :-) >> >>>>>>> >> >>>>>>> David Lang >> >>>>>>> >> >>>>>>> >> >>>>>>> @Rainer: what do you think about foreach handling object? >> >>>>>>> >> >>>>>>> >> >>>>>>>> On Wed, Mar 23, 2016 at 1:01 AM, David Lang <[email protected]> >> wrote: >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> On Wed, 23 Mar 2016, singh.janmejay wrote: >> >>>>>>>>> >> >>>>>>>>> Foreach can only work with arrays as of now. It can't work with >> >>>>>>>>> >> >>>>>>>>> objects (key-value pairs). So [{name: ... value: ...}, {..},...] >> is >> >>>>>>>>>> the only format that will work as of now. >> >>>>>>>>>> >> >>>>>>>>>> We can enhance foreach to work with objects. >> >>>>>>>>>> >> >>>>>>>>>> I can make a flag available at dyn-stats bucket level, which can >> >>>>>>>>>> control serialization format, but that would really be a hack. >> >>>>>>>>>> >> >>>>>>>>>> From single-responsibility pattern pov, impstats should be the >> >>>>>>>>>> only >> >>>>>>>>>> component that decides how to layout data for user to see. >> >>>>>>>>>> >> >>>>>>>>>> How about this: >> >>>>>>>>>> >> >>>>>>>>>> impstats(format="json" wrapDynamicObjects="on"...)? >> >>>>>>>>>> >> >>>>>>>>>> It defaults to off, which keeps backward compatibility. >> >>>>>>>>>> >> >>>>>>>>>> So what do you guys think about: >> >>>>>>>>>> - wrapDynamicObjects="on|off" >> >>>>>>>>>> - generating [{name: a, value: 10}, {...} ...] vs. {a: 10, ...} >> >>>>>>>>>> (foreach will handle the former out of the box, but later is >> >>>>>>>>>> concise, >> >>>>>>>>>> readable and light-weight in addition to being more json-y. >> >>>>>>>>>> - enhancing foreach to work with {a: 10, b: 20...} >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> If we can enhance foreach to work with the concise format, I >> would >> >>>>>>>>> rather >> >>>>>>>>> wait for it instead of introducing the wrapping version. >> >>>>>>>>> >> >>>>>>>>> I'm thinking that foreach walks through arrays, rather than >> mixing >> >>>>>>>>> concepts, >> >>>>>>>>> a foreachobject that gives us a name and contents for a {} list >> of >> >>>>>>>>> objects >> >>>>>>>>> may be the right thing to do? >> >>>>>>>>> >> >>>>>>>>> foreach just returns a single object while foreachobject needs to >> >>>>>>>>> return >> >>>>>>>>> the >> >>>>>>>>> object and name. >> >>>>>>>>> >> >>>>>>>>> although, if we ever get the ability to address arrays directly, >> >>>>>>>>> being >> >>>>>>>>> able >> >>>>>>>>> to look at the array position would be the equivalent of the >> name. >> >>>>>>>>> >> >>>>>>>>> David Lang >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> On Wed, Mar 23, 2016 at 12:26 AM, David Lang <[email protected]> >> >>>>>>>>> wrote: >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>>> On Tue, 22 Mar 2016, singh.janmejay wrote: >> >>>>>>>>>>> >> >>>>>>>>>>> How about this: we support a new flag in impstats which allows >> >>>>>>>>>>> >> >>>>>>>>>>> json-formatted stats-line to optionally use >> >>>>>>>>>>>> encapsulated/wrapped-layout? >> >>>>>>>>>>>> >> >>>>>>>>>>>> impstats(format="json" ...) generates >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> {"name":"msg_per_host","origin":"dynstats.bucket","z-scribe1r-b":80,"SWEB10":67} >> >>>>>>>>>>>> >> >>>>>>>>>>>> however, >> >>>>>>>>>>>> >> >>>>>>>>>>>> impstats(format="json/w" ...) generates {"header": >> >>>>>>>>>>>> {"name":"msg_per_host","origin":"dynstats.bucket"}, >> "counters" : >> >>>>>>>>>>>> {"z-scribe1r-b":80,"SWEB10":67}} >> >>>>>>>>>>>> >> >>>>>>>>>>>> This is relevant, the serilization format we use right now >> mixes >> >>>>>>>>>>>> pre-defined keys with counter-names and it can affect regular >> >>>>>>>>>>>> static >> >>>>>>>>>>>> counters too. >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> with the existing pstats output, there is no ability for >> >>>>>>>>>>> user-defined >> >>>>>>>>>>> data >> >>>>>>>>>>> to become a tag name, so there is no potential for ambiguity. >> but >> >>>>>>>>>>> with >> >>>>>>>>>>> dynastats, this is not a possibility, and the format we use >> >>>>>>>>>>> should >> >>>>>>>>>>> prevent >> >>>>>>>>>>> problems. >> >>>>>>>>>>> >> >>>>>>>>>>> Also, just from a conceptual point of view, why should the >> bucket >> >>>>>>>>>>> contents >> >>>>>>>>>>> be at the same level as the bucket name? >> >>>>>>>>>>> >> >>>>>>>>>>> other than backwards compatibility, what advantage is there of >> >>>>>>>>>>> the >> >>>>>>>>>>> current >> >>>>>>>>>>> version in JSON? the documentation uses the plain text >> >>>>>>>>>>> equivalant, >> >>>>>>>>>>> which >> >>>>>>>>>>> is >> >>>>>>>>>>> perfectly legitimate because there is an order to the line, and >> >>>>>>>>>>> after >> >>>>>>>>>>> you >> >>>>>>>>>>> get past the name and origin, everything else on the line is >> >>>>>>>>>>> name-value >> >>>>>>>>>>> pairs of counters, again, no ambiguity. >> >>>>>>>>>>> >> >>>>>>>>>>> But with JSON, I don't believe that you can depend on tools >> >>>>>>>>>>> maintaining >> >>>>>>>>>>> (or >> >>>>>>>>>>> even identifying) the order of the elements, and if you have >> >>>>>>>>>>> multiple >> >>>>>>>>>>> elements with the same name, it's implementation dependent as >> to >> >>>>>>>>>>> which >> >>>>>>>>>>> one >> >>>>>>>>>>> will be seen. >> >>>>>>>>>>> >> >>>>>>>>>>> So purely from a correctness and defensive programming point of >> >>>>>>>>>>> view, I >> >>>>>>>>>>> think the current JSON serialization should be changed, with >> the >> >>>>>>>>>>> old >> >>>>>>>>>>> format >> >>>>>>>>>>> no longer being an option. >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> As to the details of the new format >> >>>>>>>>>>> >> >>>>>>>>>>> What I'm wanting to do with the counters is something like >> >>>>>>>>>>> >> >>>>>>>>>>> if $!origin == "dynstats.bucket" then { >> >>>>>>>>>>> foreach $.tag $!counters { >> >>>>>>>>>>> /var/log/stats;format >> >>>>>>>>>>> } >> >>>>>>>>>>> } >> >>>>>>>>>>> >> >>>>>>>>>>> to output one line per counter. >> >>>>>>>>>>> >> >>>>>>>>>>> I'm very flexible in how to do this, but I would much rather be >> >>>>>>>>>>> able >> >>>>>>>>>>> to >> >>>>>>>>>>> do >> >>>>>>>>>>> this inside rsyslog than have to serialize things to an >> external >> >>>>>>>>>>> script, >> >>>>>>>>>>> have it parse the json and process it. >> >>>>>>>>>>> >> >>>>>>>>>>> my initial thinking was just do >> >>>>>>>>>>> >> >>>>>>>>>>> counters: [ "z-scribe1r-b":80,"SWEB10":67 ] >> >>>>>>>>>>> >> >>>>>>>>>>> but as I'm typing this, I realize that doesn't work as I don't >> >>>>>>>>>>> have a >> >>>>>>>>>>> way >> >>>>>>>>>>> to >> >>>>>>>>>>> break $.tag down to reference the name and the value. >> >>>>>>>>>>> >> >>>>>>>>>>> I'd hate to have to do something like >> >>>>>>>>>>> >> >>>>>>>>>>> counters: [{"name":"z-scribe1r-b","value":80 >> >>>>>>>>>>> },{"name":"SWEB10","value":67}] >> >>>>>>>>>>> >> >>>>>>>>>>> this mirrors the misuse of XML that gives it such a horrible >> >>>>>>>>>>> reputation. >> >>>>>>>>>>> But >> >>>>>>>>>>> unless we introduce some new function to rsyslog to break >> things >> >>>>>>>>>>> down, >> >>>>>>>>>>> I >> >>>>>>>>>>> don't see a better way. If we do need to do something like >> this, >> >>>>>>>>>>> I >> >>>>>>>>>>> sure >> >>>>>>>>>>> would not want to make it the default JSON, which would result >> in >> >>>>>>>>>>> two >> >>>>>>>>>>> different formats. I hate the idea of starting to have >> different >> >>>>>>>>>>> formats >> >>>>>>>>>>> because of subtypes of data (what is someone wants the cee >> >>>>>>>>>>> version >> >>>>>>>>>>> of >> >>>>>>>>>>> this >> >>>>>>>>>>> for example, you start to have orthoginal format decisions) >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> David Lang >> >>>>>>>>>>> _______________________________________________ >> >>>>>>>>>>> rsyslog mailing list >> >>>>>>>>>>> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >>>>>>>>>>> http://www.rsyslog.com/professional-services/ >> >>>>>>>>>>> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >>>>>>>>>>> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED >> by a >> >>>>>>>>>>> myriad >> >>>>>>>>>>> of >> >>>>>>>>>>> sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if >> >>>>>>>>>>> you >> >>>>>>>>>>> DON'T >> >>>>>>>>>>> LIKE THAT. >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> >> >>>>>>>>>> _______________________________________________ >> >>>>>>>>>> >> >>>>>>>>>> rsyslog mailing list >> >>>>>>>>> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >>>>>>>>> http://www.rsyslog.com/professional-services/ >> >>>>>>>>> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >>>>>>>>> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a >> >>>>>>>>> myriad >> >>>>>>>>> of >> >>>>>>>>> sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if >> you >> >>>>>>>>> DON'T >> >>>>>>>>> LIKE THAT. >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> >> >>>>>>>> _______________________________________________ >> >>>>>>>> >> >>>>>>>> rsyslog mailing list >> >>>>>>> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >>>>>>> http://www.rsyslog.com/professional-services/ >> >>>>>>> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >>>>>>> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a >> >>>>>>> myriad >> >>>>>>> of >> >>>>>>> sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you >> >>>>>>> DON'T >> >>>>>>> LIKE THAT. >> >>>>>>> >> >>>>>>> >> >>>>>>> >> >>>>>> >> >>>>>> >> >>>>>> _______________________________________________ >> >>>>>> >> >>>>>> rsyslog mailing list >> >>>>> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >>>>> http://www.rsyslog.com/professional-services/ >> >>>>> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >>>>> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a >> >>>>> myriad >> >>>>> of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if >> you >> >>>>> DON'T LIKE THAT. >> >>>>> >> >>>>> _______________________________________________ >> >>>>> >> >>>> rsyslog mailing list >> >>>> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >>>> http://www.rsyslog.com/professional-services/ >> >>>> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >>>> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a >> myriad >> >>>> of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you >> >>>> DON'T LIKE THAT. >> >>>> >> >>>> >> >>> _______________________________________________ >> >>> rsyslog mailing list >> >>> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >>> http://www.rsyslog.com/professional-services/ >> >>> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >>> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a >> myriad >> >>> of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you >> >>> DON'T LIKE THAT. >> >>> >> >>> _______________________________________________ >> >> rsyslog mailing list >> >> http://lists.adiscon.net/mailman/listinfo/rsyslog >> >> http://www.rsyslog.com/professional-services/ >> >> What's up with rsyslog? Follow https://twitter.com/rgerhards >> >> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad >> >> of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you >> >> DON'T LIKE THAT. >> >> >> >> _______________________________________________ >> > rsyslog mailing list >> > http://lists.adiscon.net/mailman/listinfo/rsyslog >> > http://www.rsyslog.com/professional-services/ >> > What's up with rsyslog? Follow https://twitter.com/rgerhards >> > NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad >> > of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you >> > DON'T LIKE THAT. >> > >> _______________________________________________ >> rsyslog mailing list >> http://lists.adiscon.net/mailman/listinfo/rsyslog >> http://www.rsyslog.com/professional-services/ >> What's up with rsyslog? Follow https://twitter.com/rgerhards >> NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad >> of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you >> DON'T LIKE THAT. >> > _______________________________________________ > rsyslog mailing list > http://lists.adiscon.net/mailman/listinfo/rsyslog > http://www.rsyslog.com/professional-services/ > What's up with rsyslog? Follow https://twitter.com/rgerhards > NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of > sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T > LIKE THAT. -- Regards, Janmejay http://codehunk.wordpress.com _______________________________________________ rsyslog mailing list http://lists.adiscon.net/mailman/listinfo/rsyslog http://www.rsyslog.com/professional-services/ What's up with rsyslog? Follow https://twitter.com/rgerhards NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE THAT.

