require 'rails/all'
require_relative '../app/lib/exceptions'
-require_relative '../lib/statsd_monitor'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
config.active_job.queue_adapter = :sidekiq
- config.middleware.insert(0, ::StatsDMonitor)
-
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
--- /dev/null
+# frozen_string_literal: true
+
+instrumentation_hostname = ENV.fetch('INSTRUMENTATION_HOSTNAME') { 'localhost' }
+
+ActiveSupport::Notifications.subscribe(/process_action.action_controller/) do |*args|
+ event = ActiveSupport::Notifications::Event.new(*args)
+ controller = event.payload[:controller]
+ action = event.payload[:action]
+ format = event.payload[:format] || 'all'
+ format = 'all' if format == '*/*'
+ status = event.payload[:status]
+ key = "#{controller}.#{action}.#{format}.#{instrumentation_hostname}"
+
+ ActiveSupport::Notifications.instrument :performance, action: :measure, measurement: "#{key}.total_duration", value: event.duration
+ ActiveSupport::Notifications.instrument :performance, action: :measure, measurement: "#{key}.db_time", value: event.payload[:db_runtime]
+ ActiveSupport::Notifications.instrument :performance, action: :measure, measurement: "#{key}.view_time", value: event.payload[:view_runtime]
+ ActiveSupport::Notifications.instrument :performance, measurement: "#{key}.status.#{status}"
+end
StatsD.prefix = 'mastodon'
StatsD.default_sample_rate = 1
-StatsDMonitor.extend(StatsD::Instrument)
-StatsDMonitor.statsd_measure(:call, 'request.duration')
+ActiveSupport::Notifications.subscribe(/performance/) do |name, _start, _finish, _id, payload|
+ action = payload[:action] || :increment
+ measurement = payload[:measurement]
+ value = payload[:value]
+ key_name = "#{name}.#{measurement}"
-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
+ StatsD.send(action.to_s, key_name, (value || 1))
end
+++ /dev/null
-# frozen_string_literal: true
-
-class StatsDMonitor
- def initialize(app)
- @app = app
- end
-
- def call(env)
- @app.call(env)
- end
-end