sbcli-pre 1.4.7__zip → 1.4.8__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/PKG-INFO +1 -1
  2. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/env_var +1 -1
  3. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/sbcli_pre.egg-info/PKG-INFO +1 -1
  4. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/sbcli_pre.egg-info/SOURCES.txt +1 -0
  5. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_cli/cli.py +7 -3
  6. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/constants.py +3 -2
  7. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/caching_node_controller.py +32 -33
  8. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/lvol_controller.py +3 -1
  9. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/kv_store.py +5 -1
  10. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/stats.py +4 -0
  11. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/docker-compose-swarm.yml +11 -0
  12. sbcli_pre-1.4.8/simplyblock_core/services/cached_lvol_stat_collector.py +89 -0
  13. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/README.md +0 -0
  14. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/pyproject.toml +0 -0
  15. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/sbcli_pre.egg-info/dependency_links.txt +0 -0
  16. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/sbcli_pre.egg-info/entry_points.txt +0 -0
  17. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/sbcli_pre.egg-info/requires.txt +0 -0
  18. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/sbcli_pre.egg-info/top_level.txt +0 -0
  19. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/setup.cfg +0 -0
  20. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/setup.py +0 -0
  21. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_cli/main.py +0 -0
  22. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/__init__.py +0 -0
  23. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/cluster_ops.py +0 -0
  24. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/cnode_client.py +0 -0
  25. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/compute_node_ops.py +0 -0
  26. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/__init__.py +0 -0
  27. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/cluster_events.py +0 -0
  28. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/device_controller.py +0 -0
  29. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/device_events.py +0 -0
  30. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/events_controller.py +0 -0
  31. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/health_controller.py +0 -0
  32. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/lvol_events.py +0 -0
  33. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/mgmt_events.py +0 -0
  34. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/pool_controller.py +0 -0
  35. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/pool_events.py +0 -0
  36. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/snapshot_controller.py +0 -0
  37. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/snapshot_events.py +0 -0
  38. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/storage_events.py +0 -0
  39. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/tasks_controller.py +0 -0
  40. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/controllers/tasks_events.py +0 -0
  41. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/distr_controller.py +0 -0
  42. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/mgmt_node_ops.py +0 -0
  43. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/__init__.py +0 -0
  44. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/base_model.py +0 -0
  45. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/caching_node.py +0 -0
  46. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/cluster.py +0 -0
  47. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/compute_node.py +0 -0
  48. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/deployer.py +0 -0
  49. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/events.py +0 -0
  50. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/global_settings.py +0 -0
  51. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/iface.py +0 -0
  52. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/job_schedule.py +0 -0
  53. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/lvol_model.py +0 -0
  54. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/mgmt_node.py +0 -0
  55. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/nvme_device.py +0 -0
  56. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/pool.py +0 -0
  57. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/port_stat.py +0 -0
  58. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/snapshot.py +0 -0
  59. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/models/storage_node.py +0 -0
  60. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/pci_utils.py +0 -0
  61. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/rpc_client.py +0 -0
  62. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/__init__.py +0 -0
  63. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/alerting/alert_resources.yaml.j2 +0 -0
  64. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/alerting/alert_rules.yaml +0 -0
  65. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/clean_local_storage_deploy.sh +0 -0
  66. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/config_docker.sh +0 -0
  67. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboard.yml +0 -0
  68. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboards/cluster.json +0 -0
  69. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboards/devices.json +0 -0
  70. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboards/lvols.json +0 -0
  71. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboards/node-exporter.json +0 -0
  72. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboards/nodes.json +0 -0
  73. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/dashboards/pools.json +0 -0
  74. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/datasource.yml +0 -0
  75. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/db_config_double.sh +0 -0
  76. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/db_config_single.sh +0 -0
  77. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/deploy_stack.sh +0 -0
  78. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/docker-compose-swarm-monitoring.yml +0 -0
  79. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/haproxy.cfg +0 -0
  80. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/install_deps.sh +0 -0
  81. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/objstore.yml +0 -0
  82. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/prometheus.yml +0 -0
  83. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/run_ssh.sh +0 -0
  84. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/set_db_config.sh +0 -0
  85. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/scripts/stack_deploy_wait.sh +0 -0
  86. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/__init__.py +0 -0
  87. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/caching_node_monitor.py +0 -0
  88. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/cap_monitor.py +0 -0
  89. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/capacity_and_stats_collector.py +0 -0
  90. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/device_monitor.py +0 -0
  91. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/distr_event_collector.py +0 -0
  92. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/health_check_service.py +0 -0
  93. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/install_service.sh +0 -0
  94. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/log_agg_service.py +0 -0
  95. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/lvol_monitor.py +0 -0
  96. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/lvol_stat_collector.py +0 -0
  97. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/mgmt_node_monitor.py +0 -0
  98. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/port_stat_collector.py +0 -0
  99. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/remove_service.sh +0 -0
  100. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/service_template.service +0 -0
  101. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/storage_node_monitor.py +0 -0
  102. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/tasks_runner_migration.py +0 -0
  103. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/services/tasks_runner_restart.py +0 -0
  104. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/shell_utils.py +0 -0
  105. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/snode_client.py +0 -0
  106. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/storage_node_ops.py +0 -0
  107. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_core/utils.py +0 -0
  108. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/__init__.py +0 -0
  109. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/app.py +0 -0
  110. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/auth_middleware.py +0 -0
  111. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/__init__.py +0 -0
  112. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/caching_node_ops.py +0 -0
  113. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/caching_node_ops_k8s.py +0 -0
  114. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/node_api_basic.py +0 -0
  115. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/node_api_caching_docker.py +0 -0
  116. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/node_api_caching_ks.py +0 -0
  117. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/snode_ops.py +0 -0
  118. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_caching_node.py +0 -0
  119. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_cluster.py +0 -0
  120. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_deployer.py +0 -0
  121. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_device.py +0 -0
  122. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_lvol.py +0 -0
  123. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_mgmt_node.py +0 -0
  124. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_pool.py +0 -0
  125. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_snapshot.py +0 -0
  126. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/blueprints/web_api_storage_node.py +0 -0
  127. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/caching_node_app.py +0 -0
  128. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/caching_node_app_k8s.py +0 -0
  129. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/node_utils.py +0 -0
  130. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/node_webapp.py +0 -0
  131. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/snode_app.py +0 -0
  132. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/delete.py +0 -0
  133. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/deploy.py +0 -0
  134. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/deploy_cnode.yaml +0 -0
  135. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/deploy_spdk.yaml +0 -0
  136. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/is_up.py +0 -0
  137. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/list_deps.py +0 -0
  138. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/rpac.yaml +0 -0
  139. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/static/tst.py +0 -0
  140. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/templates/deploy_spdk.yaml.j2 +0 -0
  141. {sbcli_pre-1.4.7 → sbcli_pre-1.4.8}/simplyblock_web/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 1.4.7
