Module: D13n::Metric::AppHttpMetric::Out

Includes:
Namespace
Defined in:
lib/d13n/metric/metrics/app_http_metric.rb

Instance Method Summary collapse

Methods included from Namespace

#endpoint_metric, #endpoint_status_metric, #get_service_endpoint, #http_basic_tags, #http_error_tags, #http_status_tags, #service_error_metric, #service_metric

Instance Method Details

#collect_error_count(request, response, count = 1, rate = 1.0) ⇒ Object



190
191
192
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 190

def collect_error_count(request, response, count=1, rate=1.0)
  @collector.increment(metric_name('count'), count, sample_rate: rate, tags: http_error_tags(request, response))
end

#collect_request_count(request, count = 1, rate = 1.0) ⇒ Object



182
183
184
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 182

def collect_request_count(request, count=1, rate=1.0)
  @collector.increment(metric_name('count'), count, sample_rate: rate, tags: http_basic_tags(request))
end

#collect_request_timing(request, timing, rate = 1.0) ⇒ Object



194
195
196
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 194

def collect_request_timing(request, timing, rate=1.0)
  @collector.measure(metric_name('timing'), timing, sample_rate: rate, tags: http_basic_tags(request))
end

#collect_status_count(request, response, count = 1, rate = 1.0) ⇒ Object



186
187
188
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 186

def collect_status_count(request, response, count=1, rate=1.0)
  @collector.increment(metric_name('count'), count, sample_rate: rate, tags: http_status_tags(request, response))
end

#finish(state, t0, node, request, response) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 143

def finish(state, t0, node, request, response)
  unless t0
    D13n.logger.error("HTTP request process finished metric without start time. This is probably a bug.")
    return
  end

  unless request
    D13n.logger.error("HTTP request process finished metric without request. This is probably a bug.")
  end
  
  t1 = Time.now
  duration = t1.to_f - t0.to_f
  
  begin
    scoped_metric = get_service_endpoint(request).join('.')
    node.name = scoped_metric if node
    if response
      collect_error_count(request, response) if response.is_a? Exception
      if response.is_a? Net::HTTPResponse
        collect_status_count(request, response)
        collect_request_timing(request, duration)
      end
    else
      collect_request_count(request)
    end
  ensure
    if node
      stack = state.traced_span_stack
      stack.pop_frame(state, node, scoped_metric, t1)
    end
  end
rescue ServiceNotFound, EndpointNotFound => e
  D13n.logger.debug "service or endpoind not found while collect HTTP metric:", e.message
rescue HTTPMetricError => e
  D13n.logger.debug "while collect HTTP metric", e.message
rescue => e
  D13n.logger.error "Uncaught exception while finishing an HTTP request metric", e
end

#inject_request_headers(state, request) ⇒ Object



133
134
135
136
137
138
139
140
141
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 133

def inject_request_headers(state, request)
  stream = state.current_stream

  state.is_cross_app_caller = true
  if stream
    request[StreamState::D13N_STREAM_HEADER] = state.referring_stream_id || stream.uuid
  end
  request[StreamState::D13N_APP_HEADER] = D13n.app_name        
end

#process(request, collectable = true) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 104

def process(request, collectable=true)
  state =  D13n::Metric::StreamState.st_get

  return yield unless collectable && Helper.http_out_tracable?

  t0 = Time.now
  begin
    node = start(state, t0, request)
    response = yield
  rescue ServiceNotFound => err
    D13n.logger.error err.message
  rescue Exception => err
    D13n.logger.debug 'Unexpected exception raise while processing HTTP request metric', err
  ensure
    finish(state, t0, node, request, response || err)
  end
  return response
end

#start(state, t0, request) ⇒ Object



123
124
125
126
127
128
129
130
131
# File 'lib/d13n/metric/metrics/app_http_metric.rb', line 123

def start(state, t0, request)
  inject_request_headers(state, request)
  stack = state.traced_span_stack
  node = stack.push_frame(state, prefix , t0)
  return node
rescue => e
  D13n.logger.error 'Uncaught exception while start processing HTTP request metric', e
  return nil
end