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



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



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



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

def null?
  return !@connection
end