I have a Ruby on Rails application that is working fine for most of the API requests but for some API requests it just hangs. ActiveRecord queries are made in small time and also view is rendered in small time as well but yet response time is very big.
Rails version is 4.2.5 and Ruby version is 2.2.0, Database that I am using is Postgresql. Below I am attaching my Gemfile and also production log and also the code for which this is happening.
Production.log
I, [2019-09-07T09:23:45.748270 #22745] INFO -- : Started GET "/api/v3/restaurants/1/accepted_orders?skip_search=1" for
165.228.89.233 at 2019-09-07 09:23:45 +0000
I, [2019-09-07T09:23:45.753331 #22745] INFO -- : Processing by Api::V3::Staff::OrdersController#accepted_index as JSON
I, [2019-09-07T09:23:45.753387 #22745] INFO -- : Parameters: {"skip_search"=>"1", "id"=>"1"}
D, [2019-09-07T09:23:45.756807 #22745] DEBUG -- : User Load (2.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 6]]
D, [2019-09-07T09:23:45.761643 #22745] DEBUG -- : User Load (3.9ms) SELECT "users".* FROM "users" WHERE "users"."uid" = $1 LIMIT 1 [["uid", "[email protected]"]]
D, [2019-09-07T09:23:45.765724 #22745] DEBUG -- : Eula Load (3.1ms) SELECT "eulas".* FROM "eulas" WHERE "eulas"."is_latest" = $1 LIMIT 1 [["is_latest", "t"]]
D, [2019-09-07T09:23:45.768793 #22745] DEBUG -- : Privacy Load (2.7ms) SELECT "privacies".* FROM "privacies" WHERE "privacies"."is_latest" = $1 LIMIT 1 [["is_latest", "t"]]
D, [2019-09-07T09:23:45.772602#22745] DEBUG -- : Restaurant Load (3.0ms) SELECT "restaurants".* FROM "restaurants" WHERE "restaurants"."id" = $1 LIMIT 1 [["id", 1]]
D, [2019-09-07T09:23:46.293350 #22745] DEBUG -- : Order Load (519.6ms) SELECT "orders".* FROM "orders" WHERE "orders"."restaurant_id" IN (1)
D, [2019-09-07T10:44:50.564263 #22745] DEBUG -- : (19.8ms) SELECT COUNT(*) FROM "orders" WHERE "orders"."status" = $1 AND "orders"."restaurant_id" = 1 AND ( DATE(orders.created_at) >= '2019-09-07 09:45:50 UTC') [["status", 1]]
D, [2019-09-07T10:44:50.577108 #22745] DEBUG -- : (11.7ms) SELECT COUNT(*) FROM "orders" WHERE "orders"."status" = $1 AND "orders"."restaurant_id" = 1 AND ( DATE(orders.created_at) >= '2019-09-07 09:45:50 UTC') [["status", 0]]
D, [2019-09-07T10:44:50.580691 #22745] DEBUG -- : User Exists (1.5ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 6) LIMIT 1
D, [2019-09-07T10:44:50.582116 #22745] DEBUG -- : User Exists (0.6ms) SELECT 1 AS one FROM "users" WHERE ("users"."username" = 'Staff 1' AND "users"."id" != 6) LIMIT 1
D, [2019-09-07T10:44:50.584594#22745] DEBUG -- : User Exists (1.8ms) SELECT 1 AS one FROM "users" WHERE ("users"."phone_number" = '+777777777' AND "users"."id" != 6) LIMIT 1
I, [2019-09-07T10:44:50.586265 #22745] INFO -- : Completed 200 OK in 4864833ms (Views: 0.3ms | ActiveRecord:
570.2ms)
Part of code having the error
api :GET, '/v3/restaurants/:id/accepted_orders', 'Returns all accepted orders of a restaurant (for staff and owners)'
param :id, String, desc: 'id of the restaurant', required: true
def accepted_index
query = " DATE(orders.created_at) >= '#{59.minutes.ago}'" if current_user.staff?
accepted = Order.where(status: Order.statuses[:accepted], restaurant: @restaurant).where(query)
pending = Order.where(status: Order.statuses[:pending], restaurant: @restaurant).where(query)
render json: {accepted_count: accepted.count, pending_count: pending.count}
end
Gemfile
source 'https://rubygems.org'
ruby '2.2.0'
gem 'rails', '4.2.5'
gem 'pg'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'jbuilder', '~> 2.0'
gem 'annotate'
gem 'activeadmin', github: 'activeadmin'
gem 'paper_trail', '~> 4.0.0'
gem 'dotenv-rails'
# MailChimp integration
gem 'gibbon'
gem 'google_directions'
gem 'geocoder'
gem 'stripe', :git => 'https://github.com/stripe/stripe-ruby'
# The push notification service.
gem 'rpush', github: 'rpush/rpush'
gem 'prawn-rails'
gem 'prawn-table'
gem 'active_admin_datetimepicker'
gem 'phony_rails'
gem 'closure_tree'
gem 'whenever', require: false
group :development, :test do
gem 'byebug'
end
group :development do
gem 'pry'
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'letter_opener'
end
gem 'apipie-rails'
gem 'devise'
gem 'high_voltage'
gem 'simple_form'
gem 'rack-cors', :require => 'rack/cors'
gem 'omniauth'
gem 'devise_token_auth'
gem 'sidekiq', '~> 4.0', '>= 4.0.1'
# gem 'ckeditor', '~> 4.1', '>= 4.1.5'
gem 'socket.io-client-simple'
gem 'houston'
gem 'fancybox-rails', '~> 0.3.0'
gem 'mini_magick', '~> 4.3', '>= 4.3.6'
gem 'carrierwave', '~> 0.10.0'
gem 'fog', '~> 1.36'
gem 'chosen-rails'
gem 'twilio-ruby', '~> 4.11.1'
group :development do
gem 'better_errors'
gem 'quiet_assets'
gem 'rails_layout'
gem 'spring-commands-rspec'
gem 'capistrano', '~> 3.1.0'
gem 'capistrano-bundler', '~> 1.1.2'
gem 'capistrano-rails', '~> 1.1.1'
gem 'capistrano-rvm', github: "capistrano/rvm"
gem 'capistrano-sidekiq'
gem 'rest-client'
end
group :development, :test do
gem 'factory_girl_rails'
gem 'faker'
gem 'rspec'
gem 'fakeredis'
gem 'rspec-rails'
gem 'shoulda-matchers', '~> 3.0'
gem 'shoulda-callback-matchers', '~> 1.1.1'
gem 'redis-namespace'
end
group :test do
gem 'capybara'
gem 'database_cleaner'
gem 'launchy'
gem 'selenium-webdriver'
end
gem 'sinatra', :require => nil
On production server I am using nginx and Passenger.
Thanks