forked from spotify/ffwd-ruby
-
Notifications
You must be signed in to change notification settings - Fork 0
/
metric_emitter.rb
51 lines (46 loc) · 1.68 KB
/
metric_emitter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# $LICENSE
# Copyright 2013-2014 Spotify AB. All rights reserved.
#
# The contents of this file are licensed under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
require_relative 'utils'
require_relative 'metric'
module FFWD
# Used to emit metrics to an 'output' channel
#
# Can take two parts of a configuration 'base' and 'opts' to decide which
# metadata emitted metrics should be decorated with.
class MetricEmitter
def self.build output, base, opts
host = opts[:host] || base[:host] || FFWD.current_host
tags = FFWD.merge_sets base[:tags], opts[:tags]
attributes = FFWD.merge_hashes base[:attributes], opts[:attributes]
new output, host, tags, attributes
end
def initialize output, host, tags, attributes
@output = output
@host = host
@tags = tags
@attributes = attributes
end
def emit m
m[:time] ||= Time.now
m[:host] ||= @host if @host
m[:tags] = FFWD.merge_sets @tags, m[:tags]
m[:attributes] = FFWD.merge_hashes @attributes, m[:attributes]
m[:value] = nil if (v = m[:value] and v.is_a?(Float) and v.nan?)
@output.metric Metric.make(m)
rescue => e
log.error "Failed to emit metric", e
end
end
end