1313# limitations under the License.
1414
1515from datetime import datetime
16+ import logging
17+
1618from opencensus .tags import execution_context
1719
1820
21+ logger = logging .getLogger (__name__ )
22+
23+
1924class MeasurementMap (object ):
2025 """Measurement Map is a map from Measures to measured values
2126 to be recorded at the same time
@@ -33,6 +38,10 @@ def __init__(self, measure_to_view_map, attachments=None):
3338 self ._measurement_map = {}
3439 self ._measure_to_view_map = measure_to_view_map
3540 self ._attachments = attachments
41+ # If the user tries to record a negative value for any measurement,
42+ # refuse to record all measurements from this map. Recording negative
43+ # measurements will become an error in a later release.
44+ self ._invalid = False
3645
3746 @property
3847 def measurement_map (self ):
@@ -51,10 +60,16 @@ def attachments(self):
5160
5261 def measure_int_put (self , measure , value ):
5362 """associates the measure of type Int with the given value"""
63+ if value < 0 :
64+ # Should be an error in a later release.
65+ logger .warning ("Cannot record negative values" )
5466 self ._measurement_map [measure ] = value
5567
5668 def measure_float_put (self , measure , value ):
5769 """associates the measure of type Float with the given value"""
70+ if value < 0 :
71+ # Should be an error in a later release.
72+ logger .warning ("Cannot record negative values" )
5873 self ._measurement_map [measure ] = value
5974
6075 def measure_put_attachment (self , key , value ):
@@ -75,11 +90,27 @@ def measure_put_attachment(self, key, value):
7590
7691 self ._attachments [key ] = value
7792
78- def record (self , tag_map_tags = execution_context . get_current_tag_map () ):
93+ def record (self , tag_map_tags = None ):
7994 """records all the measures at the same time with a tag_map.
8095 tag_map could either be explicitly passed to the method, or implicitly
8196 read from current execution context.
8297 """
98+ if tag_map_tags is None :
99+ tag_map_tags = execution_context .get_current_tag_map ()
100+ if self ._invalid :
101+ logger .warning ("Measurement map has included negative value "
102+ "measurements, refusing to record" )
103+ return
104+ for measure , value in self .measurement_map .items ():
105+ if value < 0 :
106+ self ._invalid = True
107+ logger .warning ("Dropping values, value to record must be "
108+ "non-negative" )
109+ logger .info ("Measure '{}' has negative value ({}), refusing "
110+ "to record measurements from {}"
111+ .format (measure .name , value , self ))
112+ return
113+
83114 self .measure_to_view_map .record (
84115 tags = tag_map_tags ,
85116 measurement_map = self .measurement_map ,
0 commit comments