[GitHub] metron pull request #871: METRON-1365: Allow PROFILE_GET to return a default...
Github user nickwallen commented on a diff in the pull request: https://github.com/apache/metron/pull/871#discussion_r157390830 --- Diff: metron-analytics/metron-profiler-client/src/test/java/org/apache/metron/profiler/client/stellar/GetProfileTest.java --- @@ -310,6 +306,36 @@ public void testOutsideTimeHorizon() { Assert.assertEquals(0, result.size()); } + /** + * Default value should be able to be specified + */ + @Test + public void testWithDefaultValue() { +String expr = "PROFILE_GET('profile1', 'entity1', PROFILE_FIXED(4, 'HOURS'))"; +@SuppressWarnings("unchecked") +List result = run(expr, List.class); + +// validate - expect to fail to read any values because we didn't write any. +Assert.assertEquals(0, result.size()); + +// execute - read the profile values - with config_override. +// first two override values are strings, third is deliberately a number. +testOverride("{'profiler.default.value' : 0}", 0); +testOverride("{'profiler.default.value' : 'metron'}", "metron"); +testOverride("{'profiler.default.value' : []}", new ArrayList<>()); + } + + private void testOverride(String overrides, Object defaultVal) { + String expr = "PROFILE_GET('profile1', 'entity1', PROFILE_FIXED(4, 'HOURS'), [], " + overrides + ")" + ; --- End diff -- Small nit... semi on a new line? ---
[GitHub] metron pull request #871: METRON-1365: Allow PROFILE_GET to return a default...
Github user nickwallen commented on a diff in the pull request: https://github.com/apache/metron/pull/871#discussion_r157390718 --- Diff: metron-analytics/metron-profiler-client/src/main/java/org/apache/metron/profiler/client/stellar/ProfilerClientConfig.java --- @@ -56,8 +56,11 @@ /** * A global property that defines the salt divisor used to store profile data. */ - PROFILER_SALT_DIVISOR("profiler.client.salt.divisor", 1000L, Long.class); - + PROFILER_SALT_DIVISOR("profiler.client.salt.divisor", 1000L, Long.class) + /** + * The default value to be returned if a profile is not written for a given period for a profile and entity. + */ + ,PROFILER_DEFAULT_VALUE("profiler.default.value", null, Object.class); --- End diff -- Small nits... Add a space above this field and move the comma so that it matches the rest of the file ---
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
Github user JonZeolla commented on a diff in the pull request: https://github.com/apache/metron/pull/873#discussion_r157385625 --- Diff: metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/StellarExecutor.java --- @@ -289,7 +293,25 @@ public Object execute(String expression) { VariableResolver variableResolver = new MapVariableResolver(Maps.transformValues(variables, result -> result.getResult()) , Collections.emptyMap()); StellarProcessor processor = new StellarProcessor(); -return processor.parse(expression, variableResolver, functionResolver, context); +StackWatch watch = new StackWatch("execute"); +watch.startTime(expression); +context.setWatch(watch); +try { + return processor.parse(expression, variableResolver, functionResolver, context); +} finally { + watch.stopTime(); + final StringBuffer buff = new StringBuffer(); + watch.visit(((level, node) -> { +for (int i = 0; i < level; i++) { + buff.append("-"); +} +buff.append("->"); +buff.append(node.getName()).append(" : ").append(node.getTime()).append("ms : "). +append(node.getNanoTime()).append("ns").append("\n"); + })); + lastTiming = Optional.of(buff.toString()); + context.clearWatch(); +} --- End diff -- That makes sense, just looking to limit the effect here. ---
Re: UPDATE MEETING December Developer Community Meeting
Aah, just noticed it in the middle of the email - 12.30 pm EST - hit send too early. Thanks. On Sun, Dec 17, 2017 at 2:54 PM, Nadir Hajiyaniwrote: > Hi, > What time is this meeting at? > > Thanks. > > On Sun, Dec 17, 2017 at 1:32 PM, Otto Fowler > wrote: > >> We will be using this meeting >> >> Topic: Community zoom meeting >> Time: this is a recurring meeting Meet anytime >> >> Join from PC, Mac, Linux, iOS or Android: >> https://hortonworks.zoom.us/j/658498271 >> >> Or join by phone: >> >> +1 669 900 6833 (US Toll) or +1 646 558 8656 > 646 >> 558 8656> (US Toll) >> +1 877 853 5247 (US Toll Free) >> +1 877 369 0926 (US Toll Free) >> Meeting ID: 658 498 271 >> International numbers available: >> https://hortonworks.zoom.us/zoomconference?m=y7M0gPfv8kRv3Wv >> XHjXrpc3n3DyNqTMe >> >> >> On December 17, 2017 at 13:05:50, Otto Fowler (ottobackwa...@gmail.com) >> wrote: >> >> The December Community Meeting will be held Monday, December 18th. >> These are the topics that are up for discussion >> >>- Call for reviewers, ideas how to get more involvement, what people >> can >>do to help (Otto) >>- Feature branches : we have two now, what are they and how are we >> going >>to work on them (Otto) >>- Release process WRT formalized upgrade and installation instructions >>to be >>included as a part of a release (JZeolla) >>- Any concerns/questions >>with the secondary repo for bro. (JZeolla) >>- ES 5.6 upgrade (michael.miklav...@gmail.com) >>- Release Status(michael.miklav...@gmail.com) >>- Short Term Roadmap(michael.miklav...@gmail.com) >> >> >> We may only have 40 minutes, so we’ll try to keep things concise, and >> follow up with Discuss threads. >> >> *NOTE: IF THE ROOM CHANGES I WILL SEND AN UPDATE* >> >> >> Topic: Metron Developer Community Meeting >> Time: Dec 18, 2017 12:30 PM Eastern Time (US and Canada) >> >> Join from PC, Mac, Linux, iOS or Android: https://zoom.us/j/4534152036 >> >> Or iPhone one-tap : >> US: +16468769923,,4534152036# or +16699006833,,4534152036# >> Or Telephone: >> Dial(for higher quality, dial a number based on your current >> location): >> US: +1 646 876 9923 or +1 669 900 6833 >> Meeting ID: 453 415 2036 >> International numbers available: >> https://zoom.us/zoomconference?m=iwzFkc-YD_msf1cfRJL21VDYsExP41jo >> >> >> Developer Community Meeting Disclaimers >> >>- Developer Community meetings are a means for realtime discussion of >>development issues >>- These meetings are not specifically aimed at demonstrations, unless >>one is required or requested as part of such discussion >>- These meetings are geared towards Metron development issues, not user >>issues with deployment or shipped functionality >>- There are NO decisions made in these meetings. The mailing list is >> the >>official communication record of the Apache Metron Project, and as >> such all >>public decisions are to be made on the list, as to give the greatest >>opportunity for community involvement. >>- There ARE proposals that can be made and discussed in these meetings, >>that will then be discussed on list for decision. >>- Notes will be taken of these meetings, and they will be posted to the >>list >>- There may also be breakout posts to the list per proposal or topic, >>for more detailed discussion >> > > > > -- > Regards, > Nadir Hajiyani > -- Regards, Nadir Hajiyani
Re: UPDATE MEETING December Developer Community Meeting
Hi, What time is this meeting at? Thanks. On Sun, Dec 17, 2017 at 1:32 PM, Otto Fowlerwrote: > We will be using this meeting > > Topic: Community zoom meeting > Time: this is a recurring meeting Meet anytime > > Join from PC, Mac, Linux, iOS or Android: > https://hortonworks.zoom.us/j/658498271 > > Or join by phone: > > +1 669 900 6833 (US Toll) or +1 646 558 8656 558 8656> (US Toll) > +1 877 853 5247 (US Toll Free) > +1 877 369 0926 (US Toll Free) > Meeting ID: 658 498 271 > International numbers available: > https://hortonworks.zoom.us/zoomconference?m= > y7M0gPfv8kRv3WvXHjXrpc3n3DyNqTMe > > > On December 17, 2017 at 13:05:50, Otto Fowler (ottobackwa...@gmail.com) > wrote: > > The December Community Meeting will be held Monday, December 18th. > These are the topics that are up for discussion > >- Call for reviewers, ideas how to get more involvement, what people can >do to help (Otto) >- Feature branches : we have two now, what are they and how are we going >to work on them (Otto) >- Release process WRT formalized upgrade and installation instructions >to be >included as a part of a release (JZeolla) >- Any concerns/questions >with the secondary repo for bro. (JZeolla) >- ES 5.6 upgrade (michael.miklav...@gmail.com) >- Release Status(michael.miklav...@gmail.com) >- Short Term Roadmap(michael.miklav...@gmail.com) > > > We may only have 40 minutes, so we’ll try to keep things concise, and > follow up with Discuss threads. > > *NOTE: IF THE ROOM CHANGES I WILL SEND AN UPDATE* > > > Topic: Metron Developer Community Meeting > Time: Dec 18, 2017 12:30 PM Eastern Time (US and Canada) > > Join from PC, Mac, Linux, iOS or Android: https://zoom.us/j/4534152036 > > Or iPhone one-tap : > US: +16468769923,,4534152036# or +16699006833,,4534152036# > Or Telephone: > Dial(for higher quality, dial a number based on your current location): > US: +1 646 876 9923 or +1 669 900 6833 > Meeting ID: 453 415 2036 > International numbers available: > https://zoom.us/zoomconference?m=iwzFkc-YD_msf1cfRJL21VDYsExP41jo > > > Developer Community Meeting Disclaimers > >- Developer Community meetings are a means for realtime discussion of >development issues >- These meetings are not specifically aimed at demonstrations, unless >one is required or requested as part of such discussion >- These meetings are geared towards Metron development issues, not user >issues with deployment or shipped functionality >- There are NO decisions made in these meetings. The mailing list is the >official communication record of the Apache Metron Project, and as such > all >public decisions are to be made on the list, as to give the greatest >opportunity for community involvement. >- There ARE proposals that can be made and discussed in these meetings, >that will then be discussed on list for decision. >- Notes will be taken of these meetings, and they will be posted to the >list >- There may also be breakout posts to the list per proposal or topic, >for more detailed discussion > -- Regards, Nadir Hajiyani
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
Github user ottobackwards commented on a diff in the pull request: https://github.com/apache/metron/pull/873#discussion_r157377882 --- Diff: metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/StellarShell.java --- @@ -346,6 +348,18 @@ private void handleMagicFunctions(String[] expression) { writeLine(functions); } + /** + * Handle a magice %timing. Returns the results of the last timing operation --- End diff -- Done thanks ---
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
Github user ottobackwards commented on a diff in the pull request: https://github.com/apache/metron/pull/873#discussion_r157377835 --- Diff: metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/StellarExecutor.java --- @@ -289,7 +293,25 @@ public Object execute(String expression) { VariableResolver variableResolver = new MapVariableResolver(Maps.transformValues(variables, result -> result.getResult()) , Collections.emptyMap()); StellarProcessor processor = new StellarProcessor(); -return processor.parse(expression, variableResolver, functionResolver, context); +StackWatch watch = new StackWatch("execute"); +watch.startTime(expression); +context.setWatch(watch); +try { + return processor.parse(expression, variableResolver, functionResolver, context); +} finally { + watch.stopTime(); + final StringBuffer buff = new StringBuffer(); + watch.visit(((level, node) -> { +for (int i = 0; i < level; i++) { + buff.append("-"); +} +buff.append("->"); +buff.append(node.getName()).append(" : ").append(node.getTime()).append("ms : "). +append(node.getNanoTime()).append("ns").append("\n"); + })); + lastTiming = Optional.of(buff.toString()); + context.clearWatch(); +} --- End diff -- I do not have any metrics, but I believe there is low impact to checking the state.context and the thread local's availability. The runtime ( non-shell ) case, we would be paying the penalty of checking that the context watch was there or not, and having it not be there. ---
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
Github user ottobackwards commented on a diff in the pull request: https://github.com/apache/metron/pull/873#discussion_r157377783 --- Diff: metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/StellarExecutor.java --- @@ -289,7 +293,25 @@ public Object execute(String expression) { VariableResolver variableResolver = new MapVariableResolver(Maps.transformValues(variables, result -> result.getResult()) , Collections.emptyMap()); StellarProcessor processor = new StellarProcessor(); -return processor.parse(expression, variableResolver, functionResolver, context); +StackWatch watch = new StackWatch("execute"); +watch.startTime(expression); +context.setWatch(watch); +try { + return processor.parse(expression, variableResolver, functionResolver, context); +} finally { + watch.stopTime(); + final StringBuffer buff = new StringBuffer(); + watch.visit(((level, node) -> { +for (int i = 0; i < level; i++) { + buff.append("-"); +} +buff.append("->"); +buff.append(node.getName()).append(" : ").append(node.getTime()).append("ms : "). +append(node.getNanoTime()).append("ns").append("\n"); + })); + lastTiming = Optional.of(buff.toString()); + context.clearWatch(); +} --- End diff -- As I hit on in the writeup, stellar expressions are parsed into a stack of actions. Some of those actions put other actions onto the stack, or put values etc etc. So a Stellar Function would not actually wrap the functions inside it the way you think. The scoping doesn't work that way. ---
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
Github user JonZeolla commented on a diff in the pull request: https://github.com/apache/metron/pull/873#discussion_r157376617 --- Diff: metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/StellarShell.java --- @@ -346,6 +348,18 @@ private void handleMagicFunctions(String[] expression) { writeLine(functions); } + /** + * Handle a magice %timing. Returns the results of the last timing operation --- End diff -- `s/magice/magic/` ---
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
Github user JonZeolla commented on a diff in the pull request: https://github.com/apache/metron/pull/873#discussion_r157376611 --- Diff: metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/common/shell/StellarExecutor.java --- @@ -289,7 +293,25 @@ public Object execute(String expression) { VariableResolver variableResolver = new MapVariableResolver(Maps.transformValues(variables, result -> result.getResult()) , Collections.emptyMap()); StellarProcessor processor = new StellarProcessor(); -return processor.parse(expression, variableResolver, functionResolver, context); +StackWatch watch = new StackWatch("execute"); +watch.startTime(expression); +context.setWatch(watch); +try { + return processor.parse(expression, variableResolver, functionResolver, context); +} finally { + watch.stopTime(); + final StringBuffer buff = new StringBuffer(); + watch.visit(((level, node) -> { +for (int i = 0; i < level; i++) { + buff.append("-"); +} +buff.append("->"); +buff.append(node.getName()).append(" : ").append(node.getTime()).append("ms : "). +append(node.getNanoTime()).append("ns").append("\n"); + })); + lastTiming = Optional.of(buff.toString()); + context.clearWatch(); +} --- End diff -- Do you have any metrics regarding the overhead of this? Instead of doing this for all stellar commands, would it make sense to implement a TIME() steller function that could wrap all other commands, similar to how it functions on *nix boxes? ---
December Developer Community Meeting
The December Community Meeting will be held Monday, December 18th. These are the topics that are up for discussion - Call for reviewers, ideas how to get more involvement, what people can do to help (Otto) - Feature branches : we have two now, what are they and how are we going to work on them (Otto) - Release process WRT formalized upgrade and installation instructions to be included as a part of a release (JZeolla) - Any concerns/questions with the secondary repo for bro. (JZeolla) - ES 5.6 upgrade (michael.miklav...@gmail.com) - Release Status(michael.miklav...@gmail.com) - Short Term Roadmap(michael.miklav...@gmail.com) We may only have 40 minutes, so we’ll try to keep things concise, and follow up with Discuss threads. *NOTE: IF THE ROOM CHANGES I WILL SEND AN UPDATE* Topic: Metron Developer Community Meeting Time: Dec 18, 2017 12:30 PM Eastern Time (US and Canada) Join from PC, Mac, Linux, iOS or Android: https://zoom.us/j/4534152036 Or iPhone one-tap : US: +16468769923,,4534152036# or +16699006833,,4534152036# Or Telephone: Dial(for higher quality, dial a number based on your current location): US: +1 646 876 9923 or +1 669 900 6833 Meeting ID: 453 415 2036 International numbers available: https://zoom.us/zoomconference?m=iwzFkc-YD_msf1cfRJL21VDYsExP41jo Developer Community Meeting Disclaimers - Developer Community meetings are a means for realtime discussion of development issues - These meetings are not specifically aimed at demonstrations, unless one is required or requested as part of such discussion - These meetings are geared towards Metron development issues, not user issues with deployment or shipped functionality - There are NO decisions made in these meetings. The mailing list is the official communication record of the Apache Metron Project, and as such all public decisions are to be made on the list, as to give the greatest opportunity for community involvement. - There ARE proposals that can be made and discussed in these meetings, that will then be discussed on list for decision. - Notes will be taken of these meetings, and they will be posted to the list - There may also be breakout posts to the list per proposal or topic, for more detailed discussion
Re: [DEV COMMUNITY MEETING] Call for Ideas and Schedule
I am still waiting for info on the zoom room. I will have an email out by the end of the day with information, one way or another. On December 15, 2017 at 18:15:21, Otto Fowler (ottobackwa...@gmail.com) wrote: Great guys, I’m going to leave the call OPEN for ideas, but at this point let’s say we are going to schedule it for that time. I will send the announce when I hear back form James about the room On December 15, 2017 at 15:44:59, Michael Miklavcic ( michael.miklav...@gmail.com) wrote: Sounds good Otto. We probably also want to touch on the ES 5.6 upgrade along with our current release status and short-term release roadmap that Nick Allen has been guiding. On Fri, Dec 15, 2017 at 9:02 AM, Laurens Vetswrote: > I'll try to attend :) > > > On 2017-12-14 12:43, Otto Fowler wrote: > >> Dev Community Meeting Call >> >> I would like to propose a developer community meeting. >> >> I propose that we set the meeting early next week, and will throw out >> Monday, December 18th at 09:30AM PST, 12:30 on the East Coast and 5:30 in >> London Towne. >> >> This meeting will be held over a web-ex, the details of which will be >> included in the actual meeting notice. >> >> Please reply to this with scheduling concerns and topic suggestions. >> Potential Topics >> >>- Call for reviewers, ideas how to get more involvement, what people >> can >>do to help >>- Feature branches : we have two now, what are they and how are we >> going >>to work on them >>- Extension Repository: Default deployment and installation of parsers >>as it relates to ‘777’ >>- General ‘777’ discussion >> >> Developer Community Meeting Disclaimers >> >>- Developer Community meetings are a means for realtime discussion of >>development issues >>- These meetings are not specifically aimed at demonstrations, unless >>one is required or requested as part of such discussion >>- These meetings are geared towards Metron development issues, not user >>issues with deployment or shipped functionality >>- There are *NO* decisions made in these meetings. The mailing list is >>the official communication record of the Apache Metron Project, and as >> such >>all public decisions are to be made on the list, as to give the >> greatest >>opportunity for community involvement. >>- There *ARE* proposals that can be made and discussed in these >>meetings, that will then be discussed on list for decision. >>- Notes will be taken of these meetings, and they will be posted to the >>list >>- There may also be breakout posts to the list per proposal or topic, >>for more detailed discussion >> >
Re: [INTRODUCTIO] Would like to contribute
Hi Pushpitha! Welcome! Joining the dev and user mailing lists is a great start. Also, take a look through https://metron.apache.org , the community and documentation sites etc. I find reading the list archives helpful as well. You will also find our free node irc channel there. As to how to contribute, there are many ways to contribute, depending on your understanding, skills, and interests. Reviewing PR’s and Documentation helps even if a person doesn’t code themselves. There are newbie jira issues in the Apache jira as well : https://issues.apache.org/jira/secure/RapidBoard.jspa?rapidView=128=METRON=planning.nodetail=797=visible, although I’m not sure that some haven’t be obsoleted….. There are many ways to get involved, and everyone has probably taken a different route, but that is ok, there is no ‘one way’ to contribute. On December 16, 2017 at 00:23:56, Pushpitha Somathilaka ( pushpitha...@cse.mrt.ac.lk) wrote: Hi all, I am Pushpitha Dilhan and I am a final year undergraduate majoring Computer Science. I would like to contribute Apache Metron and hope to have guidance for a start. Thank you Pushpitha
[GitHub] metron pull request #873: METRON-1367 Stellar should have some instrumentati...
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("") ok [Stellar]>>> %timing ->execute : 113ms : 113017132 -->if( STARTS_WITH(TO_UPPER(DECODE(hex,'BASE32HEX')), "HELLO")) THEN TO_LOWER("OK") ELSE TO_LOWER("") : 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- where 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