Current section

Files

Jump to
harness_ff_erlang_server_sdk src temp_playground.erl
Raw

src/temp_playground.erl

%%%-------------------------------------------------------------------
%%% @author erowlands
%%% @copyright (C) 2022, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 08. Nov 2022 17:47
%%%-------------------------------------------------------------------
-module(temp_playground).
%% API
-export([start/0, atomics/0, atomics_test_validate/0, all_flags/0, stream/0, start_named_instance/0]).
start_named_instance() ->
%% logger:set_primary_config(level, info),
%% case cfclient:start("545535fb-43c0-448d-b57f-498c378c7a80", #{analytics_enabled => true, config_url => "http://localhost:8000",
%% events_url => "http://localhost:8000"}
%% ) of
%% ok ->
%% logger:info("Erlang SDK Successfuly Started");
%%%% get_flag_loop();
%% {not_ok, Error} ->
%%%% logger:error("Error when starting Erlang SDK: ~p~n", [Error]),
%% not_ok
%% end.
logger:set_primary_config(level, debug),
%% case cfclient:start("545535fb-43c0-448d-b57f-498c378c7a80", #{analytics_enabled => true, config_url => "http://localhost:8000", events_url => "http://localhost:8000"}
case cfclient:start("0c0b5947-0bd1-47e6-905f-281ab4cd7a01", cool_name, #{analytics_enabled => true}
) of
ok ->
logger:info("Erlang SDK Successfuly Started");
%% get_flag_loop();
{not_ok, Error} ->
%% logger:error("Error when starting Erlang SDK: ~p~n", [Error]),
not_ok
end.
start() ->
%% logger:set_primary_config(level, info),
%% case cfclient:start("545535fb-43c0-448d-b57f-498c378c7a80", #{analytics_enabled => true, config_url => "http://localhost:8000",
%% events_url => "http://localhost:8000"}
%% ) of
%% ok ->
%% logger:info("Erlang SDK Successfuly Started");
%%%% get_flag_loop();
%% {not_ok, Error} ->
%%%% logger:error("Error when starting Erlang SDK: ~p~n", [Error]),
%% not_ok
%% end.
logger:set_primary_config(level, debug),
%% case cfclient:start("545535fb-43c0-448d-b57f-498c378c7a80", #{analytics_enabled => true, config_url => "http://localhost:8000", events_url => "http://localhost:8000"}
case cfclient:start("0c0b5947-0bd1-47e6-905f-281ab4cd7a01", #{analytics_enabled => true}
) of
ok ->
logger:info("Erlang SDK Successfuly Started");
%% get_flag_loop();
{not_ok, Error} ->
%% logger:error("Error when starting Erlang SDK: ~p~n", [Error]),
not_ok
end.
push_interval() ->
Target = #{identifier => <<"does_this_work">>,
name => <<"blah333">>},
Target2 = #{identifier => <<"does_this_work2">>,
name => <<"blah4444">>},
Target3 = #{identifier => <<"does_this_work3">>,
name => <<"blah55555">>},
Target4 = #{identifier => <<"does_this_work4">>,
name => <<"blah2232435235">>},
FlagIdentifier = "flag1",
Result = cfclient:bool_variation(FlagIdentifier, Target, false),
Result = cfclient:bool_variation(FlagIdentifier, Target2, false),
Result = cfclient:bool_variation(FlagIdentifier, Target3, false),
Result = cfclient:bool_variation(FlagIdentifier, Target4, false).
anon_test() ->
Target = #{identifier => "blah2new",
name => <<"blah2new">>,
anonymous => <<"true">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
FlagIdentifier = "anon_test",
Result = cfclient:bool_variation(FlagIdentifier, Target, false).
all_flags() ->
bool_flag(),
string_flag(),
number_flag(),
json_flag(),
timer:sleep(10000),
all_flags().
bool_flag() ->
Target = #{identifier => "Harness_Target_1",
name => <<"HT_1">>,
anonymous => <<"true">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target2 = #{identifier => <<"target1">>,
name => <<"target1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"asdasdsaddemo@harness.io">>},
analytics_push_interval => 60000,
poll_interval => 60000,
config_url => "https://config.ff.harness.io/api/1.0",
events_url => "https://events.ff.harness.io/api/1.0"
},
Target3 = #{identifier => "Harness_Target_3",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target4 = #{identifier => "Harness_Target_4",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target5 = #{identifier => "Harness_Target_5",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
FlagIdentifier = "metricsboolflag",
Result = cfclient:bool_variation(FlagIdentifier, Target, false),
Result2 = cfclient:bool_variation(FlagIdentifier, Target2, false),
Result3 = cfclient:bool_variation(FlagIdentifier, Target3, false),
Result4 = cfclient:bool_variation(FlagIdentifier, Target4, false),
Result5 = cfclient:bool_variation(FlagIdentifier, Target5, false),
logger:info("Varaion for Flag ~p witih Target ~p is: ~p~n", [FlagIdentifier, maps:get(identifier, Target), Result]).
string_flag() ->
Target = #{identifier => "Harness_Target_1",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target2 = #{identifier => <<"target1">>,
name => <<"target1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"asdasdsaddemo@harness.io">>}
},
Target3 = #{identifier => "Harness_Target_3",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target4 = #{identifier => "Harness_Target_4",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target5 = #{identifier => "Harness_Target_5",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
FlagIdentifier = "mystringflag",
Result = cfclient:string_variation(FlagIdentifier, Target, "coolvalue"),
Result2 = cfclient:bool_variation(FlagIdentifier, Target2, "coolvalue"),
Result3 = cfclient:bool_variation(FlagIdentifier, Target3, "coolvalue"),
Result4 = cfclient:string_variation(FlagIdentifier, Target4, "coolvalue"),
Result5 = cfclient:bool_variation(FlagIdentifier, Target5, "coolvalue").
json_flag() ->
Target = #{identifier => "Harness_Target_1",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target2 = #{identifier => <<"target1">>,
name => <<"target1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"asdasdsaddemo@harness.io">>}
},
Target3 = #{identifier => "Harness_Target_3",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target4 = #{identifier => "Harness_Target_4",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target5 = #{identifier => "Harness_Target_5",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
FlagIdentifier = "myJsonFlag",
Result = cfclient:string_variation(FlagIdentifier, Target, #{}),
Result2 = cfclient:bool_variation(FlagIdentifier, Target2, #{}),
Result3 = cfclient:bool_variation(FlagIdentifier, Target3, #{}),
Result4 = cfclient:bool_variation(FlagIdentifier, Target4, #{}),
Result5 = cfclient:json_variation(FlagIdentifier, Target5, #{}),
logger:info("Varaion for Flag ~p witih Target ~p is: ~p~n", [FlagIdentifier, maps:get(identifier, Target), Result]).
number_flag() ->
Target = #{identifier => "Harness_Target_1",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target2 = #{identifier => <<"target1">>,
name => <<"target1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"asdasdsaddemo@harness.io">>}
},
Target3 = #{identifier => "Harness_Target_3",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target4 = #{identifier => "Harness_Target_4",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
Target5 = #{identifier => "Harness_Target_5",
name => <<"HT_1">>,
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
FlagIdentifier = "metricsNumberFlag",
Result = cfclient:string_variation(FlagIdentifier, Target, 1),
Result2 = cfclient:bool_variation(FlagIdentifier, Target2, 1),
Result3 = cfclient:bool_variation(FlagIdentifier, Target3, 1),
Result4 = cfclient:number_variation(FlagIdentifier, Target4, 0),
Result5 = cfclient:bool_variation(FlagIdentifier, Target5, 1),
logger:info("Varaion for Flag ~p witih Target ~p is: ~p~n", [FlagIdentifier, maps:get(identifier, Target), Result]).
%% timer:sleep(10000),
%% get_flag_loop().
%%cache_test() ->
%%
%% Target1 = #{identifier => "Harness_Target_1",
%% name => "HT_1",
%% %% Attribute keys must be atoms. Values must be either bitstrings or atoms.
%% attributes => #{email => <<"demo@harness.io">>}
%% },
%%
%% MetricEvent = #{featureName => "CoolFlag", target => Target1, variation => "true"},
%%
%% Target2 = #{identifier => "Harness_Target_2",
%% name => "HT_1",
%% %% Attribute keys must be atoms. Values must be either bitstrings or atoms.
%% attributes => #{email => <<"demo@harness.io">>}
%% },
%% MetricEvent3 = #{featureName => "CoolFlag", target => Target2, variation => "true"},
%%
%%
%% lru:add(cfclient_cache_repository:get_pid(), MetricEvent3, 1).
integer_count() ->
%% Mine = atomics:new(1, [{signed, true}]),
%%
%% Target1 = #{identifier => "Harness_Target_1",
%% name => "HT_1",
%% %% Attribute keys must be atoms. Values must be either bitstrings or atoms.
%% attributes => #{email => <<"demo@harness.io">>}
%% },
%%
%% MetricEvent = #{featureName => "CoolFlag", target => Target1, variation => "true"},
%%
%% lru:add(cfclient_cache_repository:get_pid(), MetricEvent, Mine),
%%
%% lru:add(cfclient_cache_repository:get_pid(), MetricEvent, atomics:put(Mine, 1, 1)),
%%
%% atomics:get(Mine, 1).
%% So algorithm for my atomic counter map is this
%%. 1. Check if Metric Event key exists - using lru:contains_or_add
%%. 1.1 In the contains or add, do the metrics event plus a new counter.
%% 1.2 In the case of contains_or_add - for true -> maps get on the key and update the counter ; for false just do ok.
%% Notes - store a reference to the counter in the mape map. When we purge the map, it will no longer be referenced and should be GC'd.
MetricsCachePID = cfclient_metrics_server:get_metrics_cache_pid(),
Target1 = #{identifier => "Harness_Target_1",
name => "HT_1",
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
MetricEvent = #{featureName => "CoolFlag", target => Target1, variation => "true"},
case lru:contains_or_add(MetricsCachePID, MetricEvent, 1) of
{true, _} ->
Counter = lru:get(MetricsCachePID, MetricEvent),
lru:add(MetricsCachePID, MetricEvent, Counter + 1);
{false, _} ->
ok
end.
atomics() ->
%% Mine = atomics:new(1, [{signed, true}]),
%%
%% Target1 = #{identifier => "Harness_Target_1",
%% name => "HT_1",
%% %% Attribute keys must be atoms. Values must be either bitstrings or atoms.
%% attributes => #{email => <<"demo@harness.io">>}
%% },
%%
%% MetricEvent = #{featureName => "CoolFlag", target => Target1, variation => "true"},
%%
%% lru:add(cfclient_cache_repository:get_pid(), MetricEvent, Mine),
%%
%% lru:add(cfclient_cache_repository:get_pid(), MetricEvent, atomics:put(Mine, 1, 1)),
%%
%% atomics:get(Mine, 1).
%% So algorithm for my atomic counter map is this
%%. 1. Check if Metric Event key exists - using lru:contains_or_add
%%. 1.1 In the contains or add, do the metrics event plus a new counter.
%% 1.2 In the case of contains_or_add - for true -> maps get on the key and update the counter ; for false just do ok.
%% Notes - store a reference to the counter in the mape map. When we purge the map, it will no longer be referenced and should be GC'd.
MetricsCachePID = cfclient_metrics_server:get_metrics_cache_pid(),
Target1 = #{identifier => "Harness_Target_1",
name => "HT_1",
%% Attribute keys must be atoms. Values must be either bitstrings or atoms.
attributes => #{email => <<"demo@harness.io">>}
},
MetricEvent = #{featureName => "CoolFlag", target => Target1, variation => "true"},
case lru:contains_or_add(MetricsCachePID, MetricEvent, atomics:new(1, [{signed, true}])) of
{true, _} ->
CounterReference = lru:get(MetricsCachePID, MetricEvent),
atomics:add(CounterReference, 1, 1),
CounterReference;
{false, _} ->
ok
end.
stream() ->
CommonOpts = #{content_handlers => [gun_sse_h, gun_data_h]},
{ok, Pid} = gun:open("config.ff.harness.io", 443, #{
%% http_opts => CommonOpts
http_opts => CommonOpts,
transport => tls,
protocols => [http]
}),
Ref = gun:get(Pid, "/api/1.0/stream?cluster=2", #{
<<"accept">> => <<"text/event-stream">>,
<<"API-Key">> => <<"">>,
<<"Authorization">> => <<"Bearer ">> }
),
{response, nofin, Code, RespHeaders} = gun:await(Pid, Ref).
%% {sse, Event} = gun:await(Pid, Ref),
%% #{
%% last_event_id := LastEventID,
%% event_type := <<"message">>,
%% data := Data
%% } = Event.
atomics_test_validate() ->
lru:purge(cfclient_metrics_server:get_metrics_cache_pid()).
%%
%%
%% %% Get the counter reference
%% MinePID = lru:get(MetricsCachePID, MetricEvent),
%%
%% %% Increment the counter
%% atomics:put(MinePID, 1, 1),
%% lru:add(MetricsCachePID, MetricEvent, Mine),
%%
%% lru:add(MetricsCachePID, MetricEvent, atomics:put(Mine, 1, 1)),
%%
%% atomics:get(Mine, 1).
%% So algorithm for my atomic counter map is this
%%. 1. Check if Metric Event key exists - using lru:contains_or_add
%%. 1.1 In the contains or add, do the metrics event plus a new counter.
%% 1.2 In the case of contains_or_add - for true -> maps get on the key and update the counter ; for false just do ok.
%% Notes - store a reference to the counter in the mape map. When we purge the map, it will no longer be referenced and should be GC'd.
%%set_test() ->
%% Target1 = #{identifier => "Harness_Target_1",
%% name => "HT_1",
%% %% Attribute keys must be atoms. Values must be either bitstrings or atoms.
%% attributes => #{email => <<"demo@harness.io">>}
%% },
%%
%% Target2 = #{identifier => "Harness_Target_1",
%% name => "HT_2",
%% %% Attribute keys must be atoms. Values must be either bitstrings or atoms.
%% attributes => #{email => <<"demo@harness.io">>}
%% },
%%
%% Set = sets:new(),
%%
%% Set2 = sets:add_element(Target1, Set),
%% Set3 = sets:add_element(Target2, Set2),
%% sets:size(Target2, Set3).
yes() ->
supervisor:start_child(cfclient_sup, {cool_name, {lru, start_link, [[{local, cool_name}, {max_size, 32000000}]]}, permanent, 5000, worker, ['lru']}),
supervisor:start_child(cfclient_sup,{cfclient_instance_default, {lru, start_link, [{max_size, 32000000}]}, permanent, 5000,worker, [lru]}).