cds-caching 1.2.1 → 1.3.1

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 (80) hide show
  1. package/README.md +195 -1114
  2. package/app/dashboard/Component-dbg.js +59 -0
  3. package/app/dashboard/Component-dbg.js.map +1 -0
  4. package/app/dashboard/Component.js +2 -0
  5. package/app/dashboard/Component.js.map +1 -0
  6. package/app/dashboard/Component.ts +59 -0
  7. package/app/dashboard/controller/App-dbg.controller.js +132 -0
  8. package/app/dashboard/controller/App-dbg.controller.js.map +1 -0
  9. package/app/dashboard/controller/App.controller.js +2 -0
  10. package/app/dashboard/controller/App.controller.js.map +1 -0
  11. package/app/dashboard/controller/App.controller.ts +147 -0
  12. package/app/dashboard/controller/BaseController-dbg.js +75 -0
  13. package/app/dashboard/controller/BaseController-dbg.js.map +1 -0
  14. package/app/dashboard/controller/BaseController.js +2 -0
  15. package/app/dashboard/controller/BaseController.js.map +1 -0
  16. package/app/dashboard/controller/BaseController.ts +88 -0
  17. package/app/dashboard/controller/Cache-dbg.controller.js +421 -0
  18. package/app/dashboard/controller/Cache-dbg.controller.js.map +1 -0
  19. package/app/dashboard/controller/Cache.controller.js +2 -0
  20. package/app/dashboard/controller/Cache.controller.js.map +1 -0
  21. package/app/dashboard/controller/Cache.controller.ts +490 -0
  22. package/app/dashboard/controller/Main-dbg.controller.js +32 -0
  23. package/app/dashboard/controller/Main-dbg.controller.js.map +1 -0
  24. package/app/dashboard/controller/Main.controller.js +2 -0
  25. package/app/dashboard/controller/Main.controller.js.map +1 -0
  26. package/app/dashboard/controller/Main.controller.ts +31 -0
  27. package/app/dashboard/controller/SingleMetric-dbg.controller.js +306 -0
  28. package/app/dashboard/controller/SingleMetric-dbg.controller.js.map +1 -0
  29. package/app/dashboard/controller/SingleMetric.controller.js +2 -0
  30. package/app/dashboard/controller/SingleMetric.controller.js.map +1 -0
  31. package/app/dashboard/controller/SingleMetric.controller.ts +335 -0
  32. package/app/dashboard/i18n/i18n.properties +61 -0
  33. package/app/dashboard/i18n/i18n_de.properties +3 -0
  34. package/app/dashboard/i18n/i18n_en.properties +3 -0
  35. package/app/dashboard/index-cdn.html +28 -0
  36. package/app/dashboard/index.html +19 -0
  37. package/app/dashboard/manifest.json +145 -0
  38. package/app/dashboard/model/formatter-dbg.js +253 -0
  39. package/app/dashboard/model/formatter-dbg.js.map +1 -0
  40. package/app/dashboard/model/formatter.js +2 -0
  41. package/app/dashboard/model/formatter.js.map +1 -0
  42. package/app/dashboard/model/formatter.ts +275 -0
  43. package/app/dashboard/model/models-dbg.js +13 -0
  44. package/app/dashboard/model/models-dbg.js.map +1 -0
  45. package/app/dashboard/model/models.js +2 -0
  46. package/app/dashboard/model/models.js.map +1 -0
  47. package/app/dashboard/model/models.ts +13 -0
  48. package/app/dashboard/resources/sap-ui-custom-dbg.js +4695 -0
  49. package/app/dashboard/resources/sap-ui-custom-dbg.js.map +1 -0
  50. package/app/dashboard/resources/sap-ui-custom.js +5794 -0
  51. package/app/dashboard/resources/sap-ui-custom.js.map +1 -0
  52. package/app/dashboard/service/CacheStatisticsService-dbg.js +267 -0
  53. package/app/dashboard/service/CacheStatisticsService-dbg.js.map +1 -0
  54. package/app/dashboard/service/CacheStatisticsService.js +2 -0
  55. package/app/dashboard/service/CacheStatisticsService.js.map +1 -0
  56. package/app/dashboard/service/CacheStatisticsService.ts +397 -0
  57. package/app/dashboard/view/App.view.xml +18 -0
  58. package/app/dashboard/view/Cache.view.xml +777 -0
  59. package/app/dashboard/view/Main.view.xml +57 -0
  60. package/app/dashboard/view/SingleMetric.view.xml +337 -0
  61. package/cds-plugin.js +52 -0
  62. package/db/cache-store.cds +12 -0
  63. package/db/statistics.cds +128 -0
  64. package/index.cds +2 -128
  65. package/lib/CachingService.js +24 -10
  66. package/lib/add.js +17 -0
  67. package/lib/operations/AsyncOperations.js +162 -111
  68. package/lib/operations/BasicOperations.js +42 -4
  69. package/lib/operations/CapOperations.js +92 -40
  70. package/lib/support/CacheStatisticsHandler.js +35 -10
  71. package/lib/support/CacheStoreManager.js +29 -0
  72. package/lib/support/KeyManager.js +40 -2
  73. package/lib/support/KeyvCDS.js +149 -0
  74. package/lib/support/MultitenancyDetector.js +25 -0
  75. package/lib/support/RuntimeConfigurationManager.js +69 -37
  76. package/lib/support/StatisticsPersistenceManager.js +18 -2
  77. package/lib/support/Telemetry.js +137 -0
  78. package/lib/util.js +29 -11
  79. package/package.json +43 -11
  80. package/srv/caching-api-service.js +47 -2
