Skip to content

Commit 968e439

Browse files
authored
[DBMON-6784] Fix Clickhouse database_hostname usage (#24247)
* Fix database_hostname usage * Add changelog * Fixup tests
1 parent 02fe251 commit 968e439

4 files changed

Lines changed: 42 additions & 10 deletions

File tree

clickhouse/changelog.d/24247.fixed

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix the `database_hostname` tag and metadata to always report the resolved database host instead of the `reported_hostname` override.

clickhouse/datadog_checks/clickhouse/clickhouse.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def __init__(self, name, init_config, instances):
5757

5858
# DBM-related properties (computed lazily)
5959
self._resolved_hostname = None
60+
self._database_hostname = None
6061
self._database_identifier = None
6162
self._agent_hostname = None
6263
self._dbms_version = None
@@ -155,7 +156,7 @@ def _add_core_tags(self):
155156
self.tag_manager.set_tag("server", self._config.server, replace=True)
156157
self.tag_manager.set_tag("port", str(self._config.port), replace=True)
157158
self.tag_manager.set_tag("db", self._config.db, replace=True)
158-
self.tag_manager.set_tag("database_hostname", self.reported_hostname, replace=True)
159+
self.tag_manager.set_tag("database_hostname", self.database_hostname, replace=True)
159160
self.tag_manager.set_tag("database_instance", self.database_identifier, replace=True)
160161

161162
def validate_config(self):
@@ -227,7 +228,7 @@ def _send_database_instance_metadata(self):
227228
"host": self.reported_hostname,
228229
"port": self._config.port,
229230
"database_instance": self.database_identifier,
230-
"database_hostname": self.reported_hostname,
231+
"database_hostname": self.database_hostname,
231232
"agent_version": datadog_agent.get_version(),
232233
"ddagenthostname": self.agent_hostname,
233234
"dbms": "clickhouse",
@@ -353,6 +354,12 @@ def reported_hostname(self) -> str | None:
353354
self._resolved_hostname = resolve_db_host(self._config.server)
354355
return self._resolved_hostname
355356

357+
@property
358+
def database_hostname(self) -> str:
359+
if self._database_hostname is None:
360+
self._database_hostname = resolve_db_host(self._config.server)
361+
return self._database_hostname
362+
356363
@property
357364
def agent_hostname(self):
358365
"""Get the agent hostname."""

clickhouse/tests/test_clickhouse.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_check(aggregator, instance, dd_run_check):
1818
server_tag = 'server:{}'.format(instance['server'])
1919
port_tag = 'port:{}'.format(instance['port'])
2020
metrics = common.get_metrics(CLICKHOUSE_VERSION)
21-
db_hostname_tag = 'database_hostname:{}'.format(check.reported_hostname)
21+
db_hostname_tag = 'database_hostname:{}'.format(check.database_hostname)
2222
db_instance_tag = 'database_instance:{}:{}:default'.format(instance['server'], instance['port'])
2323

2424
for metric in metrics:
@@ -55,7 +55,7 @@ def test_custom_queries(aggregator, instance, dd_run_check):
5555
'db:default',
5656
'foo:bar',
5757
'test:clickhouse',
58-
'database_hostname:{}'.format(check.reported_hostname),
58+
'database_hostname:{}'.format(check.database_hostname),
5959
'database_instance:{}:{}:default'.format(instance['server'], instance['port']),
6060
],
6161
)
@@ -99,8 +99,12 @@ def test_version_metadata(instance, datadog_agent, dd_run_check):
9999
)
100100

101101

102-
def test_database_instance_metadata(aggregator, instance, datadog_agent, dd_run_check):
102+
@pytest.mark.parametrize('reported_hostname', [None, 'forced-clickhouse-host'])
103+
def test_database_instance_metadata(aggregator, instance, datadog_agent, dd_run_check, reported_hostname):
103104
"""Test that database_instance metadata is sent correctly."""
105+
if reported_hostname:
106+
instance['reported_hostname'] = reported_hostname
107+
104108
check = ClickhouseCheck('clickhouse', {}, [instance])
105109
check.check_id = 'test:456'
106110
dd_run_check(check)
@@ -115,6 +119,13 @@ def test_database_instance_metadata(aggregator, instance, datadog_agent, dd_run_
115119
assert event['dbms'] == 'clickhouse'
116120
assert event['kind'] == 'database_instance'
117121
assert event['database_instance'] == check.database_identifier
122+
# database_hostname always reports the resolved host, independent of the reported_hostname override
123+
assert event['database_hostname'] == check.database_hostname
124+
# host follows the reported_hostname override when one is configured
125+
assert event['host'] == check.reported_hostname
126+
if reported_hostname:
127+
assert event['host'] == reported_hostname
128+
assert event['database_hostname'] != reported_hostname
118129
assert event['collection_interval'] == 300
119130
assert 'metadata' in event
120131
assert 'dbm' in event['metadata']

clickhouse/tests/test_unit.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,23 @@ def test_reported_hostname_loopback_substitutes_agent_hostname(loopback):
361361
assert check.reported_hostname == 'my-agent-host'
362362

363363

364-
def test_reported_hostname_non_loopback():
364+
@pytest.mark.parametrize(
365+
'reported_hostname, expected_reported_hostname',
366+
[
367+
pytest.param(None, 'resolved-host', id='no-override'),
368+
pytest.param('custom-host', 'custom-host', id='with-override'),
369+
],
370+
)
371+
def test_database_hostname_ignores_reported_hostname_override(reported_hostname, expected_reported_hostname):
372+
instance = {**BASE_INSTANCE}
373+
if reported_hostname:
374+
instance['reported_hostname'] = reported_hostname
365375
with mock.patch(
366-
'datadog_checks.clickhouse.clickhouse.resolve_db_host', return_value=BASE_INSTANCE['server']
376+
'datadog_checks.clickhouse.clickhouse.resolve_db_host', return_value='resolved-host'
367377
) as mock_resolve:
368-
check = ClickhouseCheck('clickhouse', {}, [BASE_INSTANCE])
369-
assert check.reported_hostname == BASE_INSTANCE['server']
370-
mock_resolve.assert_called_once_with(BASE_INSTANCE['server'])
378+
check = ClickhouseCheck('clickhouse', {}, [instance])
379+
# database_hostname always resolves the real host, regardless of the override
380+
assert check.database_hostname == 'resolved-host'
381+
# reported_hostname honors the override when configured, otherwise the resolved host
382+
assert check.reported_hostname == expected_reported_hostname
383+
mock_resolve.assert_called_with(BASE_INSTANCE['server'])

0 commit comments

Comments
 (0)