Module: Datadog::Contrib::Sinatra::Tracer

Defined in:
lib/ddtrace/contrib/sinatra/tracer.rb

Overview

Datadog::Contrib::Sinatra::Tracer is a Sinatra extension which traces requests.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.registered(app) ⇒ Object

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/MethodLength



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/ddtrace/contrib/sinatra/tracer.rb', line 89

def self.registered(app)
  ::Sinatra::Base.module_eval do
    def render(engine, data, *)
      cfg = settings.datadog_tracer

      output = ''
      if cfg.enabled?
        tracer = cfg[:tracer]
        tracer.trace('sinatra.render_template') do |span|
          # If data is a string, it is a literal template and we don't
          # want to record it.
          span.set_tag('sinatra.template_name', data) if data.is_a? Symbol
          output = super
        end
      else
        output = super
      end

      output
    end
  end

  app.set :datadog_tracer, TracerCfg.new()

  app.configure do
    app.settings.datadog_tracer.apply()
  end

  app.before do
    cfg = settings.datadog_tracer
    return unless cfg.enabled?

    if instance_variable_defined? :@datadog_request_span
      if @datadog_request_span
        Datadog::Tracer.log.error('request span active in :before hook')
        @datadog_request_span.finish()
        @datadog_request_span = nil
      end
    end

    tracer = cfg[:tracer]

    span = tracer.trace('sinatra.request',
                        service: cfg.cfg[:default_service],
                        span_type: Datadog::Ext::HTTP::TYPE)
    span.set_tag(Datadog::Ext::HTTP::URL, request.path)
    span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)

    @datadog_request_span = span
  end

  app.after do
    cfg = settings.datadog_tracer
    return unless cfg.enabled?

    span = @datadog_request_span
    begin
      unless span
        Datadog::Tracer.log.error('missing request span in :after hook')
        return
      end

      span.resource = "#{request.request_method} #{@datadog_route}"
      span.set_tag('sinatra.route.path', @datadog_route)
      span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.status)
      span.set_error(env['sinatra.error']) if response.server_error?
      span.finish()
    ensure
      @datadog_request_span = nil
    end
  end
end

Instance Method Details

#route(verb, action) ⇒ Object



77
78
79
80
81
82
83
84
85
# File 'lib/ddtrace/contrib/sinatra/tracer.rb', line 77

def route(verb, action, *)
  # Keep track of the route name when the app is instantiated for an
  # incoming request.
  condition do
    @datadog_route = action
  end

  super
end