@@ -0,0 +1,306 @@
1
+ sap.ui.define(["./BaseController", "sap/ui/model/json/JSONModel", "sap/m/MessageBox"], function (__BaseController, JSONModel, MessageBox) {
2
+ "use strict";
3
+
4
+ function _interopRequireDefault(obj) {
5
+ return obj && obj.__esModule && typeof obj.default !== "undefined" ? obj.default : obj;
6
+ }
7
+ const BaseController = _interopRequireDefault(__BaseController);
8
+ /**
9
+ * @namespace cds.plugin.caching.dashboard.controller
10
+ */
11
+ const SingleMetric = BaseController.extend("cds.plugin.caching.dashboard.controller.SingleMetric", {
12
+ onInit: function _onInit() {
13
+ BaseController.prototype.onInit.call(this);
14
+
15
+ // Create a JSON model for UI data binding
16
+ this.uiModel = new JSONModel({
17
+ metricId: "",
18
+ // Performance metrics
19
+ hitRatio: 0,
20
+ cacheEfficiency: 0,
21
+ throughput: 0,
22
+ errorRate: 0,
23
+ // Latency metrics
24
+ avgLatency: 0,
25
+ avgHitLatency: 0,
26
+ avgMissLatency: 0,
27
+ // Operation counts
28
+ hits: 0,
29
+ misses: 0,
30
+ sets: 0,
31
+ deletes: 0,
32
+ errors: 0,
33
+ // Native function metrics
34
+ nativeSets: 0,
35
+ nativeGets: 0,
36
+ nativeDeletes: 0,
37
+ nativeClears: 0,
38
+ nativeDeleteByTags: 0,
39
+ nativeErrors: 0,
40
+ totalNativeOperations: 0,
41
+ nativeThroughput: 0,
42
+ nativeErrorRate: 0,
43
+ // System information
44
+ memoryUsage: 0,
45
+ itemCount: 0,
46
+ uniqueKeys: 0,
47
+ uptimeMs: 0,
48
+ // Chart data
49
+ latencyData: [],
50
+ cacheThroughData: [],
51
+ nativeData: []
52
+ });
53
+ this.getView().setModel(this.uiModel, "ui");
54
+ this.getRouter().getRoute("singleMetric").attachPatternMatched(this.onRouteMatched, this);
55
+ },
56
+ onRouteMatched: function _onRouteMatched(event) {
57
+ const {
58
+ cache,
59
+ metricId
60
+ } = event.getParameter("arguments");
61
+ this.uiModel.setProperty("/metricId", metricId);
62
+
63
+ // Set layout to three columns
64
+ this.getModel("app").setProperty("/layout", "ThreeColumnsEndExpanded");
65
+
66
+ // Load the specific metric
67
+ this.loadMetric(cache, metricId);
68
+ this.formatChart();
69
+ },
70
+ /**
71
+ * Load specific metric data
72
+ */
73
+ loadMetric: async function _loadMetric(cacheName, metricId) {
74
+ try {
75
+ const model = this.getModel();
76
+
77
+ // Try to get the metric from the Metrics entity
78
+ const context = model.bindContext(`/Metrics(ID='${metricId}',cache='${cacheName}')`);
79
+ const metric = await context.requestObject();
80
+ if (metric) {
81
+ // Set all the metric values
82
+ this.uiModel.setProperty("/hitRatio", metric.hitRatio || 0);
83
+ this.uiModel.setProperty("/cacheEfficiency", metric.cacheEfficiency || 0);
84
+ this.uiModel.setProperty("/throughput", metric.throughput || 0);
85
+ this.uiModel.setProperty("/errorRate", metric.errorRate || 0);
86
+
87
+ // Latency metrics
88
+ this.uiModel.setProperty("/avgLatency", metric.avgLatency || 0);
89
+ this.uiModel.setProperty("/avgHitLatency", metric.avgHitLatency || 0);
90
+ this.uiModel.setProperty("/avgMissLatency", metric.avgMissLatency || 0);
91
+
92
+ // Operation counts
93
+ this.uiModel.setProperty("/hits", metric.hits || 0);
94
+ this.uiModel.setProperty("/misses", metric.misses || 0);
95
+ this.uiModel.setProperty("/sets", metric.sets || 0);
96
+ this.uiModel.setProperty("/deletes", metric.deletes || 0);
97
+ this.uiModel.setProperty("/errors", metric.errors || 0);
98
+
99
+ // Native function metrics
100
+ this.uiModel.setProperty("/nativeSets", metric.nativeSets || 0);
101
+ this.uiModel.setProperty("/nativeGets", metric.nativeGets || 0);
102
+ this.uiModel.setProperty("/nativeDeletes", metric.nativeDeletes || 0);
103
+ this.uiModel.setProperty("/nativeClears", metric.nativeClears || 0);
104
+ this.uiModel.setProperty("/nativeDeleteByTags", metric.nativeDeleteByTags || 0);
105
+ this.uiModel.setProperty("/nativeErrors", metric.nativeErrors || 0);
106
+ this.uiModel.setProperty("/totalNativeOperations", metric.totalNativeOperations || 0);
107
+ this.uiModel.setProperty("/nativeThroughput", metric.nativeThroughput || 0);
108
+ this.uiModel.setProperty("/nativeErrorRate", metric.nativeErrorRate || 0);
109
+
110
+ // System information
111
+ this.uiModel.setProperty("/memoryUsage", metric.memoryUsage || 0);
112
+ this.uiModel.setProperty("/itemCount", metric.itemCount || 0);
113
+ this.uiModel.setProperty("/uptimeMs", metric.uptimeMs || 0);
114
+
115
+ // Calculate unique keys (this might need to come from a different source)
116
+ this.uiModel.setProperty("/uniqueKeys", 0); // TODO: Get from key metrics data
117
+
118
+ // Generate chart data
119
+ this.generateLatencyChartData(metric);
120
+ this.generateCacheThroughChartData(metric);
121
+ this.generateNativeChartData(metric);
122
+ } else {
123
+ MessageBox.error("Metric not found");
124
+ }
125
+ } catch (error) {
126
+ console.error("Error loading metric:", error);
127
+ MessageBox.error("Failed to load metric details");
128
+ }
129
+ },
130
+ /**
131
+ * Generate latency data for the chart
132
+ */
133
+ generateLatencyChartData: function _generateLatencyChartData(metric) {
134
+ const latencyData = [{
135
+ operation: "Average Hit Latency",
136
+ latency: metric.avgHitLatency || 0
137
+ }, {
138
+ operation: "Average Miss Latency",
139
+ latency: metric.avgMissLatency || 0
140
+ }, {
141
+ operation: "Average Read-Through Latency",
142
+ latency: metric.avgReadThroughLatency || 0
143
+ }];
144
+ this.uiModel.setProperty("/latencyData", latencyData);
145
+ },
146
+ /**
147
+ * Generate Read-Through operations data for pie chart
148
+ */
149
+ generateCacheThroughChartData: function _generateCacheThroughChartData(metric) {
150
+ const cacheThroughData = [{
151
+ operation: "Hits",
152
+ count: metric.hits || 0
153
+ }, {
154
+ operation: "Misses",
155
+ count: metric.misses || 0
156
+ }, {
157
+ operation: "Errors",
158
+ count: metric.errors || 0
159
+ }];
160
+ this.uiModel.setProperty("/cacheThroughData", cacheThroughData);
161
+ },
162
+ /**
163
+ * Generate Native Function operations data for pie chart
164
+ */
165
+ generateNativeChartData: function _generateNativeChartData(metric) {
166
+ const nativeData = [{
167
+ operation: "Sets",
168
+ count: metric.nativeSets || 0
169
+ }, {
170
+ operation: "Gets",
171
+ count: metric.nativeGets || 0
172
+ }, {
173
+ operation: "Deletes",
174
+ count: metric.nativeDeletes || 0
175
+ }, {
176
+ operation: "Clears",
177
+ count: metric.nativeClears || 0
178
+ }, {
179
+ operation: "Delete By Tags",
180
+ count: metric.nativeDeleteByTags || 0
181
+ }, {
182
+ operation: "Errors",
183
+ count: metric.nativeErrors || 0
184
+ }];
185
+ this.uiModel.setProperty("/nativeData", nativeData);
186
+ },
187
+ formatChart: function _formatChart() {
188
+ // Format latency chart (bar chart)
189
+ const latencyChart = this.getView().byId("metricLatencyChart");
190
+ if (latencyChart) {
191
+ latencyChart.setVizProperties({
192
+ legend: {
193
+ visible: false
194
+ },
195
+ plotArea: {
196
+ dataLabel: {
197
+ visible: true,
198
+ formatString: "#,## ms"
199
+ },
200
+ gridline: {
201
+ visible: false
202
+ }
203
+ },
204
+ valueAxis: {
205
+ axisLine: {
206
+ visible: false
207
+ },
208
+ axisTick: {
209
+ visible: false
210
+ },
211
+ label: {
212
+ visible: false
213
+ },
214
+ title: {
215
+ visible: false
216
+ }
217
+ },
218
+ categoryAxis: {
219
+ title: {
220
+ visible: false
221
+ }
222
+ },
223
+ title: {
224
+ visible: false,
225
+ text: 'Latency by Operation'
226
+ }
227
+ });
228
+ }
229
+
230
+ // Format Read-Through pie chart
231
+ const cacheThroughChart = this.getView().byId("metricCacheThroughChart");
232
+ if (cacheThroughChart) {
233
+ cacheThroughChart.setVizProperties({
234
+ legend: {
235
+ visible: true
236
+ },
237
+ plotArea: {
238
+ dataLabel: {
239
+ visible: true
240
+ }
241
+ },
242
+ title: {
243
+ visible: false
244
+ }
245
+ });
246
+ }
247
+
248
+ // Format Native Function pie chart
249
+ const nativeChart = this.getView().byId("metricNativeChart");
250
+ if (nativeChart) {
251
+ nativeChart.setVizProperties({
252
+ legend: {
253
+ visible: true
254
+ },
255
+ plotArea: {
256
+ dataLabel: {
257
+ visible: true
258
+ }
259
+ },
260
+ title: {
261
+ visible: false
262
+ }
263
+ });
264
+ }
265
+ },
266
+ /**
267
+ * Handle refresh button press
268
+ */
269
+ onRefresh: function _onRefresh() {
270
+ const cacheName = this.getModel("app").getProperty("/selectedCache");
271
+ const metricId = this.uiModel.getProperty("/metricId");
272
+ if (cacheName && metricId) {
273
+ this.loadMetric(cacheName, metricId);
274
+ }
275
+ },
276
+ /**
277
+ * Handle full screen mode
278
+ */
279
+ handleFullScreen: function _handleFullScreen() {
280
+ this.getModel("app").setProperty("/layout", "EndColumnFullScreen");
281
+ },
282
+ /**
283
+ * Handle exit full screen mode
284
+ */
285
+ handleExitFullScreen: function _handleExitFullScreen() {
286
+ this.getModel("app").setProperty("/layout", "ThreeColumnsEndExpanded");
287
+ },
288
+ /**
289
+ * Handle close end column
290
+ */
291
+ handleClose: function _handleClose() {
292
+ this.getModel("app").setProperty("/layout", "TwoColumnsMidExpanded");
293
+ this.getRouter().navTo("cache", {
294
+ cache: this.getModel("app").getProperty("/selectedCache")
295
+ });
296
+ },
297
+ /**
298
+ * Handle grid columns change
299
+ */
300
+ onColumnsChange: function _onColumnsChange() {
301
+ // Handle responsive grid column changes if needed
302
+ }
303
+ });
304
+ return SingleMetric;
305
+ });
306
+ //# sourceMappingURL=SingleMetric-dbg.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SingleMetric-dbg.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","SingleMetric","extend","onInit","_onInit","BaseController.prototype.onInit.call","uiModel","JSONModel","metricId","hitRatio","cacheEfficiency","throughput","errorRate","avgLatency","avgHitLatency","avgMissLatency","hits","misses","sets","deletes","errors","nativeSets","nativeGets","nativeDeletes","nativeClears","nativeDeleteByTags","nativeErrors","totalNativeOperations","nativeThroughput","nativeErrorRate","memoryUsage","itemCount","uniqueKeys","uptimeMs","latencyData","cacheThroughData","nativeData","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","setProperty","getModel","loadMetric","formatChart","_loadMetric","cacheName","model","context","bindContext","metric","requestObject","generateLatencyChartData","generateCacheThroughChartData","generateNativeChartData","MessageBox","error","console","_generateLatencyChartData","operation","latency","avgReadThroughLatency","_generateCacheThroughChartData","count","_generateNativeChartData","_formatChart","latencyChart","byId","setVizProperties","legend","visible","plotArea","dataLabel","formatString","gridline","valueAxis","axisLine","axisTick","label","title","categoryAxis","text","cacheThroughChart","nativeChart","onRefresh","_onRefresh","getProperty","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","handleClose","_handleClose","navTo","onColumnsChange","_onColumnsChange"],"sources":["SingleMetric.controller.ts"],"sourcesContent":["import BaseController from \"./BaseController\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport MessageBox from \"sap/m/MessageBox\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class SingleMetric extends BaseController {\n private uiModel: JSONModel;\n\n public onInit(): void {\n super.onInit();\n\n // Create a JSON model for UI data binding\n this.uiModel = new JSONModel({\n metricId: \"\",\n // Performance metrics\n hitRatio: 0,\n cacheEfficiency: 0,\n throughput: 0,\n errorRate: 0,\n // Latency metrics\n avgLatency: 0,\n avgHitLatency: 0,\n avgMissLatency: 0,\n // Operation counts\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n errors: 0,\n // Native function metrics\n nativeSets: 0,\n nativeGets: 0,\n nativeDeletes: 0,\n nativeClears: 0,\n nativeDeleteByTags: 0,\n nativeErrors: 0,\n totalNativeOperations: 0,\n nativeThroughput: 0,\n nativeErrorRate: 0,\n // System information\n memoryUsage: 0,\n itemCount: 0,\n uniqueKeys: 0,\n uptimeMs: 0,\n // Chart data\n latencyData: [],\n cacheThroughData: [],\n nativeData: []\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n this.getRouter().getRoute(\"singleMetric\").attachPatternMatched(this.onRouteMatched, this);\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache, metricId } = event.getParameter(\"arguments\") as { cache: string; metricId: string };\n\n this.uiModel.setProperty(\"/metricId\", metricId);\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n\n // Load the specific metric\n this.loadMetric(cache, metricId);\n\n this.formatChart();\n }\n\n /**\n * Load specific metric data\n */\n private async loadMetric(cacheName: string, metricId: string): Promise<void> {\n try {\n const model = this.getModel() as ODataModel;\n\n // Try to get the metric from the Metrics entity\n const context = model.bindContext(`/Metrics(ID='${metricId}',cache='${cacheName}')`);\n const metric = await context.requestObject();\n\n if (metric) {\n // Set all the metric values\n this.uiModel.setProperty(\"/hitRatio\", metric.hitRatio || 0);\n this.uiModel.setProperty(\"/cacheEfficiency\", metric.cacheEfficiency || 0);\n this.uiModel.setProperty(\"/throughput\", metric.throughput || 0);\n this.uiModel.setProperty(\"/errorRate\", metric.errorRate || 0);\n\n // Latency metrics\n this.uiModel.setProperty(\"/avgLatency\", metric.avgLatency || 0);\n this.uiModel.setProperty(\"/avgHitLatency\", metric.avgHitLatency || 0);\n this.uiModel.setProperty(\"/avgMissLatency\", metric.avgMissLatency || 0);\n\n // Operation counts\n this.uiModel.setProperty(\"/hits\", metric.hits || 0);\n this.uiModel.setProperty(\"/misses\", metric.misses || 0);\n this.uiModel.setProperty(\"/sets\", metric.sets || 0);\n this.uiModel.setProperty(\"/deletes\", metric.deletes || 0);\n this.uiModel.setProperty(\"/errors\", metric.errors || 0);\n\n // Native function metrics\n this.uiModel.setProperty(\"/nativeSets\", metric.nativeSets || 0);\n this.uiModel.setProperty(\"/nativeGets\", metric.nativeGets || 0);\n this.uiModel.setProperty(\"/nativeDeletes\", metric.nativeDeletes || 0);\n this.uiModel.setProperty(\"/nativeClears\", metric.nativeClears || 0);\n this.uiModel.setProperty(\"/nativeDeleteByTags\", metric.nativeDeleteByTags || 0);\n this.uiModel.setProperty(\"/nativeErrors\", metric.nativeErrors || 0);\n this.uiModel.setProperty(\"/totalNativeOperations\", metric.totalNativeOperations || 0);\n this.uiModel.setProperty(\"/nativeThroughput\", metric.nativeThroughput || 0);\n this.uiModel.setProperty(\"/nativeErrorRate\", metric.nativeErrorRate || 0);\n\n // System information\n this.uiModel.setProperty(\"/memoryUsage\", metric.memoryUsage || 0);\n this.uiModel.setProperty(\"/itemCount\", metric.itemCount || 0);\n this.uiModel.setProperty(\"/uptimeMs\", metric.uptimeMs || 0);\n\n // Calculate unique keys (this might need to come from a different source)\n this.uiModel.setProperty(\"/uniqueKeys\", 0); // TODO: Get from key metrics data\n\n // Generate chart data\n this.generateLatencyChartData(metric);\n this.generateCacheThroughChartData(metric);\n this.generateNativeChartData(metric);\n\n } else {\n MessageBox.error(\"Metric not found\");\n }\n\n } catch (error) {\n console.error(\"Error loading metric:\", error);\n MessageBox.error(\"Failed to load metric details\");\n }\n }\n\n /**\n * Generate latency data for the chart\n */\n private generateLatencyChartData(metric: any): void {\n const latencyData = [\n {\n operation: \"Average Hit Latency\",\n latency: metric.avgHitLatency || 0\n },\n {\n operation: \"Average Miss Latency\",\n latency: metric.avgMissLatency || 0\n },\n {\n operation: \"Average Read-Through Latency\",\n latency: metric.avgReadThroughLatency || 0\n }\n ];\n\n this.uiModel.setProperty(\"/latencyData\", latencyData);\n }\n\n /**\n * Generate Read-Through operations data for pie chart\n */\n private generateCacheThroughChartData(metric: any): void {\n const cacheThroughData = [\n {\n operation: \"Hits\",\n count: metric.hits || 0\n },\n {\n operation: \"Misses\",\n count: metric.misses || 0\n },\n {\n operation: \"Errors\",\n count: metric.errors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/cacheThroughData\", cacheThroughData);\n }\n\n /**\n * Generate Native Function operations data for pie chart\n */\n private generateNativeChartData(metric: any): void {\n const nativeData = [\n {\n operation: \"Sets\",\n count: metric.nativeSets || 0\n },\n {\n operation: \"Gets\",\n count: metric.nativeGets || 0\n },\n {\n operation: \"Deletes\",\n count: metric.nativeDeletes || 0\n },\n {\n operation: \"Clears\",\n count: metric.nativeClears || 0\n },\n {\n operation: \"Delete By Tags\",\n count: metric.nativeDeleteByTags || 0\n },\n {\n operation: \"Errors\",\n count: metric.nativeErrors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/nativeData\", nativeData);\n }\n\n public formatChart() {\n // Format latency chart (bar chart)\n const latencyChart = this.getView().byId(\"metricLatencyChart\") as any;\n if (latencyChart) {\n latencyChart.setVizProperties({\n legend: {\n visible: false\n },\n plotArea: {\n dataLabel: {\n visible: true,\n formatString: \"#,## ms\"\n },\n gridline: {\n visible: false\n }\n },\n valueAxis: {\n axisLine: {\n visible: false\n },\n axisTick: {\n visible: false\n },\n label: {\n visible: false\n },\n title: {\n visible: false\n }\n },\n categoryAxis: {\n title: {\n visible: false\n }\n },\n title: {\n visible: false,\n text: 'Latency by Operation'\n }\n });\n }\n\n // Format Read-Through pie chart\n const cacheThroughChart = this.getView().byId(\"metricCacheThroughChart\") as any;\n if (cacheThroughChart) {\n cacheThroughChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n\n // Format Native Function pie chart\n const nativeChart = this.getView().byId(\"metricNativeChart\") as any;\n if (nativeChart) {\n nativeChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n }\n\n /**\n * Handle refresh button press\n */\n public onRefresh(): void {\n const cacheName = this.getModel(\"app\").getProperty(\"/selectedCache\");\n const metricId = this.uiModel.getProperty(\"/metricId\");\n\n if (cacheName && metricId) {\n this.loadMetric(cacheName, metricId);\n }\n }\n\n /**\n * Handle full screen mode\n */\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"EndColumnFullScreen\");\n }\n\n /**\n * Handle exit full screen mode\n */\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n\n /**\n * Handle close end column\n */\n public handleClose(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n this.getRouter().navTo(\"cache\", { cache: this.getModel(\"app\").getProperty(\"/selectedCache\") });\n }\n\n /**\n * Handle grid columns change\n */\n public onColumnsChange(): void {\n // Handle responsive grid column changes if needed\n }\n} "],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ sap.ui.define(["./BaseController","sap/ui/model/json/JSONModel","sap/m/MessageBox"],function(e,t,i){"use strict";function a(e){return e&&e.__esModule&&typeof e.default!=="undefined"?e.default:e}const s=a(e);const r=s.extend("cds.plugin.caching.dashboard.controller.SingleMetric",{onInit:function e(){s.prototype.onInit.call(this);this.uiModel=new t({metricId:"",hitRatio:0,cacheEfficiency:0,throughput:0,errorRate:0,avgLatency:0,avgHitLatency:0,avgMissLatency:0,hits:0,misses:0,sets:0,deletes:0,errors:0,nativeSets:0,nativeGets:0,nativeDeletes:0,nativeClears:0,nativeDeleteByTags:0,nativeErrors:0,totalNativeOperations:0,nativeThroughput:0,nativeErrorRate:0,memoryUsage:0,itemCount:0,uniqueKeys:0,uptimeMs:0,latencyData:[],cacheThroughData:[],nativeData:[]});this.getView().setModel(this.uiModel,"ui");this.getRouter().getRoute("singleMetric").attachPatternMatched(this.onRouteMatched,this)},onRouteMatched:function e(t){const{cache:i,metricId:a}=t.getParameter("arguments");this.uiModel.setProperty("/metricId",a);this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded");this.loadMetric(i,a);this.formatChart()},loadMetric:async function e(t,a){try{const e=this.getModel();const s=e.bindContext(`/Metrics(ID='${a}',cache='${t}')`);const r=await s.requestObject();if(r){this.uiModel.setProperty("/hitRatio",r.hitRatio||0);this.uiModel.setProperty("/cacheEfficiency",r.cacheEfficiency||0);this.uiModel.setProperty("/throughput",r.throughput||0);this.uiModel.setProperty("/errorRate",r.errorRate||0);this.uiModel.setProperty("/avgLatency",r.avgLatency||0);this.uiModel.setProperty("/avgHitLatency",r.avgHitLatency||0);this.uiModel.setProperty("/avgMissLatency",r.avgMissLatency||0);this.uiModel.setProperty("/hits",r.hits||0);this.uiModel.setProperty("/misses",r.misses||0);this.uiModel.setProperty("/sets",r.sets||0);this.uiModel.setProperty("/deletes",r.deletes||0);this.uiModel.setProperty("/errors",r.errors||0);this.uiModel.setProperty("/nativeSets",r.nativeSets||0);this.uiModel.setProperty("/nativeGets",r.nativeGets||0);this.uiModel.setProperty("/nativeDeletes",r.nativeDeletes||0);this.uiModel.setProperty("/nativeClears",r.nativeClears||0);this.uiModel.setProperty("/nativeDeleteByTags",r.nativeDeleteByTags||0);this.uiModel.setProperty("/nativeErrors",r.nativeErrors||0);this.uiModel.setProperty("/totalNativeOperations",r.totalNativeOperations||0);this.uiModel.setProperty("/nativeThroughput",r.nativeThroughput||0);this.uiModel.setProperty("/nativeErrorRate",r.nativeErrorRate||0);this.uiModel.setProperty("/memoryUsage",r.memoryUsage||0);this.uiModel.setProperty("/itemCount",r.itemCount||0);this.uiModel.setProperty("/uptimeMs",r.uptimeMs||0);this.uiModel.setProperty("/uniqueKeys",0);this.generateLatencyChartData(r);this.generateCacheThroughChartData(r);this.generateNativeChartData(r)}else{i.error("Metric not found")}}catch(e){console.error("Error loading metric:",e);i.error("Failed to load metric details")}},generateLatencyChartData:function e(t){const i=[{operation:"Average Hit Latency",latency:t.avgHitLatency||0},{operation:"Average Miss Latency",latency:t.avgMissLatency||0},{operation:"Average Read-Through Latency",latency:t.avgReadThroughLatency||0}];this.uiModel.setProperty("/latencyData",i)},generateCacheThroughChartData:function e(t){const i=[{operation:"Hits",count:t.hits||0},{operation:"Misses",count:t.misses||0},{operation:"Errors",count:t.errors||0}];this.uiModel.setProperty("/cacheThroughData",i)},generateNativeChartData:function e(t){const i=[{operation:"Sets",count:t.nativeSets||0},{operation:"Gets",count:t.nativeGets||0},{operation:"Deletes",count:t.nativeDeletes||0},{operation:"Clears",count:t.nativeClears||0},{operation:"Delete By Tags",count:t.nativeDeleteByTags||0},{operation:"Errors",count:t.nativeErrors||0}];this.uiModel.setProperty("/nativeData",i)},formatChart:function e(){const t=this.getView().byId("metricLatencyChart");if(t){t.setVizProperties({legend:{visible:false},plotArea:{dataLabel:{visible:true,formatString:"#,## ms"},gridline:{visible:false}},valueAxis:{axisLine:{visible:false},axisTick:{visible:false},label:{visible:false},title:{visible:false}},categoryAxis:{title:{visible:false}},title:{visible:false,text:"Latency by Operation"}})}const i=this.getView().byId("metricCacheThroughChart");if(i){i.setVizProperties({legend:{visible:true},plotArea:{dataLabel:{visible:true}},title:{visible:false}})}const a=this.getView().byId("metricNativeChart");if(a){a.setVizProperties({legend:{visible:true},plotArea:{dataLabel:{visible:true}},title:{visible:false}})}},onRefresh:function e(){const t=this.getModel("app").getProperty("/selectedCache");const i=this.uiModel.getProperty("/metricId");if(t&&i){this.loadMetric(t,i)}},handleFullScreen:function e(){this.getModel("app").setProperty("/layout","EndColumnFullScreen")},handleExitFullScreen:function e(){this.getModel("app").setProperty("/layout","ThreeColumnsEndExpanded")},handleClose:function e(){this.getModel("app").setProperty("/layout","TwoColumnsMidExpanded");this.getRouter().navTo("cache",{cache:this.getModel("app").getProperty("/selectedCache")})},onColumnsChange:function e(){}});return r});
2
+ //# sourceMappingURL=SingleMetric.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SingleMetric.controller.js","names":["BaseController","_interopRequireDefault","__BaseController","SingleMetric","extend","onInit","_onInit","BaseController.prototype.onInit.call","this","uiModel","JSONModel","metricId","hitRatio","cacheEfficiency","throughput","errorRate","avgLatency","avgHitLatency","avgMissLatency","hits","misses","sets","deletes","errors","nativeSets","nativeGets","nativeDeletes","nativeClears","nativeDeleteByTags","nativeErrors","totalNativeOperations","nativeThroughput","nativeErrorRate","memoryUsage","itemCount","uniqueKeys","uptimeMs","latencyData","cacheThroughData","nativeData","getView","setModel","getRouter","getRoute","attachPatternMatched","onRouteMatched","_onRouteMatched","event","cache","getParameter","setProperty","getModel","loadMetric","formatChart","async","_loadMetric","cacheName","model","context","bindContext","metric","requestObject","generateLatencyChartData","generateCacheThroughChartData","generateNativeChartData","MessageBox","error","console","_generateLatencyChartData","operation","latency","avgReadThroughLatency","_generateCacheThroughChartData","count","_generateNativeChartData","_formatChart","latencyChart","byId","setVizProperties","legend","visible","plotArea","dataLabel","formatString","gridline","valueAxis","axisLine","axisTick","label","title","categoryAxis","text","cacheThroughChart","nativeChart","onRefresh","_onRefresh","getProperty","handleFullScreen","_handleFullScreen","handleExitFullScreen","_handleExitFullScreen","handleClose","_handleClose","navTo","onColumnsChange","_onColumnsChange"],"sources":["SingleMetric.controller.ts"],"sourcesContent":["import BaseController from \"./BaseController\";\nimport JSONModel from \"sap/ui/model/json/JSONModel\";\nimport ODataModel from \"sap/ui/model/odata/v4/ODataModel\";\nimport { Route$PatternMatchedEvent } from \"sap/ui/core/routing/Route\";\nimport MessageBox from \"sap/m/MessageBox\";\n\n/**\n * @namespace cds.plugin.caching.dashboard.controller\n */\nexport default class SingleMetric extends BaseController {\n private uiModel: JSONModel;\n\n public onInit(): void {\n super.onInit();\n\n // Create a JSON model for UI data binding\n this.uiModel = new JSONModel({\n metricId: \"\",\n // Performance metrics\n hitRatio: 0,\n cacheEfficiency: 0,\n throughput: 0,\n errorRate: 0,\n // Latency metrics\n avgLatency: 0,\n avgHitLatency: 0,\n avgMissLatency: 0,\n // Operation counts\n hits: 0,\n misses: 0,\n sets: 0,\n deletes: 0,\n errors: 0,\n // Native function metrics\n nativeSets: 0,\n nativeGets: 0,\n nativeDeletes: 0,\n nativeClears: 0,\n nativeDeleteByTags: 0,\n nativeErrors: 0,\n totalNativeOperations: 0,\n nativeThroughput: 0,\n nativeErrorRate: 0,\n // System information\n memoryUsage: 0,\n itemCount: 0,\n uniqueKeys: 0,\n uptimeMs: 0,\n // Chart data\n latencyData: [],\n cacheThroughData: [],\n nativeData: []\n });\n this.getView().setModel(this.uiModel, \"ui\");\n\n this.getRouter().getRoute(\"singleMetric\").attachPatternMatched(this.onRouteMatched, this);\n }\n\n public onRouteMatched(event: Route$PatternMatchedEvent): void {\n const { cache, metricId } = event.getParameter(\"arguments\") as { cache: string; metricId: string };\n\n this.uiModel.setProperty(\"/metricId\", metricId);\n\n // Set layout to three columns\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n\n // Load the specific metric\n this.loadMetric(cache, metricId);\n\n this.formatChart();\n }\n\n /**\n * Load specific metric data\n */\n private async loadMetric(cacheName: string, metricId: string): Promise<void> {\n try {\n const model = this.getModel() as ODataModel;\n\n // Try to get the metric from the Metrics entity\n const context = model.bindContext(`/Metrics(ID='${metricId}',cache='${cacheName}')`);\n const metric = await context.requestObject();\n\n if (metric) {\n // Set all the metric values\n this.uiModel.setProperty(\"/hitRatio\", metric.hitRatio || 0);\n this.uiModel.setProperty(\"/cacheEfficiency\", metric.cacheEfficiency || 0);\n this.uiModel.setProperty(\"/throughput\", metric.throughput || 0);\n this.uiModel.setProperty(\"/errorRate\", metric.errorRate || 0);\n\n // Latency metrics\n this.uiModel.setProperty(\"/avgLatency\", metric.avgLatency || 0);\n this.uiModel.setProperty(\"/avgHitLatency\", metric.avgHitLatency || 0);\n this.uiModel.setProperty(\"/avgMissLatency\", metric.avgMissLatency || 0);\n\n // Operation counts\n this.uiModel.setProperty(\"/hits\", metric.hits || 0);\n this.uiModel.setProperty(\"/misses\", metric.misses || 0);\n this.uiModel.setProperty(\"/sets\", metric.sets || 0);\n this.uiModel.setProperty(\"/deletes\", metric.deletes || 0);\n this.uiModel.setProperty(\"/errors\", metric.errors || 0);\n\n // Native function metrics\n this.uiModel.setProperty(\"/nativeSets\", metric.nativeSets || 0);\n this.uiModel.setProperty(\"/nativeGets\", metric.nativeGets || 0);\n this.uiModel.setProperty(\"/nativeDeletes\", metric.nativeDeletes || 0);\n this.uiModel.setProperty(\"/nativeClears\", metric.nativeClears || 0);\n this.uiModel.setProperty(\"/nativeDeleteByTags\", metric.nativeDeleteByTags || 0);\n this.uiModel.setProperty(\"/nativeErrors\", metric.nativeErrors || 0);\n this.uiModel.setProperty(\"/totalNativeOperations\", metric.totalNativeOperations || 0);\n this.uiModel.setProperty(\"/nativeThroughput\", metric.nativeThroughput || 0);\n this.uiModel.setProperty(\"/nativeErrorRate\", metric.nativeErrorRate || 0);\n\n // System information\n this.uiModel.setProperty(\"/memoryUsage\", metric.memoryUsage || 0);\n this.uiModel.setProperty(\"/itemCount\", metric.itemCount || 0);\n this.uiModel.setProperty(\"/uptimeMs\", metric.uptimeMs || 0);\n\n // Calculate unique keys (this might need to come from a different source)\n this.uiModel.setProperty(\"/uniqueKeys\", 0); // TODO: Get from key metrics data\n\n // Generate chart data\n this.generateLatencyChartData(metric);\n this.generateCacheThroughChartData(metric);\n this.generateNativeChartData(metric);\n\n } else {\n MessageBox.error(\"Metric not found\");\n }\n\n } catch (error) {\n console.error(\"Error loading metric:\", error);\n MessageBox.error(\"Failed to load metric details\");\n }\n }\n\n /**\n * Generate latency data for the chart\n */\n private generateLatencyChartData(metric: any): void {\n const latencyData = [\n {\n operation: \"Average Hit Latency\",\n latency: metric.avgHitLatency || 0\n },\n {\n operation: \"Average Miss Latency\",\n latency: metric.avgMissLatency || 0\n },\n {\n operation: \"Average Read-Through Latency\",\n latency: metric.avgReadThroughLatency || 0\n }\n ];\n\n this.uiModel.setProperty(\"/latencyData\", latencyData);\n }\n\n /**\n * Generate Read-Through operations data for pie chart\n */\n private generateCacheThroughChartData(metric: any): void {\n const cacheThroughData = [\n {\n operation: \"Hits\",\n count: metric.hits || 0\n },\n {\n operation: \"Misses\",\n count: metric.misses || 0\n },\n {\n operation: \"Errors\",\n count: metric.errors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/cacheThroughData\", cacheThroughData);\n }\n\n /**\n * Generate Native Function operations data for pie chart\n */\n private generateNativeChartData(metric: any): void {\n const nativeData = [\n {\n operation: \"Sets\",\n count: metric.nativeSets || 0\n },\n {\n operation: \"Gets\",\n count: metric.nativeGets || 0\n },\n {\n operation: \"Deletes\",\n count: metric.nativeDeletes || 0\n },\n {\n operation: \"Clears\",\n count: metric.nativeClears || 0\n },\n {\n operation: \"Delete By Tags\",\n count: metric.nativeDeleteByTags || 0\n },\n {\n operation: \"Errors\",\n count: metric.nativeErrors || 0\n }\n ];\n\n this.uiModel.setProperty(\"/nativeData\", nativeData);\n }\n\n public formatChart() {\n // Format latency chart (bar chart)\n const latencyChart = this.getView().byId(\"metricLatencyChart\") as any;\n if (latencyChart) {\n latencyChart.setVizProperties({\n legend: {\n visible: false\n },\n plotArea: {\n dataLabel: {\n visible: true,\n formatString: \"#,## ms\"\n },\n gridline: {\n visible: false\n }\n },\n valueAxis: {\n axisLine: {\n visible: false\n },\n axisTick: {\n visible: false\n },\n label: {\n visible: false\n },\n title: {\n visible: false\n }\n },\n categoryAxis: {\n title: {\n visible: false\n }\n },\n title: {\n visible: false,\n text: 'Latency by Operation'\n }\n });\n }\n\n // Format Read-Through pie chart\n const cacheThroughChart = this.getView().byId(\"metricCacheThroughChart\") as any;\n if (cacheThroughChart) {\n cacheThroughChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n\n // Format Native Function pie chart\n const nativeChart = this.getView().byId(\"metricNativeChart\") as any;\n if (nativeChart) {\n nativeChart.setVizProperties({\n legend: {\n visible: true\n },\n plotArea: {\n dataLabel: {\n visible: true\n }\n },\n title: {\n visible: false\n }\n });\n }\n }\n\n /**\n * Handle refresh button press\n */\n public onRefresh(): void {\n const cacheName = this.getModel(\"app\").getProperty(\"/selectedCache\");\n const metricId = this.uiModel.getProperty(\"/metricId\");\n\n if (cacheName && metricId) {\n this.loadMetric(cacheName, metricId);\n }\n }\n\n /**\n * Handle full screen mode\n */\n public handleFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"EndColumnFullScreen\");\n }\n\n /**\n * Handle exit full screen mode\n */\n public handleExitFullScreen(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"ThreeColumnsEndExpanded\");\n }\n\n /**\n * Handle close end column\n */\n public handleClose(): void {\n (<JSONModel>this.getModel(\"app\")).setProperty(\"/layout\", \"TwoColumnsMidExpanded\");\n this.getRouter().navTo(\"cache\", { cache: this.getModel(\"app\").getProperty(\"/selectedCache\") });\n }\n\n /**\n * Handle grid columns change\n */\n public onColumnsChange(): void {\n // Handle responsive grid column changes if needed\n }\n} "],"mappings":"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","ignoreList":[]}