Current section
Files
Jump to
Current section
Files
src/otters_snapshot_count.erl
%%%-------------------------------------------------------------------
%%% Licensed to the Apache Software Foundation (ASF) under one
%%% or more contributor license agreements. See the NOTICE file
%%% distributed with this work for additional information
%%% regarding copyright ownership. The ASF licenses this file
%%% 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.
%%%
%%%-------------------------------------------------------------------
-module(otters_snapshot_count).
-compile(export_all).
%% This module implements a simple way of giving operational visibility
%% to events/spans in the system. It expects a Key and Data where the
%% Key is used to increment a counter in a table and also to store the
%% last received Data for that Key. The Data is preferred to be a list
%% of 2 element {K,V} tuples, if it is any other format, it uses
%% [{data, Data}] to store the last information.
snapshot(Key, [{_, _} |_ ] = Data) ->
{_, _, Us} = os:timestamp(),
{{Year, Month, Day}, {Hour, Min, Sec}} = calendar:local_time(),
ets:insert(
otters_snapshot_store,
{
Key,
[
{snap_timestamp, {Year, Month, Day, Hour, Min, Sec, Us}}
| Data
]
}
),
case catch ets:update_counter(otters_snapshot_count, Key, 1) of
{'EXIT', {badarg, _}} ->
ets:insert(otters_snapshot_count, {Key, 1});
Cnt ->
Cnt
end;
snapshot(Key, Data) ->
snapshot(Key, [{data, Data}]).
list_counts() ->
ets:tab2list(otters_snapshot_count).
get_snap(Key) ->
ets:lookup(otters_snapshot_store, Key).
delete_counter(Key) ->
ets:delete(otters_snapshot_store, Key),
ets:delete(otters_snapshot_count, Key).
delete_all_counters() ->
ets:delete_all_objects(otters_snapshot_store),
ets:delete_all_objects(otters_snapshot_count).
sup_init() -> [
ets:new(
Tab,
[named_table, public, {Concurrency, true}]
) ||
{Tab, Concurrency} <- [
{otters_snapshot_count, write_concurrency},
{otters_snapshot_store, write_concurrency}
]
].