Skip to content

Commit 8537f5a

Browse files
committed
Add :clean_dir option and clean_pid method to DirectFileStore.
Signed-off-by: Stefan Sundin <stefan@stefansundin.com>
1 parent 7129453 commit 8537f5a

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

lib/prometheus/client/data_stores/direct_file_store.rb

+18-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
require 'fileutils'
22
require "cgi"
33

4+
require 'prometheus/client/version'
5+
46
module Prometheus
57
module Client
68
module DataStores
@@ -33,9 +35,15 @@ class InvalidStoreSettingsError < StandardError; end
3335
DEFAULT_METRIC_SETTINGS = { aggregation: SUM }
3436
DEFAULT_GAUGE_SETTINGS = { aggregation: ALL }
3537

36-
def initialize(dir:)
38+
def initialize(dir:, clean_dir: false)
3739
@store_settings = { dir: dir }
3840
FileUtils.mkdir_p(dir)
41+
42+
if clean_dir
43+
Dir.glob(File.join(dir, "#{ MetricStore::FILENAME_PREFIX }_*___*.bin")).each do |file_path|
44+
File.unlink(file_path)
45+
end
46+
end
3947
end
4048

4149
def for_metric(metric_name, metric_type:, metric_settings: {})
@@ -52,6 +60,12 @@ def for_metric(metric_name, metric_type:, metric_settings: {})
5260
metric_settings: settings)
5361
end
5462

63+
def clean_pid(pid)
64+
Dir.glob(File.join(@store_settings[:dir], "#{ MetricStore::FILENAME_PREFIX }_*___#{pid}.bin")).each do |file_path|
65+
File.unlink(file_path)
66+
end
67+
end
68+
5569
private
5670

5771
def validate_metric_settings(metric_settings)
@@ -68,6 +82,7 @@ def validate_metric_settings(metric_settings)
6882
end
6983

7084
class MetricStore
85+
FILENAME_PREFIX = "prometheus_#{ Prometheus::Client::VERSION }"
7186
attr_reader :metric_name, :store_settings
7287

7388
def initialize(metric_name:, store_settings:, metric_settings:)
@@ -168,12 +183,12 @@ def internal_store
168183

169184
# Filename for this metric's PStore (one per process)
170185
def filemap_filename
171-
filename = "metric_#{ metric_name }___#{ process_id }.bin"
186+
filename = "#{ FILENAME_PREFIX }_#{ metric_name }___#{ process_id }.bin"
172187
File.join(@store_settings[:dir], filename)
173188
end
174189

175190
def stores_for_metric
176-
Dir.glob(File.join(@store_settings[:dir], "metric_#{ metric_name }___*"))
191+
Dir.glob(File.join(@store_settings[:dir], "#{ FILENAME_PREFIX }_#{ metric_name }___*.bin"))
177192
end
178193

179194
def process_id

spec/prometheus/client/data_stores/direct_file_store_spec.rb

+10-6
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,9 @@
44
require 'examples/data_store_example'
55

66
describe Prometheus::Client::DataStores::DirectFileStore do
7-
subject { described_class.new(dir: "/tmp/prometheus_test") }
7+
subject { described_class.new(dir: "/tmp/prometheus_test", clean_dir: true) }
88
let(:metric_store) { subject.for_metric(:metric_name, metric_type: :counter) }
99

10-
# Reset the PStores
11-
before do
12-
Dir.glob('/tmp/prometheus_test/*').each { |file| File.delete(file) }
13-
end
14-
1510
it_behaves_like Prometheus::Client::DataStores
1611

1712
it "only accepts valid :aggregation as Metric Settings" do
@@ -57,6 +52,15 @@
5752
ms2.increment(labels: {}, by: 1)
5853
end
5954

55+
it "can clean files from old processes" do
56+
allow(Process).to receive(:pid).and_return(12345)
57+
ms = metric_store
58+
ms.increment(labels: {}, by: 1)
59+
expect(ms.all_values).to eq({} => 1.0)
60+
subject.clean_pid(12345)
61+
expect(ms.all_values).to be_empty
62+
end
63+
6064
context "when process is forked" do
6165
it "opens a new internal store to avoid two processes using the same file" do
6266
allow(Process).to receive(:pid).and_return(12345)

0 commit comments

Comments
 (0)