64 lines
1.6 KiB
Ruby
64 lines
1.6 KiB
Ruby
require 'rack'
|
|
require './postfix_exporter'
|
|
require 'socket'
|
|
|
|
class Settings
|
|
def initialize environment
|
|
@environment = environment.to_s.to_sym
|
|
end
|
|
attr_reader :environment
|
|
alias :env :environment
|
|
def development?() :development == environment end
|
|
def production?() :production == environment end
|
|
def test?() :test == environment end
|
|
end
|
|
|
|
settings = Settings.new ENV['RACK_ENV']
|
|
collector = Collector.new settings: settings
|
|
collector.start
|
|
showqpath = '/var/spool/postfix/public/showq'
|
|
prometheus = collector.prometheus
|
|
metrics = OpenStruct.new(
|
|
queued: prometheus.gauge( :postfix_queued, docstring: "Queued mails per queue and sender/recipient", labels: %i[queue sender recipient]),
|
|
)
|
|
|
|
def determine_domain str
|
|
case str
|
|
when /@([^.]+\.[^.]+)\z/
|
|
$1
|
|
when /\.([^.]+\.[^.]+)\z/
|
|
"any.#$1"
|
|
when 'MAILER-DAEMON'
|
|
'MAILER-DAEMON'
|
|
else
|
|
'any'
|
|
end
|
|
end
|
|
|
|
run lambda {|env|
|
|
req = Rack::Request.new env
|
|
case req.path
|
|
when "/metrics"
|
|
showq = ''
|
|
UNIXSocket.open showqpath do |s|
|
|
while '' != (r = s.read)
|
|
showq += r
|
|
end
|
|
end
|
|
showq =
|
|
showq.split( "\x00\x00").map do |x|
|
|
y = x.split "\x00"
|
|
y.push '' if y.length.odd?
|
|
Hash[*y]
|
|
end
|
|
showq.group_by do |e|
|
|
{queue: e['queue_name'], sender: determine_domain( e['sender']), recipient: determine_domain( e['recipient'])}
|
|
end.each do |labels, entries|
|
|
metrics.queued.set entries.length, labels: labels if labels and labels[:queue]
|
|
end
|
|
[200, {"Content-Type" => "text/plain"}, [Prometheus::Client::Formats::Text.marshal( prometheus)]]
|
|
else
|
|
[404, {"Content-Type" => "text/plain"}, ["Not found\nYou want to try /metrics?\n"]]
|
|
end
|
|
}
|