Sha256: 672ce04fcd3a9795fabc7f5c7a6165e76c1d48822679e980373992833c9763e5

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

# frozen_string_literal: true

# Copyright 2019 OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

module OpenTelemetry
  module Instrumentation
    module Sinatra
      module Middlewares
        # Middleware to trace Sinatra requests
        class TracerMiddleware
          def initialize(app)
            @app = app
          end

          def call(env)
            tracer.in_span(
              env['PATH_INFO'],
              attributes: { 'http.method' => env['REQUEST_METHOD'],
                            'http.url' => env['PATH_INFO'] },
              kind: :server,
              with_parent_context: parent_context(env)
            ) do |span|
              app.call(env).tap { |resp| trace_response(span, env, resp) }
            end
          end

          private

          attr_reader :app

          def parent_context(env)
            OpenTelemetry.propagation.http.extract(env)
          end

          def tracer
            OpenTelemetry::Instrumentation::Sinatra::Instrumentation.instance.tracer
          end

          def trace_response(span, env, resp)
            status, _headers, _response_body = resp

            span.set_attribute('http.status_code', status)
            span.set_attribute('http.status_text', ::Rack::Utils::HTTP_STATUS_CODES[status])
            span.set_attribute('http.route', env['sinatra.route'].split.last) if env['sinatra.route']
            span.status = OpenTelemetry::Trace::Status.http_to_status(status)
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
opentelemetry-instrumentation-sinatra-0.6.0 lib/opentelemetry/instrumentation/sinatra/middlewares/tracer_middleware.rb
opentelemetry-instrumentation-sinatra-0.5.0 lib/opentelemetry/instrumentation/sinatra/middlewares/tracer_middleware.rb