class Google::Cloud::Trace::FaradayMiddleware

Public Class Methods

new(app, opts = {}) click to toggle source

# Trace FaradayMiddleware

A faraday middleware that setup request/response labels for trace.

## Installing

To use this middleware, simply install it in your middleware stack. Here is an example configuration enable the Trace middleware:

“`ruby conn = Faraday.new(:url => 'example.com') do |faraday|

# enable cross project tracing with option to true
faraday.use Google::Cloud::Trace, enable_cross_project_tracing: true
faraday.request  :url_encoded             # form-encode POST params
faraday.response :logger                  # log requests to $stdout
faraday.adapter  Faraday.default_adapter  # use Net::HTTP adapter

end “`

Calls superclass method
# File lib/google/cloud/trace/faraday_middleware.rb, line 42
def initialize app, opts = {}
  @enable_cross_project_tracing = opts[:enable_cross_project_tracing] || false
  super app
end

Public Instance Methods

call(env) click to toggle source

Create a Trace span with the HTTP request/response information.

# File lib/google/cloud/trace/faraday_middleware.rb, line 49
def call env
  Google::Cloud::Trace.in_span "faraday_request" do |span|
    add_request_labels span, env if span
    add_trace_context_header env if @enable_cross_project_tracing

    response = @app.call env

    add_response_labels span, env if span

    response
  end
end

Protected Instance Methods

add_request_labels(span, env) click to toggle source

@private Set Trace span labels from request object

# File lib/google/cloud/trace/faraday_middleware.rb, line 66
def add_request_labels span, env
  labels = span.labels
  label_keys = Google::Cloud::Trace::LabelKey

  set_label labels, label_keys::HTTP_METHOD, env.method
  set_label labels, label_keys::HTTP_URL, env.url.to_s

  # Only sets request size if request is not sent yet.
  unless env.status
    request_body = env.body || ""
    set_label labels, label_keys::RPC_REQUEST_SIZE,
              request_body.bytesize.to_s
  end
end
add_response_labels(span, env) click to toggle source

@private Set Trace span labels from response

# File lib/google/cloud/trace/faraday_middleware.rb, line 83
def add_response_labels span, env
  labels = span.labels
  label_keys = Google::Cloud::Trace::LabelKey

  response = env.response
  response_body = response.body || ""
  response_status = response.status
  response_url = response.headers[:location]

  set_label labels, label_keys::RPC_RESPONSE_SIZE,
            response_body.bytesize.to_s
  set_label labels, label_keys::HTTP_STATUS_CODE, response_status.to_s

  if response_status >= 300 && response_status < 400 && response_url
    set_label labels, label_keys::HTTP_REDIRECTED_URL, response_url
  end
end
add_trace_context_header(env) click to toggle source

@private Add X-Cloud-Trace-Context for request header

# File lib/google/cloud/trace/faraday_middleware.rb, line 115
def add_trace_context_header env
  trace_ctx = Stackdriver::Core::TraceContext.get
  env[:request_headers]["X-Cloud-Trace-Context"] = trace_ctx.to_string if trace_ctx
end
set_label(labels, key, value) click to toggle source

Sets the given label if the given value is a proper string.

@private @param [Hash] labels The labels hash. @param [String] key The key of the label to set. @param [Object] value The value to set.

# File lib/google/cloud/trace/faraday_middleware.rb, line 109
def set_label labels, key, value
  labels[key] = value if value.is_a? ::String
end