Skip to content

Commit cfce556

Browse files
authored
Optimize endpoint blacklist (#13)
* performance: re.compile endpoint blacklist * added documentation
1 parent 3dbfdf4 commit cfce556

File tree

3 files changed

+28
-20
lines changed

3 files changed

+28
-20
lines changed

howfast_apm/flask.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from flask import Flask, request
77

88
from .core import CoreAPM
9-
from .utils import is_in_blacklist
9+
from .utils import is_in_blacklist, compile_endpoints
1010

1111
logger = logging.getLogger('howfast_apm')
1212

@@ -42,7 +42,7 @@ def __init__(
4242
app.wsgi_app = self
4343

4444
if endpoints_blacklist:
45-
self.endpoints_blacklist = endpoints_blacklist
45+
self.endpoints_blacklist = compile_endpoints(*endpoints_blacklist)
4646
else:
4747
self.endpoints_blacklist = []
4848

howfast_apm/utils.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
import fnmatch
2+
import re
23

34
from typing import List
45

56

7+
def compile_endpoints(*blacklist):
8+
"""Compiles a list endpoints to a list of regexes"""
9+
return [re.compile(fnmatch.translate(x)) for x in blacklist]
10+
11+
612
def is_in_blacklist(uri: str, blacklist: List[str]) -> bool:
713
"""
814
Return True if the URI is blacklisted.
915
10-
>>> is_in_blacklist('/some-real-uri/', ['/exact-uri/'])
16+
>>> is_in_blacklist('/some-real-uri/', compile_endpoints('/exact-uri/'))
1117
False
12-
>>> is_in_blacklist('/exact-uri/', ['/exact-uri/'])
18+
>>> is_in_blacklist('/exact-uri/', compile_endpoints('/exact-uri/'))
1319
True
14-
>>> is_in_blacklist('/job/42/retry', ['/job/*'])
20+
>>> is_in_blacklist('/job/42/retry', compile_endpoints('/job/*'))
1521
True
1622
1723
"""
1824
for pattern in blacklist:
19-
if fnmatch.fnmatch(uri, pattern):
25+
if pattern.match(uri):
2026
return True
2127
return False
2228

tests/test_utils.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
from howfast_apm import utils
1+
from howfast_apm.utils import compile_endpoints, is_in_blacklist
22

33

44
def test_is_blacklist_exact():
55
""" The blacklist util should support exact strings matching """
6-
assert utils.is_in_blacklist('/some-real-uri/', ['/exact-uri/']) is False
7-
assert utils.is_in_blacklist('/exact-uri/', ['/exact-uri/']) is True
8-
assert utils.is_in_blacklist('/exact-uri/with-subpath', ['/exact-uri/']) is False
6+
blacklist = compile_endpoints('/exact-uri/')
7+
assert is_in_blacklist('/some-real-uri/', blacklist) is False
8+
assert is_in_blacklist('/exact-uri/', blacklist) is True
9+
assert is_in_blacklist('/exact-uri/with-subpath', blacklist) is False
910

1011
# With multiple patterns
11-
assert utils.is_in_blacklist('/exact-uri-1/', ['/exact-uri-1/', '/exact-uri-2/']) is True
12-
assert utils.is_in_blacklist('/exact-uri-2/', ['/exact-uri-1/', '/exact-uri-2/']) is True
13-
assert utils.is_in_blacklist('/exact-uri-3/', ['/exact-uri-1/', '/exact-uri-2/']) is False
12+
multiple_blacklist = compile_endpoints('/exact-uri-1/', '/exact-uri-2/')
13+
assert is_in_blacklist('/exact-uri-1/', multiple_blacklist) is True
14+
assert is_in_blacklist('/exact-uri-2/', multiple_blacklist) is True
15+
assert is_in_blacklist('/exact-uri-3/', multiple_blacklist) is False
1416

1517

1618
def test_is_blacklist_glob():
1719
""" The blacklist util should support shell-like matching """
18-
blacklist = ['/jobs/*/results', '/support/*']
19-
assert utils.is_in_blacklist('/jobs/42/results', blacklist) is True
20-
assert utils.is_in_blacklist('/jobs/42/', blacklist) is False
20+
blacklist = compile_endpoints('/jobs/*/results', '/support/*')
21+
assert is_in_blacklist('/jobs/42/results', blacklist) is True
22+
assert is_in_blacklist('/jobs/42/', blacklist) is False
2123

22-
assert utils.is_in_blacklist('/support/', blacklist) is True
23-
assert utils.is_in_blacklist('/support/tickets/23', blacklist) is True
24-
assert utils.is_in_blacklist('/support/admin', blacklist) is True
25-
assert utils.is_in_blacklist('/support', blacklist) is False
24+
assert is_in_blacklist('/support/', blacklist) is True
25+
assert is_in_blacklist('/support/tickets/23', blacklist) is True
26+
assert is_in_blacklist('/support/admin', blacklist) is True
27+
assert is_in_blacklist('/support', blacklist) is False

0 commit comments

Comments
 (0)