mirror of
https://github.com/cmur2/dyndnsd.git
synced 2025-08-08 08:33:56 +02:00
Compare commits
27 Commits
v2.0.0.rc1
...
v2.0.0
Author | SHA1 | Date | |
---|---|---|---|
7a03415dd9 | |||
77914c42e1 | |||
![]() |
a9d1cc644a | ||
![]() |
902e5868b3 | ||
ffe01467c5 | |||
79db1b1911 | |||
![]() |
f37a77094f | ||
![]() |
2e233422d3 | ||
![]() |
6f044ec5f2 | ||
![]() |
988e30dac9 | ||
![]() |
31233df5ee | ||
1f35f60c55 | |||
![]() |
6310343e45 | ||
![]() |
1dd0eb7d1a | ||
280bfbeb82 | |||
![]() |
bd7c786c9c | ||
![]() |
4f3e591f13 | ||
![]() |
c1b5e14862 | ||
![]() |
d1dc91ed8d | ||
![]() |
14fe8ebedf | ||
![]() |
5264b3e6f1 | ||
d2ac6890aa | |||
a01276c348 | |||
![]() |
22d686dec7 | ||
fe019515eb | |||
3d64c2f2a3 | |||
472d9aaa98 |
18
.rubocop.yml
18
.rubocop.yml
@@ -6,10 +6,19 @@ AllCops:
|
||||
Gemspec/OrderedDependencies:
|
||||
Enabled: false
|
||||
|
||||
Layout/AlignHash:
|
||||
Enabled: false
|
||||
|
||||
Layout/EmptyLineAfterGuardClause:
|
||||
Enabled: false
|
||||
|
||||
# allows nicer usage of private_class_method
|
||||
Layout/EmptyLinesAroundArguments:
|
||||
Enabled: false
|
||||
|
||||
Layout/LeadingBlankLines:
|
||||
Enabled: false
|
||||
|
||||
Layout/SpaceInsideHashLiteralBraces:
|
||||
Enabled: false
|
||||
|
||||
@@ -34,6 +43,12 @@ Metrics/MethodLength:
|
||||
Metrics/PerceivedComplexity:
|
||||
Enabled: false
|
||||
|
||||
Naming/UncommunicativeMethodParamName:
|
||||
Enabled: false
|
||||
|
||||
Naming/MemoizedInstanceVariableName:
|
||||
Enabled: false
|
||||
|
||||
Style/ConditionalAssignment:
|
||||
Enabled: false
|
||||
|
||||
@@ -58,5 +73,8 @@ Style/InverseMethods:
|
||||
Style/NegatedIf:
|
||||
Enabled: false
|
||||
|
||||
Style/RescueModifier:
|
||||
Enabled: false
|
||||
|
||||
Style/SymbolArray:
|
||||
Enabled: false
|
||||
|
@@ -2,6 +2,7 @@
|
||||
sudo: false
|
||||
language: ruby
|
||||
rvm:
|
||||
- 2.6
|
||||
- 2.5
|
||||
- 2.4
|
||||
- 2.3
|
||||
|
@@ -1,6 +1,6 @@
|
||||
# Changelog
|
||||
|
||||
## 2.0.0
|
||||
## 2.0.0 (January 25, 2019)
|
||||
|
||||
IMPROVEMENTS:
|
||||
|
||||
@@ -8,9 +8,10 @@ IMPROVEMENTS:
|
||||
- Better protocol compliance by returning `badauth` in response body on HTTP 401 errors
|
||||
- Better code maintainability by refactorings
|
||||
- Update dependencies, mainly `rack` to new major version 2
|
||||
- Add Ruby 2.5 support
|
||||
- Add Ruby 2.5 and Ruby 2.6 support
|
||||
- Add experimental [OpenTracing](http://opentracing.io/) support with [CNCF Jaeger](https://github.com/jaegertracing/jaeger)
|
||||
- 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)
|
||||
|
||||
|
@@ -135,7 +135,7 @@ The [Debian 6 init.d script](init.d/debian-6-dyndnsd) assumes that dyndnsd.rb is
|
||||
|
||||
### 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
|
||||
host: "0.0.0.0"
|
||||
@@ -147,6 +147,10 @@ graphite:
|
||||
host: localhost # defaults for host and port of a carbon server
|
||||
port: 2003
|
||||
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
|
||||
updater:
|
||||
name: "command_with_bind_zone"
|
||||
|
4
Rakefile
4
Rakefile
@@ -1,8 +1,10 @@
|
||||
require 'bundler/gem_tasks'
|
||||
require 'rspec/core/rake_task'
|
||||
require 'rubocop/rake_task'
|
||||
require 'bundler/audit/task'
|
||||
|
||||
RSpec::Core::RakeTask.new(:spec)
|
||||
RuboCop::RakeTask.new
|
||||
Bundler::Audit::Task.new
|
||||
|
||||
task default: [:rubocop, :spec]
|
||||
task default: [:rubocop, :spec, 'bundle:audit']
|
||||
|
@@ -1,5 +1,5 @@
|
||||
|
||||
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
||||
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
||||
|
||||
require 'dyndnsd/version'
|
||||
|
||||
@@ -23,14 +23,14 @@ Gem::Specification.new do |s|
|
||||
s.add_runtime_dependency 'rack', '~> 2.0'
|
||||
s.add_runtime_dependency 'json'
|
||||
s.add_runtime_dependency 'metriks'
|
||||
s.add_runtime_dependency 'opentracing', '~> 0.3'
|
||||
s.add_runtime_dependency 'rack-tracer', '~> 0.4'
|
||||
s.add_runtime_dependency 'spanmanager', '~> 0.3'
|
||||
s.add_runtime_dependency 'jaeger-client', '~> 0.4'
|
||||
s.add_runtime_dependency 'opentracing', '~> 0.5.0'
|
||||
s.add_runtime_dependency 'rack-tracer', '~> 0.8.0'
|
||||
s.add_runtime_dependency 'jaeger-client', '~> 0.10.0'
|
||||
|
||||
s.add_development_dependency 'bundler'
|
||||
s.add_development_dependency 'rake'
|
||||
s.add_development_dependency 'rspec'
|
||||
s.add_development_dependency 'rack-test'
|
||||
s.add_development_dependency 'rubocop', '~> 0.52.1'
|
||||
s.add_development_dependency 'rubocop', '~> 0.63.0'
|
||||
s.add_development_dependency 'bundler-audit'
|
||||
end
|
||||
|
@@ -10,7 +10,6 @@ require 'metriks'
|
||||
require 'metriks/reporter/graphite'
|
||||
require 'opentracing'
|
||||
require 'rack/tracer'
|
||||
require 'spanmanager'
|
||||
|
||||
require 'dyndnsd/generator/bind'
|
||||
require 'dyndnsd/updater/command_with_bind_zone'
|
||||
@@ -18,6 +17,7 @@ require 'dyndnsd/responder/dyndns_style'
|
||||
require 'dyndnsd/responder/rest_style'
|
||||
require 'dyndnsd/database'
|
||||
require 'dyndnsd/helper'
|
||||
require 'dyndnsd/textfile_reporter'
|
||||
require 'dyndnsd/version'
|
||||
|
||||
module Dyndnsd
|
||||
@@ -235,6 +235,12 @@ module Dyndnsd
|
||||
options[:prefix] = config['graphite']['prefix'] if config['graphite']['prefix']
|
||||
reporter = Metriks::Reporter::Graphite.new(host, port, options)
|
||||
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
|
||||
reporter = Metriks::Reporter::ProcTitle.new
|
||||
reporter.add 'good', 'sec' do
|
||||
@@ -259,8 +265,6 @@ module Dyndnsd
|
||||
host: host, port: port, service_name: service_name, flush_interval: 1
|
||||
)
|
||||
end
|
||||
# always use SpanManager
|
||||
OpenTracing.global_tracer = SpanManager::Tracer.new(OpenTracing.global_tracer)
|
||||
end
|
||||
|
||||
private_class_method def self.setup_rack(config)
|
||||
|
@@ -13,9 +13,9 @@ module Dyndnsd
|
||||
|
||||
def self.ip_valid?(ip)
|
||||
IPAddr.new(ip)
|
||||
return true
|
||||
true
|
||||
rescue ArgumentError
|
||||
return false
|
||||
false
|
||||
end
|
||||
|
||||
def self.user_allowed?(username, password, users)
|
||||
@@ -28,13 +28,24 @@ module Dyndnsd
|
||||
end
|
||||
|
||||
def self.span(operation, &block)
|
||||
span = OpenTracing.start_span(operation)
|
||||
scope = OpenTracing.start_active_span(operation)
|
||||
span = scope.span
|
||||
span.set_tag('component', 'dyndnsd')
|
||||
span.set_tag('span.kind', 'server')
|
||||
begin
|
||||
block.call(span)
|
||||
rescue StandardError => e
|
||||
span.set_tag('error', true)
|
||||
span.log_kv(
|
||||
event: 'error',
|
||||
'error.kind': e.class.to_s,
|
||||
'error.object': e,
|
||||
message: e.message,
|
||||
stack: e.backtrace.join("\n")
|
||||
)
|
||||
raise
|
||||
ensure
|
||||
span.finish
|
||||
scope.close
|
||||
end
|
||||
end
|
||||
end
|
||||
|
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
|
@@ -1,4 +1,4 @@
|
||||
|
||||
module Dyndnsd
|
||||
VERSION = '2.0.0.rc1'.freeze
|
||||
VERSION = '2.0.0'.freeze
|
||||
end
|
||||
|
Reference in New Issue
Block a user