Skip to content

Commit

Permalink
Merge pull request #40 from juise/master
Browse files Browse the repository at this point in the history
Add ewma for day support, add tests
  • Loading branch information
joewilliams committed Oct 9, 2012
2 parents a87ef8a + 223acaf commit e1499f3
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 9 deletions.
13 changes: 9 additions & 4 deletions src/folsom_ewma.erl
Expand Up @@ -29,9 +29,10 @@


-module(folsom_ewma). -module(folsom_ewma).


-define(M1_ALPHA, 1 - math:exp(-5 / 60.0)). -define(M1_ALPHA, 1 - math:exp(-5 / 60.0)).
-define(M5_ALPHA, 1 - math:exp(-5 / 60.0 / 5)). -define(M5_ALPHA, 1 - math:exp(-5 / 60.0 / 5)).
-define(M15_ALPHA, 1 - math:exp(-5 / 60.0 / 15)). -define(M15_ALPHA, 1 - math:exp(-5 / 60.0 / 15)).
-define(D1_ALPHA, 1 - math:exp(-5 / 60.0 / 1440)).


-record(ewma, { -record(ewma, {
alpha, alpha,
Expand All @@ -47,7 +48,8 @@
tick/1, tick/1,
one_minute_ewma/0, one_minute_ewma/0,
five_minute_ewma/0, five_minute_ewma/0,
fifteen_minute_ewma/0]). fifteen_minute_ewma/0,
one_day_ewma/0]).




% API % API
Expand All @@ -61,6 +63,9 @@ five_minute_ewma() ->
fifteen_minute_ewma() -> fifteen_minute_ewma() ->
new(?M15_ALPHA, 5). new(?M15_ALPHA, 5).


one_day_ewma() ->
new(?D1_ALPHA, 5).

new(Alpha, Interval) -> new(Alpha, Interval) ->
#ewma{alpha = Alpha, interval = Interval}. #ewma{alpha = Alpha, interval = Interval}.


Expand Down
19 changes: 15 additions & 4 deletions src/folsom_metrics_meter.erl
Expand Up @@ -37,6 +37,7 @@
one, one,
five, five,
fifteen, fifteen,
day,
count = 0, count = 0,
start_time start_time
}). }).
Expand All @@ -47,26 +48,31 @@ new(Name) ->
OneMin = folsom_ewma:one_minute_ewma(), OneMin = folsom_ewma:one_minute_ewma(),
FiveMin = folsom_ewma:five_minute_ewma(), FiveMin = folsom_ewma:five_minute_ewma(),
FifteenMin = folsom_ewma:fifteen_minute_ewma(), FifteenMin = folsom_ewma:fifteen_minute_ewma(),
OneDay = folsom_ewma:one_day_ewma(),


ets:insert(?METER_TABLE, ets:insert(?METER_TABLE,
{Name, #meter{one = OneMin, {Name, #meter{one = OneMin,
five = FiveMin, five = FiveMin,
fifteen = FifteenMin, fifteen = FifteenMin,
day = OneDay,
start_time = folsom_utils:now_epoch_micro()}}). start_time = folsom_utils:now_epoch_micro()}}).


tick(Name) -> tick(Name) ->
#meter{one = OneMin, #meter{one = OneMin,
five = FiveMin, five = FiveMin,
fifteen = FifteenMin} = Meter = get_value(Name), fifteen = FifteenMin,
day = OneDay} = Meter = get_value(Name),


OneMin1 = folsom_ewma:tick(OneMin), OneMin1 = folsom_ewma:tick(OneMin),
FiveMin1 = folsom_ewma:tick(FiveMin), FiveMin1 = folsom_ewma:tick(FiveMin),
FifteenMin1 = folsom_ewma:tick(FifteenMin), FifteenMin1 = folsom_ewma:tick(FifteenMin),
OneDay1 = folsom_ewma:tick(OneDay),


ets:insert(?METER_TABLE, ets:insert(?METER_TABLE,
{Name, Meter#meter{one = OneMin1, {Name, Meter#meter{one = OneMin1,
five = FiveMin1, five = FiveMin1,
fifteen = FifteenMin1}}). fifteen = FifteenMin1,
day = OneDay1}}).


mark(Name) -> mark(Name) ->
mark(Name, 1). mark(Name, 1).
Expand All @@ -75,28 +81,33 @@ mark(Name, Value) ->
#meter{count = Count, #meter{count = Count,
one = OneMin, one = OneMin,
five = FiveMin, five = FiveMin,
fifteen = FifteenMin} = Meter = get_value(Name), fifteen = FifteenMin,
day = OneDay} = Meter = get_value(Name),


OneMin1 = folsom_ewma:update(OneMin, Value), OneMin1 = folsom_ewma:update(OneMin, Value),
FiveMin1 = folsom_ewma:update(FiveMin, Value), FiveMin1 = folsom_ewma:update(FiveMin, Value),
FifteenMin1 = folsom_ewma:update(FifteenMin, Value), FifteenMin1 = folsom_ewma:update(FifteenMin, Value),
OneDay1 = folsom_ewma:update(OneDay, Value),


ets:insert(?METER_TABLE, {Name, Meter#meter{count = Count + Value, ets:insert(?METER_TABLE, {Name, Meter#meter{count = Count + Value,
one = OneMin1, one = OneMin1,
five = FiveMin1, five = FiveMin1,
fifteen = FifteenMin1}}). fifteen = FifteenMin1,
day = OneDay1}}).


get_values(Name) -> get_values(Name) ->
#meter{one = OneMin, #meter{one = OneMin,
five = FiveMin, five = FiveMin,
fifteen = FifteenMin, fifteen = FifteenMin,
day = OneDay,
count = Count} = Meter = get_value(Name), count = Count} = Meter = get_value(Name),


L = [ L = [
{count, Count}, {count, Count},
{one, get_rate(OneMin)}, {one, get_rate(OneMin)},
{five, get_rate(FiveMin)}, {five, get_rate(FiveMin)},
{fifteen, get_rate(FifteenMin)}, {fifteen, get_rate(FifteenMin)},
{day, get_rate(OneDay)},
{mean, get_mean_rate(Meter)}, {mean, get_mean_rate(Meter)},
{acceleration, get_acceleration(Name)} {acceleration, get_acceleration(Name)}
], ],
Expand Down
8 changes: 7 additions & 1 deletion test/folsom_erlang_checks.erl
Expand Up @@ -183,12 +183,18 @@ check_metrics() ->
_ -> _ ->
error error
end, end,
ok = case proplists:get_value(day, Meter) of
Value1 when Value1 > 0.005 ->
ok;
_ ->
error
end,


?debugFmt("checking meter reader~n", []), ?debugFmt("checking meter reader~n", []),
MeterReader = folsom_metrics:get_metric_value(meter_reader), MeterReader = folsom_metrics:get_metric_value(meter_reader),
?debugFmt("~p~n", [MeterReader]), ?debugFmt("~p~n", [MeterReader]),
ok = case proplists:get_value(one, MeterReader) of ok = case proplists:get_value(one, MeterReader) of
Value1 when Value1 > 1 -> Value2 when Value2 > 1 ->
ok; ok;
_ -> _ ->
error error
Expand Down

0 comments on commit e1499f3

Please sign in to comment.