Module: NewRelic::Agent::StatsEngine::MetricStats
- Included in:
- NewRelic::Agent::StatsEngine
- Defined in:
- lib/new_relic/agent/stats_engine/metric_stats.rb
Overview
Handles methods related to actual Metric collection
Instance Method Summary collapse
- #apply_rules_to_metric_data(rules_engine, stats_hash) ⇒ Object
-
#clear_stats ⇒ Object
For use by test code only.
- #coerce_to_metric_spec_array(metric_names_or_specs, scope) ⇒ Object
-
#get_stats(metric_name, use_scope = true, scoped_metric_only = false, scope = nil) ⇒ Object
If use_scope is true, two chained metrics are created, one with scope and one without If scoped_metric_only is true, only a scoped metric is created (used by rendering metrics which by definition are per controller only).
-
#get_stats_no_scope(metric_name) ⇒ Object
a simple accessor for looking up a stat with no scope - returns a new stats object if no stats object for that metric exists yet.
-
#harvest_timeslice_data(old_stats_hash, rules_engine = RulesEngine.new) ⇒ Object
Harvest the timeslice data.
-
#lookup_stats(metric_name, scope_name = '') ⇒ Object
Returns a stat if one exists, otherwise returns nil.
-
#merge!(other_stats_hash) ⇒ Object
merge data from previous harvests into this stats engine.
-
#metrics ⇒ Object
Returns all of the metric names of all the stats in the engine.
-
#record_metrics(metric_names_or_specs, value = nil, options = {}, &blk) ⇒ Object
Lookup and write to the named metric in a single call.
-
#record_supportability_metrics(value, *metrics) ⇒ Object
Helper method for recording supportability metrics consistently.
-
#record_supportability_metrics_count(value, *metrics) ⇒ Object
Helper for recording a straight value into the count.
-
#record_supportability_metrics_timed(metrics) ⇒ Object
Helper method for timing supportability metrics.
- #reset_stats ⇒ Object
Instance Method Details
#apply_rules_to_metric_data(rules_engine, stats_hash) ⇒ Object
121 122 123 124 125 126 127 128 129 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 121 def apply_rules_to_metric_data(rules_engine, stats_hash) renamed_stats = NewRelic::Agent::StatsHash.new stats_hash.each do |spec, stats| new_name = rules_engine.rename(spec.name) new_spec = NewRelic::MetricSpec.new(new_name, spec.scope) renamed_stats[new_spec].merge!(stats) end renamed_stats end |
#clear_stats ⇒ Object
For use by test code only.
146 147 148 149 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 146 def clear_stats reset_stats NewRelic::Agent::BusyCalculator.reset end |
#coerce_to_metric_spec_array(metric_names_or_specs, scope) ⇒ Object
131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 131 def coerce_to_metric_spec_array(metric_names_or_specs, scope) specs = [] Array(metric_names_or_specs).map do |name_or_spec| case name_or_spec when String specs << NewRelic::MetricSpec.new(name_or_spec) specs << NewRelic::MetricSpec.new(name_or_spec, scope) if scope when NewRelic::MetricSpec specs << name_or_spec end end specs end |
#get_stats(metric_name, use_scope = true, scoped_metric_only = false, scope = nil) ⇒ Object
If use_scope is true, two chained metrics are created, one with scope and one without If scoped_metric_only is true, only a scoped metric is created (used by rendering metrics which by definition are per controller only)
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 38 def get_stats(metric_name, use_scope = true, scoped_metric_only = false, scope = nil) scope ||= scope_name if use_scope stats = nil with_stats_lock do if scoped_metric_only stats = @stats_hash[NewRelic::MetricSpec.new(metric_name, scope)] else unscoped_spec = NewRelic::MetricSpec.new(metric_name) unscoped_stats = @stats_hash[unscoped_spec] if scope && scope != metric_name scoped_spec = NewRelic::MetricSpec.new(metric_name, scope) scoped_stats = @stats_hash[scoped_spec] stats = NewRelic::Agent::ChainedStats.new(scoped_stats, unscoped_stats) else stats = unscoped_stats end end end stats end |
#get_stats_no_scope(metric_name) ⇒ Object
a simple accessor for looking up a stat with no scope - returns a new stats object if no stats object for that metric exists yet
32 33 34 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 32 def get_stats_no_scope(metric_name) get_stats(metric_name, false) end |
#harvest_timeslice_data(old_stats_hash, rules_engine = RulesEngine.new) ⇒ Object
Harvest the timeslice data. First recombine current statss with any previously unsent metrics, clear out stats cache, and return the current stats.
114 115 116 117 118 119 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 114 def harvest_timeslice_data(old_stats_hash, rules_engine=RulesEngine.new) poll harvest_samplers snapshot = reset_stats snapshot = apply_rules_to_metric_data(rules_engine, snapshot) snapshot.merge!(old_stats_hash) end |
#lookup_stats(metric_name, scope_name = '') ⇒ Object
Returns a stat if one exists, otherwise returns nil. If you want auto-initialization, use one of get_stats or get_stats_no_scope
61 62 63 64 65 66 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 61 def lookup_stats(metric_name, scope_name = '') spec = NewRelic::MetricSpec.new(metric_name, scope_name) with_stats_lock do @stats_hash.has_key?(spec) ? @stats_hash[spec] : nil end end |
#merge!(other_stats_hash) ⇒ Object
merge data from previous harvests into this stats engine
104 105 106 107 108 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 104 def merge!(other_stats_hash) with_stats_lock do @stats_hash.merge!(other_stats_hash) end end |
#metrics ⇒ Object
Returns all of the metric names of all the stats in the engine. For use by test code only.
153 154 155 156 157 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 153 def metrics with_stats_lock do @stats_hash.keys.map { |spec| spec.to_s } end end |
#record_metrics(metric_names_or_specs, value = nil, options = {}, &blk) ⇒ Object
Lookup and write to the named metric in a single call.
This method is thead-safe, and is preferred to the lookup / modify method pairs (e.g. get_stats + record_data_point)
16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 16 def record_metrics(metric_names_or_specs, value=nil, ={}, &blk) defaults = { :scoped => false, :scope => scope_name } = defaults.merge() effective_scope = [:scoped] && [:scope] specs = coerce_to_metric_spec_array(metric_names_or_specs, effective_scope) with_stats_lock do @stats_hash.record(specs, value, &blk) end end |
#record_supportability_metrics(value, *metrics) ⇒ Object
Helper method for recording supportability metrics consistently
88 89 90 91 92 93 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 88 def record_supportability_metrics(value, *metrics) real_names = metrics.map { |name| "Supportability/#{name}" } NewRelic::Agent.agent.record_metric(real_names) do |stat| yield stat end end |
#record_supportability_metrics_count(value, *metrics) ⇒ Object
Helper for recording a straight value into the count
81 82 83 84 85 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 81 def record_supportability_metrics_count(value, *metrics) record_metrics(metrics) do |stat| stat.call_count = value end end |
#record_supportability_metrics_timed(metrics) ⇒ Object
Helper method for timing supportability metrics
69 70 71 72 73 74 75 76 77 78 |
# File 'lib/new_relic/agent/stats_engine/metric_stats.rb', line 69 def record_supportability_metrics_timed(metrics) start_time = Time.now yield end_time = Time.now duration = (end_time - start_time).to_f ensure record_metrics(metrics) do |stat| stat.record_data_point(duration) end end |