diff --git a/Gemfile b/Gemfile
index e530e43..c43dd30 100644
--- a/Gemfile
+++ b/Gemfile
@@ -47,3 +47,4 @@ gem 'therubyracer'
gem 'omniauth-oauth2'
gem 'figaro'
+gem 'newrelic_rpm'
diff --git a/Gemfile.lock b/Gemfile.lock
index 9924334..ab648c7 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -62,6 +62,7 @@ GEM
multi_json (1.8.4)
multi_xml (0.5.5)
multipart-post (2.0.0)
+ newrelic_rpm (3.9.3.241)
oauth2 (0.9.3)
faraday (>= 0.8, < 0.10)
jwt (~> 0.1.8)
@@ -136,6 +137,7 @@ DEPENDENCIES
execjs
figaro
jquery-rails
+ newrelic_rpm
omniauth-oauth2
pg
rails (= 3.2.14)
diff --git a/app/assets/javascripts/process_logs.js b/app/assets/javascripts/process_logs.js
index 70fd40d..fd411db 100644
--- a/app/assets/javascripts/process_logs.js
+++ b/app/assets/javascripts/process_logs.js
@@ -11,10 +11,15 @@ LogProcessor.stop_experiment = function() {
Logging.log({ name: "ExperimentStop", experiment_name: experiment_name });
}
-LogProcessor.show_experiment_results = function() {
- var experiment_name = document.getElementById("experiment_name").value;
+LogProcessor.show_experiment_results = function(name) {
+ var experiment_name;
+ if (arguments.length == 0) {
+ experiment_name = document.getElementById("experiment_name").value;
+ } else {
+ experiment_name = name;
+ }
LogProcessor.parse(experiment_name);
- LogProcessor.add_plots();
+ LogProcessor.add_ui();
// LogProcessor.plot_all_time_entries();
}
@@ -22,7 +27,7 @@ LogProcessor.process = function() {
LogProcessor.parse();
// LogProcessor.plot_all_time_entries();
// LogProcessor.compute_time_averages_by_group(["lerner"], ["lerner2"]);
- LogProcessor.add_plots();
+ LogProcessor.add_ui();
}
LogProcessor.parse = function(experiment_name) {
@@ -86,12 +91,12 @@ LogProcessor.parse = function(experiment_name) {
}
var user_time_entries = time_entries_by_user[user];
var time_delta = (end-start)/1000;
- user_time_entries.push({ puzzle_id: puzzle_id, time_delta: time_delta });
- all_time_entries.push({ user: user, puzzle_id: puzzle_id, time_delta: time_delta });
+ // user_time_entries.push({ puzzle_id: puzzle_id, time_delta: time_delta });
+ // all_time_entries.push({ user: user, puzzle_id: puzzle_id, time_delta: time_delta });
delete start_times[user][puzzle_id];
}
if (msg.time_delta !== undefined) {
- user = user + "_c";
+ // user = user + "_c";
if (time_entries_by_user[user] === undefined) {
time_entries_by_user[user] = [];
}
@@ -145,7 +150,7 @@ LogProcessor.show_all_entries = function() {
// console.log(group_b_data);
// }
-LogProcessor.add_plots = function() {
+LogProcessor.add_ui = function() {
if (LogProcessor.user_names.length == 0) {
return;
@@ -205,7 +210,9 @@ LogProcessor.add_plots = function() {
.attr("id", function(d) { return d + "-b"; });
// .attr("onClick", "LogProcessor.plot_selected()");
- document.getElementById(LogProcessor.user_names[0]).checked = true;
+ LogProcessor.user_names.forEach(function(n) {
+ document.getElementById(n).checked = true;
+ });
// div.append("button")
// .text("Show All Entires")
@@ -247,33 +254,74 @@ LogProcessor.plot_groups = function() {
LogProcessor.plot(data, "puzzle_id", "Time (s)");
}
+// LogProcessor.compute_time_averages_for_group = function(group, name) {
+// var data = [];
+// var is_in_group = {};
+// group.forEach(function (x) { is_in_group[x] = true });
+// LogProcessor.all_time_entries.forEach(function (entry) {
+// if (is_in_group[entry.user]) {
+// var puzzle_id = entry.puzzle_id;
+// var x = data[puzzle_id];
+// if (x === undefined) {
+// x = { puzzle_id: puzzle_id, sum: 0, count: 0};
+// data[puzzle_id] = x;
+// }
+// x.count++;
+// x.sum += entry.time_delta;
+// }
+// });
+// // for (var i = 0; i < data.length; i++) {
+// for (var i = 0; i < 45; i++) {
+// var x = data[i];
+// if (x === undefined) {
+// x = { puzzle_id: i };
+// x[name] = 0;
+// data[i] = x;
+// } else {
+// var avg = x.sum / x.count;
+// delete x.sum;
+// delete x.count;
+// x[name] = avg;
+// }
+// }
+// return data;
+// }
+
LogProcessor.compute_time_averages_for_group = function(group, name) {
+ return LogProcessor.compute_data_for_group(group, name, function(arr) {
+ return arr.reduce(function(a, b) { return a + b }) / arr.length;
+ });
+}
+
+LogProcessor.compute_data_for_group = function(group, name, fold) {
var data = [];
var is_in_group = {};
group.forEach(function (x) { is_in_group[x] = true });
LogProcessor.all_time_entries.forEach(function (entry) {
if (is_in_group[entry.user]) {
var puzzle_id = entry.puzzle_id;
- var x = data[puzzle_id];
- if (x === undefined) {
- x = { puzzle_id: puzzle_id, sum: 0, count: 0};
- data[puzzle_id] = x;
+ var time_delta = entry.time_delta;
+ if (time_delta > 0) {
+ var x = data[puzzle_id];
+ if (x === undefined) {
+ x = { puzzle_id: puzzle_id, time_deltas: [] };
+ data[puzzle_id] = x;
+ }
+ x.time_deltas.push(time_delta);
}
- x.count++;
- x.sum += entry.time_delta;
}
});
- for (var i = 0; i < data.length; i++) {
+ // for (var i = 0; i < data.length; i++) {
+ for (var i = 0; i < 45; i++) {
var x = data[i];
if (x === undefined) {
x = { puzzle_id: i };
x[name] = 0;
data[i] = x;
} else {
- var avg = x.sum / x.count;
- delete x.sum;
- delete x.count;
- x[name] = avg;
+ var time_deltas = x.time_deltas;
+ delete x.time_deltas;
+ x[name] = fold(time_deltas);
}
}
return data;
@@ -334,7 +382,7 @@ LogProcessor.plot_all_time_entries = function() {
LogProcessor.plot = function(data, x_key, y_axis_label) {
var margin = {top: 20, right: 20, bottom: 30, left: 40},
- width = document.body.clientWidth - margin.left - margin.right,
+ width = (document.body.clientWidth*1.5) - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var x0 = d3.scale.ordinal()
diff --git a/app/views/logs/index.html.erb b/app/views/logs/index.html.erb
index fa6e6d7..eff2bab 100644
--- a/app/views/logs/index.html.erb
+++ b/app/views/logs/index.html.erb
@@ -52,6 +52,3 @@
<% end %>
-
diff --git a/config/newrelic.yml b/config/newrelic.yml
new file mode 100644
index 0000000..fd9cb5f
--- /dev/null
+++ b/config/newrelic.yml
@@ -0,0 +1,224 @@
+#
+# This file configures the New Relic Agent. New Relic monitors Ruby, Java,
+# .NET, PHP, Python and Node applications with deep visibility and low
+# overhead. For more information, visit www.newrelic.com.
+#
+# Generated August 25, 2014
+#
+# This configuration file is custom generated for app18882529@heroku.com
+
+
+# Here are the settings that are common to all environments
+common: &default_settings
+ # ============================== LICENSE KEY ===============================
+
+ # You must specify the license key associated with your New Relic
+ # account. This key binds your Agent's data to your account in the
+ # New Relic service.
+ license_key: '10a4f8a7372043f50010a2b7a61d85b96ca38c85'
+
+ # Agent Enabled (Ruby/Rails Only)
+ # Use this setting to force the agent to run or not run.
+ # Default is 'auto' which means the agent will install and run only
+ # if a valid dispatcher such as Mongrel is running. This prevents
+ # it from running with Rake or the console. Set to false to
+ # completely turn the agent off regardless of the other settings.
+ # Valid values are true, false and auto.
+ #
+ # agent_enabled: auto
+
+ # Application Name Set this to be the name of your application as
+ # you'd like it show up in New Relic. The service will then auto-map
+ # instances of your application into an "application" on your
+ # dashboard page. If you want to map this instance into multiple
+ # apps, like "AJAX Requests" and "All UI" then specify a semicolon
+ # separated list of up to three distinct names, or a yaml list.
+ # Defaults to the capitalized RAILS_ENV or RACK_ENV (i.e.,
+ # Production, Staging, etc)
+ #
+ # Example:
+ #
+ # app_name:
+ # - Ajax Service
+ # - All Services
+ #
+ # Caution: If you change this name, a new application will appear in the New
+ # Relic user interface with the new name, and data will stop reporting to the
+ # app with the old name.
+ #
+ # See https://newrelic.com/docs/site/renaming-applications for more details
+ # on renaming your New Relic applications.
+ #
+ app_name: My Application
+
+ # When "true", the agent collects performance data about your
+ # application and reports this data to the New Relic service at
+ # newrelic.com. This global switch is normally overridden for each
+ # environment below. (formerly called 'enabled')
+ monitor_mode: true
+
+ # Developer mode should be off in every environment but
+ # development as it has very high overhead in memory.
+ developer_mode: false
+
+ # The newrelic agent generates its own log file to keep its logging
+ # information separate from that of your application. Specify its
+ # log level here.
+ log_level: info
+
+ # Optionally set the path to the log file This is expanded from the
+ # root directory (may be relative or absolute, e.g. 'log/' or
+ # '/var/log/') The agent will attempt to create this directory if it
+ # does not exist.
+ # log_file_path: 'log'
+
+ # Optionally set the name of the log file, defaults to 'newrelic_agent.log'
+ # log_file_name: 'newrelic_agent.log'
+
+ # The newrelic agent communicates with the service via https by default. This
+ # prevents eavesdropping on the performance metrics transmitted by the agent.
+ # The encryption required by SSL introduces a nominal amount of CPU overhead,
+ # which is performed asynchronously in a background thread. If you'd prefer
+ # to send your metrics over http uncomment the following line.
+ # ssl: false
+
+ #============================== Browser Monitoring ===============================
+ # New Relic Real User Monitoring gives you insight into the performance real users are
+ # experiencing with your website. This is accomplished by measuring the time it takes for
+ # your users' browsers to download and render your web pages by injecting a small amount
+ # of JavaScript code into the header and footer of each page.
+ browser_monitoring:
+ # By default the agent automatically injects the monitoring JavaScript
+ # into web pages. Set this attribute to false to turn off this behavior.
+ auto_instrument: true
+
+ # Proxy settings for connecting to the New Relic server.
+ #
+ # If a proxy is used, the host setting is required. Other settings
+ # are optional. Default port is 8080.
+ #
+ # proxy_host: hostname
+ # proxy_port: 8080
+ # proxy_user:
+ # proxy_pass:
+
+ # The agent can optionally log all data it sends to New Relic servers to a
+ # separate log file for human inspection and auditing purposes. To enable this
+ # feature, change 'enabled' below to true.
+ # See: https://newrelic.com/docs/ruby/audit-log
+ audit_log:
+ enabled: false
+
+ # Tells transaction tracer and error collector (when enabled)
+ # whether or not to capture HTTP params. When true, frameworks can
+ # exclude HTTP parameters from being captured.
+ # Rails: the RoR filter_parameter_logging excludes parameters
+ # Java: create a config setting called "ignored_params" and set it to
+ # a comma separated list of HTTP parameter names.
+ # ex: ignored_params: credit_card, ssn, password
+ capture_params: false
+
+ # Transaction tracer captures deep information about slow
+ # transactions and sends this to the New Relic service once a
+ # minute. Included in the transaction is the exact call sequence of
+ # the transactions including any SQL statements issued.
+ transaction_tracer:
+
+ # Transaction tracer is enabled by default. Set this to false to
+ # turn it off. This feature is only available at the Professional
+ # and above product levels.
+ enabled: true
+
+ # Threshold in seconds for when to collect a transaction
+ # trace. When the response time of a controller action exceeds
+ # this threshold, a transaction trace will be recorded and sent to
+ # New Relic. Valid values are any float value, or (default) "apdex_f",
+ # which will use the threshold for an dissatisfying Apdex
+ # controller action - four times the Apdex T value.
+ transaction_threshold: apdex_f
+
+ # When transaction tracer is on, SQL statements can optionally be
+ # recorded. The recorder has three modes, "off" which sends no
+ # SQL, "raw" which sends the SQL statement in its original form,
+ # and "obfuscated", which strips out numeric and string literals.
+ record_sql: obfuscated
+
+ # Threshold in seconds for when to collect stack trace for a SQL
+ # call. In other words, when SQL statements exceed this threshold,
+ # then capture and send to New Relic the current stack trace. This is
+ # helpful for pinpointing where long SQL calls originate from.
+ stack_trace_threshold: 0.500
+
+ # Determines whether the agent will capture query plans for slow
+ # SQL queries. Only supported in mysql and postgres. Should be
+ # set to false when using other adapters.
+ # explain_enabled: true
+
+ # Threshold for query execution time below which query plans will
+ # not be captured. Relevant only when `explain_enabled` is true.
+ # explain_threshold: 0.5
+
+ # Error collector captures information about uncaught exceptions and
+ # sends them to New Relic for viewing
+ error_collector:
+
+ # Error collector is enabled by default. Set this to false to turn
+ # it off. This feature is only available at the Professional and above
+ # product levels.
+ enabled: true
+
+ # To stop specific errors from reporting to New Relic, set this property
+ # to comma-separated values. Default is to ignore routing errors,
+ # which are how 404's get triggered.
+ ignore_errors: "ActionController::RoutingError,Sinatra::NotFound"
+
+ # If you're interested in capturing memcache keys as though they
+ # were SQL uncomment this flag. Note that this does increase
+ # overhead slightly on every memcached call, and can have security
+ # implications if your memcached keys are sensitive
+ # capture_memcache_keys: true
+
+# Application Environments
+# ------------------------------------------
+# Environment-specific settings are in this section.
+# For Rails applications, RAILS_ENV is used to determine the environment.
+# For Java applications, pass -Dnewrelic.environment to set
+# the environment.
+
+# NOTE if your application has other named environments, you should
+# provide newrelic configuration settings for these environments here.
+
+development:
+ <<: *default_settings
+ # Turn on communication to New Relic service in development mode
+ monitor_mode: true
+ app_name: My Application (Development)
+
+ # Rails Only - when running in Developer Mode, the New Relic Agent will
+ # present performance information on the last 100 transactions you have
+ # executed since starting the mongrel.
+ # NOTE: There is substantial overhead when running in developer mode.
+ # Do not use for production or load testing.
+ developer_mode: true
+
+test:
+ <<: *default_settings
+ # It almost never makes sense to turn on the agent when running
+ # unit, functional or integration tests or the like.
+ monitor_mode: false
+
+# Turn on the agent in production for 24x7 monitoring. NewRelic
+# testing shows an average performance impact of < 5 ms per
+# transaction, you can leave this on all the time without
+# incurring any user-visible performance degradation.
+production:
+ <<: *default_settings
+ monitor_mode: true
+
+# Many applications have a staging environment which behaves
+# identically to production. Support for that environment is provided
+# here. By default, the staging environment has the agent turned on.
+staging:
+ <<: *default_settings
+ monitor_mode: true
+ app_name: My Application (Staging)