Merge pull request #67339 from kginonredhat/wip-74658-fix-prometheus_sd_config-returns-hostnames-instead-of-IP

mgr/cephadm: prometheus_sd_config() returns hostnames instead of IP addresses

Reviewed-by: Redouane Kachach <rkachach@ibm.com>
Reviewed-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
Redouane Kachach 2026-04-09 17:54:18 +02:00 committed by GitHub
commit b4b8d2121f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 8 deletions

View File

@ -169,11 +169,14 @@ class Root:
"""
targets = []
mgr_daemons = self.mgr.cache.get_daemons_by_service('mgr')
host = service_registry.get_service('mgr').get_active_daemon(mgr_daemons).hostname or ''
fqdn = self.mgr.get_fqdn(host)
port = self.mgr.get_module_option_ex(
'prometheus', 'server_port', PrometheusService.DEFAULT_MGR_PROMETHEUS_PORT)
targets.append(f'{fqdn}:{port}')
dd = service_registry.get_service('mgr').get_active_daemon(mgr_daemons)
if dd:
assert dd.hostname is not None
addr = dd.ip if dd.ip else self.mgr.inventory.get_addr(dd.hostname)
port_val = self.mgr.get_module_option_ex(
'prometheus', 'server_port', PrometheusService.DEFAULT_MGR_PROMETHEUS_PORT)
port: Optional[int] = int(port_val) if port_val is not None else None
targets.append(build_url(host=addr, port=port).lstrip('/'))
return [{"targets": targets, "labels": {}}]
def alertmgr_sd_config(self) -> List[Dict[str, Collection[str]]]:

View File

@ -1,4 +1,5 @@
from unittest.mock import MagicMock
from typing import List
from cephadm.services.service_discovery import Root
from cephadm.services.service_registry import service_registry
@ -128,7 +129,10 @@ class FakeMgr:
return -1, '', 'error'
def get_module_option_ex(self, module, option, default_value):
return "9283"
# Port value for prometheus server_port (used by prometheus_sd_config).
if module == 'prometheus' and option == 'server_port':
return 9283
return default_value
def daemon_is_self(self, d_type, d_id) -> bool:
if d_type == 'mgr' and d_id == 'fake_active_mgr':
@ -152,8 +156,27 @@ class TestServiceDiscovery:
assert 'labels' in entry
assert 'targets' in entry
# check content
assert cfg[0]['targets'] == ['node0:9283']
# check content - should return IP address instead of hostname
assert cfg[0]['targets'] == ['1.2.3.4:9283']
def test_get_sd_config_prometheus_uses_ip_when_hostname_unresolvable(self, monkeypatch):
mgr = FakeMgr()
def _mgr_daemons_no_ip(service_type: str) -> List[FakeDaemonDescription]:
if service_type == 'mgr':
return [
FakeDaemonDescription(None, [9922], 'node0', daemon_type='mgr', daemon_id='fake_active_mgr'),
FakeDaemonDescription('1.2.3.5', [9922], 'node1', daemon_type='mgr', daemon_id='fake_standby_mgr'),
]
return FakeCache().get_daemons_by_service(service_type)
monkeypatch.setattr(mgr.cache, 'get_daemons_by_service', _mgr_daemons_no_ip)
root = Root(mgr)
cfg = root.get_sd_config('mgr-prometheus')
# Expect fallback to inventory IP (FakeInventory returns 1.2.3.4)
assert cfg == [{"targets": ["1.2.3.4:9283"], "labels": {}}]
def test_get_sd_config_node_exporter(self):
mgr = FakeMgr()