]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cephadm: configuring prometheus endpoint for smb
authorShachar Sharon <ssharon@redhat.com>
Wed, 24 Jul 2024 10:59:30 +0000 (13:59 +0300)
committerShachar Sharon <ssharon@redhat.com>
Fri, 30 Aug 2024 09:02:55 +0000 (12:02 +0300)
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 <ssharon@redhat.com>
src/pybind/mgr/cephadm/service_discovery.py
src/pybind/mgr/cephadm/services/monitoring.py
src/pybind/mgr/cephadm/templates/services/prometheus/prometheus.yml.j2
src/pybind/mgr/cephadm/tests/test_service_discovery.py
src/pybind/mgr/cephadm/tests/test_services.py

index e9b072a9a50ae7601329b7dde64e9bc616a262d4..1efd2dc1281aaae0f454d2f5608ab4d6285f4305 100644 (file)
@@ -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):
 <p><a href='prometheus/sd-config?service=ceph-exporter'>Ceph exporter http sd-config</a></p>
 <p><a href='prometheus/sd-config?service=nvmeof'>NVMeoF http sd-config</a></p>
 <p><a href='prometheus/sd-config?service=nfs'>NFS http sd-config</a></p>
+<p><a href='prometheus/sd-config?service=smb'>SMB http sd-config</a></p>
 <p><a href='prometheus/rules'>Prometheus rules</a></p>
 </body>
 </html>'''
@@ -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 <http_sd_config> 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."""
index f407985fcee59ab051cc4a0b0099c39ee8460d1e..5d5d26ecad13af9c431f2dbfe720d668ffdd59f0 100644 (file)
@@ -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 = ''
index 3707f47f9770f656bddcb8092ac66d9117ebe930..e769486775591ca55b360e666b5cf058d0984f81 100644 (file)
@@ -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
index 159431b3b889ab9f03f7f81808175b2a0544dce7..6f73cad91def05f5770b3818af80ada6b904cc83 100644 (file)
@@ -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')
index b3be014a0a662eba1cc7c414edfab8fda8db93d4..4b34a302ef02e4becb314b4f811a31d5ac78bbbf 100644 (file)
@@ -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(