mirror of
https://github.com/cmur2/dyndnsd.git
synced 2024-12-21 14:54:22 +01:00
monitoring: add textfile reporter to write Graphite-style metrics into file
This commit is contained in:
parent
22d686dec7
commit
a01276c348
@ -37,6 +37,9 @@ Metrics/PerceivedComplexity:
|
|||||||
Naming/UncommunicativeMethodParamName:
|
Naming/UncommunicativeMethodParamName:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Naming/MemoizedInstanceVariableName:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/ConditionalAssignment:
|
Style/ConditionalAssignment:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
@ -61,5 +64,8 @@ Style/InverseMethods:
|
|||||||
Style/NegatedIf:
|
Style/NegatedIf:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/RescueModifier:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/SymbolArray:
|
Style/SymbolArray:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -11,6 +11,7 @@ IMPROVEMENTS:
|
|||||||
- Add Ruby 2.5 support
|
- Add Ruby 2.5 support
|
||||||
- Add experimental [OpenTracing](http://opentracing.io/) support with [CNCF Jaeger](https://github.com/jaegertracing/jaeger)
|
- Add experimental [OpenTracing](http://opentracing.io/) support with [CNCF Jaeger](https://github.com/jaegertracing/jaeger)
|
||||||
- Support host offlining by deleting the associated DNS records
|
- Support host offlining by deleting the associated DNS records
|
||||||
|
- Add textfile reporter to write Graphite-style metrics (also compatible with [Prometheus](https://prometheus.io/)) into a file
|
||||||
|
|
||||||
## 1.6.1 (October 31, 2017)
|
## 1.6.1 (October 31, 2017)
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ The [Debian 6 init.d script](init.d/debian-6-dyndnsd) assumes that dyndnsd.rb is
|
|||||||
|
|
||||||
### Monitoring
|
### Monitoring
|
||||||
|
|
||||||
For monitoring dyndnsd.rb uses the [metriks](https://github.com/eric/metriks) framework and exposes several metrics like the number of unauthenticated requests, requests that did (not) update a hostname, etc. By default the most important metrics are shown in the [proctitle](https://github.com/eric/metriks#proc-title-reporter) but you can also configure a [Graphite](https://graphiteapp.org/) backend for central monitoring.
|
For monitoring dyndnsd.rb uses the [metriks](https://github.com/eric/metriks) framework and exposes several metrics like the number of unauthenticated requests, requests that did (not) update a hostname, etc. By default the most important metrics are shown in the [proctitle](https://github.com/eric/metriks#proc-title-reporter) but you can also configure a [Graphite](https://graphiteapp.org/) backend for central monitoring or the [textfile_reporter](https://github.com/prometheus/node_exporter/#textfile-collector) which outputs Graphite-style metrics that are also compatible with Prometheus to a file.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
host: "0.0.0.0"
|
host: "0.0.0.0"
|
||||||
@ -147,6 +147,10 @@ graphite:
|
|||||||
host: localhost # defaults for host and port of a carbon server
|
host: localhost # defaults for host and port of a carbon server
|
||||||
port: 2003
|
port: 2003
|
||||||
prefix: "my.graphite.metrics.naming.structure.dyndnsd"
|
prefix: "my.graphite.metrics.naming.structure.dyndnsd"
|
||||||
|
# OR configure the textfile reporter instead of Graphite/proctitle
|
||||||
|
textfile:
|
||||||
|
file: /path/to/file.prom
|
||||||
|
prefix: "my.graphite.metrics.naming.structure.dyndnsd"
|
||||||
# configure the updater, here we use command_with_bind_zone, params are updater-specific
|
# configure the updater, here we use command_with_bind_zone, params are updater-specific
|
||||||
updater:
|
updater:
|
||||||
name: "command_with_bind_zone"
|
name: "command_with_bind_zone"
|
||||||
|
@ -18,6 +18,7 @@ require 'dyndnsd/responder/dyndns_style'
|
|||||||
require 'dyndnsd/responder/rest_style'
|
require 'dyndnsd/responder/rest_style'
|
||||||
require 'dyndnsd/database'
|
require 'dyndnsd/database'
|
||||||
require 'dyndnsd/helper'
|
require 'dyndnsd/helper'
|
||||||
|
require 'dyndnsd/textfile_reporter'
|
||||||
require 'dyndnsd/version'
|
require 'dyndnsd/version'
|
||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
@ -235,6 +236,12 @@ module Dyndnsd
|
|||||||
options[:prefix] = config['graphite']['prefix'] if config['graphite']['prefix']
|
options[:prefix] = config['graphite']['prefix'] if config['graphite']['prefix']
|
||||||
reporter = Metriks::Reporter::Graphite.new(host, port, options)
|
reporter = Metriks::Reporter::Graphite.new(host, port, options)
|
||||||
reporter.start
|
reporter.start
|
||||||
|
elsif config['textfile']
|
||||||
|
file = config['textfile']['file'] || '/tmp/dyndnsd-metrics.prom'
|
||||||
|
options = {}
|
||||||
|
options[:prefix] = config['textfile']['prefix'] if config['textfile']['prefix']
|
||||||
|
reporter = Dyndnsd::TextfileReporter.new(file, options)
|
||||||
|
reporter.start
|
||||||
else
|
else
|
||||||
reporter = Metriks::Reporter::ProcTitle.new
|
reporter = Metriks::Reporter::ProcTitle.new
|
||||||
reporter.add 'good', 'sec' do
|
reporter.add 'good', 'sec' do
|
||||||
|
110
lib/dyndnsd/textfile_reporter.rb
Normal file
110
lib/dyndnsd/textfile_reporter.rb
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
|
||||||
|
# Adapted from https://github.com/eric/metriks-graphite/blob/master/lib/metriks/reporter/graphite.rb
|
||||||
|
|
||||||
|
require 'metriks'
|
||||||
|
|
||||||
|
module Dyndnsd
|
||||||
|
class TextfileReporter
|
||||||
|
attr_reader :file
|
||||||
|
|
||||||
|
def initialize(file, options = {})
|
||||||
|
@file = file
|
||||||
|
|
||||||
|
@prefix = options[:prefix]
|
||||||
|
|
||||||
|
@registry = options[:registry] || Metriks::Registry.default
|
||||||
|
@interval = options[:interval] || 60
|
||||||
|
@on_error = options[:on_error] || proc { |ex| }
|
||||||
|
end
|
||||||
|
|
||||||
|
def start
|
||||||
|
@thread ||= Thread.new do
|
||||||
|
loop do
|
||||||
|
sleep @interval
|
||||||
|
|
||||||
|
Thread.new do
|
||||||
|
begin
|
||||||
|
write
|
||||||
|
rescue StandardError => e
|
||||||
|
@on_error[e] rescue nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop
|
||||||
|
@thread&.kill
|
||||||
|
@thread = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def restart
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
end
|
||||||
|
|
||||||
|
def write
|
||||||
|
File.open(@file, 'w') do |f|
|
||||||
|
@registry.each do |name, metric|
|
||||||
|
case metric
|
||||||
|
when Metriks::Meter
|
||||||
|
write_metric f, name, metric, [
|
||||||
|
:count, :one_minute_rate, :five_minute_rate,
|
||||||
|
:fifteen_minute_rate, :mean_rate
|
||||||
|
]
|
||||||
|
when Metriks::Counter
|
||||||
|
write_metric f, name, metric, [
|
||||||
|
:count
|
||||||
|
]
|
||||||
|
when Metriks::UtilizationTimer
|
||||||
|
write_metric f, name, metric, [
|
||||||
|
:count, :one_minute_rate, :five_minute_rate,
|
||||||
|
:fifteen_minute_rate, :mean_rate,
|
||||||
|
:min, :max, :mean, :stddev,
|
||||||
|
:one_minute_utilization, :five_minute_utilization,
|
||||||
|
:fifteen_minute_utilization, :mean_utilization
|
||||||
|
], [
|
||||||
|
:median, :get_95th_percentile
|
||||||
|
]
|
||||||
|
when Metriks::Timer
|
||||||
|
write_metric f, name, metric, [
|
||||||
|
:count, :one_minute_rate, :five_minute_rate,
|
||||||
|
:fifteen_minute_rate, :mean_rate,
|
||||||
|
:min, :max, :mean, :stddev
|
||||||
|
], [
|
||||||
|
:median, :get_95th_percentile
|
||||||
|
]
|
||||||
|
when Metriks::Histogram
|
||||||
|
write_metric f, name, metric, [
|
||||||
|
:count, :min, :max, :mean, :stddev
|
||||||
|
], [
|
||||||
|
:median, :get_95th_percentile
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def write_metric(file, base_name, metric, keys, snapshot_keys = [])
|
||||||
|
time = Time.now.to_i
|
||||||
|
|
||||||
|
base_name = base_name.to_s.gsub(/ +/, '_')
|
||||||
|
base_name = "#{@prefix}.#{base_name}" if @prefix
|
||||||
|
|
||||||
|
keys.flatten.each do |key|
|
||||||
|
name = key.to_s.gsub(/^get_/, '')
|
||||||
|
value = metric.send(key)
|
||||||
|
file.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)
|
||||||
|
file.write("#{base_name}.#{name} #{value} #{time}\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user