Add optional StatsD performance tracking
This commit is contained in:
		
							
								
								
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							@@ -47,6 +47,7 @@ gem 'sidekiq'
 | 
			
		||||
gem 'rails-settings-cached'
 | 
			
		||||
gem 'pg_search'
 | 
			
		||||
gem 'simple-navigation'
 | 
			
		||||
gem 'statsd-instrument'
 | 
			
		||||
 | 
			
		||||
gem 'react-rails'
 | 
			
		||||
gem 'browserify-rails'
 | 
			
		||||
 
 | 
			
		||||
@@ -370,6 +370,7 @@ GEM
 | 
			
		||||
      actionpack (>= 4.0)
 | 
			
		||||
      activesupport (>= 4.0)
 | 
			
		||||
      sprockets (>= 3.0.0)
 | 
			
		||||
    statsd-instrument (2.1.2)
 | 
			
		||||
    temple (0.7.7)
 | 
			
		||||
    term-ansicolor (1.4.0)
 | 
			
		||||
      tins (~> 1.0)
 | 
			
		||||
@@ -463,6 +464,7 @@ DEPENDENCIES
 | 
			
		||||
  simple-navigation
 | 
			
		||||
  simple_form
 | 
			
		||||
  simplecov
 | 
			
		||||
  statsd-instrument
 | 
			
		||||
  uglifier (>= 1.3.0)
 | 
			
		||||
  webmock
 | 
			
		||||
  will_paginate
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								app/lib/statsd_monitor.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/lib/statsd_monitor.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class StatsDMonitor
 | 
			
		||||
  def initialize(app)
 | 
			
		||||
    @app = app
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def call(env)
 | 
			
		||||
    @app.call(env)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -30,6 +30,8 @@ module Mastodon
 | 
			
		||||
 | 
			
		||||
    config.active_job.queue_adapter = :sidekiq
 | 
			
		||||
 | 
			
		||||
    config.middleware.insert(0, 'StatsDMonitor')
 | 
			
		||||
 | 
			
		||||
    config.middleware.insert_before 0, Rack::Cors do
 | 
			
		||||
      allow do
 | 
			
		||||
        origins  '*'
 | 
			
		||||
 
 | 
			
		||||
@@ -104,4 +104,8 @@ Rails.application.configure do
 | 
			
		||||
  config.react.variant = :production
 | 
			
		||||
 | 
			
		||||
  config.active_record.logger = nil
 | 
			
		||||
 | 
			
		||||
  config.to_prepare do
 | 
			
		||||
    StatsD.backend = StatsD::Instrument::Backends::NullBackend if ENV['STATSD_ADDR'].blank?
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@
 | 
			
		||||
#   inflect.uncountable %w( fish sheep )
 | 
			
		||||
# end
 | 
			
		||||
 | 
			
		||||
# These inflection rules are supported but not enabled by default:
 | 
			
		||||
# ActiveSupport::Inflector.inflections(:en) do |inflect|
 | 
			
		||||
#   inflect.acronym 'RESTful'
 | 
			
		||||
# end
 | 
			
		||||
ActiveSupport::Inflector.inflections(:en) do |inflect|
 | 
			
		||||
  inflect.acronym 'StatsD'
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								config/initializers/statsd.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								config/initializers/statsd.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
StatsD.prefix              = 'mastodon'
 | 
			
		||||
StatsD.default_sample_rate = 1
 | 
			
		||||
 | 
			
		||||
StatsDMonitor.extend(StatsD::Instrument)
 | 
			
		||||
StatsDMonitor.statsd_measure(:call, 'request.duration')
 | 
			
		||||
 | 
			
		||||
STATSD_REQUEST_METRICS = {
 | 
			
		||||
  'request.status.success'               => 200,
 | 
			
		||||
  'request.status.not_found'             => 404,
 | 
			
		||||
  'request.status.too_many_requests'     => 429,
 | 
			
		||||
  'request.status.internal_server_error' => 500,
 | 
			
		||||
}.freeze
 | 
			
		||||
 | 
			
		||||
STATSD_REQUEST_METRICS.each do |name, code|
 | 
			
		||||
  StatsDMonitor.statsd_count_if(:call, name) do |status, _env, _body|
 | 
			
		||||
    status.to_i == code
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user