Merge pull request #31 from campanja/master

support n-ary metric initialization from application environment at startup
diff --git a/src/folsom.erl b/src/folsom.erl
index 0f08da0..9fbe2e0 100644
--- a/src/folsom.erl
+++ b/src/folsom.erl
@@ -36,24 +36,29 @@
 
 start(_Type, _Args) ->
     {ok, Pid} = folsom_sup:start_link(),
-    lists:foreach(
-      fun ({K, New}) ->
-              case application:get_env(?APP, K) of
-                  {ok, Name} when is_atom(Name) ->
-                      New(Name);
-                  {ok, Names} when is_list(Names) ->
-                      lists:foreach(New, Names);
-                  undefined ->
-                      ok
-              end
-      end,
-      [{counter, fun folsom_metrics:new_counter/1},
-       {gauge, fun folsom_metrics:new_gauge/1},
-       {histogram, fun folsom_metrics:new_histogram/1},
-       {history, fun folsom_metrics:new_history/1},
-       {meter, fun folsom_metrics:new_meter/1},
-       {meter_reader, fun folsom_metrics:new_meter_reader/1}]),
+    lists:foreach(fun configure/1,
+      [{counter, new_counter},
+       {gauge, new_gauge},
+       {histogram, new_histogram},
+       {history, new_history},
+       {meter, new_meter},
+       {meter_reader, new_meter_reader}]),
     {ok, Pid}.
 
 stop(_State) ->
     ok.
+
+%% internal
+configure({K, New}) ->
+    case application:get_env(?APP, K) of
+        {ok, Specs} when is_list(Specs) ->
+            [configure_metric(New, Spec) || Spec <- Specs];
+        {ok, Spec} ->
+            configure_metric(New, Spec);
+        undefined -> ok
+    end.
+
+configure_metric(New, Spec) when is_list(Spec) ->
+    apply(folsom_metrics, New, Spec);
+configure_metric(New, Name) ->
+    folsom_metrics:New(Name).
diff --git a/test/folsom_tests.erl b/test/folsom_tests.erl
index 04f0ba8..296b57f 100644
--- a/test/folsom_tests.erl
+++ b/test/folsom_tests.erl
@@ -46,3 +46,28 @@
        fun folsom_erlang_checks:delete_metrics/0},
       {"cpu topology test",
        fun folsom_erlang_checks:cpu_topology/0}]}.
+
+configure_test_() ->
+    {foreach, fun setup_app/0, fun cleanup_app/1,
+     [{"start with configured metrics",
+       fun() ->
+               ?assertMatch(ok, application:start(folsom)),
+               [counter, slide, <<"gauge">>, <<"uniform">>] =
+                   lists:sort(folsom_metrics:get_metrics())
+       end}]}.
+
+setup_app() ->
+    application:unload(folsom),
+    Env = [{counter, counter},
+           {gauge, <<"gauge">>},
+           {histogram, [[<<"uniform">>, uniform, 5000],
+                        [slide, slide_uniform, {60, 1028}]]}],
+    application:load({application, folsom, [{mod, {folsom, []}}, {env, Env}]}),
+    ok.
+
+cleanup_app(ok) ->
+    lists:foreach(fun folsom_metrics:delete_metric/1,
+                  [counter, slide, <<"gauge">>, <<"uniform">>]),
+    application:stop(folsom),
+    application:unload(folsom),
+    ok.