class RailsOpentracer::Middleware

Public Class Methods

new(app) click to toggle source
# File lib/rails_opentracer/middleware.rb, line 18
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/rails_opentracer/middleware.rb, line 22
def call(env)
  span = nil
  if ZipkinConfig.opentracer_enabled_and_zipkin_url_present?
    begin
      extracted_ctx = OpenTracing.extract(OpenTracing::FORMAT_RACK, env)
      span_name = env['REQUEST_PATH']
      span =
        if extracted_ctx.nil?
          OpenTracing.start_span(span_name)
        else
          OpenTracing.start_span(span_name, child_of: extracted_ctx)
        end
      # yuck
      $active_span = span
    rescue StandardError => e
      Rails.logger.error "TRACER_ERROR: #{error_message(e)}"
      return @app.call(env)
    end

    status, headers, response = @app.call(env)

    begin
      carrier = {}
      OpenTracing.inject(span.context, OpenTracing::FORMAT_RACK, carrier)
      span.finish
      [status, headers, response]
    rescue StandardError => e
      Rails.logger.error "TRACER_ERROR: #{error_message(e)}"
      [status, headers, response]
    end
  else
    if ZipkinConfig.opentracer_enabled?
      Rails.logger.error 'TRACER_ERROR: `ZIPKIN_SERVICE_URL` environment variable is not defined'
    end
    return @app.call(env)
  end
end
error_message(e) click to toggle source
# File lib/rails_opentracer/middleware.rb, line 60
def error_message(e)
  "#{e}\n#{e.backtrace[0, 10].join("\n\t")}"
end