3
+ Version: 1.4.8
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -1,5 +1,5 @@
1
1
  SIMPLY_BLOCK_COMMAND_NAME=sbcli-pre
2
- SIMPLY_BLOCK_VERSION=1.4.7
2
+ SIMPLY_BLOCK_VERSION=1.4.8
3
3
 
4
4
 
5
5
  SIMPLY_BLOCK_DOCKER_IMAGE=simplyblock/simplyblock:pre-release
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sbcli-pre
3
- Version: 1.4.7
3
+ Version: 1.4.8
4
4
  Summary: CLI for managing SimplyBlock cluster
5
5
  Home-page: https://www.simplyblock.io/
6
6
  Author: Hamdy
@@ -85,6 +85,7 @@ simplyblock_core/scripts/dashboards/node-exporter.json
85
85
  simplyblock_core/scripts/dashboards/nodes.json
86
86
  simplyblock_core/scripts/dashboards/pools.json
87
87
  simplyblock_core/services/__init__.py
88
+ simplyblock_core/services/cached_lvol_stat_collector.py
88
89
  simplyblock_core/services/caching_node_monitor.py
89
90
  simplyblock_core/services/cap_monitor.py
90
91
  simplyblock_core/services/capacity_and_stats_collector.py
@@ -609,9 +609,9 @@ class CLIWrapper:
609
609
  sub_command.add_argument("node_id", help='Caching node UUID')
610
610
 
611
611
  sub_command = self.add_sub_command(subparser, 'get-lvol-stats', 'Get LVol stats')
612
- sub_command.add_argument("node_id", help='Caching node UUID')
613
612
  sub_command.add_argument("lvol_id", help='LVol UUID')
614
- sub_command.add_argument("--duration", help='collection duration in seconds, default: 5', type=int, default=5)
613
+ sub_command.add_argument("--history", help='(XXdYYh), list history records (one for every 15 minutes) '
614
+ 'for XX days and YY hours (up to 10 days in total).')
615
615
 
