%% ------------------------------------------------------------------- %% %% Copyright (c) 2007-2012 Basho Technologies, Inc. All Rights Reserved. %% %% This file is provided to you under the Apache License, %% Version 2.0 (the "License"); you may not use this file %% except in compliance with the License. You may obtain %% a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, %% software distributed under the License is distributed on an %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY %% KIND, either express or implied. See the License for the %% specific language governing permissions and limitations %% under the License. %% %% ------------------------------------------------------------------- %%%------------------------------------------------------------------- %%% File: folsom_metrics_duration.erl %%% @author Russell Brown %%% @doc Tracks the time something takes. If %%% you can, use folsom_metrics:histogram_timed_update/2,3,4. %%% This is for the case when you can't wrap your timed action %%% in a fun. Calling timer_start / timer_end in the correct %%% order is the calling code's responsibility. %%% @end %%%------------------------------------------------------------------ -module(folsom_metrics_duration). -export([new/1, update/2, get_value/1, get_values/1 ]). -include("folsom.hrl"). new(Name) -> %% {Name, count, start, last} Dur = {Name, 0, undefined, 0}, ets:insert(?DURATION_TABLE, Dur). update(Name, timer_start) -> StartTime = os:timestamp(), ets:update_element(?DURATION_TABLE, Name, {3, StartTime}); update(Name, timer_end) -> EndTime = os:timestamp(), case ets:lookup_element(?DURATION_TABLE, Name, 3) of undefined -> ok; StartTime -> %% potential race, but then you're using it wrong ets:update_element(?DURATION_TABLE, Name, {3, undefined}), Duration = timer:now_diff(EndTime, StartTime), ets:update_counter(?DURATION_TABLE, Name, {2, 1}), ets:update_element(?DURATION_TABLE, Name, {4, Duration}), folsom_metrics_histogram:update(Name, Duration) end. % gets the duration tuple from ets get_value(Name) -> [Dur] = ets:lookup(?DURATION_TABLE, Name), Dur. % pulls the sample out of the record gotten from ets % and the duration get_values(Name) -> Values = folsom_metrics_histogram:get_values(Name), {Name, Cnt, _Start, Last} = get_value(Name), Stats = bear:get_statistics(Values), [{count, Cnt}, {last, Last} | Stats].