require 'active_resource_associations' # = New Relic REST API # # This is a helper module for working with the New Relic API's XML interface. Requires Rails 2.0 or later to be loaded. # # Can also be used as a script using script/runner. # # In this version of the api, authentication is handled using your account API key, available in your Account settings # in http://rpm.newrelic.com. # Log in, click Account at the top of the page and check the "Make my account data accessible" checkbox. An # API key will appear. # # Refer to the README file for details and examples on the REST API. # # == Examples # # # Fetching the list of applications for an account # NewRelicApi::Account.find(:first).applications # # # Fetching the health values for all account applications # NewRelicApi::Account.application_health # # # Fetching the health values for an application # NewRelicApi::Account.find(:first).applications.first.threshold_values # # # Finding an application by name # NewRelicApi::Account.find(:first).applications(:params => {:conditions => {:name => 'My App'}}) # module NewRelicApi class << self attr_accessor :api_key, :ssl, :host, :port, :proxy # Resets the base path of all resources. This should be called when overridding the newrelic.yml settings # using the ssl, host or port accessors. def reset! @classes.each {|klass| klass.reset!} if @classes NewRelicApi::Account.site_url end def track_resource(klass) #:nodoc: (@classes ||= []) << klass end end class BaseResource < ActiveResource::Base #:nodoc: include ActiveResourceAssociations class << self def inherited(klass) #:nodoc: NewRelicApi.track_resource(klass) end def headers raise "api_key required" unless NewRelicApi.api_key {'x-api-key' => NewRelicApi.api_key} end def site_url host = NewRelicApi.host || 'rpm.newrelic.com' port = NewRelicApi.port || 80 "#{port == 443 ? 'https' : 'http'}://#{host}:#{port}" end def reset! self.site = self.site_url end def proxy NewRelicApi.proxy end end self.site = self.site_url self.proxy = self.proxy end ACCOUNT_RESOURCE_PATH = '/accounts/:account_id/' #:nodoc: ACCOUNT_AGENT_RESOURCE_PATH = ACCOUNT_RESOURCE_PATH + 'agents/:agent_id/' #:nodoc: ACCOUNT_APPLICATION_RESOURCE_PATH = ACCOUNT_RESOURCE_PATH + 'applications/:application_id/' #:nodoc: module AccountResource #:nodoc: def account_id prefix_options[:account_id] end def account_query_params(extra_params = {}) {:account_id => account_id}.merge(extra_params) end def query_params#:nodoc: account_query_params end end module AgentResource #:nodoc: include ActiveResourceAssociations end # An application has many: # +agents+:: the agent instances associated with this app # +threshold_values+:: the health indicators for this application. class Application < BaseResource include AccountResource include AgentResource has_many :agents, :threshold_values self.prefix = ACCOUNT_RESOURCE_PATH def query_params#:nodoc: account_query_params(:application_id => id) end class Agent < BaseResource include AccountResource include AgentResource self.prefix = ACCOUNT_APPLICATION_RESOURCE_PATH def query_params#:nodoc: super.merge(:application_id => cluster_agent_id) end end end # A threshold value represents a single health indicator for an application such as CPU, memory or response time. # # ==Fields # +name+:: The name of the threshold setting associated with this threshold value. # +begin_time+:: Time value indicating start of evaluation period, as a string. # +threshold_value+:: A value of 0, 1, 2 or 3 representing gray (not reporting), green, yellow and red # +metric_value+:: The metric value associated with this threshold class ThresholdValue < BaseResource self.prefix = ACCOUNT_APPLICATION_RESOURCE_PATH # attr_reader :name, :begin_time, :metric_value, :threshold_value # Return theshold_value as 0, 1, 2, or 3 representing grey (not reporting) # green, yellow, and red, respectively. def threshold_value super.to_i end # Return the actual value of the threshold as a Float def metric_value super.to_f end # Returns the color value for this threshold (Gray, Green, Yellow or Red). def color_value case threshold_value when 3 then 'Red' when 2 then 'Yellow' when 1 then 'Green' else 'Gray' end end def to_s #:nodoc: "#{name}: #{color_value} (#{formatted_metric_value})" end end # An account contains your basic account information. # # Accounts have many # +applications+:: the applications contained within the account # # Find Accounts # # NewRelicApi::Account.find(:first) # find account associated with the api key # NewRelicApi::Account.find(44) # find individual account by ID # class Account < BaseResource has_many :applications has_many :account_views def query_params #:nodoc: {:account_id => id} end # Returns an account including all of its applications and the threshold values for each application. def self.application_health(type = :first) find(type, :params => {:include => :application_health}) end class AccountView < BaseResource self.prefix = ACCOUNT_RESOURCE_PATH def query_params(extra_params = {}) #:nodoc: {:account_id => account_id}.merge(extra_params) end def user @attributes['user'] end end class AccountUsage < BaseResource end end # This model is used to mark production deployments in RPM # Only create is supported. # == Options # # Exactly one of the following is required: # * app_name: The value of app_name in the newrelic.yml file used by the application. This may be different than the label that appears in the RPM UI. You can find the app_name value in RPM by looking at the label settings for your application. # * application_id: The application id, found in the URL when viewing the application in RPM. # # Following are optional parameters: # * description: Text annotation for the deployment — notes for you # * changelog: A list of changes for this deployment # * user: The name of the user/process that triggered this deployment # # ==Example # # NewRelicApi::Deployment.create :application_id => 11142007, :description => "Update production", :user => "Big Mike" # # NewRelicApi::Deployment.create :app_name => "My Application", :description => "Update production", :user => "Big Mike" # class Deployment < BaseResource end class Subscription < BaseResource def query_params(extra_params = {}) #:nodoc: {:account_id => account_id}.merge(extra_params) end end class User < BaseResource end end