26
26
class LabelSet (metrics_api .LabelSet ):
27
27
"""See `opentelemetry.metrics.LabelSet."""
28
28
29
- def __init__ (
30
- self ,
31
- meter : "Meter" = None ,
32
- labels : Dict [str , str ] = None ,
33
- encoded : str = "" ,
34
- ):
35
- self .meter = meter
29
+ def __init__ (self , labels : Dict [str , str ] = None ):
36
30
self .labels = labels
37
- self .encoded = encoded
38
31
39
32
40
33
class BaseHandle :
@@ -110,7 +103,6 @@ def __init__(
110
103
description : str ,
111
104
unit : str ,
112
105
value_type : Type [metrics_api .ValueT ],
113
- meter : "Meter" ,
114
106
label_keys : Sequence [str ] = None ,
115
107
enabled : bool = True ,
116
108
monotonic : bool = False ,
@@ -119,39 +111,21 @@ def __init__(
119
111
self .description = description
120
112
self .unit = unit
121
113
self .value_type = value_type
122
- self .meter = meter
123
114
self .label_keys = label_keys
124
115
self .enabled = enabled
125
116
self .monotonic = monotonic
126
117
self .handles = {}
127
118
128
119
def get_handle (self , label_set : LabelSet ) -> BaseHandle :
129
120
"""See `opentelemetry.metrics.Metric.get_handle`."""
130
- lable_set_for = self ._label_set_for (label_set )
131
- handle = self .handles .get (lable_set_for .encoded )
121
+ handle = self .handles .get (label_set )
132
122
if not handle :
133
123
handle = self .HANDLE_TYPE (
134
124
self .value_type , self .enabled , self .monotonic
135
125
)
136
- self .handles [lable_set_for . encoded ] = handle
126
+ self .handles [label_set ] = handle
137
127
return handle
138
128
139
- def _label_set_for (self , label_set : LabelSet ) -> LabelSet :
140
- """Returns an appropriate `LabelSet` based off this metric's `meter`
141
-
142
- If this metric's `meter` is the same as label_set's meter, that means
143
- label_set was created from this metric's `meter` instance and the
144
- proper handle can be found. If not, label_set was created using a
145
- different `meter` implementation, in which the metric cannot interpret.
146
- In this case, return the `EMPTY_LABEL_SET`.
147
-
148
- Args:
149
- label_set: The `LabelSet` to check for the same `Meter` implentation.
150
- """
151
- if label_set .meter and label_set .meter is self .meter :
152
- return label_set
153
- return EMPTY_LABEL_SET
154
-
155
129
def __repr__ (self ):
156
130
return '{}(name="{}", description={})' .format (
157
131
type (self ).__name__ , self .name , self .description
@@ -176,7 +150,6 @@ def __init__(
176
150
description : str ,
177
151
unit : str ,
178
152
value_type : Type [metrics_api .ValueT ],
179
- meter : "Meter" ,
180
153
label_keys : Sequence [str ] = None ,
181
154
enabled : bool = True ,
182
155
monotonic : bool = True ,
@@ -186,7 +159,6 @@ def __init__(
186
159
description ,
187
160
unit ,
188
161
value_type ,
189
- meter ,
190
162
label_keys = label_keys ,
191
163
enabled = enabled ,
192
164
monotonic = monotonic ,
@@ -214,7 +186,6 @@ def __init__(
214
186
description : str ,
215
187
unit : str ,
216
188
value_type : Type [metrics_api .ValueT ],
217
- meter : "Meter" ,
218
189
label_keys : Sequence [str ] = None ,
219
190
enabled : bool = True ,
220
191
monotonic : bool = False ,
@@ -224,7 +195,6 @@ def __init__(
224
195
description ,
225
196
unit ,
226
197
value_type ,
227
- meter ,
228
198
label_keys = label_keys ,
229
199
enabled = enabled ,
230
200
monotonic = monotonic ,
@@ -252,7 +222,6 @@ def __init__(
252
222
description : str ,
253
223
unit : str ,
254
224
value_type : Type [metrics_api .ValueT ],
255
- meter : "Meter" ,
256
225
label_keys : Sequence [str ] = None ,
257
226
enabled : bool = False ,
258
227
monotonic : bool = False ,
@@ -262,7 +231,6 @@ def __init__(
262
231
description ,
263
232
unit ,
264
233
value_type ,
265
- meter ,
266
234
label_keys = label_keys ,
267
235
enabled = enabled ,
268
236
monotonic = monotonic ,
@@ -279,10 +247,26 @@ def record(self, label_set: LabelSet, value: metrics_api.ValueT) -> None:
279
247
EMPTY_LABEL_SET = LabelSet ()
280
248
281
249
250
+ class Encoder :
251
+ def encode (self , dd ):
252
+ pass
253
+
254
+
255
+ class DumbEncoder (Encoder ):
256
+ def encode (self , dd ):
257
+ return tuple (sorted (dd .items ()))
258
+
259
+
260
+ class SmartEncoder (Encoder ):
261
+ def encode (self , dd ):
262
+ return tuple (reversed (sorted (dd .items ())))
263
+
264
+
282
265
class Meter (metrics_api .Meter ):
283
266
"""See `opentelemetry.metrics.Meter`."""
284
267
285
- def __init__ (self ):
268
+ def __init__ (self , encoder = DumbEncoder ):
269
+ self ._encoder = encoder ()
286
270
self .labels = {}
287
271
288
272
def record_batch (
@@ -326,18 +310,9 @@ def get_label_set(self, labels: Dict[str, str]):
326
310
Args:
327
311
labels: The dictionary of label keys to label values.
328
312
"""
329
- if len (labels ) == 0 :
330
- return EMPTY_LABEL_SET
331
- sorted_labels = OrderedDict (sorted (labels .items ()))
332
- # Uses statsd encoding for labels
333
- encoded = "," + "," .join (
334
- "%s=%s" % (key , value ) for (key , value ) in sorted_labels .items ()
335
- )
336
- # If LabelSet exists for this meter in memory, use existing one
337
- if not self .labels .get (encoded ):
338
- self .labels [encoded ] = LabelSet (
339
- self , labels = sorted_labels , encoded = encoded
340
- )
313
+ encoded = self ._encoder .encode (labels )
314
+ if not encoded in self .labels :
315
+ self .labels [encoded ] = LabelSet (self , labels = labels )
341
316
return self .labels [encoded ]
342
317
343
318
0 commit comments