Add Elastic APM integration.
https://www.elastic.co/guide/en/apm/agent/ruby/4.x/introduction.html
This commit is contained in:
1
Gemfile
1
Gemfile
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 } } })
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
10
config/initializers/00_elastic_apm.rb
Normal file
10
config/initializers/00_elastic_apm.rb
Normal 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
|
||||||
Reference in New Issue
Block a user