Add Elastic APM integration.

https://www.elastic.co/guide/en/apm/agent/ruby/4.x/introduction.html
This commit is contained in:
evazion
2022-04-11 01:46:08 -05:00
parent 98b313f8de
commit f69847fc59
6 changed files with 37 additions and 9 deletions

View File

@@ -56,6 +56,7 @@ gem "rbtrace"
gem "good_job" gem "good_job"
gem "crass" gem "crass"
gem "public_suffix" gem "public_suffix"
gem "elastic-apm"
group :development do group :development do
gem 'rubocop', require: false gem 'rubocop', require: false

View File

@@ -166,6 +166,9 @@ GEM
railties (>= 3.2) railties (>= 3.2)
e2mmap (0.1.0) e2mmap (0.1.0)
ed25519 (1.3.0) ed25519 (1.3.0)
elastic-apm (4.5.0)
concurrent-ruby (~> 1.0)
http (>= 3.0)
erubi (1.10.0) erubi (1.10.0)
et-orbi (1.2.7) et-orbi (1.2.7)
tzinfo tzinfo
@@ -535,6 +538,7 @@ DEPENDENCIES
dotenv-rails dotenv-rails
dtext_rb! dtext_rb!
ed25519 ed25519
elastic-apm
factory_bot factory_bot
ffaker ffaker
ffi ffi

View File

@@ -42,10 +42,10 @@ class DanbooruLogger
# @param session the Rails session # @param session the Rails session
# @param user [User] the current user # @param user [User] the current user
def self.add_session_attributes(request, session, user) def self.add_session_attributes(request, session, user)
add_attributes("request", { path: request.path }) #add_attributes("request", { path: request.path })
add_attributes("request.headers", header_params(request)) #add_attributes("request.headers", header_params(request))
add_attributes("request.params", request_params(request)) add_attributes("param", request_params(request))
add_attributes("session.params", session_params(session)) add_attributes("session", session_params(session))
add_attributes("user", user_params(request, user)) add_attributes("user", user_params(request, user))
end end
@@ -70,10 +70,10 @@ class DanbooruLogger
id: user&.id, id: user&.id,
name: user&.name, name: user&.name,
level: user&.level_string, level: user&.level_string,
ip: request.remote_ip, #ip: request.remote_ip,
country: CurrentUser.country, #country: CurrentUser.country,
safe_mode: CurrentUser.safe_mode?, #safe_mode: CurrentUser.safe_mode?,
bot: UserAgent.new(request.headers["HTTP_USER_AGENT"]).is_bot?, #bot: UserAgent.new(request.headers["HTTP_USER_AGENT"]).is_bot?,
} }
end end
@@ -86,12 +86,18 @@ class DanbooruLogger
private_class_method private_class_method
def self.log_attributes(attributes) def self.log_attributes(attributes)
attributes.each do |key, value|
ElasticAPM.set_label(key, value)
end
end end
def self.log_exception(exception, expected: false, custom_params: {}) def self.log_exception(exception, expected: false, custom_params: {})
ElasticAPM.report(exception, handled: expected)
end end
def self.log_event(level, message: nil, **params) def self.log_event(level, message: nil, **params)
ElasticAPM.set_custom_context(params)
ElasticAPM.report_message(message)
end end
# flatten_hash({ foo: { bar: { baz: 42 } } }) # flatten_hash({ foo: { bar: { baz: 42 } } })

View File

@@ -117,7 +117,7 @@ class SessionLoader
def authenticate_basic_auth def authenticate_basic_auth
credentials = ::Base64.decode64(request.authorization.split(' ', 2).last || '') credentials = ::Base64.decode64(request.authorization.split(' ', 2).last || '')
login, api_key = credentials.split(/:/, 2) login, api_key = credentials.split(/:/, 2)
DanbooruLogger.add_attributes("request.params", login: login) DanbooruLogger.add_attributes("param", login: login)
authenticate_api_key(login, api_key) authenticate_api_key(login, api_key)
end end

View File

@@ -547,6 +547,13 @@ module Danbooru
# "redis://localhost:6379" # "redis://localhost:6379"
end end
# Optional. The URL of the Elastic APM server. Used for application performance monitoring.
#
# https://www.elastic.co/observability/application-performance-monitoring
def elastic_apm_server_url
# "http://localhost:8200"
end
# True if the Winter Sale is active. # True if the Winter Sale is active.
def is_promotion? def is_promotion?
false false

View File

@@ -0,0 +1,10 @@
if Danbooru.config.elastic_apm_server_url.present?
require "elastic_apm"
# https://www.elastic.co/guide/en/apm/agent/ruby/4.x/api.html#api-agent-start
# https://www.elastic.co/guide/en/apm/agent/ruby/4.x/configuration.html
ElasticAPM::Rails.start(
server_url: Danbooru.config.elastic_apm_server_url,
service_name: "Danbooru",
)
end