GithubHelp home page GithubHelp logo

oink's Introduction

<img src=“https://codeclimate.com/github/noahd1/oink.png” />

Oink

Description

Rails plugin and log parser to help narrow down the source(s) of increased memory usage in rails applications.

Synopsis

Oink adds memory and active record instantiation information to rails log during runtime and provides an executable to help digest the enhanced logs.

Given a minimum threshold and a metric (memory or active record instantiation), the oink executable reports:

  1. The top ten single requests which exceeded the threshold for the metric, ordered by the request which exceeded the threshold the most

  2. The number of times each action exceeded the threshold for the metric, ordered by the action which exceeded the threshold the most

  3. (in verbose mode) The log lines produced by requests which exceeded the threshold

Many thanks to Ben Johnson for Memory Usage Logger (github.com/binarylogic/memory_usage_logger/tree/master) which is the basis of this plugin.

Dependencies

Currently oink can only parse logs in the Hodel3000Logger format

When used as a gem, this is automatically brought in as a dependency.

Installation

Add oink to your Gemfile

gem "oink"

In most rails environments this is sufficient and oink will be required for you via bundler. If not, add a require statement “require ‘oink’” in your app.

Configuration

Oink is middleware for instrumentation during the runtime of your application as well as log parsers for offline crunching of the logs generated by the middleware.

The middleware class to include into your stack is “Oink::Middleware”. For rails using an initializer is recommended:

Rails.application.middleware.use Oink::Middleware

Oink::Middleware writes log entries to log/oink.log in your application root directory by default.

You can also initialize it with an optional logger instance enabling your application to write Oink log entries to your application’s default log file:

Rails.application.middleware.use( Oink::Middleware, :logger => Rails.logger )

(This setup enables Oink to work with Request Log Analyzer (github.com/wvanbergen/request-log-analyzer), which currently parses rails logs)

Oink::Middleware logs memory and activerecord usage by default.

You can configure which using the :instruments option. For memory only:

Rails.application.middleware.use( Oink::Middleware, :instruments => :memory )

For activerecord instantiation counts only:

Rails.application.middleware.use( Oink::Middleware, :instruments => :activerecord )

Note that the previous way of configuring oink, as a set of modules to include into rails controllers, is deprecated.

Analyzing logs

After installing the plugin and aggregating some enhanced logs, run the ‘oink’ executable against your server logs.

Usage: oink [options] files
    -t, --threshold [INTEGER]        Memory threshold in MB
    -f, --file filepath              Output to file
        --format FORMAT              Select format
                                       (ss,v,s,verbose,short-summary,summary)
    -m, --memory                     Check for Memory Threshold (default)
    -r, --active-record              Check for Active Record Threshold

Oink hunts for requests which exceed a given threshold. In “memory” mode (the default), the threshold represents a megabyte memory increase from the previous request. In “active record” mode (turned on by passing the –active-record switch), the threshold represents the number of active record objects instantiated during a request.

e.g. To find all actions which increase the heap size more than 75 MB, where log files are location in /tmp/logs/

