GitHub user ottobackwards opened a pull request:

    https://github.com/apache/metron/pull/873

    METRON-1367 Stellar should have some instrumentation of function calls

    This PR introduces the ability through a new `magic` command for a stellar 
shell user to view the timing information for the last statement the shell 
executed.  The information provided is the total execution time, and the 
execution time per stellar function.
    
    At this point, only the stellar function execution has been timed, but it 
is possible in the future to add timing to other parts of stellar, for example 
to time how long lambdas take, or matches.
    
    For example:
    
    ```bash
    Stellar, Go!
    Please note that functions are loading lazily in the background and will be 
unavailable until loaded fully.
    [Stellar]>>> Functions loaded, you may refer to functions now...
    
    [Stellar]>>> hex:="91IMOR3F41BMUSJCCG======"
    [Stellar]>>> if( STARTS_WITH(TO_UPPER(DECODE(hex,'BASE32HEX')), "HELLO")) 
THEN TO_LOWER("OK") ELSE TO_LOWER("FFFF")
    ok
    [Stellar]>>> %timing
    ->execute : 113ms : 113017132
    -->if( STARTS_WITH(TO_UPPER(DECODE(hex,'BASE32HEX')), "HELLO")) THEN 
TO_LOWER("OK") ELSE TO_LOWER("FFFF") : 112ms : 112998881ns
    --->DECODE : 8ms : 8572968ns
    --->TO_UPPER : 0ms : 20018ns
    --->STARTS_WITH : 0ms : 30586ns
    --->TO_LOWER : 0ms : 19085ns
    ```
    
    ## StackWatch
    A set of utility classes under the new package stellar.common.timing have 
been added.  These provide the `StackWatch` functionality.
    
    StackWatch provides an abstraction over the Apache Commons StopWatch class 
that allows callers to 
    create multiple named and possibly nested timing operations.
    
    Since Stellar operations are executed in a queue and in isolation ( even a 
Stellar statement that is nested  such as  TO_UPPER(TO_STRING()) is executed as 
 TO_STRING(), TO_UPPER, the benefit of the support for nested timing operations 
is not utilized.  
    
    This class may be more generally useful to this and other projects, but I 
am not sure where it would live since we wouldn't want it in common.
    
    StackWatch uses a combination of `Deque` and a custom Tree implementation 
to create, start and end timing operations.
    
    A `Visitor` pattern is also implemented to allow for retrieving the results 
after the completion of the operation.
    
    See the StackWatch tests for examples of nested function timings.
    
    The StackWatch is optionally available from the Stellar `Context` object.
    
    ## Testing
    
    To test:
    
    - Run the Stellar Shell, either from full_dev or using mvn exec ( here run 
from metron-stellar/stellar-common after a mvn package )
    ```
    > % mvn exec:java  
-Dexec.mainClass="org.apache.metron.stellar.common.shell.StellarShell"
    ```
    
    - run some stellar statements
    - run the %timing function
    - in full dev verify that data is processed normally through storm, and 
that it shows in kibana
    
    
    
    - [x] Is there a JIRA ticket associated with this PR? If not one needs to 
be created at [Metron 
Jira](https://issues.apache.org/jira/browse/METRON/?selectedTab=com.atlassian.jira.jira-projects-plugin:summary-panel).
 
    - [x] Does your PR title start with METRON-XXXX where XXXX is the JIRA 
number you are trying to resolve? Pay particular attention to the hyphen "-" 
character.
    - [x] Has your PR been rebased against the latest commit within the target 
branch (typically master)?
    
    
    ### For code changes:
    - [ ] Have you included steps to reproduce the behavior or problem that is 
being changed or addressed?
    - [x] Have you included steps or a guide to how the change may be verified 
and tested manually?
    - [x] Have you ensured that the full suite of tests and checks have been 
executed in the root metron folder via:
      ```
      mvn -q clean integration-test install && build_utils/verify_licenses.sh 
      ```
    
    - [x] Have you written or updated unit tests and or integration tests to 
verify your changes?
    - [ ] If adding new dependencies to the code, are these dependencies 
licensed in a way that is compatible for inclusion under [ASF 
2.0](http://www.apache.org/legal/resolved.html#category-a)? 
    - [ ] Have you verified the basic functionality of the build by building 
and running locally with Vagrant full-dev environment or the equivalent?
    
    ### For documentation related changes:
    - [x] Have you ensured that format looks appropriate for the output in 
which it is rendered by building and verifying the site-book? If not then run 
the following commands and the verify changes via 
`site-book/target/site/index.html`:
    
      ```
      cd site-book
      mvn site
      ```


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/ottobackwards/metron stellar_timing

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/metron/pull/873.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #873
    
----
commit 6d434941aeb492c8e836b59b56149f0efcceec2a
Author: Otto Fowler <ottobackwa...@gmail.com>
Date:   2017-12-17T05:42:19Z

    initial StackWatch implementation

commit 2b21590cbc31001b20e135d68c34f304d3a8ac59
Author: Otto Fowler <ottobackwa...@gmail.com>
Date:   2017-12-17T07:00:30Z

    integration with stackwatch, shell can time last stellar statement run

commit 0dcb5e394983d27aae1b2b7afa3c417f39649144
Author: Otto Fowler <ottobackwa...@gmail.com>
Date:   2017-12-17T14:53:56Z

    add link to lang javadoc

commit c8303ffadbf642f087a82c71ce7ada37ce00808a
Author: Otto Fowler <ottobackwa...@gmail.com>
Date:   2017-12-17T15:04:10Z

    readme

----


---

Reply via email to