def trace_and_record_stats(self, method_name, fn, *args, **kwargs): __TRACER = execution_context.get_opencensus_tracer() or noop_tracer.NoopTracer() __STATS_RECORDER = stats.Stats().stats_recorder start_time = time.time() tags = tag_map_module.TagMap() tags.insert(key_method, tag_value_module.TagValue(method_name)) mm = __STATS_RECORDER.new_measurement_map() with __TRACER.span(name=method_name) as span: try: return fn(*args, **kwargs) except Exception as e: # an error to record span.status = Status.from_exception(e) # TODO: (@odeke-em) perhaps shorten the exception when added as a tag here? tags.insert(key_error, e.__str__()) # Then finally after recording the exception, re-raise it. raise e else: # Success tags.insert(key_status, "ok") finally: latency_ms = (time.time() - start_time) * 1000 mm.measure_float_put(m_latency_ms, latency_ms) mm.measure_int_put(m_calls, 1) mm.record(tags)
def trace_and_record_stats_with_key_and_value(method_name, fn, key, value, *args, **kwargs): __TRACER = execution_context.get_opencensus_tracer( ) or noop_tracer.NoopTracer() __STATS_RECORDER = stats.stats.stats_recorder start_time = time.time() tags = tag_map.TagMap() tags.insert(key_method, tag_value.TagValue(method_name)) mm = __STATS_RECORDER.new_measurement_map() with __TRACER.span(name=method_name) as span: try: return fn(*args, **kwargs) except Exception as e: span.status = Status.from_exception(e) tags.insert(key_status, "ERROR") tags.insert(key_error, e.__str__()) # Re-raise that exception after we've extracted the error. raise e else: tags.insert(key_status, "OK") finally: latency_ms = (time.time() - start_time) * 1e3 mm.measure_float_put(m_latency_ms, latency_ms) key_lengths = heuristical_lengths(key) value_lengths = heuristical_lengths(value) for key_length in key_lengths: mm.measure_int_put(m_key_length, key_length) for value_length in value_lengths: mm.measure_int_put(m_value_length, value_length) mm.record(tags)
def unknown(exception): return Status.from_exception(exception)