]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: show perf. counters for rgw svc. on Cluster > Hosts 42629/head
authorAlfonso Martínez <almartin@redhat.com>
Wed, 4 Aug 2021 09:11:50 +0000 (11:11 +0200)
committerAlfonso Martínez <almartin@redhat.com>
Wed, 4 Aug 2021 12:48:46 +0000 (14:48 +0200)
- Use service_map_id to retrieve perf. counters for rgw services.
- Move logic from controller to CephService.

Fixes: https://tracker.ceph.com/issues/52022
Signed-off-by: Alfonso Martínez <almartin@redhat.com>
(cherry picked from commit 69a87a1dea6fe148f2a81b1d7775f5ade9626c09)

src/pybind/mgr/dashboard/controllers/perf_counters.py
src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-daemon.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-daemon-details/rgw-daemon-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-daemon-details/rgw-daemon-details.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-daemon-details/rgw-daemon-details.component.ts
src/pybind/mgr/dashboard/services/ceph_service.py
src/pybind/mgr/dashboard/tests/test_rgw.py

index fca8e294ef51b44a184e217d2f8ecb06a01b2f62..dff109dff256ae0663af1cc80f058192142c8881 100644 (file)
@@ -1,8 +1,6 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
 
-from typing import Any, Dict
-
 import cherrypy
 
 from .. import mgr
@@ -28,35 +26,10 @@ class PerfCounter(RESTController):
     service_type = None  # type: str
 
     def get(self, service_id):
-        schema_dict = mgr.get_perf_schema(self.service_type, str(service_id))
         try:
-            schema = schema_dict["{}.{}".format(self.service_type, service_id)]
-        except KeyError as e:
-            raise cherrypy.HTTPError(404, "{0} not found".format(e))
-        counters = []
-
-        for key, value in sorted(schema.items()):
-            counter = dict()
-            counter['name'] = str(key)
-            counter['description'] = value['description']
-            # pylint: disable=W0212
-            if mgr._stattype_to_str(value['type']) == 'counter':
-                counter['value'] = CephService.get_rate(
-                    self.service_type, service_id, key)
-                counter['unit'] = mgr._unit_to_str(value['units'])
-            else:
-                counter['value'] = mgr.get_latest(
-                    self.service_type, service_id, key)
-                counter['unit'] = ''
-            counters.append(counter)
-
-        return {
-            'service': {
-                'type': self.service_type,
-                'id': str(service_id)
-            },
-            'counters': counters
-        }
+            return CephService.get_service_perf_counters(self.service_type, str(service_id))
+        except KeyError as error:
+            raise cherrypy.HTTPError(404, "{0} not found".format(error))
 
 
 @ApiController('perf_counters/mds', Scope.CEPHFS)
@@ -82,39 +55,6 @@ class OsdPerfCounter(PerfCounter):
 class RgwPerfCounter(PerfCounter):
     service_type = 'rgw'
 
-    def get(self, service_id: str) -> Dict[str, Any]:
-        svc_data = CephService.get_service_data_by_metadata_id(self.service_type, service_id)
-        service_map_id = svc_data['service_map_id']
-        schema_dict = mgr.get_perf_schema(self.service_type, service_map_id)
-        try:
-            schema = schema_dict["{}.{}".format(self.service_type, service_map_id)]
-        except KeyError as e:
-            raise cherrypy.HTTPError(404, "{0} not found".format(e))
-        counters = []
-
-        for key, value in sorted(schema.items()):
-            counter = dict()
-            counter['name'] = str(key)
-            counter['description'] = value['description']
-            # pylint: disable=W0212
-            if mgr._stattype_to_str(value['type']) == 'counter':
-                counter['value'] = CephService.get_rate(
-                    self.service_type, service_map_id, key)
-                counter['unit'] = mgr._unit_to_str(value['units'])
-            else:
-                counter['value'] = mgr.get_latest(
-                    self.service_type, service_map_id, key)
-                counter['unit'] = ''
-            counters.append(counter)
-
-        return {
-            'service': {
-                'type': self.service_type,
-                'id': svc_data['id']
-            },
-            'counters': counters
-        }
-
 
 @ApiController('perf_counters/rbd-mirror', Scope.RBD_MIRRORING)
 @ControllerDoc("Rgw Mirroring Perf Counters Management API", "RgwMirrorPerfCounter")
