Skip to content

Commit cd2c121

Browse files
authored
Merge branch 'main' into observe-exemplars
2 parents 3bc75dd + 63d338a commit cd2c121

17 files changed

+347
-155
lines changed

apps/opentelemetry/src/otel_configuration.erl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
readers := [#{id := atom(), module => module(), config => map()}],
5454
exemplars_enabled := boolean(),
5555
exemplar_filter := always_on | always_off | trace_based,
56+
metric_producers := [{module(), term()}],
5657

5758
processors := list(),
5859
sampler := {atom(), term()},
@@ -94,6 +95,7 @@ new() ->
9495
readers => [],
9596
exemplars_enabled => false,
9697
exemplar_filter => trace_based,
98+
metric_producers => [],
9799
processors => [{otel_batch_processor, ?BATCH_PROCESSOR_DEFAULTS}],
98100
sampler => {parent_based, #{root => always_on}},
99101
sweeper => #{interval => timer:minutes(10),
@@ -318,6 +320,7 @@ config_mappings(general_sdk) ->
318320
{"OTEL_METRIC_READERS", readers, readers},
319321
{"OTEL_ERLANG_X_EXEMPLARS_ENABLED", exemplars_enabled, boolean},
320322
{"OTEL_METRICS_EXEMPLAR_FILTER", exemplar_filter, exemplar_filter},
323+
{"OTEL_ERLANG_X_METRIC_PRODUCERS", metric_producers, metric_producers},
321324
{"OTEL_RESOURCE_DETECTORS", resource_detectors, existing_atom_list},
322325
{"OTEL_RESOURCE_DETECTOR_TIMEOUT", resource_detector_timeout, integer},
323326

@@ -514,6 +517,14 @@ transform(exemplar_filter, ExemplarFilter) when ExemplarFilter =:= "always_off"
514517
always_off;
515518
transform(exemplar_filter, _) ->
516519
trace_based;
520+
transform(metric_producers, MetricProducers) when is_list(MetricProducers) ->
521+
lists:filtermap(fun({ProducerModule, ProducerConfig}) when is_atom(ProducerModule) ->
522+
{true, {ProducerModule, ProducerConfig}};
523+
(ProducerModule) when is_atom(ProducerModule) ->
524+
{true, {ProducerModule, []}};
525+
(_) ->
526+
false
527+
end, MetricProducers);
517528
transform(views, Views) ->
518529
Views.
519530

apps/opentelemetry/src/otel_simple_processor.erl

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,4 @@ report_cb(#{source := exporter,
266266
exporter := ExporterModule,
267267
stacktrace := StackTrace}) ->
268268
{"exporter threw exception: exporter=~p ~ts",
269-
[ExporterModule, format_exception(Kind, Reason, StackTrace)]}.
270-
271-
-if(?OTP_RELEASE >= 24).
272-
format_exception(Kind, Reason, StackTrace) ->
273-
erl_error:format_exception(Kind, Reason, StackTrace).
274-
-else.
275-
format_exception(Kind, Reason, StackTrace) ->
276-
io_lib:format("~p:~p ~p", [Kind, Reason, StackTrace]).
277-
-endif.
269+
[ExporterModule, otel_utils:format_exception(Kind, Reason, StackTrace)]}.

apps/opentelemetry_api/src/otel_span.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ validate_start_opts(Opts) when is_map(Opts) ->
7272

7373
%% @doc Returns whether the span is recording.
7474
-spec is_recording(SpanCtx) -> boolean() when
75-
SpanCtx :: opentelemetry:span_ctx().
75+
SpanCtx :: opentelemetry:span_ctx() | undefined.
7676
is_recording(SpanCtx) ->
7777
?is_recording(SpanCtx).
7878

apps/opentelemetry_experimental/include/otel_metrics.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
-record(metric,
115115
{
116116
name :: otel_view:name(),
117-
scope :: opentelemetry:instrumentation_scope(),
117+
scope :: opentelemetry:instrumentation_scope() | undefined,
118118
description :: otel_instrument:description(),
119119
unit :: otel_instrument:unit(),
120120
data :: #sum{} | #gauge{} | #histogram{}

apps/opentelemetry_experimental/src/otel_aggregation.erl

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
-module(otel_aggregation).
22

33
-export([maybe_init_aggregate/6,
4-
default_mapping/0,
5-
ets_lookup_element/4]).
4+
default_mapping/0]).
65

76
-include_lib("opentelemetry_api_experimental/include/otel_metrics.hrl").
8-
-include("otel_metrics.hrl").
97
-include("otel_view.hrl").
108

