diff --git a/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb b/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb index ff33a6458..a7e813276 100644 --- a/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb +++ b/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb @@ -6,12 +6,29 @@ class Api::V1::Accounts::AppliedSlasController < Api::V1::Accounts::EnterpriseAc before_action :check_admin_authorization? def metrics - @total_applied_slas = @applied_slas.count - @number_of_sla_breaches = @applied_slas.missed.count + @total_applied_slas = total_applied_slas + @number_of_sla_breaches = number_of_sla_breaches + @hit_rate = hit_rate end private + def total_applied_slas + @total_applied_slas ||= @applied_slas.count + end + + def number_of_sla_breaches + @number_of_sla_breaches ||= @applied_slas.missed.count + end + + def hit_rate + number_of_sla_breaches.zero? ? '100%' : "#{hit_rate_percentage}%" + end + + def hit_rate_percentage + ((total_applied_slas - number_of_sla_breaches) / total_applied_slas.to_f * 100).round(2) + end + def set_appplied_slas @applied_slas = initial_query .filter_by_date_range(range) diff --git a/enterprise/app/views/api/v1/accounts/applied_slas/metrics.json.jbuilder b/enterprise/app/views/api/v1/accounts/applied_slas/metrics.json.jbuilder index 265e756fe..13f184845 100644 --- a/enterprise/app/views/api/v1/accounts/applied_slas/metrics.json.jbuilder +++ b/enterprise/app/views/api/v1/accounts/applied_slas/metrics.json.jbuilder @@ -1,2 +1,3 @@ json.total_applied_slas @total_applied_slas json.number_of_sla_breaches @number_of_sla_breaches +json.hit_rate @hit_rate diff --git a/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb b/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb index f40842bd6..6ab32b082 100644 --- a/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb +++ b/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb @@ -25,14 +25,16 @@ RSpec.describe 'Applied SLAs API', type: :request do context 'when it is an authenticated user' do it 'returns the sla metrics' do - create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1, sla_status: 'missed') + get "/api/v1/accounts/#{account.id}/applied_slas/metrics", headers: administrator.create_new_auth_token expect(response).to have_http_status(:success) body = JSON.parse(response.body) expect(body).to include('total_applied_slas' => 1) - expect(body).to include('number_of_sla_breaches' => 0) + expect(body).to include('number_of_sla_breaches' => 1) + expect(body).to include('hit_rate' => '0.0%') end it 'filters sla metrics based on a date range' do @@ -47,6 +49,7 @@ RSpec.describe 'Applied SLAs API', type: :request do expect(body).to include('total_applied_slas' => 1) expect(body).to include('number_of_sla_breaches' => 0) + expect(body).to include('hit_rate' => '100%') end it 'filters sla metrics based on a date range and agent ids' do @@ -62,6 +65,7 @@ RSpec.describe 'Applied SLAs API', type: :request do expect(body).to include('total_applied_slas' => 3) expect(body).to include('number_of_sla_breaches' => 1) + expect(body).to include('hit_rate' => '66.67%') end it 'filters sla metrics based on sla policy ids' do @@ -77,6 +81,7 @@ RSpec.describe 'Applied SLAs API', type: :request do expect(body).to include('total_applied_slas' => 2) expect(body).to include('number_of_sla_breaches' => 1) + expect(body).to include('hit_rate' => '50.0%') end it 'filters sla metrics based on labels' do @@ -94,6 +99,7 @@ RSpec.describe 'Applied SLAs API', type: :request do expect(body).to include('total_applied_slas' => 2) expect(body).to include('number_of_sla_breaches' => 1) + expect(body).to include('hit_rate' => '50.0%') end end end