index 12a65613dd164d7cceca42e521deb10a3691c4f2..faf003ef4d1ddc1a61f7853e33e1703ff8524c6d 100644 (file)
@@ -98,6 +98,7 @@ class RgwDaemon(RESTController):
                 # extract per-daemon service data and health
                 daemon = {
                     'id': metadata['id'],
+                    'service_map_id': service['id'],
                     'version': metadata['ceph_version'],
                     'server_hostname': hostname,
                     'zonegroup_name': metadata['zonegroup_name'],
index 25544a5ed2700c013681c479095225cba0c6bee6..499692129318fcd9cf569d5e6a2e27bf84b074ca 100644 (file)
@@ -1,5 +1,6 @@
 export class RgwDaemon {
   id: string;
+  service_map_id: string;
   version: string;
   server_hostname: string;
   zonegroup_name: string;
index 873200d71b9f64c4d0227993c81133a58dc96b26..e53eaa8f73d3d6c5801f52429bc52e4cc78a4148 100644 (file)
@@ -17,7 +17,7 @@
          i18n>Performance Counters</a>
       <ng-template ngbNavContent>
         <cd-table-performance-counter serviceType="rgw"
-                                      [serviceId]="serviceId">
+                                      [serviceId]="serviceMapId">
         </cd-table-performance-counter>
       </ng-template>
     </li>
index e9bebbe9aac955e61d5a5d91d64aca7a24b0e80e..40ea5a04328be18c873e967e77d8462eaf099ff2 100644 (file)
@@ -4,6 +4,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
 
 import { PerformanceCounterModule } from '~/app/ceph/performance-counter/performance-counter.module';
+import { RgwDaemon } from '~/app/ceph/rgw/models/rgw-daemon';
 import { SharedModule } from '~/app/shared/shared.module';
 import { configureTestBed } from '~/testing/unit-test-helper';
 import { RgwDaemonDetailsComponent } from './rgw-daemon-details.component';
@@ -27,4 +28,15 @@ describe('RgwDaemonDetailsComponent', () => {
   it('should create', () => {
     expect(component).toBeTruthy();
   });
+
+  it('should set service id and service map id on changes', () => {
+    const daemon = new RgwDaemon();
+    daemon.id = 'daemon1';
+    daemon.service_map_id = '4832';
+    component.selection = daemon;
+    component.ngOnChanges();
+
+    expect(component.serviceId).toBe(daemon.id);
+    expect(component.serviceMapId).toBe(daemon.service_map_id);
+  });
 });
index 06f6c19768fe26ed979a9358712017aea10e5007..38a309e0ace3a4d08f740c1aa1edccc407e208d9 100644 (file)
@@ -2,6 +2,7 @@ import { Component, Input, OnChanges } from '@angular/core';
 
 import _ from 'lodash';
 
+import { RgwDaemon } from '~/app/ceph/rgw/models/rgw-daemon';
 import { RgwDaemonService } from '~/app/shared/api/rgw-daemon.service';
 import { Permission } from '~/app/shared/models/permissions';
 import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
@@ -14,10 +15,11 @@ import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
 export class RgwDaemonDetailsComponent implements OnChanges {
   metadata: any;
   serviceId = '';
+  serviceMapId = '';
   grafanaPermission: Permission;
 
   @Input()
-  selection: any;
+  selection: RgwDaemon;
 
   constructor(
     private rgwDaemonService: RgwDaemonService,
@@ -27,9 +29,9 @@ export class RgwDaemonDetailsComponent implements OnChanges {
   }
 
   ngOnChanges() {
-    // Get the service id of the first selected row.
     if (this.selection) {
       this.serviceId = this.selection.id;
+      this.serviceMapId = this.selection.service_map_id;
     }
   }
 
index 4cf82f06696d87341b6694c06dafe70fbbbf6aa2..a4d0fbca9c74b0b80ff7b0f165b7aae8a0f083ac 100644 (file)
@@ -26,6 +26,7 @@ class SendCommandError(rados.Error):
         super(SendCommandError, self).__init__(err, errno)
 
 
+# pylint: disable=too-many-public-methods
 class CephService(object):
 
     OSD_FLAG_NO_SCRUB = 'noscrub'
@@ -91,6 +92,32 @@ class CephService(object):
             svc_data['status'] = mgr.get_daemon_status(svc_data['type'], svc_data['service_map_id'])
         return svc_data
 
+    @classmethod
+    def get_service_perf_counters(cls, service_type: str, service_id: str) -> Dict[str, Any]:
+        schema_dict = mgr.get_perf_schema(service_type, service_id)
+        schema = schema_dict["{}.{}".format(service_type, service_id)]
+        counters = []
+        for key, value in sorted(schema.items()):
+            counter = {'name': str(key), 'description': value['description']}
+            # pylint: disable=W0212
+            if mgr._stattype_to_str(value['type']) == 'counter':
+                counter['value'] = cls.get_rate(
+                    service_type, service_id, key)
+                counter['unit'] = mgr._unit_to_str(value['units'])
+            else:
+                counter['value'] = mgr.get_latest(
+                    service_type, service_id, key)
+                counter['unit'] = ''
+            counters.append(counter)
+
+        return {
+            'service': {
+                'type': service_type,
+                'id': str(service_id)
+            },
+            'counters': counters
+        }
+
     @classmethod
     def get_pool_list(cls, application=None):
         osd_map = mgr.get('osd_map')
index bf56464c063e8485453d505bc0fc4faa2b306f0e..2f71489f352252feac33f2202cc81ebdcb792201 100644 (file)
@@ -71,7 +71,7 @@ class RgwDaemonControllerTestCase(ControllerTestCase):
         RgwStub.get_settings()
         mgr.list_servers.return_value = [{
             'hostname': 'host1',
-            'services': [{'id': 'daemon1', 'type': 'rgw'}, {'id': 'daemon2', 'type': 'rgw'}]
+            'services': [{'id': '4832', 'type': 'rgw'}, {'id': '5356', 'type': 'rgw'}]
         }]
         mgr.get_metadata.side_effect = [
             {
@@ -90,6 +90,7 @@ class RgwDaemonControllerTestCase(ControllerTestCase):
         self.assertStatus(200)
         self.assertJsonBody([{
             'id': 'daemon1',
+            'service_map_id': '4832',
             'version': 'ceph version master (dev)',
             'server_hostname': 'host1',
             'zonegroup_name': 'zg1',
@@ -97,6 +98,7 @@ class RgwDaemonControllerTestCase(ControllerTestCase):
         },
             {
             'id': 'daemon2',
+            'service_map_id': '5356',
             'version': 'ceph version master (dev)',
             'server_hostname': 'host1',
             'zonegroup_name': 'zg2',