You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by "Andres de la Peña (Jira)" <ji...@apache.org> on 2021/09/09 15:47:00 UTC

[jira] [Comment Edited] (CASSANDRA-16938) Missed wait latencies in the output of `nodetool tpstats -F`

    [ https://issues.apache.org/jira/browse/CASSANDRA-16938?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17412647#comment-17412647 ] 

Andres de la Peña edited comment on CASSANDRA-16938 at 9/9/21, 3:46 PM:
------------------------------------------------------------------------

Please note that the change to {{jackson-mapper-asl}} will produce some formatting differences in the output. The original output didn't have any pretty-printing:
{code:json}
{"ThreadPools":{"ReadStage":{"TotalBlockedTasks":0,"ActiveTasks":0,"PendingTasks":0,"CurrentlyBlockedTasks":0,"CompletedTasks":1},"CompactionExecutor":(...)}
{code}
While the new output does use pretty-printing:
{code:json}
{
  "ThreadPools" : {
    "CompactionExecutor" : {
      "TotalBlockedTasks" : 0,
      "ActiveTasks" : 0,
      "PendingTasks" : 0,
      "CurrentlyBlockedTasks" : 0,
      "CompletedTasks" : 41
    },
    "MemtableReclaimMemory" : {
(...)
}
{code}
Also the order of the attributes is different. I have attached examples of the output after and before the changes. Of course the old output doesn't contain the wait latency metrics.

These formatting differences shouldn't be a problem for anyone parsing the output as proper json, but it might be an issue if someone is trying to parse the output as regular text. If we think that that can be a problem we can always keep using the old, ugly compact format.


was (Author: adelapena):
Please note that the change to {{jackson-mapper-asl}} will produce some formatting differences in the output. The original output didn't have any pretty-printing:
{code:json}
{"ThreadPools":{"ReadStage":{"TotalBlockedTasks":0,"ActiveTasks":0,"PendingTasks":0,"CurrentlyBlockedTasks":0,"CompletedTasks":1},"CompactionExecutor":(...)}
{code}
While the new output does use pretty-printing:
{code:json}
{
  "ThreadPools" : {
    "CompactionExecutor" : {
      "TotalBlockedTasks" : 0,
      "ActiveTasks" : 0,
      "PendingTasks" : 0,
      "CurrentlyBlockedTasks" : 0,
      "CompletedTasks" : 41
    },
    "MemtableReclaimMemory" : {
(...)
}
{code}
I have attached examples of the output after and before the changes. Of course the old output doesn't contain the wait latency metrics.

These formatting differences shouldn't be a problem for anyone parsing the output as proper json, but it might be an issue if someone is trying to parse the output as regular text. If we think that that can be a problem we can always keep using the old, ugly compact format.

> Missed wait latencies in the output of `nodetool tpstats -F`
> ------------------------------------------------------------
>
>                 Key: CASSANDRA-16938
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-16938
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Tool/nodetool
>            Reporter: Andres de la Peña
>            Assignee: Andres de la Peña
>            Priority: Normal
>             Fix For: 4.1, 4.0.x
>
>         Attachments: json-after.txt, json-before.txt
>
>
> The output of {{nodetool tpstats -F json}} always prints an empty map for {{WaitLatencies}}:
> {code}
> $ nodetool tpstats -F json
> ..."WaitLatencies":{},...
> {code}
> The same happens with yaml output:
> {code}
> $ nodetool tpstats -F yaml
> ...
> WaitLatencies: {}
> ...
> {code}
> This happens because [this cast|https://github.com/apache/cassandra/blob/cassandra-4.0.1/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsHolder.java#L61-L63] silently fails inside a try-catch with an empty catch block:
> {code}
> String[] strValues = (String[]) Arrays.stream(probe.metricPercentilesAsArray(probe.getMessagingQueueWaitMetrics(entry.getKey())))
>                                       .map(D -> D.toString())
>                                       .toArray();
> {code}
> When we would need something like:
> {code}
> String[] strValues = Arrays.stream(probe.metricPercentilesAsArray(probe.getMessagingQueueWaitMetrics(entry.getKey())))
>                            .map(Object::toString)
>                            .toArray(String[]::new);
> {code}
> This conversion from {{Double[]}} to {{String[]}} was introduced during CASSANDRA-16230. I think that conversion was done trying to work around a malformed JSON output detected in [the new tests|https://github.com/apache/cassandra/blob/cassandra-4.0.1/test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java#L158] added by that ticket. Without the conversion the output would be something like:
> {code}
> $ nodetool tpstats -F json
> ..."WaitLatencies":{"READ_RSP":[Ljava.lang.Double;@398dada8,...
> {code}
> That's because {{json-simple}} doesn't handle well arrays. I think that instead of converting the array of doubles to an array of strings we can simply use {{jackson-mapper-asl}} to print the proper array.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org