1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.web.api.admin.stats;
17
18 import java.io.File;
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Locale;
23
24 import org.codelibs.fess.app.web.api.ApiResult;
25 import org.codelibs.fess.app.web.api.ApiResult.ApiStatsResponse;
26 import org.codelibs.fess.app.web.api.admin.FessApiAdminAction;
27 import org.codelibs.fess.opensearch.client.SearchEngineClient;
28 import org.codelibs.fess.util.ComponentUtil;
29 import org.lastaflute.web.Execute;
30 import org.lastaflute.web.response.JsonResponse;
31 import org.opensearch.action.admin.cluster.health.ClusterHealthResponse;
32 import org.opensearch.monitor.jvm.JvmStats;
33 import org.opensearch.monitor.jvm.JvmStats.BufferPool;
34 import org.opensearch.monitor.jvm.JvmStats.Classes;
35 import org.opensearch.monitor.jvm.JvmStats.GarbageCollectors;
36 import org.opensearch.monitor.jvm.JvmStats.Mem;
37 import org.opensearch.monitor.jvm.JvmStats.Threads;
38 import org.opensearch.monitor.os.OsProbe;
39 import org.opensearch.monitor.os.OsStats;
40 import org.opensearch.monitor.process.ProcessProbe;
41
42
43
44
45
46 public class ApiAdminStatsAction extends FessApiAdminAction {
47
48
49
50
51
52
53
54
55 public ApiAdminStatsAction() {
56 super();
57 }
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 @Execute
74 public JsonResponse<ApiResult> index() {
75 final HashMap<String, Object> stats = new HashMap<>();
76 stats.put("jvm", getJvmObj());
77 stats.put("os", getOsObj());
78 stats.put("process", getProcessObj());
79 stats.put("engine", getEngineObj());
80 stats.put("fs", getFsObj());
81 return asJson(new ApiStatsResponse().stats(stats).status(ApiResult.Status.OK).result());
82 }
83
84 private FsObj[] getFsObj() {
85 return Arrays.stream(File.listRoots()).map(f -> {
86 final FsObj fsObj = new FsObj();
87 fsObj.path = f.getAbsolutePath();
88 fsObj.free = f.getFreeSpace();
89 fsObj.total = f.getTotalSpace();
90 fsObj.usable = f.getUsableSpace();
91 fsObj.used = fsObj.total - fsObj.usable;
92 fsObj.percent = (short) (100 * fsObj.used / fsObj.total);
93 return fsObj;
94 }).toArray(n -> new FsObj[n]);
95 }
96
97 private JvmObj getJvmObj() {
98 final JvmObj jvmObj = new JvmObj();
99 final JvmStats jvmStats = JvmStats.jvmStats();
100 final Mem mem = jvmStats.getMem();
101 final JvmMemoryObj jvmMemoryObj = new JvmMemoryObj();
102 jvmObj.memory = jvmMemoryObj;
103 final JvmMemoryHeapObj jvmMemoryHeapObj = new JvmMemoryHeapObj();
104 jvmMemoryObj.heap = jvmMemoryHeapObj;
105 jvmMemoryHeapObj.used = mem.getHeapUsed().getBytes();
106 jvmMemoryHeapObj.committed = mem.getHeapCommitted().getBytes();
107 jvmMemoryHeapObj.max = mem.getHeapMax().getBytes();
108 jvmMemoryHeapObj.percent = mem.getHeapUsedPercent();
109 final JvmMemoryNonHeapObj jvmMemoryNonHeapObj = new JvmMemoryNonHeapObj();
110 jvmMemoryObj.nonHeap = jvmMemoryNonHeapObj;
111 jvmMemoryNonHeapObj.used = mem.getNonHeapUsed().getBytes();
112 jvmMemoryNonHeapObj.committed = mem.getNonHeapCommitted().getBytes();
113 final List<BufferPool> bufferPools = jvmStats.getBufferPools();
114 jvmObj.pools = bufferPools.stream().map(p -> {
115 final JvmPoolObj jvmPoolObj = new JvmPoolObj();
116 jvmPoolObj.key = p.getName();
117 jvmPoolObj.count = p.getCount();
118 jvmPoolObj.used = p.getUsed().getBytes();
119 jvmPoolObj.capacity = p.getTotalCapacity().getBytes();
120 return jvmPoolObj;
121 }).toArray(n -> new JvmPoolObj[n]);
122 final GarbageCollectors gc = jvmStats.getGc();
123 jvmObj.gc = Arrays.stream(gc.getCollectors()).map(c -> {
124 final JvmGcObj jvmGcObj = new JvmGcObj();
125 jvmGcObj.key = c.getName();
126 jvmGcObj.count = c.getCollectionCount();
127 jvmGcObj.time = c.getCollectionTime().getMillis();
128 return jvmGcObj;
129 }).toArray(n -> new JvmGcObj[n]);
130 final Threads threads = jvmStats.getThreads();
131 final JvmThreadsObj jvmThreadsObj = new JvmThreadsObj();
132 jvmObj.threads = jvmThreadsObj;
133 jvmThreadsObj.count = threads.getCount();
134 jvmThreadsObj.peak = threads.getPeakCount();
135 final Classes classes = jvmStats.getClasses();
136 final JvmClassesObj jvmClassesObj = new JvmClassesObj();
137 jvmObj.classes = jvmClassesObj;
138 jvmClassesObj.loaded = classes.getLoadedClassCount();
139 jvmClassesObj.total_loaded = classes.getTotalLoadedClassCount();
140 jvmClassesObj.unloaded = classes.getUnloadedClassCount();
141 jvmObj.uptime = jvmStats.getUptime().getMillis();
142 return jvmObj;
143 }
144
145 private ProcessObj getProcessObj() {
146 final ProcessObj processObj = new ProcessObj();
147 final ProcessProbe processProbe = ProcessProbe.getInstance();
148 final ProcessFileDescriptorObj processFileDescriptorObj = new ProcessFileDescriptorObj();
149 processObj.fileFescriptor = processFileDescriptorObj;
150 processFileDescriptorObj.open = processProbe.getOpenFileDescriptorCount();
151 processFileDescriptorObj.max = processProbe.getMaxFileDescriptorCount();
152 final ProcessCpuObj processCpuObj = new ProcessCpuObj();
153 processObj.cpu = processCpuObj;
154 processCpuObj.percent = processProbe.getProcessCpuPercent();
155 processCpuObj.total = processProbe.getProcessCpuTotalTime();
156 final ProcessVirtualMemoryObj processVirtualMemoryObj = new ProcessVirtualMemoryObj();
157 processObj.virtualMemory = processVirtualMemoryObj;
158 processVirtualMemoryObj.total = processProbe.getTotalVirtualMemorySize();
159 return processObj;
160 }
161
162 private OsObj getOsObj() {
163 final OsObj osObj = new OsObj();
164 final OsProbe osProbe = OsProbe.getInstance();
165 final OsMemoryObj osMemoryObj = new OsMemoryObj();
166 osObj.memory = osMemoryObj;
167 final OsMemoryPhysicalObj osMemoryPhysicalObj = new OsMemoryPhysicalObj();
168 osMemoryObj.physical = osMemoryPhysicalObj;
169 osMemoryPhysicalObj.free = osProbe.getFreePhysicalMemorySize();
170 osMemoryPhysicalObj.total = osProbe.getTotalPhysicalMemorySize();
171 final OsMemorySwapSpaceObj osMemorySwapSpaceObj = new OsMemorySwapSpaceObj();
172 osMemoryObj.swapSpace = osMemorySwapSpaceObj;
173 osMemorySwapSpaceObj.free = osProbe.getFreeSwapSpaceSize();
174 osMemorySwapSpaceObj.total = osProbe.getTotalSwapSpaceSize();
175 final OsCpuObj osCpuObj = new OsCpuObj();
176 osObj.cpu = osCpuObj;
177 osCpuObj.percent = osProbe.getSystemCpuPercent();
178 final OsStats osStats = osProbe.osStats();
179 osObj.loadAverages = osStats.getCpu().getLoadAverage();
180 return osObj;
181 }
182
183 private EngineObj getEngineObj() {
184 final EngineObj engineObj = new EngineObj();
185 try {
186 final SearchEngineClient esClient = ComponentUtil.getSearchEngineClient();
187 final ClusterHealthResponse response =
188 esClient.admin().cluster().prepareHealth().execute().actionGet(fessConfig.getIndexHealthTimeout());
189 engineObj.clusterName = response.getClusterName();
190 engineObj.numberOfNodes = response.getNumberOfNodes();
191 engineObj.numberOfDataNodes = response.getNumberOfDataNodes();
192 engineObj.activePrimaryShards = response.getActivePrimaryShards();
193 engineObj.activeShards = response.getActiveShards();
194 engineObj.activeShardsPercent = response.getActiveShardsPercent();
195 engineObj.relocatingShards = response.getRelocatingShards();
196 engineObj.initializingShards = response.getInitializingShards();
197 engineObj.unassignedShards = response.getUnassignedShards();
198 engineObj.delayedUnassignedShards = response.getDelayedUnassignedShards();
199 engineObj.numberOfPendingTasks = response.getNumberOfPendingTasks();
200 engineObj.numberOfInFlightFetch = response.getNumberOfInFlightFetch();
201 engineObj.status = response.getStatus().name().toLowerCase(Locale.ROOT);
202 } catch (final Exception e) {
203 engineObj.status = "red";
204 engineObj.exception = e.getMessage();
205 }
206 return engineObj;
207 }
208
209
210
211
212 public static class FsObj {
213
214
215
216 public FsObj() {
217
218 }
219
220
221 public short percent;
222
223 public long used;
224
225 public String path;
226
227 public long free;
228
229 public long total;
230
231 public long usable;
232 }
233
234
235
236
237 public static class EngineObj {
238
239
240
241 public EngineObj() {
242
243 }
244
245
246 public String exception;
247
248 public String status;
249
250 public int numberOfInFlightFetch;
251
252 public int numberOfPendingTasks;
253
254 public int delayedUnassignedShards;
255
256 public int unassignedShards;
257
258 public int initializingShards;
259
260 public int relocatingShards;
261
262 public double activeShardsPercent;
263
264 public int activeShards;
265
266 public int activePrimaryShards;
267
268 public int numberOfDataNodes;
269
270 public int numberOfNodes;
271
272 public String clusterName;
273 }
274
275
276
277
278 public static class JvmObj {
279
280
281
282 public JvmObj() {
283
284 }
285
286
287 public JvmMemoryObj memory;
288
289 public JvmPoolObj[] pools;
290
291 public JvmGcObj[] gc;
292
293 public JvmThreadsObj threads;
294
295 public JvmClassesObj classes;
296
297 public long uptime;
298 }
299
300
301
302
303 public static class JvmMemoryObj {
304
305
306
307 public JvmMemoryObj() {
308
309 }
310
311
312 public JvmMemoryHeapObj heap;
313
314 public JvmMemoryNonHeapObj nonHeap;
315 }
316
317
318
319
320 public static class JvmMemoryHeapObj {
321
322
323
324 public JvmMemoryHeapObj() {
325
326 }
327
328
329 public long used;
330
331 public long committed;
332
333 public long max;
334
335 public short percent;
336 }
337
338
339
340
341 public static class JvmMemoryNonHeapObj {
342
343
344
345 public JvmMemoryNonHeapObj() {
346
347 }
348
349
350 public long used;
351
352 public long committed;
353
354 public long max;
355
356 public short percent;
357 }
358
359
360
361
362 public static class JvmPoolObj {
363
364
365
366 public JvmPoolObj() {
367
368 }
369
370
371 public String key;
372
373 public long count;
374
375 public long used;
376
377 public long capacity;
378 }
379
380
381
382
383 public static class JvmGcObj {
384
385
386
387 public JvmGcObj() {
388
389 }
390
391
392 public String key;
393
394 public long count;
395
396 public long time;
397 }
398
399
400
401
402 public static class JvmThreadsObj {
403
404
405
406 public JvmThreadsObj() {
407
408 }
409
410
411 public int count;
412
413 public int peak;
414 }
415
416
417
418
419 public static class JvmClassesObj {
420
421
422
423 public JvmClassesObj() {
424
425 }
426
427
428 public long loaded;
429
430 public long total_loaded;
431
432 public long unloaded;
433 }
434
435
436
437
438 public static class ProcessObj {
439
440
441
442 public ProcessObj() {
443
444 }
445
446
447 public ProcessFileDescriptorObj fileFescriptor;
448
449 public ProcessCpuObj cpu;
450
451 public ProcessVirtualMemoryObj virtualMemory;
452 }
453
454
455
456
457 public static class ProcessFileDescriptorObj {
458
459
460
461 public ProcessFileDescriptorObj() {
462
463 }
464
465
466 public long open;
467
468 public long max;
469 }
470
471
472
473
474 public static class ProcessCpuObj {
475
476
477
478 public ProcessCpuObj() {
479
480 }
481
482
483 public short percent;
484
485 public long total;
486 }
487
488
489
490
491 public static class ProcessVirtualMemoryObj {
492
493
494
495 public ProcessVirtualMemoryObj() {
496
497 }
498
499
500 public long total;
501 }
502
503
504
505
506 public static class OsObj {
507
508
509
510 public OsObj() {
511
512 }
513
514
515 public OsMemoryObj memory;
516
517 public OsCpuObj cpu;
518
519 public double[] loadAverages;
520 }
521
522
523
524
525 public static class OsMemoryObj {
526
527
528
529 public OsMemoryObj() {
530
531 }
532
533
534 public OsMemoryPhysicalObj physical;
535
536 public OsMemorySwapSpaceObj swapSpace;
537 }
538
539
540
541
542 public static class OsMemoryPhysicalObj {
543
544
545
546 public OsMemoryPhysicalObj() {
547
548 }
549
550
551 public long free;
552
553 public long total;
554 }
555
556
557
558
559 public static class OsMemorySwapSpaceObj {
560
561
562
563 public OsMemorySwapSpaceObj() {
564
565 }
566
567
568 public long free;
569
570 public long total;
571 }
572
573
574
575
576 public static class OsCpuObj {
577
578
579
580 public OsCpuObj() {
581
582 }
583
584
585 public short percent;
586 }
587 }