58
58
MetricsExporter ,
59
59
MetricsExportResult ,
60
60
)
61
+ from opentelemetry .sdk .metrics .export .aggregate import (
62
+ HistogramAggregator ,
63
+ LastValueAggregator ,
64
+ MinMaxSumCountAggregator ,
65
+ SumAggregator ,
66
+ ValueObserverAggregator ,
67
+ )
61
68
62
69
logger = logging .getLogger (__name__ )
63
70
DataPointT = TypeVar ("DataPointT" , IntDataPoint , DoubleDataPoint )
64
71
65
72
66
73
def _get_data_points (
67
- sdk_metric : MetricRecord , data_point_class : Type [DataPointT ]
74
+ sdk_metric_record : MetricRecord , data_point_class : Type [DataPointT ]
68
75
) -> List [DataPointT ]:
69
76
70
- data_points = []
71
-
72
- for (
73
- label ,
74
- bound_counter ,
75
- ) in sdk_metric .instrument .bound_instruments .items ():
76
-
77
- string_key_values = []
78
-
79
- for label_key , label_value in label :
80
- string_key_values .append (
81
- StringKeyValue (key = label_key , value = label_value )
82
- )
83
-
84
- for view_data in bound_counter .view_datas :
85
-
86
- if view_data .labels == label :
87
-
88
- data_points .append (
89
- data_point_class (
90
- labels = string_key_values ,
91
- value = view_data .aggregator .current ,
92
- start_time_unix_nano = (
93
- view_data .aggregator .last_checkpoint_timestamp
94
- ),
95
- time_unix_nano = (
96
- view_data .aggregator .last_update_timestamp
97
- ),
98
- )
99
- )
100
- break
101
-
102
- return data_points
77
+ if isinstance (sdk_metric_record .aggregator , SumAggregator ):
78
+ value = sdk_metric_record .aggregator .checkpoint
79
+
80
+ elif isinstance (sdk_metric_record .aggregator , MinMaxSumCountAggregator ):
81
+ # FIXME: How are values to be interpreted from this aggregator?
82
+ raise Exception ("MinMaxSumCount aggregator data not supported" )
83
+
84
+ elif isinstance (sdk_metric_record .aggregator , HistogramAggregator ):
85
+ # FIXME: How are values to be interpreted from this aggregator?
86
+ raise Exception ("Histogram aggregator data not supported" )
87
+
88
+ elif isinstance (sdk_metric_record .aggregator , LastValueAggregator ):
89
+ value = sdk_metric_record .aggregator .checkpoint
90
+
91
+ elif isinstance (sdk_metric_record .aggregator , ValueObserverAggregator ):
92
+ value = sdk_metric_record .aggregator .checkpoint .last
93
+
94
+ return [
95
+ data_point_class (
96
+ labels = [
97
+ StringKeyValue (key = str (label_key ), value = str (label_value ))
98
+ for label_key , label_value in sdk_metric_record .labels
99
+ ],
100
+ value = value ,
101
+ start_time_unix_nano = (
102
+ sdk_metric_record .aggregator .initial_checkpoint_timestamp
103
+ ),
104
+ time_unix_nano = (
105
+ sdk_metric_record .aggregator .last_update_timestamp
106
+ ),
107
+ )
108
+ ]
103
109
104
110
105
111
class OTLPMetricsExporter (
@@ -179,13 +185,13 @@ def _translate_data(
179
185
# SumObserver Sum(aggregation_temporality=cumulative;is_monotonic=true)
180
186
# UpDownSumObserver Sum(aggregation_temporality=cumulative;is_monotonic=false)
181
187
# ValueObserver Gauge()
182
- for sdk_metric in data :
188
+ for sdk_metric_record in data :
183
189
184
- if sdk_metric .resource not in (
190
+ if sdk_metric_record .resource not in (
185
191
sdk_resource_instrumentation_library_metrics .keys ()
186
192
):
187
193
sdk_resource_instrumentation_library_metrics [
188
- sdk_metric .resource
194
+ sdk_metric_record .resource
189
195
] = InstrumentationLibraryMetrics ()
190
196
191
197
type_class = {
@@ -204,70 +210,82 @@ def _translate_data(
204
210
},
205
211
}
206
212
207
- value_type = sdk_metric .instrument .value_type
213
+ value_type = sdk_metric_record .instrument .value_type
208
214
209
215
sum_class = type_class [value_type ]["sum" ]["class" ]
210
216
gauge_class = type_class [value_type ]["gauge" ]["class" ]
211
217
data_point_class = type_class [value_type ]["data_point_class" ]
212
218
213
- if isinstance (sdk_metric .instrument , Counter ):
219
+ if isinstance (sdk_metric_record .instrument , Counter ):
214
220
otlp_metric_data = sum_class (
215
- data_points = _get_data_points (sdk_metric , data_point_class ),
221
+ data_points = _get_data_points (
222
+ sdk_metric_record , data_point_class
223
+ ),
216
224
aggregation_temporality = (
217
225
AggregationTemporality .AGGREGATION_TEMPORALITY_DELTA
218
226
),
219
227
is_monotonic = True ,
220
228
)
221
229
argument = type_class [value_type ]["sum" ]["argument" ]
222
230
223
- elif isinstance (sdk_metric .instrument , UpDownCounter ):
231
+ elif isinstance (sdk_metric_record .instrument , UpDownCounter ):
224
232
otlp_metric_data = sum_class (
225
- data_points = _get_data_points (sdk_metric , data_point_class ),
233
+ data_points = _get_data_points (
234
+ sdk_metric_record , data_point_class
235
+ ),
226
236
aggregation_temporality = (
227
237
AggregationTemporality .AGGREGATION_TEMPORALITY_DELTA
228
238
),
229
239
is_monotonic = False ,
230
240
)
231
241
argument = type_class [value_type ]["sum" ]["argument" ]
232
242
233
- elif isinstance (sdk_metric .instrument , (ValueRecorder )):
243
+ elif isinstance (sdk_metric_record .instrument , (ValueRecorder )):
234
244
logger .warning ("Skipping exporting of ValueRecorder metric" )
235
245
continue
236
246
237
- elif isinstance (sdk_metric .instrument , SumObserver ):
247
+ elif isinstance (sdk_metric_record .instrument , SumObserver ):
238
248
otlp_metric_data = sum_class (
239
- data_points = _get_data_points (sdk_metric , data_point_class ),
249
+ data_points = _get_data_points (
250
+ sdk_metric_record , data_point_class
251
+ ),
240
252
aggregation_temporality = (
241
253
AggregationTemporality .AGGREGATION_TEMPORALITY_CUMULATIVE
242
254
),
243
255
is_monotonic = True ,
244
256
)
245
257
argument = type_class [value_type ]["sum" ]["argument" ]
246
258
247
- elif isinstance (sdk_metric .instrument , UpDownSumObserver ):
259
+ elif isinstance (sdk_metric_record .instrument , UpDownSumObserver ):
248
260
otlp_metric_data = sum_class (
249
- data_points = _get_data_points (sdk_metric , data_point_class ),
261
+ data_points = _get_data_points (
262
+ sdk_metric_record , data_point_class
263
+ ),
250
264
aggregation_temporality = (
251
265
AggregationTemporality .AGGREGATION_TEMPORALITY_CUMULATIVE
252
266
),
253
267
is_monotonic = False ,
254
268
)
255
269
argument = type_class [value_type ]["sum" ]["argument" ]
256
270
257
- elif isinstance (sdk_metric .instrument , (ValueObserver )):
271
+ elif isinstance (sdk_metric_record .instrument , (ValueObserver )):
258
272
otlp_metric_data = gauge_class (
259
- data_points = _get_data_points (sdk_metric , data_point_class )
273
+ data_points = _get_data_points (
274
+ sdk_metric_record , data_point_class
275
+ )
260
276
)
261
277
argument = type_class [value_type ]["gauge" ]["argument" ]
262
278
263
279
sdk_resource_instrumentation_library_metrics [
264
- sdk_metric .resource
280
+ sdk_metric_record .resource
265
281
].metrics .append (
266
282
OTLPMetric (
267
283
** {
268
- "name" : sdk_metric .instrument .name ,
269
- "description" : sdk_metric .instrument .description ,
270
- "unit" : sdk_metric .instrument .unit ,
284
+ "name" : sdk_metric_record .instrument .name ,
285
+ "description" : (
286
+ sdk_metric_record .instrument .description
287
+ ),
288
+ "unit" : sdk_metric_record .instrument .unit ,
271
289
argument : otlp_metric_data ,
272
290
}
273
291
)
0 commit comments