Class: PrometheusExporter::Server::WebServer

Inherits:
Object
  • Object
show all
Defined in:
lib/prometheus_exporter/server/web_server.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(port:, collector: nil) ⇒ WebServer

Returns a new instance of WebServer.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/prometheus_exporter/server/web_server.rb', line 10

def initialize(port: , collector: nil)

  @server = WEBrick::HTTPServer.new(
    Port: port,
    AccessLog: [],
    Logger: WEBrick::Log.new("/dev/null")
  )

  @collector = collector || Collector.new
  @port = port

  @server.mount_proc '/' do |req, res|
    res['ContentType'] = 'text/plain; charset=utf-8'
    if req.path == '/metrics'
      res.status = 200
      res.body = metrics
    elsif req.path == '/send-metrics'
      handle_metrics(req, res)
    else
      res.status = 404
      res.body = "Not Found! The Prometheus Discourse plugin only listens on /metrics and /send-metrics"
    end
  end
end

Instance Attribute Details

#collectorObject (readonly)

Returns the value of attribute collector.



8
9
10
# File 'lib/prometheus_exporter/server/web_server.rb', line 8

def collector
  @collector
end

Instance Method Details

#add_gauge(name, help, value) ⇒ Object



89
90
91
92
93
# File 'lib/prometheus_exporter/server/web_server.rb', line 89

def add_gauge(name, help, value)
  gauge = PrometheusExporter::Metric::Gauge.new(name, help)
  gauge.observe(value)
  @metrics << gauge
end

#handle_metrics(req, res) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/prometheus_exporter/server/web_server.rb', line 35

def handle_metrics(req, res)
  req.body do |block|
    begin
      @collector.process(JSON.parse(block))
    rescue => e
      res.body = "Bad Metrics #{e}"
      res.status = e.respond_to?(:status_code) ? e.status_code : 500
      return
    end
  end

  res.body = "OK"
  res.status = 200
end

#metricsObject



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/prometheus_exporter/server/web_server.rb', line 64

def metrics
  metric_text = nil
  begin
    Timeout::timeout(2) do
      metric_text = @collector.prometheus_metrics_text
    end
  rescue Timeout::Error
    # we timed out ... bummer
    STDERR.puts "Generating Prometheus metrics text timed out"
  end

  @metrics = []

  add_gauge(
    "collector_working",
    "Is the master process collector able to collect metrics",
    metric_text && metric_text.length > 0 ? 1 : 0
  )

  <<~TEXT
  #{@metrics.map(&:to_prometheus_text).join("\n\n")}
  #{metric_text}
  TEXT
end

#startObject



50
51
52
53
54
55
56
57
58
# File 'lib/prometheus_exporter/server/web_server.rb', line 50

def start
  @runner ||= Thread.start do
    begin
      @server.start
    rescue => e
      STDERR.puts "Failed to start prometheus collector web on port #{@port}: #{e}"
    end
  end
end

#stopObject



60
61
62
# File 'lib/prometheus_exporter/server/web_server.rb', line 60

def stop
  @server.shutdown
end