11use opentelemetry:: global;
2- use opentelemetry:: Key ;
32use opentelemetry:: KeyValue ;
4- use opentelemetry_sdk:: metrics:: { Aggregation , Instrument , SdkMeterProvider , Stream , Temporality } ;
3+ use opentelemetry_sdk:: metrics:: { Instrument , SdkMeterProvider , Stream , Temporality } ;
54use opentelemetry_sdk:: Resource ;
65use std:: error:: Error ;
76
87fn init_meter_provider ( ) -> opentelemetry_sdk:: metrics:: SdkMeterProvider {
98 // for example 1
109 let my_view_rename_and_unit = |i : & Instrument | {
11- if i. name == "my_histogram" {
10+ if i. name ( ) == "my_histogram" {
1211 Some (
13- Stream :: new ( )
14- . name ( "my_histogram_renamed" )
15- . unit ( "milliseconds" ) ,
12+ Stream :: builder ( )
13+ . with_name ( "my_histogram_renamed" )
14+ . with_unit ( "milliseconds" )
15+ . build ( )
16+ . unwrap ( ) ,
1617 )
1718 } else {
1819 None
1920 }
2021 } ;
2122
2223 // for example 2
23- let my_view_drop_attributes = |i : & Instrument | {
24- if i. name == "my_counter" {
25- Some ( Stream :: new ( ) . allowed_attribute_keys ( vec ! [ Key :: from( "mykey1" ) ] ) )
26- } else {
27- None
28- }
29- } ;
30-
31- // for example 3
32- let my_view_change_aggregation = |i : & Instrument | {
33- if i. name == "my_second_histogram" {
34- Some (
35- Stream :: new ( ) . aggregation ( Aggregation :: ExplicitBucketHistogram {
36- boundaries : vec ! [ 0.9 , 1.0 , 1.1 , 1.2 , 1.3 , 1.4 , 1.5 ] ,
37- record_min_max : false ,
38- } ) ,
39- )
24+ let my_view_change_cardinality = |i : & Instrument | {
25+ if i. name ( ) == "my_second_histogram" {
26+ // Note: If Stream is invalid, build() will return an error. By
27+ // calling `.ok()`, any such error is ignored and treated as if the
28+ // view does not match the instrument. If this is not the desired
29+ // behavior, consider handling the error explicitly.
30+ Stream :: builder ( ) . with_cardinality_limit ( 2 ) . build ( ) . ok ( )
4031 } else {
4132 None
4233 }
@@ -55,8 +46,7 @@ fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
5546 . with_periodic_exporter ( exporter)
5647 . with_resource ( resource)
5748 . with_view ( my_view_rename_and_unit)
58- . with_view ( my_view_drop_attributes)
59- . with_view ( my_view_change_aggregation)
49+ . with_view ( my_view_change_cardinality)
6050 . build ( ) ;
6151 global:: set_meter_provider ( provider. clone ( ) ) ;
6252 provider
@@ -88,65 +78,31 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
8878 ] ,
8979 ) ;
9080
91- // Example 2 - Drop unwanted attributes using view.
92- let counter = meter. u64_counter ( "my_counter" ) . build ( ) ;
93-
94- // Record measurements using the Counter instrument.
95- // Though we are passing 4 attributes here, only 1 will be used
96- // for aggregation as view is configured to use only "mykey1"
97- // attribute.
98- counter. add (
99- 10 ,
100- & [
101- KeyValue :: new ( "mykey1" , "myvalue1" ) ,
102- KeyValue :: new ( "mykey2" , "myvalue2" ) ,
103- KeyValue :: new ( "mykey3" , "myvalue3" ) ,
104- KeyValue :: new ( "mykey4" , "myvalue4" ) ,
105- ] ,
106- ) ;
107-
108- // Example 3 - Change Aggregation configuration using View.
109- // Histograms are by default aggregated using ExplicitBucketHistogram
110- // with default buckets. The configured view will change the aggregation to
111- // use a custom set of boundaries, and min/max values will not be recorded.
81+ // Example 2 - Change cardinality using View.
11282 let histogram2 = meter
11383 . f64_histogram ( "my_second_histogram" )
11484 . with_unit ( "ms" )
11585 . with_description ( "My histogram example description" )
11686 . build ( ) ;
11787
11888 // Record measurements using the histogram instrument.
119- // The values recorded are in the range of 1.2 to 1.5, warranting
120- // the change of boundaries.
121- histogram2. record (
122- 1.5 ,
123- & [
124- KeyValue :: new ( "mykey1" , "myvalue1" ) ,
125- KeyValue :: new ( "mykey2" , "myvalue2" ) ,
126- KeyValue :: new ( "mykey3" , "myvalue3" ) ,
127- KeyValue :: new ( "mykey4" , "myvalue4" ) ,
128- ] ,
129- ) ;
89+ // This metric will have a cardinality limit of 2,
90+ // as set in the view. Because of this, only the first two
91+ // measurements will be recorded, and the rest will be folded
92+ // into the overflow attribute.
93+ histogram2. record ( 1.5 , & [ KeyValue :: new ( "mykey1" , "v1" ) ] ) ;
13094
131- histogram2. record (
132- 1.2 ,
133- & [
134- KeyValue :: new ( "mykey1" , "myvalue1" ) ,
135- KeyValue :: new ( "mykey2" , "myvalue2" ) ,
136- KeyValue :: new ( "mykey3" , "myvalue3" ) ,
137- KeyValue :: new ( "mykey4" , "myvalue4" ) ,
138- ] ,
139- ) ;
95+ histogram2. record ( 1.2 , & [ KeyValue :: new ( "mykey1" , "v2" ) ] ) ;
14096
141- histogram2. record (
142- 1.23 ,
143- & [
144- KeyValue :: new ( "mykey1" , "myvalue1" ) ,
145- KeyValue :: new ( "mykey2 " , "myvalue2" ) ,
146- KeyValue :: new ( "mykey3" , "myvalue3" ) ,
147- KeyValue :: new ( "mykey4 " , "myvalue4" ) ,
148- ] ,
149- ) ;
97+ histogram2. record ( 1.23 , & [ KeyValue :: new ( "mykey1" , "v3" ) ] ) ;
98+
99+ histogram2 . record ( 1.4 , & [ KeyValue :: new ( "mykey1" , "v4" ) ] ) ;
100+
101+ histogram2 . record ( 1.6 , & [ KeyValue :: new ( "mykey1 " , "v5" ) ] ) ;
102+
103+ histogram2 . record ( 1.7 , & [ KeyValue :: new ( "mykey1 " , "v6" ) ] ) ;
104+
105+ histogram2 . record ( 1.8 , & [ KeyValue :: new ( "mykey1" , "v7" ) ] ) ;
150106
151107 // Metrics are exported by default every 30 seconds when using stdout exporter,
152108 // however shutting down the MeterProvider here instantly flushes
0 commit comments