From 4f1d97918e0f845d11adc8ef17e8f42ad9e83f9a Mon Sep 17 00:00:00 2001 From: Shachar Sharon Date: Wed, 24 Jul 2024 13:59:30 +0300 Subject: [PATCH] cephadm: configuring prometheus endpoint for smb Allow Prometheus to scrap samba-server metrics via default port 9922[1]. Uses the same conventions as used by NFS-Ganesha Prometheus metrics exporter. [1] https://github.com/prometheus/prometheus/wiki/Default-port-allocations Signed-off-by: Shachar Sharon --- src/pybind/mgr/cephadm/service_discovery.py | 17 ++++++++++++++++ src/pybind/mgr/cephadm/services/monitoring.py | 4 +++- .../services/prometheus/prometheus.yml.j2 | 20 +++++++++++++++++++ .../cephadm/tests/test_service_discovery.py | 18 +++++++++++++++++ src/pybind/mgr/cephadm/tests/test_services.py | 17 ++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/pybind/mgr/cephadm/service_discovery.py b/src/pybind/mgr/cephadm/service_discovery.py index e9b072a9a50..1efd2dc1281 100644 --- a/src/pybind/mgr/cephadm/service_discovery.py +++ b/src/pybind/mgr/cephadm/service_discovery.py @@ -13,6 +13,7 @@ from mgr_module import ServiceInfoT from mgr_util import build_url from typing import Dict, List, TYPE_CHECKING, cast, Collection, Callable, NamedTuple, Optional, IO from cephadm.services.nfs import NFSService +from cephadm.services.smb import SMBService from cephadm.services.monitoring import AlertmanagerService, NodeExporterService, PrometheusService import secrets from mgr_util import verify_tls_files @@ -149,6 +150,7 @@ class Root(Server):

Ceph exporter http sd-config

NVMeoF http sd-config

NFS http sd-config

+

SMB http sd-config

Prometheus rules

