[
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)