119
%% -type t() :: drop | sum | last_value | histogram.
1210
-type t() :: otel_aggregation_drop:t() | otel_aggregation_sum:t() |
1311
otel_aggregation_last_value:t() | otel_aggregation_histogram_explicit:t().
1412

15-
-type key() :: {atom(), opentelemetry:attributes_map(), reference() | undefined, number()}.
13+
-type key() :: {atom(), opentelemetry:attributes_map(), reference(), number()}.
1614

1715
-type options() :: map().
1816

@@ -43,8 +41,8 @@
4341
Generation :: integer().
4442

4543
maybe_init_aggregate(Ctx, MetricsTab, ExemplarsTab, Stream=#stream{aggregation_module=AggregationModule,
46-
attribute_keys=AttributeKeys},
47-
Value, Attributes) ->
44+
attribute_keys=AttributeKeys},
45+
Value, Attributes) ->
4846
{FilteredAttributes, DroppedAttributes} = filter_attributes(AttributeKeys, Attributes),
4947
case AggregationModule:aggregate(Ctx, MetricsTab, ExemplarsTab, Stream, Value, FilteredAttributes, DroppedAttributes) of
5048
true ->
@@ -80,16 +78,3 @@ split(Keys, Map) ->
8078
{KeptAcc, DroppedAcc}
8179
end
8280
end, {#{}, Map}, Keys).
83-
84-
-if(?OTP_RELEASE >= 26).
85-
ets_lookup_element(Tab, Key, Pos, Default) ->
86-
ets:lookup_element(Tab, Key, Pos, Default).
87-
-else.
88-
ets_lookup_element(Tab, Key, Pos, Default) ->
89-
try
90-
ets:lookup_element(Tab, Key, Pos)
91-
catch
92-
error:badarg ->
93-
Default
94-
end.
95-
-endif.

apps/opentelemetry_experimental/src/otel_aggregation_histogram_explicit.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ default_buckets() ->
149149
init(#stream{name=Name,
150150
reader=ReaderId,
151151
aggregation_options=Options,
152-
forget=Forget}, Attributes) ->
152+
forget=Forget}, Attributes) when is_reference(ReaderId) ->
153153
Generation = case Forget of
154154
true ->
155155
otel_metric_reader:checkpoint_generation(ReaderId);
@@ -174,16 +174,15 @@ aggregate(Ctx, Table, ExemplarsTab, #stream{name=Name,
174174
reader=ReaderId,
175175
aggregation_options=Options,
176176
forget=Forget,
177-
exemplar_reservoir=ExemplarReservoir}, Value, Attributes, DroppedAttributes) ->
177+
exemplar_reservoir=ExemplarReservoir}, Value, Attributes, DroppedAttributes) when is_reference(ReaderId) ->
178178
Generation = case Forget of
179179
true ->
180180
otel_metric_reader:checkpoint_generation(ReaderId);
181181
_ ->
182182
0
183183
end,
184-
Key = {Name, Attributes, ReaderId, Generation},
185184
ExplicitBucketBoundaries = maps:get(explicit_bucket_boundaries, Options, ?DEFAULT_BOUNDARIES),
186-
case otel_aggregation:ets_lookup_element(Table, Key, #explicit_histogram_aggregation.bucket_counts, false) of
185+
case otel_metrics_tables:lookup_explicit_histogram_bucket_counts(Table, Name, Attributes, ReaderId, Generation) of
187186
false ->
188187
%% since we need the options to initialize a histogram `false' is
189188
%% returned and `otel_metric_server' will initialize the histogram
@@ -199,6 +198,7 @@ aggregate(Ctx, Table, ExemplarsTab, #stream{name=Name,
199198
BucketIdx = find_bucket(ExplicitBucketBoundaries, Value),
200199
counters:add(BucketCounts, BucketIdx, 1),
201200

201+
Key = {Name, Attributes, ReaderId, Generation},
202202
MS = ?AGGREATE_MATCH_SPEC(Key, Value, BucketCounts),
203203
case ets:select_replace(Table, MS) of
204204
1 ->

apps/opentelemetry_experimental/src/otel_aggregation_sum.erl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242

4343
init(#stream{name=Name,
4444
reader=ReaderId,
45-
forget=Forget}, Attributes) ->
45+
forget=Forget}, Attributes) when is_reference(ReaderId) ->
4646
Generation = case Forget of
4747
true ->
4848
otel_metric_reader:checkpoint_generation(ReaderId);
@@ -270,8 +270,7 @@ datapoint(Tab, ExemplarReservoir, ExemplarsTab, Time, _, ?TEMPORALITY_DELTA, #su
270270
%% can't use `previous_checkpoint' because with delta metrics have their generation changed
271271
%% at each collection
272272
PreviousCheckpoint =
273-
otel_aggregation:ets_lookup_element(Tab, {Name, Attributes, ReaderId, Generation-1},
274-
#sum_aggregation.checkpoint, 0),
273+
otel_metrics_tables:lookup_sum_checkpoint(Tab, Name, Attributes, ReaderId, Generation-1),
275274
Exemplars = otel_metric_exemplar_reservoir:collect(ExemplarReservoir, ExemplarsTab, Key),
276275
#datapoint{
277276
attributes=Attributes,

apps/opentelemetry_experimental/src/otel_meter_default.erl

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
record/4,
3030
record/5]).
3131

