From 7ed076cf54dee41a12493cf8f65f69f644217829 Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Tue, 4 Apr 2023 17:47:39 -0600 Subject: [PATCH] update meterprovider to take resource as an argument on start --- .../src/otel_meter_provider.erl | 18 ++++++------------ .../src/opentelemetry_experimental_app.erl | 12 ++---------- .../src/otel_meter_provider_sup.erl | 6 +++--- .../src/otel_meter_server.erl | 12 +++++------- .../src/otel_meter_server_sup.erl | 10 +++++----- .../test/otel_metrics_SUITE.erl | 10 +++++++++- 6 files changed, 30 insertions(+), 38 deletions(-) diff --git a/apps/opentelemetry_api_experimental/src/otel_meter_provider.erl b/apps/opentelemetry_api_experimental/src/otel_meter_provider.erl index 68fdb74de..32b6c7d02 100644 --- a/apps/opentelemetry_api_experimental/src/otel_meter_provider.erl +++ b/apps/opentelemetry_api_experimental/src/otel_meter_provider.erl @@ -21,8 +21,7 @@ %%%------------------------------------------------------------------------- -module(otel_meter_provider). --export([start/2, - get_meter/3, +-export([get_meter/3, get_meter/4, resource/0, resource/1, @@ -30,22 +29,17 @@ force_flush/1]). -include_lib("opentelemetry_api/include/opentelemetry.hrl"). +-include_lib("otel_meter.hrl"). -type meter() :: term(). -start(Name, Config) -> - %% SDK must register a simple one for one supervisor of tracer providers - %% under the name `otel_meter_provider_sup' - %% {ok, _} = otel_meter_provider_sup:start_child(default, Config), - supervisor:start_child(otel_meter_provider_sup, [Name, Config]). - -spec get_meter(Name, Vsn, SchemaUrl) -> Meter when Name :: atom(), Vsn :: unicode:chardata() | undefined, SchemaUrl :: uri_string:uri_string() | undefined, Meter:: meter(). get_meter(Name, Vsn, SchemaUrl) -> - get_meter(?MODULE, Name, Vsn, SchemaUrl). + get_meter(?GLOBAL_METER_PROVIDER_NAME, Name, Vsn, SchemaUrl). -spec get_meter(ServerRef, Name, Vsn, SchemaUrl) -> Meter when ServerRef :: atom() | pid(), @@ -63,7 +57,7 @@ get_meter(ServerRef, Name, Vsn, SchemaUrl) -> -spec resource() -> term() | undefined. resource() -> - resource(?MODULE). + resource(?GLOBAL_METER_PROVIDER_NAME). -spec resource(atom() | pid()) -> term() | undefined. resource(ServerRef) -> @@ -76,12 +70,12 @@ resource(ServerRef) -> -spec force_flush() -> ok | {error, term()} | timeout. force_flush() -> - force_flush(?MODULE). + force_flush(?GLOBAL_METER_PROVIDER_NAME). -spec force_flush(atom() | pid()) -> ok | {error, term()} | timeout. force_flush(ServerRef) -> try - gen_server:call(ServerRef, force_flush) + gen_server:call(maybe_to_reg_name(ServerRef), force_flush) catch exit:{noproc, _} -> %% ignore because likely no SDK has been included and started ok diff --git a/apps/opentelemetry_experimental/src/opentelemetry_experimental_app.erl b/apps/opentelemetry_experimental/src/opentelemetry_experimental_app.erl index 8e91cd75d..6f6aec027 100644 --- a/apps/opentelemetry_experimental/src/opentelemetry_experimental_app.erl +++ b/apps/opentelemetry_experimental/src/opentelemetry_experimental_app.erl @@ -8,7 +8,6 @@ -behaviour(application). -export([start/2, - prep_stop/1, stop/1]). -include_lib("opentelemetry_api_experimental/include/otel_meter.hrl"). @@ -19,18 +18,11 @@ start(_StartType, _StartArgs) -> {ok, Pid} = opentelemetry_experimental_sup:start_link(Config), - {ok, _} = opentelemetry_experimental:start_meter_provider(?GLOBAL_METER_PROVIDER_NAME, Config), + Resource = otel_resource_detector:get_resource(), + {ok, _} = otel_meter_provider_sup:start(?GLOBAL_METER_PROVIDER_NAME, Resource, Config), {ok, Pid}. -%% called before the supervision tree is shutdown. -prep_stop(_State) -> - %% on application stop set meter to the noop implementation. - %% This is to ensure no crashes if the sdk isn't the last - %% thing to shutdown or if the opentelemetry application crashed. - opentelemetry_experimental:set_default_meter({otel_meter_noop, []}), - ok. - stop(_State) -> ok. diff --git a/apps/opentelemetry_experimental/src/otel_meter_provider_sup.erl b/apps/opentelemetry_experimental/src/otel_meter_provider_sup.erl index 6c8fc3fcd..f89815de8 100644 --- a/apps/opentelemetry_experimental/src/otel_meter_provider_sup.erl +++ b/apps/opentelemetry_experimental/src/otel_meter_provider_sup.erl @@ -20,7 +20,7 @@ -behaviour(supervisor). -export([start_link/0, - start_child/2]). + start/3]). -export([init/1]). @@ -29,8 +29,8 @@ start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). -start_child(Name, Opts) -> - supervisor:start_child(?SERVER, [Name, Opts]). +start(Name, Resource, Opts) -> + supervisor:start_child(?SERVER, [Name, Resource, Opts]). init([]) -> SupFlags = #{strategy => simple_one_for_one, diff --git a/apps/opentelemetry_experimental/src/otel_meter_server.erl b/apps/opentelemetry_experimental/src/otel_meter_server.erl index c981bf766..b8db158c9 100644 --- a/apps/opentelemetry_experimental/src/otel_meter_server.erl +++ b/apps/opentelemetry_experimental/src/otel_meter_server.erl @@ -34,7 +34,7 @@ -behaviour(gen_server). --export([start_link/3, +-export([start_link/4, add_metric_reader/4, add_metric_reader/5, add_instrument/1, @@ -105,9 +105,9 @@ resource :: otel_resource:t() }). --spec start_link(atom(), atom(), otel_configuration:t()) -> {ok, pid()} | ignore | {error, term()}. -start_link(Name, RegName, Config) -> - gen_server:start_link({local, RegName}, ?MODULE, [Name, RegName, Config], []). +-spec start_link(atom(), atom(), otel_resource:t(), otel_configuration:t()) -> {ok, pid()} | ignore | {error, term()}. +start_link(Name, RegName, Resource, Config) -> + gen_server:start_link({local, RegName}, ?MODULE, [Name, RegName, Resource, Config], []). -spec add_instrument(otel_instrument:t()) -> boolean(). add_instrument(Instrument) -> @@ -162,14 +162,12 @@ force_flush() -> force_flush(Provider) -> gen_server:call(Provider, force_flush). -init([Name, RegName, Config]) -> +init([Name, RegName, Resource, Config]) -> InstrumentsTab = instruments_tab(RegName), CallbacksTab = callbacks_tab(RegName), ViewAggregationsTab = view_aggregations_tab(RegName), MetricsTab = metrics_tab(RegName), - Resource = otel_resource_detector:get_resource(), - Meter = #meter{module=otel_meter_default, instruments_tab=InstrumentsTab, provider=RegName, diff --git a/apps/opentelemetry_experimental/src/otel_meter_server_sup.erl b/apps/opentelemetry_experimental/src/otel_meter_server_sup.erl index 78200cd4f..dcba76065 100644 --- a/apps/opentelemetry_experimental/src/otel_meter_server_sup.erl +++ b/apps/opentelemetry_experimental/src/otel_meter_server_sup.erl @@ -19,15 +19,15 @@ -behaviour(supervisor). --export([start_link/2, +-export([start_link/3, provider_pid/1]). -export([init/1]). -include_lib("opentelemetry_api/include/opentelemetry.hrl"). -start_link(Name, Opts) -> - supervisor:start_link(?MODULE, [Name, Opts]). +start_link(Name, Resource, Opts) -> + supervisor:start_link(?MODULE, [Name, Resource, Opts]). -dialyzer({nowarn_function, provider_pid/1}). -spec provider_pid(supervisor:sup_ref()) -> pid() | restarting | undefined. @@ -40,7 +40,7 @@ provider_pid(SupPid) -> undefined end. -init([Name, Opts]) -> +init([Name, Resource, Opts]) -> SupFlags = #{strategy => rest_for_one, %% restart the readers if the server dies intensity => 1, period => 5}, @@ -56,7 +56,7 @@ init([Name, Opts]) -> ProviderShutdownTimeout = maps:get(meter_provider_shutdown_timeout, Opts, 5000), MeterServer = #{id => otel_meter_server, - start => {otel_meter_server, start_link, [Name, MeterServerRegName, Opts]}, + start => {otel_meter_server, start_link, [Name, MeterServerRegName, Resource, Opts]}, restart => permanent, shutdown => ProviderShutdownTimeout, type => worker, diff --git a/apps/opentelemetry_experimental/test/otel_metrics_SUITE.erl b/apps/opentelemetry_experimental/test/otel_metrics_SUITE.erl index 2da33f098..7fb4217a7 100644 --- a/apps/opentelemetry_experimental/test/otel_metrics_SUITE.erl +++ b/apps/opentelemetry_experimental/test/otel_metrics_SUITE.erl @@ -83,7 +83,7 @@ all() -> kill_reader, kill_server, observable_counter, observable_updown_counter, observable_gauge, multi_instrument_callback, using_macros, float_counter, float_updown_counter, float_histogram, sync_filtered_attributes, async_filtered_attributes, delta_observable_counter, - bad_observable_return + bad_observable_return, default_resource ]. init_per_suite(Config) -> @@ -185,6 +185,14 @@ end_per_testcase(_, _Config) -> application:unload(opentelemetry_experimental), ok. +default_resource(_Config) -> + Resource = otel_meter_provider:resource(), + + ?assertMatch(#{'process.executable.name' := <<"erl">>}, + otel_attributes:map(otel_resource:attributes(Resource))), + + ok. + using_macros(_Config) -> DefaultMeter = otel_meter_default,