Class: PrometheusExporter::Client
- Inherits:
-
Object
- Object
- PrometheusExporter::Client
- Defined in:
- lib/prometheus_exporter/client.rb
Direct Known Subclasses
Defined Under Namespace
Classes: RemoteMetric
Constant Summary collapse
- MAX_SOCKET_AGE =
25
- MAX_QUEUE_SIZE =
10_000
Class Method Summary collapse
Instance Method Summary collapse
- #custom_labels=(custom_labels) ⇒ Object
- #find_registered_metric(name, type: nil, help: nil) ⇒ Object
-
#initialize(host: 'localhost', port: PrometheusExporter::DEFAULT_PORT, max_queue_size: nil, thread_sleep: 0.5, json_serializer: nil, custom_labels: nil) ⇒ Client
constructor
A new instance of Client.
- #process_queue ⇒ Object
- #register(type, name, help, opts = nil) ⇒ Object
- #send(str) ⇒ Object
- #send_json(obj) ⇒ Object
- #stop(wait_timeout_seconds: 0) ⇒ Object
Constructor Details
#initialize(host: 'localhost', port: PrometheusExporter::DEFAULT_PORT, max_queue_size: nil, thread_sleep: 0.5, json_serializer: nil, custom_labels: nil) ⇒ Client
Returns a new instance of Client.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/prometheus_exporter/client.rb', line 56 def initialize(host: 'localhost', port: PrometheusExporter::DEFAULT_PORT, max_queue_size: nil, thread_sleep: 0.5, json_serializer: nil, custom_labels: nil) @metrics = [] @queue = Queue.new @socket = nil @socket_started = nil max_queue_size ||= MAX_QUEUE_SIZE max_queue_size = max_queue_size.to_i if max_queue_size.to_i <= 0 raise ArgumentError, "max_queue_size must be larger than 0" end @max_queue_size = max_queue_size @host = host @port = port @worker_thread = nil @mutex = Mutex.new @thread_sleep = thread_sleep @json_serializer = json_serializer == :oj ? PrometheusExporter::OjCompat : JSON @custom_labels = custom_labels end |
Class Method Details
.default ⇒ Object
45 46 47 |
# File 'lib/prometheus_exporter/client.rb', line 45 def self.default @default ||= new end |
.default=(client) ⇒ Object
49 50 51 |
# File 'lib/prometheus_exporter/client.rb', line 49 def self.default=(client) @default = client end |
Instance Method Details
#custom_labels=(custom_labels) ⇒ Object
82 83 84 |
# File 'lib/prometheus_exporter/client.rb', line 82 def custom_labels=(custom_labels) @custom_labels = custom_labels end |
#find_registered_metric(name, type: nil, help: nil) ⇒ Object
92 93 94 95 96 97 98 99 100 |
# File 'lib/prometheus_exporter/client.rb', line 92 def find_registered_metric(name, type: nil, help: nil) @metrics.find do |metric| type_match = type ? metric.type == type : true help_match = help ? metric.help == help : true name_match = metric.name == name type_match && help_match && name_match end end |
#process_queue ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/prometheus_exporter/client.rb', line 117 def process_queue while @queue.length > 0 ensure_socket! begin = @queue.pop @socket.write(.bytesize.to_s(16).upcase) @socket.write("\r\n") @socket.write() @socket.write("\r\n") rescue => e STDERR.puts "Prometheus Exporter is dropping a message: #{e}" @socket = nil raise end end end |
#register(type, name, help, opts = nil) ⇒ Object
86 87 88 89 90 |
# File 'lib/prometheus_exporter/client.rb', line 86 def register(type, name, help, opts = nil) metric = RemoteMetric.new(type: type, name: name, help: help, client: self, opts: opts) @metrics << metric metric end |
#send(str) ⇒ Object
107 108 109 110 111 112 113 114 115 |
# File 'lib/prometheus_exporter/client.rb', line 107 def send(str) @queue << str if @queue.length > @max_queue_size STDERR.puts "Prometheus Exporter client is dropping message cause queue is full" @queue.pop end ensure_worker_thread! end |
#send_json(obj) ⇒ Object
102 103 104 105 |
# File 'lib/prometheus_exporter/client.rb', line 102 def send_json(obj) payload = @custom_labels.nil? ? obj : obj.merge(custom_labels: @custom_labels) send(@json_serializer.dump(payload)) end |
#stop(wait_timeout_seconds: 0) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/prometheus_exporter/client.rb', line 135 def stop(wait_timeout_seconds: 0) @mutex.synchronize do wait_for_empty_queue_with_timeout(wait_timeout_seconds) @worker_thread&.kill while @worker_thread&.alive? sleep 0.001 end @worker_thread = nil close_socket! end end |