OT, but would gladly +1(nb) a `nodetool --output-format=json` CEP. :)

[ Some discussion also in: 
https://issues.apache.org/jira/browse/CASSANDRA-12698 ]

> On Jul 8, 2023, at 11:26 AM, Josh McKenzie <jmcken...@apache.org> wrote:
> 
>> I think they should not parse that output in the first place. Gradually 
>> introducing JSON / YAML output formats for nodetool is cool but I think it 
>> started to happen too late and people were already parsing the raw nodetool 
>> output and here we are.
> Yes And: as you say: "here we are".
> 
> I personally try and overcorrect on the side of "how do we make things easier 
> for our users" whenever I'm presented with the opportunity because we've 
> historically been so weak on the UX front as a project. Maintaining 
> compatibility with previous "API's" (as we've discussed on the ML in the 
> past; things that are publicly presented and consumable by automation) goes a 
> long way towards giving folks confidence in building an ecosystem around a 
> project. Not the most fun thing in the world to maintain, but IMO worth it in 
> the long run for the confidence it gives folks. Especially in the "long-lived 
> infra" space we're in.
> 
> On Sat, Jul 8, 2023, at 12:57 PM, Miklosovic, Stefan wrote:
>> If somebody understood my message as I am promoting the removal of all these 
>> commands for which we have other means of getting the output of, that is not 
>> the case at all. I do not want to remove any of them.. I am just elaborating 
>> on "parsing the output of nodetool and problems related to that if it is 
>> changed" in this particular case.
>> 
>> ________________________________________
>> From: Miklosovic, Stefan <stefan.mikloso...@netapp.com 
>> <mailto:stefan.mikloso...@netapp.com>>
>> Sent: Saturday, July 8, 2023 17:43
>> To: dev
>> Subject: Re: Changing the output of tooling between majors
>> 
>> Thank you, Josh, for your insight.
>> 
>> I think they should not parse that output in the first place. Gradually 
>> introducing JSON / YAML output formats for nodetool is cool but I think it 
>> started to happen too late and people were already parsing the raw nodetool 
>> output and here we are.
>> 
>> I played with nodetool a little bit to see where we are with this, there is 
>> 135 commands in total. We can leave out all "set*" commands, we can not 
>> ignore "get*" because that is potential output to parse. People just don't 
>> parse the output of "set*" commands. That is 116 commands. We can also 
>> ignore all "disable*" and "enable" commands and we are on 98. Then there is 
>> the group of "invalidate*" commands, we can skip them too, we are on 90, 
>> minus help command, 89.
>> 
>> Now the commands which left can be categorized into two main groups: the 
>> commands which execute some action and commands which display some 
>> statistics or state about internals of a Cassandra node.
>> 
>> The first group, "action commands", are again not going to be parsed on the 
>> output. These are here (1) (I could make some mistakes here and there).
>> 
>> So, the commands we can potentially parse the output of are here (2), there 
>> is roughly 51 of them.
>> 
>> Some of these commands have their equivalent in system_views vtables, these 
>> are, if I havent forgotten something
>> 
>> clientstats (system_views.clients)
>> compactionhistory (system.compaction_history)
>> compactionstats (system_views.sstable_tasks)
>> gossipinfo (system_views.gossip_info)
>> listsnapshots (system_view.snapshots)
>> tpstats (system_view.thread_pools)
>> 
>> Some of them have already different format of the output supported (JSON or 
>> YAML), they are:
>> 
>> datapaths
>> tablestats
>> tpstats (has also cql table)
>> compactionhistory (has also cql table)
>> 
>> I would argue that some commands with prefix "status" and "get" can go away 
>> too because their value is visible in system_views.settings. Some of these 
>> settings will be even updateable after Maxim's work.
>> 
>> statusbackup incremental_backups
>> statushandoff hinted_handoff_enabled
>> getmaxhintwindow max_hint_window
>> getconcurrentcompactors concurrent_compactors
>> getconcurrentviewbuilders concurrent_materialized_view_builders
>> getdefaultrf default_keyspace_rf
>> gettimeout (this just reflects cassandra.yaml more or less)
>> 
>> Then there is the family of all "get throttle / threshold " etc like this, I 
>> am lazy to go through them but they are somehow retrievable from CQL 
>> system_views.settings too.
>> 
>> getbatchlogreplaythrottle
>> getcolumnindexsize
>> getcompactionthreshold
>> getcompactionthroughput
>> getinterdcstreamthroughput
>> getsnapshotthrottle
>> getstreamthroughput
>> 
>> There are commands which just return an integer or there is nothing to 
>> change about their output / it is just not necessary like:
>> 
>> gettraceprobability
>> getsstables
>> 
>> So commands which do not have their output equivalent in some cql table or 
>> for which there is not JSON / YAML format available are
>> 
>> describecluster
>> describering
>> failuredetector
>> gcstats
>> getauditlog
>> getauthcacheconfig
>> getconcurrency
>> getendpoints
>> getfullquerylog
>> getlogginglevels
>> getseeds
>> info
>> listpendinghints
>> netstats
>> profileload (replacement of toppartition (which should be removed in 5.0, 
>> actually))
>> proxyhistograms
>> rangekeysample
>> repair
>> repair_admin
>> ring
>> status
>> statusautocompaction
>> statusbinary
>> statusgossip
>> tablehistograms
>> toppartitions
>> viewbuildstatus
>> 
>> From these, if one asks which ones actually make sense to try to tweak the 
>> output of, they might be
>> 
>> describecluster
>> describering
>> info
>> listpendinghints
>> netstats
>> proxyhistograms
>> repair_admin (if somebody wants to list stuff in json)
>> ring
>> status
>> tablehistograms
>> viewbuildstatus
>> 
>> The point I want to make is that I do not think the problem of changing the 
>> output is too hot. There is basically like 15 at most commands for which the 
>> output matter because there is not their CQL equivalent or JSON / YAML 
>> output.
>> 
>> If we are providing CQL / JSON / YAML for couple years, I do not believe 
>> that the argument "lets not break it for folks in nodetool" is still 
>> relevant. CQL output is there from times of 4.0 at least (at least!) and 
>> YAML / JSON is also not something completely new. It is not like we are 
>> suddenly forcing people to change their habits, there was enough time to 
>> update the stuff to CQL / json / yaml etc ...
>> 
>> But really, the question I still don't have an answer for is who is actually 
>> parsing the output, I think I ping user ML list to probe the situation a 
>> little bit.
>> 
>> (1) https://gist.github.com/smiklosovic/3f4ea8ccae53ad503af13c53789815be
>> (2) https://gist.github.com/smiklosovic/f9a681016c22e2dfe88c883b6881cb7c
>> 
>> ________________________________________
>> From: Josh McKenzie <jmcken...@apache.org <mailto:jmcken...@apache.org>>
>> Sent: Saturday, July 8, 2023 14:47
>> To: dev
>> Subject: Re: Changing the output of tooling between majors
>> 
>> NetApp Security WARNING: This is an external email. Do not click links or 
>> open attachments unless you recognize the sender and know the content is 
>> safe.
>> 
>> 
>> 
>> Once there is, we are free to change the default output however we want.
>> One thing I always try to keep in mind on discussions like this. A thought 
>> experiment (with very hand-wavy numbers; try not to get hung up on them):
>> 
>> * Let's say there are 5,000 discrete "users" of C* out there (different 
>> groups of people using the DB)
>> * And assume 5% have written some kind of scripting / automation to parse 
>> our tooling output (250)
>> * And let's assume it'd take 18 developer hours (a few days at 6 hours/day) 
>> to retool to the new output, validate and test correctness, and then roll it 
>> out to qa, test, validate, and then to prod, test, validate
>> 
>> You're looking at 250 * 18 hours, 4,500 hours, 112.5 40 hour work weeks (2+ 
>> years for some poor sod without vacations) worth of work from what seems to 
>> be a simple change.
>> 
>> Now, that estimate could be off by an order of magnitude either way, but the 
>> motion of the exercise is valuable, I think. There's a real magnified 
>> downstream cost to our community when we make changes to APIs and we need to 
>> weigh that against the cost to the project in terms of maintaining those 
>> interfaces.
>> 
>> The above mental exercise really strongly applies to the periodic 
>> discussions where we talk about deprecating JMX support.
>> 
>> Not saying we should or shouldn't change things here for the record, just 
>> want to call this out for anyone that might not have been thinking about 
>> things this way.
>> 
>> On Fri, Jul 7, 2023, at 3:23 PM, Brandon Williams wrote:
>> On Fri, Jul 7, 2023 at 2:20 PM Miklosovic, Stefan
>> <stefan.mikloso...@netapp.com 
>> <mailto:stefan.mikloso...@netapp.com><mailto:stefan.mikloso...@netapp.com 
>> <mailto:stefan.mikloso...@netapp.com>>> wrote:
>> >
>> > Great thanks. That might work.
>> >
>> > So we do not change the default output unless there is json / yaml 
>> > equivalent.
>> >
>> > Once there is, we are free to change the default output however we want.
>> 
>> Yes, exactly.  Then we have the best of both worlds: programmatic
>> access that isn't flimsy, and a pretty display however we want it.

Reply via email to