Module: Restify::Adapter::Telemetry

Included in:
Base
Defined in:
lib/restify/adapter/telemetry.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.tracerObject



48
49
50
# File 'lib/restify/adapter/telemetry.rb', line 48

def tracer
  @tracer ||= OpenTelemetry.tracer_provider.tracer('restify', Restify::VERSION.to_s)
end

Instance Method Details

#call(request) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/restify/adapter/telemetry.rb', line 9

def call(request)
  method = request.method.to_s.upcase
  uri = URI.parse(request.uri)
  name = "#{method} #{uri.scheme}://#{uri.host}:#{uri.port}"

  attributes = {
    'http.request.method' => method,
    'server.address' => uri.host,
    'server.port' => uri.port,
    'url.full' => uri.to_s,
    'url.scheme' => uri.scheme,
  }

  span = tracer.start_span(name, attributes:, kind: :client)
  OpenTelemetry::Trace.with_span(span) do
    OpenTelemetry.propagation.inject(request.headers)

    super.tap do |x|
      x.add_observer do |_, response, err|
        if response
          span.set_attribute('http.response.status_code', response&.code)
          span.status = OpenTelemetry::Trace::Status.error unless (100..399).cover?(response&.code)
        end

        span.status = OpenTelemetry::Trace::Status.error(err) if err

        span.finish
      end
    end
  end
end