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.

