@@ -21,6 +21,25 @@ def get_inode_removed_count(fact_config):
2121 return int (value ) if value is not None else 0
2222
2323
24+ def get_kernel_rmdir_processed (fact_config ):
25+ """
26+ Query Prometheus metrics to get the count of processed (non-ignored) rmdir events.
27+
28+ Args:
29+ fact_config: The fact configuration tuple (config dict, config file path).
30+
31+ Returns:
32+ The difference between Total and Ignored kernel_path_rmdir_events.
33+ """
34+ total_str = get_metric_value (fact_config , "kernel_path_rmdir_events" , {"label" : "Total" })
35+ ignored_str = get_metric_value (fact_config , "kernel_path_rmdir_events" , {"label" : "Ignored" })
36+
37+ total = int (total_str ) if total_str is not None else 0
38+ ignored = int (ignored_str ) if ignored_str is not None else 0
39+
40+ return total - ignored
41+
42+
2443@pytest .mark .parametrize ("dirname" , [
2544 pytest .param ('testdir' , id = 'ASCII' ),
2645 pytest .param ('café' , id = 'French' ),
@@ -49,8 +68,9 @@ def test_rmdir_empty(monitored_dir, server, fact_config, dirname):
4968 """
5069 process = Process .from_proc ()
5170
52- # Get baseline metric count
53- initial_count = get_inode_removed_count (fact_config )
71+ # Get baseline metric counts
72+ initial_inode_removed = get_inode_removed_count (fact_config )
73+ initial_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
5474
5575 # Create a directory
5676 test_dir = os .path .join (monitored_dir , dirname )
@@ -78,7 +98,7 @@ def test_rmdir_empty(monitored_dir, server, fact_config, dirname):
7898
7999 # Check that file deletion incremented the metric by exactly 1
80100 count_after_file = get_inode_removed_count (fact_config )
81- file_delta = count_after_file - initial_count
101+ file_delta = count_after_file - initial_inode_removed
82102 assert file_delta == 1 , \
83103 f"Expected exactly 1 inode removed for file deletion, got { file_delta } "
84104
@@ -91,11 +111,17 @@ def test_rmdir_empty(monitored_dir, server, fact_config, dirname):
91111
92112 server .wait_events ([e3 ])
93113
94- # Check that directory deletion also incremented the metric by exactly 1
95- final_count = get_inode_removed_count (fact_config )
96- total_delta = final_count - initial_count
97- assert total_delta == 2 , \
98- f"Expected exactly 2 inodes removed (1 file + 1 dir), got { total_delta } "
114+ # Check that directory deletion incremented both metrics by exactly 1
115+ final_inode_removed = get_inode_removed_count (fact_config )
116+ final_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
117+
118+ inode_delta = final_inode_removed - initial_inode_removed
119+ kernel_delta = final_kernel_rmdir - initial_kernel_rmdir
120+
121+ assert inode_delta == 2 , \
122+ f"Expected exactly 2 inodes removed (1 file + 1 dir), got { inode_delta } "
123+ assert kernel_delta == 1 , \
124+ f"Expected exactly 1 kernel rmdir event processed, got { kernel_delta } "
99125
100126
101127def test_rmdir_tree (monitored_dir , server , fact_config ):
@@ -115,8 +141,9 @@ def test_rmdir_tree(monitored_dir, server, fact_config):
115141 """
116142 process = Process .from_proc ()
117143
118- # Get baseline metric count
119- initial_count = get_inode_removed_count (fact_config )
144+ # Get baseline metric counts
145+ initial_inode_removed = get_inode_removed_count (fact_config )
146+ initial_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
120147
121148 # Create nested directories
122149 level1 = os .path .join (monitored_dir , 'level1' )
@@ -172,11 +199,17 @@ def test_rmdir_tree(monitored_dir, server, fact_config):
172199
173200 server .wait_events (unlink_events )
174201
175- # Check that all inodes were removed: 3 files + 3 directories = 6 total
176- final_count = get_inode_removed_count (fact_config )
177- total_delta = final_count - initial_count
178- assert total_delta == 6 , \
179- f"Expected exactly 6 inodes removed (3 files + 3 dirs), got { total_delta } "
202+ # Check that all inodes and kernel events were tracked
203+ final_inode_removed = get_inode_removed_count (fact_config )
204+ final_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
205+
206+ inode_delta = final_inode_removed - initial_inode_removed
207+ kernel_delta = final_kernel_rmdir - initial_kernel_rmdir
208+
209+ assert inode_delta == 6 , \
210+ f"Expected exactly 6 inodes removed (3 files + 3 dirs), got { inode_delta } "
211+ assert kernel_delta == 3 , \
212+ f"Expected exactly 3 kernel rmdir events processed, got { kernel_delta } "
180213
181214
182215def test_rmdir_ignored (monitored_dir , ignored_dir , server , fact_config ):
@@ -193,8 +226,9 @@ def test_rmdir_ignored(monitored_dir, ignored_dir, server, fact_config):
193226 """
194227 process = Process .from_proc ()
195228
196- # Get baseline metric count
197- initial_count = get_inode_removed_count (fact_config )
229+ # Get baseline metric counts
230+ initial_inode_removed = get_inode_removed_count (fact_config )
231+ initial_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
198232
199233 # Create directory in ignored path
200234 ignored_subdir = os .path .join (ignored_dir , 'ignored_subdir' )
@@ -207,10 +241,13 @@ def test_rmdir_ignored(monitored_dir, ignored_dir, server, fact_config):
207241 os .remove (ignored_file )
208242 os .rmdir (ignored_subdir )
209243
210- # Metric should not have changed
211- count_after_ignored = get_inode_removed_count (fact_config )
212- assert count_after_ignored == initial_count , \
244+ # Metrics should not have changed
245+ inode_after_ignored = get_inode_removed_count (fact_config )
246+ kernel_after_ignored = get_kernel_rmdir_processed (fact_config )
247+ assert inode_after_ignored == initial_inode_removed , \
213248 f"Ignored path operations should not increment inode_removed metric"
249+ assert kernel_after_ignored == initial_kernel_rmdir , \
250+ f"Ignored path operations should not increment kernel_rmdir_processed metric"
214251
215252 # Create and remove directory in monitored path
216253 monitored_subdir = os .path .join (monitored_dir , 'monitored_subdir' )
@@ -239,11 +276,17 @@ def test_rmdir_ignored(monitored_dir, ignored_dir, server, fact_config):
239276
240277 server .wait_events (deletion_events )
241278
242- # Metric should have incremented by exactly 2 (file + dir)
243- final_count = get_inode_removed_count (fact_config )
244- total_delta = final_count - initial_count
245- assert total_delta == 2 , \
246- f"Expected exactly 2 inodes removed from monitored path, got { total_delta } "
279+ # Metrics should have incremented by exactly 2 inodes and 1 kernel rmdir
280+ final_inode_removed = get_inode_removed_count (fact_config )
281+ final_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
282+
283+ inode_delta = final_inode_removed - initial_inode_removed
284+ kernel_delta = final_kernel_rmdir - initial_kernel_rmdir
285+
286+ assert inode_delta == 2 , \
287+ f"Expected exactly 2 inodes removed from monitored path, got { inode_delta } "
288+ assert kernel_delta == 1 , \
289+ f"Expected exactly 1 kernel rmdir event processed, got { kernel_delta } "
247290
248291
249292def test_rmdir_with_parent_inode (monitored_dir , server , fact_config ):
@@ -260,8 +303,9 @@ def test_rmdir_with_parent_inode(monitored_dir, server, fact_config):
260303 """
261304 process = Process .from_proc ()
262305
263- # Get baseline metric count
264- initial_count = get_inode_removed_count (fact_config )
306+ # Get baseline metric counts
307+ initial_inode_removed = get_inode_removed_count (fact_config )
308+ initial_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
265309
266310 # Create a subdirectory
267311 subdir = os .path .join (monitored_dir , 'subdir' )
@@ -299,11 +343,17 @@ def test_rmdir_with_parent_inode(monitored_dir, server, fact_config):
299343 ]
300344 server .wait_events (deletion_events )
301345
302- # Check metric incremented by 2 (file + subdir)
303- count_after_subdir = get_inode_removed_count (fact_config )
304- delta_after_subdir = count_after_subdir - initial_count
305- assert delta_after_subdir == 2 , \
306- f"Expected 2 inodes removed (file + subdir), got { delta_after_subdir } "
346+ # Check metrics incremented (file + subdir)
347+ inode_after_subdir = get_inode_removed_count (fact_config )
348+ kernel_after_subdir = get_kernel_rmdir_processed (fact_config )
349+
350+ inode_delta_subdir = inode_after_subdir - initial_inode_removed
351+ kernel_delta_subdir = kernel_after_subdir - initial_kernel_rmdir
352+
353+ assert inode_delta_subdir == 2 , \
354+ f"Expected 2 inodes removed (file + subdir), got { inode_delta_subdir } "
355+ assert kernel_delta_subdir == 1 , \
356+ f"Expected 1 kernel rmdir event processed, got { kernel_delta_subdir } "
307357
308358 # Create a NEW file in the parent directory (monitored_dir)
309359 # This tests that removing the subdirectory didn't corrupt
@@ -323,8 +373,15 @@ def test_rmdir_with_parent_inode(monitored_dir, server, fact_config):
323373 file = new_file , host_path = new_file )
324374 server .wait_events ([e5 ])
325375
326- # Final metric check: should be 3 total (test_file, subdir, new_file)
327- final_count = get_inode_removed_count (fact_config )
328- total_delta = final_count - initial_count
329- assert total_delta == 3 , \
330- f"Expected 3 inodes removed total, got { total_delta } "
376+ # Final metric check: should be 3 total inodes (test_file, subdir, new_file)
377+ # and 1 total kernel rmdir (subdir)
378+ final_inode_removed = get_inode_removed_count (fact_config )
379+ final_kernel_rmdir = get_kernel_rmdir_processed (fact_config )
380+
381+ inode_total_delta = final_inode_removed - initial_inode_removed
382+ kernel_total_delta = final_kernel_rmdir - initial_kernel_rmdir
383+
384+ assert inode_total_delta == 3 , \
385+ f"Expected 3 inodes removed total, got { inode_total_delta } "
386+ assert kernel_total_delta == 1 , \
387+ f"Expected 1 kernel rmdir event total, got { kernel_total_delta } "
0 commit comments