@@ -83,7 +83,7 @@ all() ->
83
83
kill_reader , kill_server , observable_counter , observable_updown_counter , observable_gauge ,
84
84
multi_instrument_callback , using_macros , float_counter , float_updown_counter , float_histogram ,
85
85
sync_filtered_attributes , async_filtered_attributes , delta_observable_counter ,
86
- bad_observable_return , default_resource
86
+ bad_observable_return , default_resource , advisory_params
87
87
].
88
88
89
89
init_per_suite (Config ) ->
@@ -1130,3 +1130,87 @@ bad_observable_return(_Config) ->
1130
1130
? assertSumReceive (CounterName2 , <<" observable counter 2 description" >>, kb , [{8 , #{}}]),
1131
1131
1132
1132
ok .
1133
+
1134
+ advisory_params (_Config ) ->
1135
+ DefaultMeter = otel_meter_default ,
1136
+
1137
+ Meter = opentelemetry_experimental :get_meter (),
1138
+ ? assertMatch ({DefaultMeter , _ }, Meter ),
1139
+
1140
+ % explicit_bucket_boundaries allowed only for histograms
1141
+ Counter = otel_counter :create (Meter , invalid_1 ,
1142
+ #{advisory_params => #{explicit_bucket_boundaries => [1 , 2 , 3 ]}}),
1143
+ ? assertEqual (Counter # instrument .advisory_params , #{}),
1144
+
1145
+ % advisory parameters different from explicit_bucket_boundaries are not allowed
1146
+ Counter1 = otel_counter :create (Meter , invalid_2 , #{advisory_params => #{invalid => invalid }}),
1147
+ ? assertEqual (Counter1 # instrument .advisory_params , #{}),
1148
+
1149
+ % explicit_bucket_boundaries should be an ordered list of numbers
1150
+ Histo1 = otel_histogram :create (Meter , invalid_3 ,
1151
+ #{advisory_params => #{explicit_bucket_boundaries => invalid }}),
1152
+ ? assertEqual (Histo1 # instrument .advisory_params , #{}),
1153
+
1154
+ Histo2 = otel_histogram :create (Meter , invalid_4 ,
1155
+ #{advisory_params => #{explicit_bucket_boundaries => [2 ,1 ,4 ]}}),
1156
+ ? assertEqual (Histo2 # instrument .advisory_params , #{}),
1157
+
1158
+ % when valid use the explicit_bucket_boundaries from advisory_params if not set in a view
1159
+ Histogram = otel_histogram :create (Meter , a_histogram ,
1160
+ #{advisory_params => #{explicit_bucket_boundaries => [10 , 20 , 30 ]}}),
1161
+ ? assertEqual (Histogram # instrument .advisory_params , #{explicit_bucket_boundaries => [10 , 20 , 30 ]}),
1162
+
1163
+ ? assertEqual (ok , otel_histogram :record (Histogram , 15 , #{<<" a" >> => <<" 1" >>})),
1164
+ ? assertEqual (ok , otel_histogram :record (Histogram , 50 , #{<<" a" >> => <<" 1" >>})),
1165
+ ? assertEqual (ok , otel_histogram :record (Histogram , 26 , #{<<" a" >> => <<" 2" >>})),
1166
+
1167
+ otel_meter_server :force_flush (),
1168
+
1169
+ receive
1170
+ {otel_metric , # metric {name = a_histogram ,
1171
+ data = # histogram {datapoints = Datapoints }}} ->
1172
+ AttributeBuckets =
1173
+ lists :sort ([{Attributes , Buckets , Min , Max , Sum } || # histogram_datapoint {bucket_counts = Buckets ,
1174
+ attributes = Attributes ,
1175
+ min = Min ,
1176
+ max = Max ,
1177
+ sum = Sum } <- Datapoints ]),
1178
+ ? assertEqual ([], [{#{<<" a" >> => <<" 1" >>}, [0 ,1 ,0 ,1 ], 15 , 50 , 65 },
1179
+ {#{<<" a" >> => <<" 2" >>}, [0 ,0 ,1 ,0 ], 26 , 26 , 26 }]
1180
+ -- AttributeBuckets , AttributeBuckets )
1181
+ after
1182
+ 5000 ->
1183
+ ct :fail (histogram_receive_timeout )
1184
+ end ,
1185
+
1186
+ % boundaries from view have precedence
1187
+ ? assert (otel_meter_server :add_view (view , #{instrument_name => b_histogram }, #{
1188
+ aggregation_module => otel_aggregation_histogram_explicit ,
1189
+ aggregation_options => #{boundaries => [10 , 100 ]}})),
1190
+
1191
+ HistogramB = otel_histogram :create (Meter , b_histogram ,
1192
+ #{advisory_params => #{explicit_bucket_boundaries => [10 , 20 , 30 ]}}),
1193
+ ? assertEqual (HistogramB # instrument .advisory_params , #{explicit_bucket_boundaries => [10 , 20 , 30 ]}),
1194
+
1195
+ ? assertEqual (ok , otel_histogram :record (HistogramB , 15 , #{<<" a" >> => <<" 1" >>})),
1196
+ ? assertEqual (ok , otel_histogram :record (HistogramB , 50 , #{<<" a" >> => <<" 1" >>})),
1197
+ ? assertEqual (ok , otel_histogram :record (HistogramB , 26 , #{<<" a" >> => <<" 2" >>})),
1198
+
1199
+ otel_meter_server :force_flush (),
1200
+
1201
+ receive
1202
+ {otel_metric , # metric {name = view ,
1203
+ data = # histogram {datapoints = DatapointsB }}} ->
1204
+ AttributeBucketsB =
1205
+ lists :sort ([{Attributes , Buckets , Min , Max , Sum } || # histogram_datapoint {bucket_counts = Buckets ,
1206
+ attributes = Attributes ,
1207
+ min = Min ,
1208
+ max = Max ,
1209
+ sum = Sum } <- DatapointsB ]),
1210
+ ? assertEqual ([], [{#{<<" a" >> => <<" 1" >>}, [0 ,2 ,0 ], 15 , 50 , 65 },
1211
+ {#{<<" a" >> => <<" 2" >>}, [0 ,1 ,0 ], 26 , 26 , 26 }]
1212
+ -- AttributeBucketsB , AttributeBucketsB )
1213
+ after
1214
+ 1000 ->
1215
+ ct :fail (histogram_receive_timeout )
1216
+ end .
0 commit comments