1
1
use opentelemetry:: metrics:: Unit ;
2
2
use opentelemetry:: Key ;
3
3
use opentelemetry:: { metrics:: MeterProvider as _, KeyValue } ;
4
- use opentelemetry_sdk:: metrics:: { Instrument , MeterProvider , PeriodicReader , Stream } ;
4
+ use opentelemetry_sdk:: metrics:: { Aggregation , Instrument , MeterProvider , PeriodicReader , Stream } ;
5
5
use opentelemetry_sdk:: { runtime, Resource } ;
6
6
use std:: error:: Error ;
7
7
@@ -28,7 +28,25 @@ fn init_meter_provider() -> MeterProvider {
28
28
}
29
29
} ;
30
30
31
- let exporter = opentelemetry_stdout:: MetricsExporter :: default ( ) ;
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
+ )
40
+ } else {
41
+ None
42
+ }
43
+ } ;
44
+
45
+ let exporter = opentelemetry_stdout:: MetricsExporterBuilder :: default ( )
46
+ // uncomment the below lines to pretty print output.
47
+ // .with_encoder(|writer, data|
48
+ // Ok(serde_json::to_writer_pretty(writer, &data).unwrap()))
49
+ . build ( ) ;
32
50
let reader = PeriodicReader :: builder ( exporter, runtime:: Tokio ) . build ( ) ;
33
51
MeterProvider :: builder ( )
34
52
. with_reader ( reader)
@@ -38,6 +56,7 @@ fn init_meter_provider() -> MeterProvider {
38
56
) ] ) )
39
57
. with_view ( my_view_rename_and_unit)
40
58
. with_view ( my_view_drop_attributes)
59
+ . with_view ( my_view_change_aggregation)
41
60
. build ( )
42
61
}
43
62
@@ -86,6 +105,52 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
86
105
. as_ref ( ) ,
87
106
) ;
88
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.
112
+ let histogram2 = meter
113
+ . f64_histogram ( "my_second_histogram" )
114
+ . with_unit ( Unit :: new ( "ms" ) )
115
+ . with_description ( "My histogram example description" )
116
+ . init ( ) ;
117
+
118
+ // 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
+ . as_ref ( ) ,
130
+ ) ;
131
+
132
+ histogram2. record (
133
+ 1.2 ,
134
+ [
135
+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
136
+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
137
+ KeyValue :: new ( "mykey3" , "myvalue3" ) ,
138
+ KeyValue :: new ( "mykey4" , "myvalue4" ) ,
139
+ ]
140
+ . as_ref ( ) ,
141
+ ) ;
142
+
143
+ histogram2. record (
144
+ 1.23 ,
145
+ [
146
+ KeyValue :: new ( "mykey1" , "myvalue1" ) ,
147
+ KeyValue :: new ( "mykey2" , "myvalue2" ) ,
148
+ KeyValue :: new ( "mykey3" , "myvalue3" ) ,
149
+ KeyValue :: new ( "mykey4" , "myvalue4" ) ,
150
+ ]
151
+ . as_ref ( ) ,
152
+ ) ;
153
+
89
154
// Metrics are exported by default every 30 seconds when using stdout exporter,
90
155
// however shutting down the MeterProvider here instantly flushes
91
156
// the metrics, instead of waiting for the 30 sec interval.
0 commit comments