Skip to content

Commit 6f13ef3

Browse files
HasenpfoteHasenpfote
authored andcommitted
Add a feature to filter output by include and exclude patterns
1 parent 4e39a5e commit 6f13ef3

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

malloc_tracer/tracer.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import contextlib
77
import textwrap
88
import linecache
9+
import fnmatch
910
from enum import Enum
1011
from tracemalloc import start, take_snapshot, stop, Filter
1112

@@ -295,7 +296,9 @@ def trace(
295296
self,
296297
target_args=None,
297298
setup='pass',
298-
related_traces_output_mode=RelatedTracesOutputMode.NONE
299+
related_traces_output_mode=RelatedTracesOutputMode.NONE,
300+
include_patterns=None,
301+
exclude_patterns=None
299302
):
300303
'''Display the trace result.
301304
@@ -304,16 +307,31 @@ def trace(
304307
setup (str): Run-time dependencies.
305308
This parameter is ignored if enable_auto_resolve is enabled.
306309
related_traces_output_mode (:class:`RelatedTracesOutputMode`):
310+
include_patterns (set): Specify patterns of file paths to include in the output.
311+
exclude_patterns (set): Specify patterns of file paths to exclude in the output.
307312
'''
308313
snapshot = self._take_snapshot(
309314
target_args=target_args,
310315
setup=setup
311316
)
312317

318+
if include_patterns is None:
319+
include_patterns = set('*')
320+
321+
if exclude_patterns is None:
322+
exclude_patterns = set()
323+
313324
recorder = TraceRecorder()
314325
stats = snapshot.statistics('lineno')
315326
for stat in stats:
316327
frame = stat.traceback[0]
328+
329+
if frame.filename != DUMMY_SRC_NAME:
330+
if not any(fnmatch.fnmatch(frame.filename, pattern) for pattern in include_patterns):
331+
continue
332+
if any(fnmatch.fnmatch(frame.filename, pattern) for pattern in exclude_patterns):
333+
continue
334+
317335
recorder.add_trace(
318336
filepath=frame.filename,
319337
lineno=frame.lineno,
@@ -447,7 +465,9 @@ def trace(
447465
enable_auto_resolve=True,
448466
ctime_setup='pass',
449467
rtime_setup='pass',
450-
related_traces_output_mode=RelatedTracesOutputMode.NONE
468+
related_traces_output_mode=RelatedTracesOutputMode.NONE,
469+
include_patterns=None,
470+
exclude_patterns=None
451471
):
452472
'''Convenience function to create Tracer object and call trace method.'''
453473
tracer = Tracer(
@@ -458,5 +478,7 @@ def trace(
458478
tracer.trace(
459479
target_args=target_args,
460480
setup=rtime_setup,
461-
related_traces_output_mode=related_traces_output_mode
481+
related_traces_output_mode=related_traces_output_mode,
482+
include_patterns=include_patterns,
483+
exclude_patterns=exclude_patterns
462484
)

test/test_tracer.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,23 @@ def test_class_method_with_auto_resolve_dependencies(self):
280280
target_args=dict(base=1),
281281
related_traces_output_mode=RelatedTracesOutputMode.IN_DESCENDING_ORDER
282282
)
283+
284+
def test_include_and_exclude_patterns(self):
285+
tracer = Tracer(
286+
function,
287+
)
288+
with contextlib.redirect_stdout(None):
289+
tracer.trace(
290+
target_args=dict(base=2, num=100),
291+
setup='import math as mathematics',
292+
related_traces_output_mode=RelatedTracesOutputMode.FOR_EACH_FILE,
293+
include_patterns={'*.py'},
294+
exclude_patterns={'*/site-packages/*'}
295+
)
296+
tracer.trace(
297+
target_args=dict(base=2, num=100),
298+
setup='import math as mathematics',
299+
related_traces_output_mode=RelatedTracesOutputMode.IN_DESCENDING_ORDER,
300+
include_patterns={'*.py'},
301+
exclude_patterns={'*/site-packages/*'}
302+
)

0 commit comments

Comments
 (0)