def __enter__(self): assert self._state == STATE_PENDING # Bail out if the transaction is not enabled. if not self.enabled: return self # Mark transaction as active and update state # used to validate correct usage of class. self._state = STATE_RUNNING # Cache transaction in thread/coroutine local # storage so that it can be accessed from # anywhere in the context of the transaction. try: self.save_transaction() except: # Catch all self._state = STATE_PENDING self.enabled = False raise # Record the start time for transaction. self.start_time = time.time() # Record initial CPU user time. self._cpu_user_time_start = os.times()[0] # Calculate initial thread utilisation factor. # For now we only do this if we know it is an # actual thread and not a greenlet. if not hasattr(sys, "_current_frames") or self.thread_id in sys._current_frames(): thread_instance = threading.currentThread() self._utilization_tracker = utilization_tracker(self.application.name) if self._utilization_tracker: self._utilization_tracker.enter_transaction(thread_instance) self._thread_utilization_start = self._utilization_tracker.utilization_count() # We need to push an object onto the top of the # node stack so that children can reach back and # add themselves as children to the parent. We # can't use ourself though as we then end up # with a reference count cycle which will cause # the destructor to never be called if the # __exit__() function is never called. We # instead push on to the top of the node stack a # dummy time trace object and when done we will # just grab what we need from that. self._node_stack.append(newrelic.api.time_trace.TimeTrace(None)) return self
def __enter__(self): assert(self._state == self.STATE_PENDING) # Bail out if the transaction is not enabled. if not self.enabled: return self # Mark transaction as active and update state # used to validate correct usage of class. self._state = self.STATE_RUNNING # Cache transaction in thread/coroutine local # storage so that it can be accessed from # anywhere in the context of the transaction. try: self.save_transaction() except: # Catch all self._state = self.STATE_PENDING self.enabled = False raise # Record the start time for transaction. self.start_time = time.time() # Record initial CPU user time. self._cpu_user_time_start = os.times()[0] # Calculate initial thread utilisation factor. # For now we only do this if we know it is an # actual thread and not a greenlet. if (not hasattr(sys, '_current_frames') or self.thread_id in sys._current_frames()): thread_instance = threading.currentThread() self._utilization_tracker = utilization_tracker( self.application.name) if self._utilization_tracker: self._utilization_tracker.enter_transaction(thread_instance) self._thread_utilization_start = \ self._utilization_tracker.utilization_count() # We need to push an object onto the top of the # node stack so that children can reach back and # add themselves as children to the parent. We # can't use ourself though as we then end up # with a reference count cycle which will cause # the destructor to never be called if the # __exit__() function is never called. We # instead push on to the top of the node stack a # dummy time trace object and when done we will # just grab what we need from that. self._node_stack.append(Sentinel()) return self