<div dir="ltr"><div dir="ltr"><div style="font-family:arial,helvetica,sans-serif" class="gmail_default">I&#39;ve found it convenient to use an undocumented feature of Sumstats: changing the epoch.  This comes particularly handy when creating statistics for human consumption, as oftentimes it is useful to synchronize to a logging interval.  For example, if hourly stats are desired, it is useful to have a shorter epoch for the original sumstats to align with an hour, then to have subsequent sumstats trigger on the hour.</div><div style="font-family:arial,helvetica,sans-serif" class="gmail_default"><br></div><div style="font-family:arial,helvetica,sans-serif" class="gmail_default">Researching into this, I realized that the epoch variable can be changed, if the argument to <i>Sumstats::create</i> is a variable, rather than the usual style of an anonymous argument.  Then, in <i>epoch_result</i>, or <i>epoch_finished</i>, the timeout for the next epoch can be recomputed on the fly using <i>calc_next_rotate()</i>.</div><div style="font-family:arial,helvetica,sans-serif" class="gmail_default"><br></div><div style="font-family:arial,helvetica,sans-serif" class="gmail_default">However, this fails to work as expected as the next sumstat is scheduled prior to executing <i>epoch_result</i>, and <i>epoch_finished</i>.  What does work is the following hack:</div><ol><li>Create the initial sumstat with a epoch that will synchronize to the logging interval</li><li>Immediately change the epoch to the desired interval</li></ol><div style="font-family:arial,helvetica,sans-serif" class="gmail_default"><br></div><div style="font-family:arial,helvetica,sans-serif" class="gmail_default">Example:<br></div><br><div class="gmail_default"><span style="font-family:monospace,monospace"><i>event bro_init()</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    {</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    # So network_time() will be initialized...<br></i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    schedule 0 usec { setup_sumstat() };</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    }<br></i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>event setup_sumstat()</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    {</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    ... blah ...</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i><span style="font-family:monospace,monospace"><i>    local mysumstat: SumStats::SumStat;</i></span></i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    mysumstat = [</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>        $name=&quot;mysumstat&quot;,</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>        $epoch=calc_next_rotate(10 min) - network_time(),</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>        etc...</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    ];</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    SumStats::create(mysumstat);</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    # Now SumStat has been created, and the initial epoch scheduled, change epoch to regular interval for the future<br></i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    mysumstat$epoch = 10 min;</i></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><i>    }</i></span></div><div class="gmail_default"><i><br></i></div><div class="gmail_default">It would be convenient if the epoch could be changed in <span style="font-family:monospace,monospace"><i>epoch_result</i></span> or <span style="font-family:monospace,monospace"><i>epoch_finished</i><font face="arial,helvetica,sans-serif">, but some internals would require a bit of change - the reschedule would need to take place after processing results, which could throw the timing off a bit - on the other hand, unless one is interested in exact statistics over a known time period (as I am), the small amount of jitter probably wouldn&#39;t be noticeable or significant.<br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">The above is horribly hackish, and a different approach for accomplishing the goal would be to allow use scripts to schedule the end of the epoch:</font></span></div><div class="gmail_default"><ol><li><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Mark </font><i>epoch</i><font face="arial,helvetica,sans-serif"> as </font><i>&amp;optional</i><font face="Arial, Helvetica, sans-serif">.</font><i><font face="Arial, Helvetica, sans-serif"><br></font></i></span></li><li>Expose and document <span style="font-family:monospace,monospace"><i>SumStats::finish_epoch</i><font face="arial,helvetica,sans-serif"> as part of the public API</font></span></li><li><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Make the minor changes to not schedule <span style="font-family:monospace,monospace"><i>SumStats::finish_epoch</i><font face="times new roman,serif"> </font></span></font></span>if <i><span style="font-family:monospace,monospace">epoch</span></i> is undefined.</li></ol></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">By not defining </font><i>epoch</i><font face="arial,helvetica,sans-serif"> a script would indicate that it will manage epoch timing. The script would schedule the first epoch based on the logging interval, and in the </font><i>epoch_finished</i><font face="arial,helvetica,sans-serif">  function schedule each successive epoch to stay in sync with the logging interval.</font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Any comments, suggestions, etc. ????<br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Jim</font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div class="gmail_default"><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif"><br></font></span></div><div style="font-family:arial,helvetica,sans-serif" class="gmail_default"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div>