diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb index 91ab4f836..e64a6b118 100644 --- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb +++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dimension::BaseDimension - include Redisable + include Admin::Metrics::Dimension::StoreHelper def key 'software_versions' @@ -45,13 +45,11 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim end def redis_version - value = redis_info['redis_version'] - { key: 'redis', - human_key: 'Redis', - value: value, - human_value: value, + human_key: store_name, + value: store_version, + human_value: store_version, } end @@ -117,8 +115,4 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim rescue Terrapin::CommandNotFoundError, Terrapin::ExitStatusError, Oj::ParseError nil end - - def redis_info - @redis_info ||= redis.info - end end diff --git a/app/lib/admin/metrics/dimension/space_usage_dimension.rb b/app/lib/admin/metrics/dimension/space_usage_dimension.rb index c03464eca..1b4d224c7 100644 --- a/app/lib/admin/metrics/dimension/space_usage_dimension.rb +++ b/app/lib/admin/metrics/dimension/space_usage_dimension.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension::BaseDimension - include Redisable include ActionView::Helpers::NumberHelper + include Admin::Metrics::Dimension::StoreHelper def key 'space_usage' @@ -27,14 +27,12 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension end def redis_size - value = redis_info['used_memory'] - { key: 'redis', - human_key: 'Redis', - value: value.to_s, + human_key: store_name, + value: store_size.to_s, unit: 'bytes', - human_value: number_to_human_size(value), + human_value: number_to_human_size(store_size), } end @@ -57,10 +55,6 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension } end - def redis_info - @redis_info ||= redis.info - end - def search_size return unless Chewy.enabled? diff --git a/app/lib/admin/metrics/dimension/store_helper.rb b/app/lib/admin/metrics/dimension/store_helper.rb new file mode 100644 index 000000000..6deae62bc --- /dev/null +++ b/app/lib/admin/metrics/dimension/store_helper.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module Admin::Metrics::Dimension::StoreHelper + include Redisable + + private + + def store_name + return 'Valkey' if redis_info.key?('valkey_version') + return 'Dragonfly' if redis_info.key?('dragonfly_version') + + 'Redis' + end + + def store_version + redis_info['valkey_version'] || redis_info['dragonfly_version'] || redis_info['redis_version'] + end + + def store_size + redis_info['used_memory'] + end + + def redis_info + @redis_info ||= redis.info + end +end diff --git a/spec/lib/admin/metrics/dimension/software_versions_dimension_spec.rb b/spec/lib/admin/metrics/dimension/software_versions_dimension_spec.rb index 5b0fb902e..d76fad625 100644 --- a/spec/lib/admin/metrics/dimension/software_versions_dimension_spec.rb +++ b/spec/lib/admin/metrics/dimension/software_versions_dimension_spec.rb @@ -9,14 +9,44 @@ RSpec.describe Admin::Metrics::Dimension::SoftwareVersionsDimension do let(:end_at) { Time.now.utc } let(:limit) { 10 } let(:params) { ActionController::Parameters.new } + let(:redis_human_key) { 'Redis' } + let(:redis_version) { '7.4.5' } + let(:redis_info) { { 'redis_version' => redis_version } } describe '#data' do - it 'reports on the running software' do - expect(subject.data.map(&:symbolize_keys)) - .to include( - include(key: 'mastodon', value: Mastodon::Version.to_s), - include(key: 'ruby', value: include(RUBY_VERSION)) - ) + shared_examples 'shared behavior' do + before do + allow(subject).to receive(:redis_info).and_return(redis_info) # rubocop:disable RSpec/SubjectStub + end + + it 'reports on the running software' do + expect(subject.data.map(&:symbolize_keys)) + .to include( + include(key: 'mastodon', value: Mastodon::Version.to_s), + include(key: 'ruby', value: include(RUBY_VERSION)), + include(key: 'redis', human_key: redis_human_key, value: redis_version) + ) + end + end + + context 'when using redis' do + it_behaves_like 'shared behavior' + end + + context 'when using valkey' do + let(:redis_human_key) { 'Valkey' } + let(:redis_version) { '8.1.3' } + let(:redis_info) { { 'valkey_version' => redis_version } } + + it_behaves_like 'shared behavior' + end + + context 'when using dragonfly' do + let(:redis_human_key) { 'Dragonfly' } + let(:redis_version) { 'df-v1.32.0' } + let(:redis_info) { { 'dragonfly_version' => redis_version } } + + it_behaves_like 'shared behavior' end end end diff --git a/spec/lib/admin/metrics/dimension/space_usage_dimension_spec.rb b/spec/lib/admin/metrics/dimension/space_usage_dimension_spec.rb index 4be5ed30e..c71c788ea 100644 --- a/spec/lib/admin/metrics/dimension/space_usage_dimension_spec.rb +++ b/spec/lib/admin/metrics/dimension/space_usage_dimension_spec.rb @@ -10,14 +10,41 @@ RSpec.describe Admin::Metrics::Dimension::SpaceUsageDimension do let(:limit) { 10 } let(:params) { ActionController::Parameters.new } + let(:redis_human_key) { 'Redis' } + let(:redis_info) { { 'redis_version' => '7.4.5', 'used_memory' => 1_024 } } + describe '#data' do - it 'reports on used storage space' do - expect(subject.data.map(&:symbolize_keys)) - .to include( - include(key: 'media', value: /\d/), - include(key: 'postgresql', value: /\d/), - include(key: 'redis', value: /\d/) - ) + shared_examples 'shared behavior' do + before do + allow(subject).to receive(:redis_info).and_return(redis_info) # rubocop:disable RSpec/SubjectStub + end + + it 'reports on used storage space' do + expect(subject.data.map(&:symbolize_keys)) + .to include( + include(key: 'media', value: /\d/), + include(key: 'postgresql', value: /\d/), + include(key: 'redis', human_key: redis_human_key, value: /\d/) + ) + end + end + + context 'when using redis' do + it_behaves_like 'shared behavior' + end + + context 'when using valkey' do + let(:redis_human_key) { 'Valkey' } + let(:redis_info) { { 'valkey_version' => '8.1.3', 'used_memory' => 1_024 } } + + it_behaves_like 'shared behavior' + end + + context 'when using dragonfly' do + let(:redis_human_key) { 'Dragonfly' } + let(:redis_info) { { 'dragonfly_version' => 'df-v1.32.0', 'used_memory' => 1_024 } } + + it_behaves_like 'shared behavior' end end end