$ oink --threshold=75 /tmp/logs/*
---- MEMORY THRESHOLD ----
THRESHOLD: 75 MB

-- SUMMARY --
Worst Requests:
1. Feb 02 16:26:06, 157524 KB, SportsController#show
2. Feb 02 20:11:54, 134972 KB, DashboardsController#show
3. Feb 02 19:06:13, 131912 KB, DashboardsController#show
4. Feb 02 08:07:46, 115448 KB, GroupsController#show
5. Feb 02 12:19:53, 112924 KB, GroupsController#show
6. Feb 02 13:03:00, 112064 KB, ColorSchemesController#show
7. Feb 02 13:01:59, 109148 KB, SessionsController#create
8. Feb 02 06:11:17, 108456 KB, PublicPagesController#join
9. Feb 02 08:43:06, 94468 KB, CommentsController#create
10. Feb 02 20:49:44, 82340 KB, DashboardsController#show

Worst Actions:
10, DashboardsController#show
9, GroupsController#show
5, PublicPagesController#show
5, UsersController#show
3, MediaController#show
2, SportsController#show
1, SessionsController#create
1, GroupInvitesController#by_email
1, MediaController#index
1, PostsController#show
1, PhotoVotesController#create
1, AlbumsController#index
1, SignupsController#new
1, ColorSchemesController#show
1, PublicPagesController#join
1, CommentsController#create

Aggregated Totals:
Action                                  Max     Mean    Min     Total   Number of requests
SportsController#show                   101560  19754   4       5590540 283
CommentsController#create               8344    701     4       253324  361
ColorSchemesController#show             10124   739     4       68756   93
PublicPagesController#join              9004    1346    8       51172   38
DashboardsController#show               13696   2047    8       45036   22
SessionsController#create               9220    528     8       17448   33
GroupsController#show                   10748   1314    8       15776   12

e.g. In verbose mode, oink will print out all the log information from your logs about the actions which exceeded the threshold specified

$ oink --format verbose --threshold=75 /tmp/logs/*

---------------------------------------------------------------------

Feb 08 11:39:52 ey33-s00302 rails[9076]: Processing UsersController#show (for 11.187.34.45 at 2009-02-08 11:39:52) [GET]
Feb 08 11:39:52 ey33-s00302 rails[9076]: Parameters: {"action"=>"show", "id"=>"45", "controller"=>"users"}
Feb 08 11:39:52 ey33-s00302 rails[9076]: Rendering template within layouts/application
Feb 08 11:39:52 ey33-s00302 rails[9076]: Rendering users/show
Feb 08 11:39:54 ey33-s00302 rails[9076]: Completed in 2008ms (View: 1136, DB: 264) | 200 OK [http://www.example.com/users/45]
Feb 08 11:39:52 ey33-s00302 rails[9076]: Oink Action: users#show
Feb 08 11:39:54 ey33-s00302 rails[9076]: Memory usage: 316516 | PID: 9076
Feb 08 11:39:54 ey33-s00302 rails[9076]: Oink Log Entry Complete
---------------------------------------------------------------------

Verbose format prints the summary as well as each action which exceeded the threshold.

Authors

  • Maintained by Noah Davis

  • Thanks to Weplay (weplay.com) for sponsoring development and supporting open sourcing it from the start

oink's People

Contributors

anatol avatar bjpirt avatar brynary avatar colindkelley avatar ghazel avatar lukemelia avatar noahd1 avatar pmarreck avatar pwnall avatar smtlaissezfaire avatar technicalpickles avatar wagner avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

oink's Issues

Oink not logging to STDOUT in Rails 4.1 app on Heroku

We are using Rails 4.1.4 and currently can't get Oink to log to standard out in Heroku. Our setup:
Gemfile:

...
gem 'oink', '~> 0.10.1'
...

application.rb:

...
config.middleware.use Oink::Middleware, :logger => Hodel3000CompliantLogger.new(STDOUT)
...

If using Rails 4 the developers from Heroku suggests using the rails_stdout_logging gem which ensures that your logs will be sent to standard out. We are currently using this gem so I'm wondering whether it is stopping Oink from logging to standard out with the above setup?

Locally Oink is logging just fine.

P.S. I tried setting LOG_LEVEL to info without success

Oink and serving assets

Would it be possible to filter out oink logging when Rails is serving assets (in development)?

It currently spams my logs like this (asset logging itself is being silenced, otherwise those requests would show up):

Feb 07 12:36:18 zephyr rails[2941]: Memory usage: 2658288 | PID: 2941
Feb 07 12:36:18 zephyr rails[2941]: Oink Log Entry Complete
Feb 07 12:36:18 zephyr rails[2941]: Memory usage: 2658288 | PID: 2941
Feb 07 12:36:18 zephyr rails[2941]: Oink Log Entry Complete
Feb 07 12:36:18 zephyr rails[2941]: Memory usage: 2658288 | PID: 2941
Feb 07 12:36:18 zephyr rails[2941]: Oink Log Entry Complete
Feb 07 12:36:18 zephyr rails[2941]: Memory usage: 2658288 | PID: 2941
...

invalid byte sequence

[root@vps-626-1 thirsty]# bundle exec oink log
---- MEMORY THRESHOLD ----
THRESHOLD: 75 MB
/usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/reports/memory_usage_report.rb:20:in =~': invalid byte sequence in UTF-8 (ArgumentError) from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/reports/memory_usage_report.rb:20:inblock (2 levels) in print'
from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/reports/memory_usage_report.rb:16:in each_line' from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/reports/memory_usage_report.rb:16:inblock in print'
from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/reports/memory_usage_report.rb:15:in each' from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/reports/memory_usage_report.rb:15:inprint'
from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/lib/oink/cli.rb:68:in process' from /usr/lib/ruby/gems/1.9.1/gems/oink-0.9.3/bin/oink:4:in<top (required)>'
from /usr/lib/ruby/gems/1.9.1/bin/oink:19:in load' from /usr/lib/ruby/gems/1.9.1/bin/oink:19:in

'

'Worst Requests' contains aggregated memory usage for requests, not individual

Hi, I am using 'hodel_3000_compliant_logger' gem in Rails 3.2 app to format logs and when I am using oink to get memory usage, it looks like this:

-- SUMMARY --
Worst Requests:
1. Sep 28 11:47:09, 564712 KB, portal/credit_cards#index
2. Sep 28 11:58:00, 564712 KB, portal/credit_cards#index
3. Sep 28 11:59:11, 564712 KB, portal/credit_cards#index
4. Sep 28 12:17:13, 564712 KB, portal/credit_cards#index
5. Sep 28 12:18:32, 564712 KB, portal/credit_cards#index
6. Sep 28 12:16:16, 434536 KB, api/v2/customers#index
7. Sep 28 11:56:14, 388600 KB, api/v2/customers#index
8. Sep 28 12:15:56, 348844 KB, api/v2/customers#index
9. Sep 28 12:16:00, 331608 KB, api/v2/customers#index
10. Sep 28 12:16:32, 224020 KB, api/v2/customers#index

Worst Actions:
8, api/v2/customers#index
5, portal/credit_cards#index
1, portal/service_reports#customer_signature
1, api/v2/work_orders#index

Aggregated Totals:
Action                                          Max     Mean    Min     Total   Number of requests
portal/credit_cards#index                       564712  564712  564712  2823560 5
api/v2/customers#index                          434536  276200  138472  2209600 8
api/v2/work_orders#index                        155032  155032  155032  155032  1
portal/service_reports#customer_signature       121580  121580  121580  121580  1

For some reason 'Worst Requests' section shows agregated memory usage, not individual for request.

Any ideas how to fix this or what is causing it?

Oink with Rails 3

Does Oink work with rails 3 ?
And if yes, how does we need to install it ?

Thanks a lot,

Incorrect parsing of logs?

I am using oink after running a bunch of request specs to benchmark/profile various controllers actions. One result that I get back after running

bundle exec oink -r --threshold=50 --format=v log/oink.log

is

May 04 15:31:18 box6 rails[7603]: Oink Action: sessions#new
May 04 15:31:18 box6 rails[7603]: Memory usage: 1358100 | PID: 7603
May 04 15:31:18 box6 rails[7603]: Instantiation Breakdown: Total: 9164 | User: 2081 | School: 1385 | Employer: 946 | Communication: 777 | SchoolYear: 422 | Posting: 397 | StudentScreen: 351 | InterviewSchedule: 286 | Job: 263 | InterviewScheduleType: 263 | JobType: 241 | EmployerApproval: 117 | Education: 111 | RolePermission: 105 | Major: 91 | InterviewScheduleInvite: 81 | Event: 76 | HABTM_Majors: 70 | Role: 66 | EducationLevel: 65 | Building: 64 | Room: 61 | EventType: 59 | InterviewSlot: 56 | HABTM_Roles: 51 | InternalMessage: 44 | Conversation: 42 | Application: 40 | CommunicationType: 39 | MassEmail: 34 | Skill: 31 | NotificationReason: 31 | Activity: 30 | SavedSearch: 25 | Report: 24 | EventTime: 23 | CareerPlan: 23 | MajorGroup: 21 | NotificationCategory: 20 | Attendee: 18 | NotificationPreference: 15 | WorkAuthorization: 14 | JobPosition: 13 | EmailTemplate: 12 | InstitutionContact: 12 | Notification: 11 | ExtraCurricularPosition: 10 | WorkExperience: 9 | ExtraCurricularActivity: 8 | CareerPlanCategory: 8 | ExtraCurricularCategory: 8 | FeedItem: 8 | Location: 7 | Minor: 6 | Invite: 6 | AuthInformation: 6 | Label: 6 | PlanItem: 6 | InstitutionLabel: 6 | SkillOption: 5 | SchoolMajor: 5 | InterviewScheduleCheckin: 4 | ExtraCurricular: 4 | Resume: 4 | PlanItemCompletion: 4 | HABTM_WorkAuthorizations: 4 | EmployerFlag: 4 | InterviewScheduleInterviewer: 4 | StudentReview: 4 | Survey: 3 | Project: 3 | Industry: 2 | Favorite: 2 | InterviewScheduleJob: 2 | InstitutionType: 2 | InstitutionSize: 2 | HABTM_Minors: 2 | ApiKey: 1 | ResumeParsing: 1 | AuditLog: 1
May 04 15:31:18 box6 rails[7603]: Oink Log Entry Complete

This does not seem correct. Is it possible that oink is parsing wrong? I use the sessions#new url to log in at the beginning most of my specs.

Thanks for the awesome gem

.

sorry please delete

oink as a gem

I've been talking with the guys over at Scout about supporting oink in their Ruby on Rails Monitoring plugin. One of the hurdles we encountered was the setup of oink could stand to be a lot easier.

The best plan I could come up with would be to setup oink and its hodel_3000_complaint_logger be packaged and released as gems.

It looks like there was Rake stuff in place for generating gemspecs, but I don't think it ever got properly released. I've done some work to get it ready to be released as a gem, and be managed by jeweler. You can see it in action at: http://github.com/noahd1/oink

I've also updated the documentation to be more straightforward about how to get up and running.

This also depends on hodel_3000_compliant_logger getting released as a gem: http://github.com/topfunky/hodel_3000_compliant_logger/issues/issue/2

Oink doesn't work with Sequel

I'm replacing ActiveRecord with Sequel while still using rails. This gem breaks stuff.

I would like to use it, though. One suggestion could be not load the activerecord instrumentation unless defined?(ActiveRecord) while giving me the possibility of adding my own custom (or gem-specific) sequel instrumentation. How does that sound?

Not working

Hey
I have included oink in gemfile and also added the middleware declaration in config/initializers/oink.rb. But I am getting this error

fire@fire-hp:~/Desktop/rails/finly/finly-server$ bundle exec oink --threshold=75 /log/*
bundler: failed to load command: oink (/home/fire/.rbenv/versions/2.6.0/bin/oink)
RuntimeError: Could not find "/log/*"
  /home/fire/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/oink-0.10.1/lib/oink/cli.rb:88:in `block in get_file_listing'
  /home/fire/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/oink-0.10.1/lib/oink/cli.rb:86:in `each'
  /home/fire/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/oink-0.10.1/lib/oink/cli.rb:86:in `get_file_listing'
  /home/fire/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/oink-0.10.1/lib/oink/cli.rb:59:in `process'
  /home/fire/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/oink-0.10.1/bin/oink:4:in `<top (required)>'
  /home/fire/.rbenv/versions/2.6.0/bin/oink:23:in `load'
  /home/fire/.rbenv/versions/2.6.0/bin/oink:23:in `<top (required)>'

fire@fire-hp:~/Desktop/rails/finly/finly-server$ ruby -v
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
fire@fire-hp:~/Desktop/rails/finly/finly-server$ rails -v
Rails 5.2.2

Running Oink from my Terminal

Hello,

I have the oink gem installed and can read through the oink log within my rails application. I would like to run the oink commands in the terminal that are outlined within the readme but I get this error:

-bash: oink: command not found

How do I make sure that I have installed oink properly so that I can call oink commands in the terminal?

Thank you,
Ellie

Understanding oink result

The initial bash script curl logs from logentries for the last 24h and then parse them

It looks like this :

end=`ruby -e "puts Time.new.to_i * 1000"` && \
start=`ruby -e "puts (Time.new - 24.hours).to_i * 1000"` && \
var=`curl "https://pull.logentries.com/keeeyyyyyy/hosts/Heroku/my-product/?start=${start}&end=${end}&filter=%2Frails%5C%5B" | cut -c 59- > log/production-oink.log && oink --threshold=0 log/production-oink.log`

Why size looks always similar "151*** kb" ?
stores#colors is a realy small part in my codebase. Does oink tell me it is the worst code on my codebase with memory?

---- MEMORY THRESHOLD ----
THRESHOLD: 0 MB

-- SUMMARY --
Worst Requests:
1. Nov 23 09:50:50, 151876 KB, stores#colors
2. Nov 23 09:50:52, 151876 KB, stores#colors
3. Nov 23 09:50:57, 151876 KB, mobile_applications#index
4. Nov 23 09:51:43, 151556 KB, stores#colors
5. Nov 23 09:51:49, 151556 KB, mobile_applications#index
6. Nov 23 09:51:53, 151556 KB, mobile_application_updates#apkinfo
7. Nov 23 09:52:10, 151556 KB, mobile_applications#install
8. Nov 23 09:52:24, 151556 KB, subdomain_home#index
9. Nov 23 08:27:43, 141268 KB, mobile_applications#show
10. Nov 23 08:28:03, 141268 KB, home#ping

Worst Actions:
2765, stores#colors
2628, mobile_applications#index
1644, mobile_applications#show
1220, authentication/sessions#auth_mobile
1006, stores#android_mobile_store
971, mobile_application_updates#is_authorized
906, users#register_xpn_device
707, mobile_applications#install
698, api/v1/applications#index
643, home#ping
636, home#index
453, subdomain_home#index
441, subdomain_sessions#new
[...cut...]

Aggregated Totals:
Action Max Mean Min Total Number of requests
stores#colors 151876 29142 136 80578952 2765
mobile_applications#index 151876 27723 132 72857544 2628
mobile_applications#show 141268 28600 132 47018948 1644
authentication/sessions#auth_mobile 140928 28907 132 35267028 1220
stores#android_mobile_store 139104 29025 140 29199552 1006
mobile_application_updates#is_authorized 141268 27877 132 27069128 971
users#register_xpn_device 140928 29380 132 26618484 906
[...cut...]

STDOUT for heroku

Can you make this work on heroku? Heroku needs a puts instead of logger.info

config.middleware.use( Oink::Middleware, :logger => Rails.logger, stdout: true )

That would make it so I could see the data in the log, then you would still need a way to parse it since it's not local and it's not in Hodel3000Logger format, but I could at least see the individual "Memory usage: #{memory} | PID: #{$$}" lines.

If all Oink logs started with Oink, this might work:

heroku logs -n 5000 | grep Oink > log/oink_prod.log
oink --threshold=5 log/oink_prod.log

Thanks for the Gem!

shouldn't virtual size (vsz) be monitored rather than resident set (rss)? also on linux you can get that from /proc

I noticed that the monitoring is looking at resident set rss. On a memory-starved machine that will be lower than the real bloat since you're constrained on physical memory. Virtual size (vsz) would be more accurate wouldn't it?

Also I noticed that the data is gathered by running ps. On linux machines there is a /proc directory which can be read, avoiding a whole fork/exec. I have that working using the equivalent of vsz.

I can contribute a patch with both these changes if there's interest.

any way to show the delta used for the threshold?

The results show the total memory when that request was made, but it would be more useful to know that this request caused the total memory to go up by 25MB. Since you're already generating it to use the threshold, would it be hard to add to the results printout?

Dyno PIDs on Heroku

Am I right in thinking that oink uses the pid to evaluate changes in heap size?

Heroku logs come out looking some thing like:

Nov 12 16:06:16 app-name app/web.3: Nov 12 16:06:16 a2b85a63-8b2f-4779-bee5-3cc981238f23 rails[7]: Memory usage: 587724 | PID: 7 
Nov 12 16:06:37 app-name app/web.1: Nov 12 16:06:37 642db80d-23f8-4088-8ce4-4071bd0466ec rails[7]: Memory usage: 647864 | PID: 7

This is 2 dynos each running the process on the same PID, once we strip the heroku log information from the beginning we get:

Nov 12 16:06:16 a2b85a63-8b2f-4779-bee5-3cc981238f23 rails[7]: Memory usage: 587724 | PID: 7 
Nov 12 16:06:37 642db80d-23f8-4088-8ce4-4071bd0466ec rails[7]: Memory usage: 647864 | PID: 7

Will oink interpret those as being from the same process? Therefore recording that as a large heap increase?

thread safety

Oink is currently not thread safe. The use of class variables in the ActiveRecord instrumentation allows for two threads to step on each other. Instead, Thread.current['some_key'] should be used.

How does Oink Deal with Threads?

Sorry for opening an issue to ask a general question.

How does Oink deal with threaded webservers? For example if i'm running puma with 5 threads and each start serving a request A,B,C,D, & E. If Oink is measuring memory by wrapping the request for A and then in the middle B gets hit with a REALLY expensive endpoint, if you're taking process memory it might look like A was at fault. Does Oink handle that well? Does it use statistics to see what requests consistently use more memory?

Thanks for your work on this gem and in for working in the Ruby memory space.

Not getting "Oink Action" lines in the log

Hi

I am trying to use Oink 0.9.2 and hodel_3000_compliant_logger 0.1.0, as gems, under rails 2.3.11.

In environment.rb:

Rails::Initializer.run do |config|
require 'hodel_3000_compliant_logger'
config.logger = h3_log = Hodel3000CompliantLogger.new(config.log_path)
config.middleware.use "Oink::Middleware", :logger => h3_log
...
end

This is what I am getting in log/development.log:

Jul 08 17:09:09 yarmac rails[29643]: Completed in 582ms (View: 194, DB: 21) | 200 OK [http://weather.local/]
Jul 08 17:09:09 yarmac rails[29643]: Memory usage: 2561680 | PID: 29643
Jul 08 17:09:09 yarmac rails[29643]: Instantiation Breakdown: Total: 14 | Photo: 6 | Location: 5 | Weatherfinder: 1 | Forecast: 1 | Language: 1
Jul 08 17:09:09 yarmac rails[29643]: Oink Log Entry Complete

No "Oink Action" line!

If I then run

% oink --threshold=0 log/development.log

---- MEMORY THRESHOLD ----
THRESHOLD: 0 MB

-- SUMMARY --
Worst Requests:

  1. Jul 08 17:09:09, 15360 KB,
  2. Jul 08 17:02:54, 2052 KB,
  3. Jul 08 17:02:50, 2052 KB,
  4. Jul 08 17:02:50, 2052 KB,
  5. Jul 08 17:02:51, 2052 KB,
  6. Jul 08 17:02:50, 2052 KB,
  7. Jul 08 17:02:52, 2052 KB,
  8. Jul 08 17:02:52, 2052 KB,
  9. Jul 08 17:02:53, 2052 KB,
  10. Jul 08 17:02:49, 2052 KB,

Worst Actions:
44,
%

– the result is missing the action list as well.

Is Rails 2.3.11 still supported?

Can oink be used with Sinatra?

From what I read it seems highly coupled with Rails but was wondering if anyone ever attempted/managed to use it with Sinatra?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.