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

Matt Stump commented on CASSANDRA-9193:
---------------------------------------

It's actually pretty simple the Nashorn API makes this pretty easy. For context 
here is a little snippet that I had running in {{StorageProxy.read}}.  I'm 
evaluating a script, then executing a named function passing parameters to the 
JS function. The idea would be to pull a script from a CF for the injection 
point, eval and when we reach that point in the code invoke a known function 
name adhering to an interface. We would pass the request parameters.  The JS 
would have full visibility into the internals of C*.  Each injection point 
would have a different context (scope) so that we don't have to worry about 
namespace collision between scripts.

{code}
            String script = ""
                            + "var printReadCommands = function(readCommands, 
consistency, state) {"
                            + "    for each (var rc in readCommands) {"
                            + "        print(\"rc class definition: \" + 
Object.prototype.toString.call(rc) + \"\\n\");"
                            + "        print(\"KEYSPACE \" + rc.ksName);"
                            + "        print(\" CF \" + rc.cfName);"
                            + "        print(\" KEY \" + rc.key);"
                            + "        print(\"\\n\");"
                            + "    }"
                            + "};";

            jsEngine.eval(script);
            Invocable invocable = (Invocable) jsEngine;
            Object result = invocable.invokeFunction("printReadCommands", 
commands, consistencyLevel, state);
{code}

> Facility to write dynamic code to selectively trigger trace or log for queries
> ------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-9193
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9193
>             Project: Cassandra
>          Issue Type: New Feature
>            Reporter: Matt Stump
>
> I want the equivalent of dtrace for Cassandra. I want the ability to 
> intercept a query with a dynamic script (assume JS) and based on logic in 
> that script trigger the statement for trace or logging. 
> Examples 
> - Trace only INSERT statements to a particular CF. 
> - Trace statements for a particular partition or consistency level.
> - Log statements that fail to reach the desired consistency for read or write.
> - Log If the request size for read or write exceeds some threshold
> At some point in the future it would be helpful to also do things such as log 
> partitions greater than X bytes or Z cells when performing compaction. 
> Essentially be able to inject custom code dynamically without a reboot to the 
> different stages of C*. 
> The code should be executed synchronously as part of the monitored task, but 
> we should provide the ability to log or execute CQL asynchronously from the 
> provided API.
> Further down the line we could use this functionality to modify/rewrite 
> requests or tasks dynamically.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to