616
616
 
617
617
  def init_parser(self):
@@ -1111,7 +1111,11 @@ class CLIWrapper:
1111
1111
  ret = caching_node_controller.recreate(args.node_id)
1112
1112
 
1113
1113
  if sub_command == "get-lvol-stats":
1114
- ret = caching_node_controller.get_lvol_stats(args.node_id, args.lvol_id, args.duration)
1114
+ data = caching_node_controller.get_io_stats(args.lvol_id, args.history)
1115
+ if data:
1116
+ ret = utils.print_table(data)
1117
+ else:
1118
+ return False
1115
1119
 
1116
1120
  else:
1117
1121
  self.parser.print_help()
@@ -14,8 +14,8 @@ INSTALL_DIR = os.path.dirname(os.path.realpath(__file__))
14
14
  NODE_MONITOR_INTERVAL_SEC = 3
15
15
  DEVICE_MONITOR_INTERVAL_SEC = 5
16
16
  STAT_COLLECTOR_INTERVAL_SEC = 60*5 # 5 minutes
17
- LVOL_STAT_COLLECTOR_INTERVAL_SEC = 2
18
- LVOL_MONITOR_INTERVAL_SEC = 60
17
+ LVOL_STAT_COLLECTOR_INTERVAL_SEC = 5
18
+ LVOL_MONITOR_INTERVAL_SEC = 120
19
19
  DEV_MONITOR_INTERVAL_SEC = 10
20
20
  DEV_STAT_COLLECTOR_INTERVAL_SEC = 2
21
21
  PROT_STAT_COLLECTOR_INTERVAL_SEC = 2
@@ -23,6 +23,7 @@ DISTR_EVENT_COLLECTOR_INTERVAL_SEC = 2
23
23
  DISTR_EVENT_COLLECTOR_NUM_OF_EVENTS = 10
24
24
  CAP_MONITOR_INTERVAL_SEC = 30
25
25
  SSD_VENDOR_WHITE_LIST = ["1d0f:cd01", "1d0f:cd00"]
26
+ CACHED_LVOL_STAT_COLLECTOR_INTERVAL_SEC = 5
26
27
 
27
28
  PMEM_DIR = '/tmp/pmem'
28
29
 
@@ -478,7 +478,7 @@ def connect(caching_node_id, lvol_id):
478
478
  logger.info(f"Device path: {dev_path}")
479
479
 
480
480
  cached_lvol = CachedLVol()
481
- cached_lvol.uuid = str(uuid.uuid4())
481
+ cached_lvol.uuid = lvol.get_id()
482
482
  cached_lvol.lvol_id = lvol.get_id()
483
483
  cached_lvol.lvol = lvol
484
484
  cached_lvol.hostname = cnode.hostname
@@ -733,41 +733,40 @@ def remove_node(node_id, force=False):
733
733
  logger.info("done")
734
734
 
735
735
 
736
- def get_lvol_stats(caching_node_id, lvol_id, duration=5):
737
- db_controller = DBController()
738
- cnode = db_controller.get_caching_node_by_id(caching_node_id)
739
- if not cnode:
740
- logger.info(f"Caching node uuid not found: {caching_node_id}")
741
- cnode = db_controller.get_caching_node_by_hostname(caching_node_id)
742
- if not cnode:
743
- logger.error("Caching node not found")
744
- return False
745
-
746
- lvol = db_controller.get_lvol_by_id(lvol_id)
736
+ def get_io_stats(lvol_uuid, history, records_count=20, parse_sizes=True):
737
+ lvol = db_controller.get_lvol_by_id(lvol_uuid)
747
738
  if not lvol:
748
- logger.error(f"LVol not found: {lvol_id}")
739
+ logger.error(f"LVol not found: {lvol_uuid}")
749
740
  return False
750
741
 
751
- rpc_client = RPCClient(
752
- cnode.mgmt_ip, cnode.rpc_port,
753
- cnode.rpc_username, cnode.rpc_password,
754
- timeout=3, retry=2)
755
-
756
- ocf_bdev = None
757
- for lv in cnode.lvols:
758
- if lv.lvol_id == lvol.get_id():
759
- ocf_bdev = lv.ocf_bdev
742
+ if history:
743
+ records_number = utils.parse_history_param(history)
744
+ if not records_number:
745
+ logger.error(f"Error parsing history string: {history}")
746
+ return False
747
+ else:
748
+ records_number = 20
760
749
 