32+
-include_lib("opentelemetry_api/include/opentelemetry.hrl").
3233
-include_lib("kernel/include/logger.hrl").
3334
-include_lib("opentelemetry_api_experimental/include/otel_metrics.hrl").
3435
-include("otel_metrics.hrl").
@@ -44,14 +45,8 @@ create_instrument(Meter, Name, Kind, Opts) ->
4445
_ = otel_meter_server:add_instrument(Provider, Instrument),
4546
Instrument.
4647

47-
lookup_instrument(Meter={_, #meter{instruments_tab=Tab}}, Name) ->
48-
try ets:lookup_element(Tab, {Meter, Name}, 2) of
49-
Instrument ->
50-
Instrument
51-
catch
52-
_:_ ->
53-
undefined
54-
end.
48+
lookup_instrument({_, Meter=#meter{instruments_tab=InstrumentsTab}}, Name) ->
49+
otel_metrics_tables:lookup_instrument(InstrumentsTab, Meter, Name).
5550

5651
-spec create_instrument(otel_meter:t(), otel_instrument:name(), otel_instrument:kind(), otel_instrument:callback(), otel_instrument:callback_args(), otel_instrument:opts()) -> otel_instrument:t().
5752
create_instrument(Meter, Name, Kind, Callback, CallbackArgs, Opts) ->
@@ -67,7 +62,10 @@ register_callback({_, #meter{provider=Provider}}, Instruments, Callback, Callbac
6762
register_callback(_, _, _, _) ->
6863
ok.
6964

65+
-spec scope({module(), #meter{}} | #meter{}) -> opentelemetry:instrumentation_scope() | undefined.
7066
scope({_, #meter{instrumentation_scope=Scope}}) ->
67+
Scope;
68+
scope(#meter{instrumentation_scope=Scope}) ->
7169
Scope.
7270

7371
validate_name(Name) when is_atom(Name) ->
@@ -116,15 +114,11 @@ validate_explicit_bucket_boundaries(Name, Value) ->
116114
record(Ctx, Instrument=#instrument{}, Number) ->
117115
record(Ctx, Instrument, Number, #{}).
118116

119-
record(Ctx, Meter={_,#meter{}}, NameOrInstrument, Number) ->
117+
record(Ctx, Meter={_, #meter{}}, NameOrInstrument, Number) ->
120118
record(Ctx, Meter, NameOrInstrument, Number, #{});
121119

122-
record(Ctx, Instrument=#instrument{meter={_, #meter{streams_tab=StreamTab,
123-
metrics_tab=MetricsTab,
124-
exemplars_tab=ExemplarsTab}}}, Number, Attributes) ->
125-
otel_meter_server:record(Ctx, StreamTab, MetricsTab, ExemplarsTab, Instrument, Number, Attributes).
120+
record(Ctx, Instrument=#instrument{meter={_, Meter=#meter{}}}, Number, Attributes) ->
121+
otel_meter_server:record(Ctx, Meter, Instrument, Number, Attributes).
126122

127-
record(Ctx, Meter={_, #meter{streams_tab=StreamTab,
128-
metrics_tab=MetricsTab,
129-
exemplars_tab=ExemplarsTab}}, NameOrInstrument, Number, Attributes) ->
130-
otel_meter_server:record(Ctx, Meter, StreamTab, MetricsTab, ExemplarsTab, NameOrInstrument, Number, Attributes).
123+
record(Ctx, {_, Meter}, NameOrInstrument, Number, Attributes) ->
124+
otel_meter_server:record(Ctx, Meter, NameOrInstrument, Number, Attributes).

0 commit comments

Comments
 (0)