config.ru 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. require 'erb'
  2. require 'active_record'
  3. require 'yaml'
  4. require_relative 'config/auto_tune'
  5. MAX_PK = 10_000
  6. ID_RANGE = (1..MAX_PK).freeze
  7. ALL_IDS = ID_RANGE.to_a
  8. QUERIES_MIN = 1
  9. QUERIES_MAX = 500
  10. Bundler.require :default
  11. db_config = YAML.load(ERB.new(File.read('config/database.yml')).result)[ENV['RACK_ENV']]
  12. ActiveRecord::Base.establish_connection(db_config)
  13. class World < ActiveRecord::Base
  14. self.table_name = 'World'
  15. end
  16. module Acme
  17. class HelloWorld < Grape::API
  18. get '/json' do
  19. {message:'Hello, World!'}
  20. end
  21. end
  22. class PlainText < Grape::API
  23. content_type :plain, 'text/plain'
  24. format :plain
  25. get '/plaintext' do
  26. 'Hello, World!'
  27. end
  28. end
  29. class DatabaseQueries < Grape::API
  30. helpers do
  31. def bounded_queries
  32. queries = params[:queries].to_i
  33. queries.clamp(QUERIES_MIN, QUERIES_MAX)
  34. end
  35. # Return a random number between 1 and MAX_PK
  36. def rand1
  37. rand(MAX_PK).succ
  38. end
  39. end
  40. get '/db' do
  41. ActiveRecord::Base.connection_pool.with_connection do
  42. World.find(rand1).attributes
  43. end
  44. end
  45. get '/query' do
  46. ActiveRecord::Base.connection_pool.with_connection do
  47. ALL_IDS.sample(bounded_queries).map do |id|
  48. World.find(id)
  49. end
  50. end
  51. end
  52. get '/updates' do
  53. worlds =
  54. ActiveRecord::Base.connection_pool.with_connection do
  55. ALL_IDS.sample(bounded_queries).map do |id|
  56. world = World.find(id)
  57. new_value = rand1
  58. new_value = rand1 while new_value == world.randomNumber
  59. world.update_columns(randomNumber: new_value)
  60. world
  61. end
  62. end
  63. end
  64. end
  65. class API < Grape::API
  66. before do
  67. header 'Date', Time.now.httpdate
  68. header 'Server', 'WebServer'
  69. end
  70. content_type :json, 'application/json'
  71. format :json
  72. mount ::Acme::HelloWorld
  73. mount ::Acme::PlainText
  74. mount ::Acme::DatabaseQueries
  75. end
  76. end
  77. run Acme::API