''' @@ -171,6 +173,8 @@ class Root(Server): return self.nvmeof_sd_config() elif service == 'nfs': return self.nfs_sd_config() + elif service == 'smb': + return self.smb_sd_config() else: return [] @@ -265,6 +269,19 @@ class Root(Server): }) return srv_entries + def smb_sd_config(self) -> List[Dict[str, Collection[str]]]: + """Return compatible prometheus config for smb service.""" + srv_entries = [] + for dd in self.mgr.cache.get_daemons_by_type('smb'): + assert dd.hostname is not None + addr = dd.ip if dd.ip else self.mgr.inventory.get_addr(dd.hostname) + port = SMBService.DEFAULT_EXPORTER_PORT + srv_entries.append({ + 'targets': [build_url(host=addr, port=port).lstrip('/')], + 'labels': {'instance': dd.hostname} + }) + return srv_entries + @cherrypy.expose(alias='prometheus/rules') def get_prometheus_rules(self) -> str: """Return currently configured prometheus rules as Yaml.""" diff --git a/src/pybind/mgr/cephadm/services/monitoring.py b/src/pybind/mgr/cephadm/services/monitoring.py index f407985fcee..5d5d26ecad1 100644 --- a/src/pybind/mgr/cephadm/services/monitoring.py +++ b/src/pybind/mgr/cephadm/services/monitoring.py @@ -503,6 +503,7 @@ class PrometheusService(CephadmService): nvmeof_sd_url = f'{srv_end_point}service=nvmeof' # always included mgmt_gw_enabled = len(self.mgr.cache.get_daemons_by_service('mgmt-gateway')) > 0 nfs_sd_url = f'{srv_end_point}service=nfs' # always included + smb_sd_url = f'{srv_end_point}service=smb' # always included alertmanager_user, alertmanager_password = self.mgr._get_alertmanager_credentials() prometheus_user, prometheus_password = self.mgr._get_prometheus_credentials() @@ -524,7 +525,8 @@ class PrometheusService(CephadmService): 'nvmeof_sd_url': nvmeof_sd_url, 'external_prometheus_targets': targets, 'cluster_fsid': FSID, - 'nfs_sd_url': nfs_sd_url + 'nfs_sd_url': nfs_sd_url, + 'smb_sd_url': smb_sd_url } ip_to_bind_to = '' diff --git a/src/pybind/mgr/cephadm/templates/services/prometheus/prometheus.yml.j2 b/src/pybind/mgr/cephadm/templates/services/prometheus/prometheus.yml.j2 index 3707f47f977..e7694867755 100644 --- a/src/pybind/mgr/cephadm/templates/services/prometheus/prometheus.yml.j2 +++ b/src/pybind/mgr/cephadm/templates/services/prometheus/prometheus.yml.j2 @@ -181,6 +181,26 @@ scrape_configs: {% endif %} {% endif %} +{% if smb_sd_url %} + - job_name: 'smb' +{% if security_enabled %} + honor_labels: true + scheme: https + tls_config: + ca_file: root_cert.pem + http_sd_configs: + - url: {{ smb_sd_url }} + basic_auth: + username: {{ service_discovery_username }} + password: {{ service_discovery_password }} + tls_config: + ca_file: root_cert.pem +{% else %} + http_sd_configs: + - url: {{ smb_sd_url }} +{% endif %} +{% endif %} + {% if not security_enabled %} - job_name: 'federate' scrape_interval: 15s diff --git a/src/pybind/mgr/cephadm/tests/test_service_discovery.py b/src/pybind/mgr/cephadm/tests/test_service_discovery.py index 159431b3b88..6f73cad91de 100644 --- a/src/pybind/mgr/cephadm/tests/test_service_discovery.py +++ b/src/pybind/mgr/cephadm/tests/test_service_discovery.py @@ -27,6 +27,10 @@ class FakeCache: return [FakeDaemonDescription('1.2.3.4', [9587], 'node0'), FakeDaemonDescription('1.2.3.5', [9587], 'node1')] + if service_type == 'smb': + return [FakeDaemonDescription('1.2.3.4', [9922], 'node0'), + FakeDaemonDescription('1.2.3.5', [9922], 'node1')] + return [FakeDaemonDescription('1.2.3.4', [9100], 'node0'), FakeDaemonDescription('1.2.3.5', [9200], 'node1')] @@ -206,6 +210,20 @@ class TestServiceDiscovery: # check content assert cfg[0]['targets'] == ['1.2.3.4:9587'] + def test_get_sd_config_smb(self): + mgr = FakeMgr() + root = Root(mgr, 5000, '0.0.0.0') + cfg = root.get_sd_config('smb') + + # check response structure + assert cfg + for entry in cfg: + assert 'labels' in entry + assert 'targets' in entry + + # check content + assert cfg[0]['targets'] == ['1.2.3.4:9922'] + def test_get_sd_config_invalid_service(self): mgr = FakeMgr() root = Root(mgr, 5000, '0.0.0.0') diff --git a/src/pybind/mgr/cephadm/tests/test_services.py b/src/pybind/mgr/cephadm/tests/test_services.py index b3be014a0a6..4b34a302ef0 100644 --- a/src/pybind/mgr/cephadm/tests/test_services.py +++ b/src/pybind/mgr/cephadm/tests/test_services.py @@ -828,6 +828,10 @@ class TestMonitoring: http_sd_configs: - url: http://[::1]:8765/sd/prometheus/sd-config?service=nfs + - job_name: 'smb' + http_sd_configs: + - url: http://[::1]:8765/sd/prometheus/sd-config?service=smb + - job_name: 'federate' scrape_interval: 15s honor_labels: true @@ -1038,6 +1042,19 @@ class TestMonitoring: tls_config: ca_file: root_cert.pem + - job_name: 'smb' + honor_labels: true + scheme: https + tls_config: + ca_file: root_cert.pem + http_sd_configs: + - url: https://[::1]:8765/sd/prometheus/sd-config?service=smb + basic_auth: + username: sd_user + password: sd_password + tls_config: + ca_file: root_cert.pem + """).lstrip() _run_cephadm.assert_called_with( -- 2.47.3