761
- if not ocf_bdev:
762
- logger.error(f"LVol is not connected to caching node")
750
+ records_list = db_controller.get_cached_lvol_stats(lvol.get_id(), limit=records_number)
751
+ if not records_list:
763
752
  return False
753
+ new_records = utils.process_records(records_list, min(records_count, len(records_list)))
754
+
755
+ if not parse_sizes:
756
+ return new_records
757
+
758
+ out = []
759
+ for record in new_records:
760
+ out.append({
761
+ "Date": time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(record['date'])),
762
+ "Read bytes": utils.humanbytes(record["read_bytes"]),
763
+ "Read speed": utils.humanbytes(record['read_bytes_ps']),
764
+ "Read IOPS": record['read_io_ps'],
765
+ "Read lat": record['read_latency_ps'],
766
+ "Write bytes": utils.humanbytes(record["write_bytes"]),
767
+ "Write speed": utils.humanbytes(record['write_bytes_ps']),
768
+ "Write IOPS": record['write_io_ps'],
769
+ "Write lat": record['write_latency_ps'],
770
+ })
771
+ return out
764
772
 
765
- logger.info("Getting bdev stats: %s", ocf_bdev)
766
-
767
- while True:
768
- stats_dict = rpc_client.get_lvol_stats(ocf_bdev)
769
- print(datetime.datetime.now())
770
- print(json.dumps(stats_dict, indent=2))
771
- time.sleep(duration)
772
-
773
- return True
@@ -1345,7 +1345,9 @@ def get_io_stats(lvol_uuid, history, records_count=20, parse_sizes=True):
1345
1345
  records_number = 20
1346
1346
 
1347
1347
  records_list = db_controller.get_lvol_stats(lvol, limit=records_number)
1348
- new_records = utils.process_records(records_list, records_count)
1348
+ if not records_list:
1349
+ return False
1350
+ new_records = utils.process_records(records_list, min(records_count, len(records_list)))
1349
1351
 
1350
1352
  if not parse_sizes:
1351
1353
  return new_records
@@ -19,7 +19,7 @@ from simplyblock_core.models.mgmt_node import MgmtNode
19
19
  from simplyblock_core.models.pool import Pool
20
20
  from simplyblock_core.models.snapshot import SnapShot
21
21
  from simplyblock_core.models.stats import DeviceStatObject, NodeStatObject, ClusterStatObject, LVolStatObject, \
22
- PoolStatObject
22
+ PoolStatObject, CachedLVolStatObject
23
23
  from simplyblock_core.models.storage_node import StorageNode
24
24
  from simplyblock_core.models.lvol_model import LVol
25
25
 
@@ -232,6 +232,10 @@ class DBController:
232
232
  stats = LVolStatObject().read_from_db(self.kv_store, id="%s/%s" % (lvol.pool_uuid, lvol.uuid), limit=limit, reverse=True)
233
233
  return stats
234
234
 
235
+ def get_cached_lvol_stats(self, lvol_id, limit=20):
236
+ stats = CachedLVolStatObject().read_from_db(self.kv_store, id="%s/%s" % (lvol_id, lvol_id), limit=limit, reverse=True)
237
+ return stats
238
+
235
239
  def get_pool_stats(self, pool, limit=20):
236
240
  stats = PoolStatObject().read_from_db(self.kv_store, id="%s/%s" % (pool.get_id(), pool.get_id()), limit=limit, reverse=True)
237
241
  return stats
@@ -126,3 +126,7 @@ class LVolStatObject(StatsObject):
126
126
 
127
127
  class PoolStatObject(LVolStatObject):
128
128
  pass
129
+
130
+
131
+ class CachedLVolStatObject(StatsObject):
132
+ pass
@@ -79,6 +79,17 @@ services:
79
79
  networks:
80
80
  - hostnet
81
81
 
82
+ CachedLVolStatsCollector:
83
+ image: $SIMPLYBLOCK_DOCKER_IMAGE
84
+ command: "python simplyblock_core/services/cached_lvol_stat_collector.py"
85
+ deploy:
86
+ placement:
87
+ constraints: [node.role == manager]
88
+ volumes:
89
+ - "/etc/foundationdb:/etc/foundationdb"
90
+ networks:
91
+ - hostnet
92
+
82
93
  PortStatsCollector:
83
94
  image: $SIMPLYBLOCK_DOCKER_IMAGE
84
95
  command: "python simplyblock_core/services/port_stat_collector.py"
