Skip to content

Commit 797289f

Browse files
authored
#6: added ability to pass custom dns servers to resolver (#7)
added ability to pass custom dns servers to resolver (it's important because exporter may be ran not in Russia while we still should use Russia resolvers)
1 parent be0052e commit 797289f

File tree

7 files changed

+40
-7
lines changed

7 files changed

+40
-7
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ PORT=8080 ; docker run -it --rm --name rkn-exporter \
4343
-e APP_DOMAINS=/app/inputs/domains.txt \
4444
-e APP_SUBNETS=/app/inputs/blocked_subnets.txt \
4545
-e APP_THREADS_COUNT=10 \
46+
-e APP_DNS=8.8.8.8 \
4647
-e LOG_LEVEL=DEBUG \
4748
bissquit/rkn-exporter:latest
4849
```
@@ -92,6 +93,7 @@ This command is not needed if you configure env with `make env`.
9293
|-d, --domains|`APP_DOMAINS`|Path to a file with domains to check. One domain per line (default: No)|
9394
|-s, --blocked_subnets|`APP_SUBNETS`|Path to a file with subnets bloked by RKN. One subnet per line. Or url with json list (default: No)|
9495
|-t, --threads_count|`APP_THREADS_COUNT`|Threads count to parallelize computation. Is useful when DNS resolving is slow (default: 10)|
96+
|--dns|`APP_DNS`|DNS servers (default: 8.8.8.8)|
9597
|-|`LOG_LEVEL`|Log level based on Python [logging](https://docs.python.org/3/library/logging.html) module. expected values: DEBUG, INFO, WARNING, ERROR, CRITICAL (default: INFO)|
9698

9799

docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ services:
1717
# rkn-exporter receives file or url
1818
- APP_SUBNETS=/app/inputs/blocked_subnets.txt
1919
- APP_THREADS_COUNT=10
20+
- APP_DNS=8.8.8.8
2021
- LOG_LEVEL=DEBUG
2122
volumes:
2223
- ./inputs:/app/inputs

handler.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,19 @@ async def data_handler(path: str) -> set:
270270
raw_data = read_file_to_list(path=path)
271271

272272
return set(ip_converter(raw_data))
273+
274+
275+
def normalize_dns(dns_str: str) -> list:
276+
# remove any whitespaces from string first then split string into a list
277+
# comma is default delimiter
278+
dns_servers_list = (dns_str.replace(' ', '')).split(',')
279+
280+
valid_list = []
281+
for dns_server_str in dns_servers_list:
282+
# check if string is a valid ipv4 address
283+
if validators.ipv4(dns_server_str):
284+
valid_list.append(dns_server_str)
285+
else:
286+
logger.debug(f'{dns_server_str} is not a valid ip address of DNS server!')
287+
logger.debug(f'DNS server(s) to proceed: {valid_list}')
288+
return valid_list

kubernetes/config.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ common:
55
k8s_namespace: monitoring
66

77
# type not only image tag but hash too
8-
rkn_exporter_version: 'v1.3-dev@sha256:df72a1eb422ba07fc42686b0bc7198a4c953ddbbefe6ebb0a5c9469d70d24e59'
8+
rkn_exporter_version: 'v1.6@sha256:65b475b4e3102f901f9d8d5aba1239bf18bc3e268009f6cf528f7d276fe73c14'
99
# default settings. You may rewrite them for certain k8s cluster
1010
rkn_exporter:
1111
ip: "0.0.0.0"
@@ -14,6 +14,7 @@ common:
1414
domains: "/app/inputs/domains.txt"
1515
subnets: "https://reestr.rublacklist.net/api/v2/ips/json/"
1616
threads_count: "10"
17+
dns: "8.8.8.8"
1718
log_level: "DEBUG"
1819

1920
env-name:

kubernetes/templates/deployment.yaml.j2

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,16 @@ spec:
3131
value: "{{ rkn_exporter.subnets }}"
3232
- name: APP_THREADS_COUNT
3333
value: "{{ rkn_exporter.threads_count }}"
34+
- name: APP_DNS
35+
value: "{{ rkn_exporter.dns }}"
3436
- name: LOG_LEVEL
3537
value: "{{ rkn_exporter.log_level }}"
3638
resources:
3739
requests:
38-
cpu: 40m
40+
cpu: 100m
3941
memory: 64Mi
4042
limits:
41-
cpu: 80m
43+
cpu: 200m
4244
memory: 128Mi
4345
volumeMounts:
4446
- name: inputs

rkn_exporter.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
return_metrics, \
1414
fill_queue, \
1515
subnets_to_ips, \
16-
data_handler
16+
data_handler, \
17+
normalize_dns
1718

1819
# possibly it's good idea to use contextvars here
1920
data = 'rkn_computation_success 0'
@@ -52,6 +53,10 @@ def parse_args():
5253
default=os.getenv("APP_THREADS_COUNT", 10),
5354
type=int,
5455
help='Threads count to parallelize computation. Is useful when DNS resolving is slow (default: 10)')
56+
parser.add_argument('--dns',
57+
default=os.getenv("APP_DNS", '8.8.8.8'),
58+
type=str,
59+
help='DNS servers (default: 8.8.8.8)')
5560
return parser.parse_args()
5661

5762

@@ -97,8 +102,7 @@ async def handler(self):
97102
blocked_subnets_set = await data_handler(self.args.blocked_subnets)
98103
blocked_ips_set = subnets_to_ips(blocked_subnets_set)
99104

100-
# I'll add variables later
101-
resolver = self.initialize_resolver(nameservers=['8.8.8.8'],
105+
resolver = self.initialize_resolver(nameservers=normalize_dns(self.args.dns),
102106
timeout=20,
103107
lifetime=20,
104108
retry_servfail=False)

tests/test_handler.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
return_domain_metrics, \
1818
read_file_to_list, \
1919
validate_domains, \
20-
fill_queue, subnet_to_ips, subnets_to_ips, get_data, ip_converter, data_handler
20+
fill_queue, subnet_to_ips, subnets_to_ips, get_data, ip_converter, data_handler, normalize_dns
2121

2222

2323
# taken from https://github.com/aio-libs/aiohttp/blob/master/tests/test_resolver.py
@@ -282,3 +282,10 @@ async def test_data_handler(mocker):
282282
mocker.patch('handler.read_file_to_list', return_value=await mock_awaitable_obj(raw_ips_list))
283283
blocked_subnets_set = await data_handler('./fake/path/to/file')
284284
assert blocked_subnets_set == valid_subnets_set
285+
286+
287+
def test_normalize_dns():
288+
input_str = ' 8.8.8.8 ,8.8.4.4, 8.8.1.1111'
289+
290+
valid_dns_list = normalize_dns(input_str)
291+
assert valid_dns_list == ['8.8.8.8', '8.8.4.4']

0 commit comments

Comments
 (0)