Class: PhusionPassenger::AnalyticsLogger::Log

Inherits:
Object
  • Object
show all
Defined in:
lib/phusion_passenger/analytics_logger.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection = nil, txn_id = nil) ⇒ Log

Returns a new instance of Log.



41
42
43
44
45
46
47
# File 'lib/phusion_passenger/analytics_logger.rb', line 41

def initialize(connection = nil, txn_id = nil)
	if connection
		@connection = connection
		@txn_id = txn_id
		connection.ref
	end
end

Instance Attribute Details

#txn_idObject (readonly)

Returns the value of attribute txn_id.



39
40
41
# File 'lib/phusion_passenger/analytics_logger.rb', line 39

def txn_id
  @txn_id
end

Instance Method Details

#begin_measure(name, extra_info = nil) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/phusion_passenger/analytics_logger.rb', line 70

def begin_measure(name, extra_info = nil)
	if extra_info
		extra_info_base64 = [extra_info].pack("m")
		extra_info_base64.gsub!("\n", "")
		extra_info_base64.strip!
	else
		extra_info_base64 = nil
	end
	times = NativeSupport.process_times
	message "BEGIN: #{name} (#{current_timestamp.to_s(36)},#{times.utime.to_s(36)},#{times.stime.to_s(36)}) #{extra_info_base64}"
end

#close(flush_to_disk = false) ⇒ Object



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/phusion_passenger/analytics_logger.rb', line 118

def close(flush_to_disk = false)
	@connection.synchronize do
		begin
			# We need an ACK here. See abstract_request_handler.rb finalize_request.
			@connection.channel.write("closeTransaction", @txn_id,
				AnalyticsLogger.timestamp_string, true)
			result = @connection.channel.read
			if result != ["ok"]
				raise "Expected logging agent to respond with 'ok', but got #{result.inspect} instead"
			end
			if flush_to_disk
				@connection.channel.write("flush")
				result = @connection.channel.read
				if result != ["ok"]
					raise "Invalid logging agent response #{result.inspect} to the 'flush' command"
				end
			end
		rescue SystemCallError, IOError => e
			@connection.disconnect
			DebugLogging.warn("Error communicating with the logging agent: #{e.message}")
		rescue Exception => e
			@connection.disconnect
			raise e
		ensure
			@connection.unref
			@connection = nil
		end
	end if @connection
end

#closed?Boolean

Returns:

  • (Boolean)


148
149
150
151
152
153
154
155
156
# File 'lib/phusion_passenger/analytics_logger.rb', line 148

def closed?
	if @connection
		@connection.synchronize do
			return !@connection.connected?
		end
	else
		return nil
	end
end

#end_measure(name, error_encountered = false) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/phusion_passenger/analytics_logger.rb', line 82

def end_measure(name, error_encountered = false)
	times = NativeSupport.process_times
	if error_encountered
		message "FAIL: #{name} (#{current_timestamp.to_s(36)},#{times.utime.to_s(36)},#{times.stime.to_s(36)})"
	else
		message "END: #{name} (#{current_timestamp.to_s(36)},#{times.utime.to_s(36)},#{times.stime.to_s(36)})"
	end
end

#measure(name, extra_info = nil) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/phusion_passenger/analytics_logger.rb', line 91

def measure(name, extra_info = nil)
	begin_measure(name, extra_info)
	begin
		yield
	rescue Exception
		error = true
		is_closed = closed?
		raise
	ensure
		end_measure(name, error) if !is_closed
	end
end

#measured_time_points(name, begin_time, end_time, extra_info = nil) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/phusion_passenger/analytics_logger.rb', line 104

def measured_time_points(name, begin_time, end_time, extra_info = nil)
	if extra_info
		extra_info_base64 = [extra_info].pack("m")
		extra_info_base64.gsub!("\n", "")
		extra_info_base64.strip!
	else
		extra_info_base64 = nil
	end
	begin_timestamp = begin_time.to_i * 1_000_000 + begin_time.usec
	end_timestamp = end_time.to_i * 1_000_000 + end_time.usec
	message "BEGIN: #{name} (#{begin_timestamp.to_s(36)}) #{extra_info_base64}"
	message "END: #{name} (#{end_timestamp.to_s(36)})"
end

#message(text) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/phusion_passenger/analytics_logger.rb', line 53

def message(text)
	@connection.synchronize do
		return if !@connection.connected?
		begin
			@connection.channel.write("log", @txn_id,
				AnalyticsLogger.timestamp_string)
			@connection.channel.write_scalar(text)
		rescue SystemCallError, IOError => e
			@connection.disconnect
			DebugLogging.warn("Error communicating with the logging agent: #{e.message}")
		rescue Exception => e
			@connection.disconnect
			raise e
		end
	end if @connection
end

#null?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/phusion_passenger/analytics_logger.rb', line 49

def null?
	return !@connection
end