@@ -0,0 +1,89 @@
1
+ # coding=utf-8
2
+ import time
3
+
4
+ from simplyblock_core import constants, kv_store, utils
5
+ from simplyblock_core.models.stats import CachedLVolStatObject
6
+ from simplyblock_core.rpc_client import RPCClient
7
+
8
+
9
+ logger = utils.get_logger(__name__)
10
+
11
+ last_object_record = {}
12
+
13
+
14
+ def add_lvol_stats(lvol, stats_dict):
15
+ now = int(time.time())
16
+ data = {
17
+ "cluster_id": lvol.get_id(),
18
+ "uuid": lvol.get_id(),
19
+ "date": now}
20
+
21
+ if stats_dict and stats_dict['bdevs']:
22
+ stats = stats_dict['bdevs'][0]
23
+ data.update({
24
+ "read_bytes": stats['bytes_read'],
25
+ "read_io": stats['num_read_ops'],
26
+ "read_latency_ticks": stats['read_latency_ticks'],
27
+
28
+ "write_bytes": stats['bytes_written'],
29
+ "write_io": stats['num_write_ops'],
30
+ "write_latency_ticks": stats['write_latency_ticks'],
31
+
32
+ "unmap_bytes": stats['bytes_unmapped'],
33
+ "unmap_io": stats['num_unmap_ops'],
34
+ "unmap_latency_ticks": stats['unmap_latency_ticks'],
35
+ })
36
+
37
+ last_record = None
38
+ if lvol.get_id() in last_object_record:
39
+ last_record = last_object_record[lvol.get_id()]
40
+ else:
41
+ records = db_controller.get_cached_lvol_stats(lvol.get_id(), limit=1)
42
+ if records:
43
+ last_record = records[0]
44
+
45
+ if last_record:
46
+ time_diff = (now - last_record.date)
47
+ if time_diff > 0:
48
+ data['record_duration'] = time_diff
49
+ data['read_bytes_ps'] = int((data['read_bytes'] - last_record['read_bytes']) / time_diff)
50
+ data['read_io_ps'] = int((data['read_io'] - last_record['read_io']) / time_diff)
51
+ data['read_latency_ps'] = int(
52
+ (data['read_latency_ticks'] - last_record['read_latency_ticks']) / time_diff)
53
+
54
+ data['write_bytes_ps'] = int((data['write_bytes'] - last_record['write_bytes']) / time_diff)
55
+ data['write_io_ps'] = int((data['write_io'] - last_record['write_io']) / time_diff)
56
+ data['write_latency_ps'] = int(
57
+ (data['write_latency_ticks'] - last_record['write_latency_ticks']) / time_diff)
58
+
59
+ data['unmap_bytes_ps'] = int((data['unmap_bytes'] - last_record['unmap_bytes']) / time_diff)
60
+ data['unmap_io_ps'] = int((data['unmap_io'] - last_record['unmap_io']) / time_diff)
61
+ data['unmap_latency_ps'] = int(
62
+ (data['unmap_latency_ticks'] - last_record['unmap_latency_ticks']) / time_diff)
63
+
64
+ else:
65
+ logger.warning("last record not found")
66
+ else:
67
+ logger.error("Error getting stats")
68
+
69
+ stat_obj = CachedLVolStatObject(data=data)
70
+ stat_obj.write_to_db(db_controller.kv_store)
71
+ last_object_record[lvol.get_id()] = stat_obj
72
+ return stat_obj
73
+
74
+
75
+ db_store = kv_store.KVStore()
76
+ db_controller = kv_store.DBController()
77
+
78
+ logger.info("Starting stats collector...")
79
+ while True:
80
+ cnodes = db_controller.get_caching_nodes()
81
+ for node in cnodes:
82
+ rpc_client = RPCClient(node.mgmt_ip, node.rpc_port, node.rpc_username, node.rpc_password, timeout=3, retry=1)
83
+ for cached_lvol in node.lvols:
84
+ logger.info("Getting lVol stats: %s", cached_lvol.uuid)
85
+ stats_dict = rpc_client.get_lvol_stats(cached_lvol.ocf_bdev)
86
+ add_lvol_stats(cached_lvol.lvol, stats_dict)
87
+
88
+ logger.info(f"Sleeping for {constants.CACHED_LVOL_STAT_COLLECTOR_INTERVAL_SEC} seconds")
89
+ time.sleep(constants.CACHED_LVOL_STAT_COLLECTOR_INTERVAL_SEC)
File without changes
File without changes
File without changes
File without changes