@@ -1173,11 +1173,157 @@ impl<T> ExemplarBuilder<T> {
11731173#[ cfg( test) ]
11741174mod tests {
11751175
1176- use super :: { Exemplar , ExponentialHistogramDataPoint , HistogramDataPoint , SumDataPoint } ;
1176+ use super :: * ;
11771177
11781178 use opentelemetry:: time:: now;
11791179 use opentelemetry:: KeyValue ;
11801180
1181+ #[ test]
1182+ fn build_resource_metrics_full_tree ( ) {
1183+ let time = now ( ) ;
1184+ let exemplar = Exemplar :: builder ( 1.0_f64 , time)
1185+ . with_filtered_attributes ( vec ! [ KeyValue :: new( "filtered" , "attr" ) ] )
1186+ . with_span_id ( [ 1 ; 8 ] )
1187+ . with_trace_id ( [ 2 ; 16 ] )
1188+ . build ( ) ;
1189+
1190+ let gauge_dp = GaugeDataPoint :: builder ( 42.0_f64 )
1191+ . with_attributes ( vec ! [ KeyValue :: new( "host" , "localhost" ) ] )
1192+ . with_exemplars ( vec ! [ exemplar] )
1193+ . build ( ) ;
1194+
1195+ let gauge = Gauge :: builder ( vec ! [ gauge_dp] , time)
1196+ . with_start_time ( time)
1197+ . build ( ) ;
1198+
1199+ let metric = Metric :: builder ( "my_gauge" , AggregatedMetrics :: F64 ( MetricData :: Gauge ( gauge) ) )
1200+ . with_description ( "a test gauge" )
1201+ . with_unit ( "ms" )
1202+ . build ( ) ;
1203+
1204+ let scope_metrics = ScopeMetrics :: builder ( )
1205+ . with_metrics ( vec ! [ metric] )
1206+ . build ( ) ;
1207+
1208+ let rm = ResourceMetrics :: builder ( )
1209+ . with_resource ( Resource :: builder ( ) . build ( ) )
1210+ . with_scope_metrics ( vec ! [ scope_metrics] )
1211+ . build ( ) ;
1212+
1213+ assert_eq ! ( rm. scope_metrics( ) . count( ) , 1 ) ;
1214+ let sm = rm. scope_metrics ( ) . next ( ) . unwrap ( ) ;
1215+ assert_eq ! ( sm. metrics( ) . count( ) , 1 ) ;
1216+ let m = sm. metrics ( ) . next ( ) . unwrap ( ) ;
1217+ assert_eq ! ( m. name( ) , "my_gauge" ) ;
1218+ assert_eq ! ( m. description( ) , "a test gauge" ) ;
1219+ assert_eq ! ( m. unit( ) , "ms" ) ;
1220+ }
1221+
1222+ #[ test]
1223+ fn build_sum_with_data_points ( ) {
1224+ let time = now ( ) ;
1225+ let dp = SumDataPoint :: builder ( 100_i64 )
1226+ . with_attributes ( vec ! [ KeyValue :: new( "key" , "value" ) ] )
1227+ . build ( ) ;
1228+
1229+ let sum = Sum :: builder (
1230+ vec ! [ dp] ,
1231+ Temporality :: Cumulative ,
1232+ true ,
1233+ time,
1234+ time,
1235+ )
1236+ . build ( ) ;
1237+
1238+ assert_eq ! ( sum. data_points( ) . count( ) , 1 ) ;
1239+ assert ! ( sum. is_monotonic( ) ) ;
1240+ assert_eq ! ( sum. temporality( ) , Temporality :: Cumulative ) ;
1241+ let dp = sum. data_points ( ) . next ( ) . unwrap ( ) ;
1242+ assert_eq ! ( dp. value( ) , 100 ) ;
1243+ assert_eq ! ( dp. attributes( ) . count( ) , 1 ) ;
1244+ }
1245+
1246+ #[ test]
1247+ fn build_histogram_with_optional_fields ( ) {
1248+ let time = now ( ) ;
1249+ let dp = HistogramDataPoint :: builder ( 10 , 42.0_f64 , vec ! [ 5.0 , 10.0 ] , vec ! [ 3 , 5 , 2 ] )
1250+ . with_attributes ( vec ! [ KeyValue :: new( "key" , "val" ) ] )
1251+ . with_min ( 1.0 )
1252+ . with_max ( 20.0 )
1253+ . build ( ) ;
1254+
1255+ let histogram = Histogram :: builder ( vec ! [ dp] , Temporality :: Delta , time, time) . build ( ) ;
1256+
1257+ assert_eq ! ( histogram. data_points( ) . count( ) , 1 ) ;
1258+ assert_eq ! ( histogram. temporality( ) , Temporality :: Delta ) ;
1259+ let dp = histogram. data_points ( ) . next ( ) . unwrap ( ) ;
1260+ assert_eq ! ( dp. count( ) , 10 ) ;
1261+ assert_eq ! ( dp. sum( ) , 42.0 ) ;
1262+ assert_eq ! ( dp. min( ) , Some ( 1.0 ) ) ;
1263+ assert_eq ! ( dp. max( ) , Some ( 20.0 ) ) ;
1264+ assert_eq ! ( dp. bounds( ) . collect:: <Vec <_>>( ) , vec![ 5.0 , 10.0 ] ) ;
1265+ assert_eq ! ( dp. bucket_counts( ) . collect:: <Vec <_>>( ) , vec![ 3 , 5 , 2 ] ) ;
1266+ }
1267+
1268+ #[ test]
1269+ fn build_exponential_histogram ( ) {
1270+ let time = now ( ) ;
1271+ let dp = ExponentialHistogramDataPoint :: builder (
1272+ 5 ,
1273+ 100.0_f64 ,
1274+ 3 ,
1275+ 1 ,
1276+ ExponentialBucket :: new ( 0 , vec ! [ 1 , 2 , 3 ] ) ,
1277+ ExponentialBucket :: new ( 0 , vec ! [ 4 , 5 ] ) ,
1278+ )
1279+ . with_attributes ( vec ! [ KeyValue :: new( "key" , "val" ) ] )
1280+ . with_min ( 10.0 )
1281+ . with_max ( 50.0 )
1282+ . with_zero_threshold ( 0.001 )
1283+ . build ( ) ;
1284+
1285+ let eh = ExponentialHistogram :: builder ( vec ! [ dp] , Temporality :: Cumulative , time, time) . build ( ) ;
1286+
1287+ assert_eq ! ( eh. data_points( ) . count( ) , 1 ) ;
1288+ let dp = eh. data_points ( ) . next ( ) . unwrap ( ) ;
1289+ assert_eq ! ( dp. count( ) , 5 ) ;
1290+ assert_eq ! ( dp. scale( ) , 3 ) ;
1291+ assert_eq ! ( dp. zero_count( ) , 1 ) ;
1292+ assert_eq ! ( dp. sum( ) , 100.0 ) ;
1293+ assert_eq ! ( dp. min( ) , Some ( 10.0 ) ) ;
1294+ assert_eq ! ( dp. max( ) , Some ( 50.0 ) ) ;
1295+ assert ! ( ( dp. zero_threshold( ) - 0.001 ) . abs( ) < f64 :: EPSILON ) ;
1296+ assert_eq ! ( dp. positive_bucket( ) . offset( ) , 0 ) ;
1297+ assert_eq ! ( dp. positive_bucket( ) . counts( ) . collect:: <Vec <_>>( ) , vec![ 1 , 2 , 3 ] ) ;
1298+ assert_eq ! ( dp. negative_bucket( ) . counts( ) . collect:: <Vec <_>>( ) , vec![ 4 , 5 ] ) ;
1299+ }
1300+
1301+ #[ test]
1302+ fn build_exemplar_with_defaults ( ) {
1303+ let time = now ( ) ;
1304+ let exemplar = Exemplar :: builder ( 42.0_f64 , time) . build ( ) ;
1305+
1306+ assert_eq ! ( exemplar. value, 42.0 ) ;
1307+ assert_eq ! ( exemplar. time( ) , time) ;
1308+ assert_eq ! ( exemplar. span_id( ) , & [ 0 ; 8 ] ) ;
1309+ assert_eq ! ( exemplar. trace_id( ) , & [ 0 ; 16 ] ) ;
1310+ assert_eq ! ( exemplar. filtered_attributes( ) . count( ) , 0 ) ;
1311+ }
1312+
1313+ #[ test]
1314+ fn build_defaults_without_optional_fields ( ) {
1315+ let rm = ResourceMetrics :: builder ( ) . build ( ) ;
1316+ assert_eq ! ( rm. scope_metrics( ) . count( ) , 0 ) ;
1317+
1318+ let sm = ScopeMetrics :: builder ( ) . build ( ) ;
1319+ assert_eq ! ( sm. metrics( ) . count( ) , 0 ) ;
1320+
1321+ let dp = GaugeDataPoint :: builder ( 0.0_f64 ) . build ( ) ;
1322+ assert_eq ! ( dp. value( ) , 0.0 ) ;
1323+ assert_eq ! ( dp. attributes( ) . count( ) , 0 ) ;
1324+ assert_eq ! ( dp. exemplars( ) . count( ) , 0 ) ;
1325+ }
1326+
11811327 #[ test]
11821328 fn validate_cloning_data_points ( ) {
11831329 let data_type = SumDataPoint {
0 commit comments