mirror of
https://github.com/cmur2/dyndnsd.git
synced 2026-11-14 12:55:58 +01:00
hitime is only needed for Metriks::Timer and requires native extensions. Those do not compile with default settings under Ubuntu 26.04 or Alpine 3.24.
92 lines
2.1 KiB
Ruby
92 lines
2.1 KiB
Ruby
# Vendored from metriks 0.9.9.8 — https://github.com/eric/metriks
|
|
# Copyright (c) 2012 Eric Lindvall, MIT licensed.
|
|
# Trimmed to the subset dyndnsd uses (meters + registry + reporters).
|
|
|
|
require 'socket'
|
|
|
|
module Metriks::Reporter
|
|
class Graphite
|
|
attr_reader :host, :port
|
|
|
|
def initialize(host, port, options = {})
|
|
@host = host
|
|
@port = port
|
|
|
|
@prefix = options[:prefix]
|
|
|
|
@registry = options[:registry] || Metriks::Registry.default
|
|
@interval = options[:interval] || 60
|
|
@on_error = options[:on_error] || proc { |ex| }
|
|
end
|
|
|
|
def socket
|
|
@socket = nil if @socket && @socket.closed?
|
|
@socket ||= TCPSocket.new(@host, @port)
|
|
end
|
|
|
|
def start
|
|
@thread ||= Thread.new do
|
|
loop do
|
|
sleep @interval
|
|
|
|
Thread.new do
|
|
begin
|
|
write
|
|
rescue Exception => ex
|
|
@on_error[ex] rescue nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def stop
|
|
@thread.kill if @thread
|
|
@thread = nil
|
|
end
|
|
|
|
def restart
|
|
stop
|
|
start
|
|
end
|
|
|
|
def write
|
|
@registry.each do |name, metric|
|
|
case metric
|
|
when Metriks::Meter
|
|
write_metric name, metric, [
|
|
:count, :one_minute_rate, :five_minute_rate,
|
|
:fifteen_minute_rate, :mean_rate
|
|
]
|
|
end
|
|
end
|
|
end
|
|
|
|
def write_metric(base_name, metric, keys, snapshot_keys = [])
|
|
time = Time.now.to_i
|
|
|
|
base_name = base_name.to_s.gsub(/ +/, '_')
|
|
if @prefix
|
|
base_name = "#{@prefix}.#{base_name}"
|
|
end
|
|
|
|
keys.flatten.each do |key|
|
|
name = key.to_s.gsub(/^get_/, '')
|
|
value = metric.send(key)
|
|
socket.write("#{base_name}.#{name} #{value} #{time}\n")
|
|
end
|
|
|
|
unless snapshot_keys.empty?
|
|
snapshot = metric.snapshot
|
|
snapshot_keys.flatten.each do |key|
|
|
name = key.to_s.gsub(/^get_/, '')
|
|
value = snapshot.send(key)
|
|
socket.write("#{base_name}.#{name} #{value} #{time}\n")
|
|
end
|
|
end
|
|
rescue Errno::EPIPE
|
|
socket.close
|
|
end
|
|
end
|
|
end
|