Skip to content

Commit 09a231c

Browse files
committed
Add discovery port name helper
1 parent c2f1b6f commit 09a231c

4 files changed

Lines changed: 79 additions & 3 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add a discovery helper for selecting service ports by name.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# (C) Datadog, Inc. 2025-present
22
# All rights reserved
33
# Licensed under a 3-clause BSD style license (see LICENSE)
4-
from .discovery import Discovery, Port, Service, candidate_ports
4+
from .discovery import Discovery, Port, Service, candidate_ports, candidate_ports_by_name
55
from .strategies import discovery_strategy
66

7-
__all__ = ['Discovery', 'Port', 'Service', 'candidate_ports', 'discovery_strategy']
7+
__all__ = ['Discovery', 'Port', 'Service', 'candidate_ports', 'candidate_ports_by_name', 'discovery_strategy']

datadog_checks_base/datadog_checks/base/utils/discovery/discovery.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,14 @@ def candidate_ports(service: Service, hints: Iterable[int]) -> Iterator[Port]:
6060
if port.number not in seen:
6161
seen.add(port.number)
6262
yield port
63+
64+
65+
def candidate_ports_by_name(service: Service, names: Iterable[str]) -> Iterator[Port]:
66+
"""Yield service ports matching one of the provided names."""
67+
seen: set[int] = set()
68+
69+
for name in dict.fromkeys(names):
70+
for port in service.ports:
71+
if port.name == name and port.number not in seen:
72+
seen.add(port.number)
73+
yield port

datadog_checks_base/tests/base/utils/discovery/test_discovery.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import mock
77
import pytest
88

9-
from datadog_checks.base.utils.discovery import Discovery, Port, Service, candidate_ports
9+
from datadog_checks.base.utils.discovery import Discovery, Port, Service, candidate_ports, candidate_ports_by_name
1010

1111

1212
def test_include_empty():
@@ -209,6 +209,70 @@ def test_candidate_ports_prefers_hints_and_deduplicates():
209209
]
210210

211211

212+
def test_candidate_ports_by_name_only_yields_matching_ports():
213+
service = Service(
214+
id='svc',
215+
host='127.0.0.1',
216+
ports=(
217+
Port(number=8080, name='http'),
218+
Port(number=9090, name='metrics'),
219+
Port(number=8081, name='admin'),
220+
),
221+
)
222+
223+
assert list(candidate_ports_by_name(service, ['metrics', 'http-prom'])) == [Port(number=9090, name='metrics')]
224+
225+
226+
def test_candidate_ports_by_name_respects_name_priority():
227+
service = Service(
228+
id='svc',
229+
host='127.0.0.1',
230+
ports=(
231+
Port(number=8080, name='bar'),
232+
Port(number=9090, name='foo'),
233+
Port(number=8081, name='bar'),
234+
Port(number=9091, name='foo'),
235+
),
236+
)
237+
238+
assert list(candidate_ports_by_name(service, ['foo', 'bar'])) == [
239+
Port(number=9090, name='foo'),
240+
Port(number=9091, name='foo'),
241+
Port(number=8080, name='bar'),
242+
Port(number=8081, name='bar'),
243+
]
244+
245+
246+
def test_candidate_ports_by_name_does_not_fallback_to_other_ports():
247+
service = Service(
248+
id='svc',
249+
host='127.0.0.1',
250+
ports=(
251+
Port(number=8080, name='http'),
252+
Port(number=8081, name='admin'),
253+
),
254+
)
255+
256+
assert list(candidate_ports_by_name(service, ['metrics'])) == []
257+
258+
259+
def test_candidate_ports_by_name_deduplicates_matching_port_numbers():
260+
service = Service(
261+
id='svc',
262+
host='127.0.0.1',
263+
ports=(
264+
Port(number=8443, name='metrics'),
265+
Port(number=8443, name='http-metrics'),
266+
Port(number=9443, name='metrics'),
267+
),
268+
)
269+
270+
assert list(candidate_ports_by_name(service, ['http-metrics', 'metrics'])) == [
271+
Port(number=8443, name='http-metrics'),
272+
Port(number=9443, name='metrics'),
273+
]
274+
275+
212276
def test_dev_placeholder_field_constants_match_models():
213277
"""Guard the one fact datadog_checks_dev must hand-copy from base.
214278

0 commit comments

Comments
 (0)