|
1 | | -import random |
2 | | -import re |
3 | | -import threading |
4 | | -import time |
| 1 | +import os |
| 2 | +import sys |
5 | 3 |
|
6 | 4 | import pytest |
7 | 5 |
|
| 6 | + |
| 7 | +@pytest.mark.skipif(sys.platform in ("win32", "cygwin"), reason="Fork not supported on Windows") |
| 8 | +def test_config_extra_service_names_fork(run_python_code_in_subprocess): |
| 9 | + code = """ |
| 10 | +import ddtrace.auto |
8 | 11 | import ddtrace |
9 | 12 |
|
| 13 | +import re |
| 14 | +import os |
| 15 | +import sys |
| 16 | +import time |
| 17 | +
|
| 18 | +children = [] |
| 19 | +for i in range(10): |
| 20 | + pid = os.fork() |
| 21 | + if pid == 0: |
| 22 | + # Child process |
| 23 | + ddtrace.config._add_extra_service(f"extra_service_{i}") |
| 24 | + time.sleep(0.1) # Ensure the child has time to save the service |
| 25 | + sys.exit(0) |
| 26 | + else: |
| 27 | + # Parent process |
| 28 | + children.append(pid) |
| 29 | +
|
| 30 | +for pid in children: |
| 31 | + os.waitpid(pid, 0) |
| 32 | +
|
| 33 | +extra_services = ddtrace.config._get_extra_services() |
| 34 | +extra_services.discard("sqlite") # coverage |
| 35 | +assert len(extra_services) == 10, extra_services |
| 36 | +assert all(re.match(r"extra_service_\\d+", service) for service in extra_services), extra_services |
| 37 | +""" |
10 | 38 |
|
11 | | -MAX_NAMES = 64 |
| 39 | + env = os.environ.copy() |
| 40 | + env["DD_REMOTE_CONFIGURATION_ENABLED"] = "true" |
| 41 | + stdout, stderr, status, _ = run_python_code_in_subprocess(code, env=env) |
| 42 | + assert status == 0, (stdout, stderr, status) |
12 | 43 |
|
13 | 44 |
|
14 | | -@pytest.mark.parametrize("nb_service", [2, 16, 64, 256]) |
15 | | -def test_service_name(nb_service): |
16 | | - ddtrace.config._extra_services = set() |
| 45 | +def test_config_extra_service_names_duplicates(run_python_code_in_subprocess): |
| 46 | + code = """ |
| 47 | +import ddtrace.auto |
| 48 | +import ddtrace |
| 49 | +import re |
| 50 | +import os |
| 51 | +import sys |
| 52 | +import time |
| 53 | +
|
| 54 | +for _ in range(10): |
| 55 | + ddtrace.config._add_extra_service("extra_service_1") |
17 | 56 |
|
18 | | - def write_in_subprocess(id_nb): |
19 | | - time.sleep(random.random()) |
20 | | - ddtrace.config._add_extra_service(f"extra_service_{id_nb}") |
| 57 | +extra_services = ddtrace.config._get_extra_services() |
| 58 | +extra_services.discard("sqlite") # coverage |
| 59 | +assert extra_services == {"extra_service_1"} |
| 60 | + """ |
21 | 61 |
|
22 | | - default_remote_config_enabled = ddtrace.config._remote_config_enabled |
23 | | - ddtrace.config._remote_config_enabled = True |
24 | | - if ddtrace.config._extra_services_queue is None: |
25 | | - import ddtrace.internal._file_queue as file_queue |
| 62 | + env = os.environ.copy() |
| 63 | + env["DD_REMOTE_CONFIGURATION_ENABLED"] = "true" |
| 64 | + stdout, stderr, status, _ = run_python_code_in_subprocess(code, env=env) |
| 65 | + assert status == 0, (stdout, stderr, status) |
26 | 66 |
|
27 | | - ddtrace.config._extra_services_queue = file_queue.File_Queue() |
28 | 67 |
|
29 | | - threads = [threading.Thread(target=write_in_subprocess, args=(i,)) for i in range(nb_service)] |
30 | | - for thread in threads: |
31 | | - thread.start() |
32 | | - for thread in threads: |
33 | | - thread.join() |
| 68 | +def test_config_extra_service_names_rc_disabled(run_python_code_in_subprocess): |
| 69 | + code = """ |
| 70 | +import ddtrace.auto |
| 71 | +import ddtrace |
| 72 | +import re |
| 73 | +import os |
| 74 | +import sys |
| 75 | +import time |
| 76 | +
|
| 77 | +for _ in range(10): |
| 78 | + ddtrace.config._add_extra_service("extra_service_1") |
34 | 79 |
|
35 | | - extra_services = ddtrace.config._get_extra_services() |
36 | | - assert len(extra_services) == min(nb_service, MAX_NAMES) |
37 | | - assert all(re.match(r"extra_service_\d+", service) for service in extra_services) |
| 80 | +extra_services = ddtrace.config._get_extra_services() |
| 81 | +assert len(extra_services) == 0 |
| 82 | + """ |
38 | 83 |
|
39 | | - ddtrace.config._remote_config_enabled = default_remote_config_enabled |
40 | | - if not default_remote_config_enabled: |
41 | | - ddtrace.config._extra_services_queue = None |
42 | | - ddtrace.config._extra_services = set() |
| 84 | + env = os.environ.copy() |
| 85 | + env["DD_REMOTE_CONFIGURATION_ENABLED"] = "false" |
| 86 | + stdout, stderr, status, _ = run_python_code_in_subprocess(code, env=env) |
| 87 | + assert status == 0, (stdout, stderr, status) |
0 commit comments