sureshanaparti commented on a change in pull request #5588:
URL: https://github.com/apache/cloudstack/pull/5588#discussion_r761935511



##########
File path: server/src/main/java/com/cloud/server/StatsCollector.java
##########
@@ -564,11 +678,471 @@ protected Point creteInfluxDbPoint(Object metricsObject) 
{
         }
     }
 
+     class DbCollector extends AbstractStatsCollector {
+         List<Double> loadHistory = new ArrayList<>();
+         DbCollector() {
+             dbStats.put(loadAvarages, loadHistory);
+         }
+         @Override
+         protected void runInContext() {
+             LOGGER.debug(String.format("%s is running...", 
this.getClass().getSimpleName()));
+
+             try {
+                 int lastUptime = (dbStats.containsKey(uptime) ? (Integer) 
dbStats.get(uptime) : 0);
+                 int lastQueries = (dbStats.containsKey(queries) ? (Integer) 
dbStats.get(queries) : 0);
+                 getDynamicDataFromDB();
+                 int interval = (Integer) dbStats.get(uptime) - lastUptime;
+                 int activity = (Integer) dbStats.get(queries) - lastQueries;
+                 loadHistory.add(Double.valueOf(activity / interval));
+                 while (loadHistory.size() > 
DATABASE_SERVER_LOAD_HISTORY_RETENTION_NUMBER.value()) {
+                     loadHistory.remove(0);
+                 }
+             } catch (Throwable e) {
+                 // pokemon catch to make sure the thread stays running
+                 LOGGER.error("db statistics collection failed due to " + 
e.getLocalizedMessage());
+                 if (LOGGER.isDebugEnabled()) {
+                     LOGGER.debug("db statistics collection failed.", e);
+                 }
+             }
+         }
+
+         private void getDynamicDataFromDB() {
+             Map<String, String> stats = DbUtil.getDbInfo("STATUS", queries, 
uptime);
+             dbStats.put(queries, (Integer.valueOf(stats.get(queries))));
+             dbStats.put(uptime, (Integer.valueOf(stats.get(uptime))));
+         }
+
+
+         @Override
+         protected Point creteInfluxDbPoint(Object metricsObject) {
+             return null;
+         }
+     }
+
+    Gson gson;
+
+    class ManagementServerCollector extends AbstractStatsCollector {
+        @Override
+        protected void runInContext() {
+            LOGGER.debug(String.format("%s is running...", 
this.getClass().getSimpleName()));
+            long msid = ManagementServerNode.getManagementServerId();
+            ManagementServerHostVO mshost = null;
+            ManagementServerHostStatsEntry hostStatsEntry = null;
+            try {
+                mshost = managementServerHostDao.findByMsid(msid);
+                // get local data
+                hostStatsEntry = getDataFrom(mshost);
+                managementServerHostStats.put(mshost.getUuid(), 
hostStatsEntry);
+                // send to other hosts
+                clusterManager.publishStatus(gson.toJson(hostStatsEntry));
+            } catch (Throwable t) {
+                // pokemon catch to make sure the thread stays running
+                LOGGER.error("Error trying to retrieve management server host 
statistics", t);
+            }
+            try {
+                // send to DB
+                storeStatus(hostStatsEntry, mshost);
+            } catch (Throwable t) {
+                // pokemon catch to make sure the thread stays running
+                LOGGER.error("Error trying to store  management server host 
statistics", t);
+            }
+        }
+
+        private void storeStatus(ManagementServerHostStatsEntry 
hostStatsEntry, ManagementServerHostVO mshost) {
+            if (hostStatsEntry == null || mshost == null) {
+                return;
+            }
+            ManagementServerStatusVO msStats = 
managementServerStatusDao.findByMsId(hostStatsEntry.getManagementServerHostUuid());
+            if (msStats == null) {
+                LOGGER.info(String.format("creating new status info record for 
host %s - %s",
+                        mshost.getName(),
+                        hostStatsEntry.getManagementServerHostUuid()));
+                msStats = new ManagementServerStatusVO();
+                msStats.setMsId(hostStatsEntry.getManagementServerHostUuid());
+            }
+            msStats.setOsDistribution(hostStatsEntry.getOsDistribution()); // 
for now just the bunch details come later
+            msStats.setJavaName(hostStatsEntry.getJvmVendor());
+            msStats.setJavaVersion(hostStatsEntry.getJvmVersion());
+            Date startTime = new Date(hostStatsEntry.getStartTime());
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format("reporting starttime %s", 
startTime));
+            }
+            msStats.setLastStart(startTime);
+            msStats.setUpdated(new Date());
+            managementServerStatusDao.persist(msStats);
+        }
+
+        @NotNull
+        private ManagementServerHostStatsEntry 
getDataFrom(ManagementServerHostVO mshost) {
+            ManagementServerHostStatsEntry newEntry = new 
ManagementServerHostStatsEntry();
+            LOGGER.trace("Metrics collection start...");
+            newEntry.setManagementServerHostId(mshost.getId());
+            newEntry.setManagementServerHostUuid(mshost.getUuid());
+            newEntry.setDbLocal(isDbLocal());
+            newEntry.setUsageLocal(isUsageLocal());
+            retrieveSession(newEntry);
+            getJvmDimensions(newEntry);
+            LOGGER.trace("Metrics collection extra...");
+            getRuntimeData(newEntry);
+            getCpuData(newEntry);
+            getMemoryData(newEntry);
+            // newEntry must now include a pid!
+            getProcFsData(newEntry);
+            getFsData(newEntry);
+            getDataBaseStatistics(newEntry, mshost.getMsid());
+            gatherAllMetrics(newEntry);
+            LOGGER.trace("Metrics collection end!");
+            return newEntry;
+        }
+
+        private void retrieveSession(ManagementServerHostStatsEntry newEntry) {
+            long sessions = ApiSessionListener.getSessionCount();
+            newEntry.setSessions(sessions);
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format("Sessions found in Api %d vs 
context %d", sessions,ApiSessionListener.getNumberOfSessions()));
+            } else {
+                LOGGER.debug("Sessions active: " + sessions);
+            }
+        }
+
+        private void getDataBaseStatistics(ManagementServerHostStatsEntry 
newEntry, long msid) {
+            int count = _hostDao.countByMs(msid);
+            newEntry.setAgentCount(count);
+        }
+
+        private void getMemoryData(@NotNull ManagementServerHostStatsEntry 
newEntry) {
+            MemoryMXBean mxBean = ManagementFactory.getMemoryMXBean();
+            newEntry.setTotalInit(mxBean.getHeapMemoryUsage().getInit() + 
mxBean.getNonHeapMemoryUsage().getInit());
+            newEntry.setTotalUsed(mxBean.getHeapMemoryUsage().getUsed() + 
mxBean.getNonHeapMemoryUsage().getUsed());
+            newEntry.setTotalMax(mxBean.getHeapMemoryUsage().getMax() + 
mxBean.getNonHeapMemoryUsage().getMax());
+            
newEntry.setTotalCommitted(mxBean.getHeapMemoryUsage().getCommitted() + 
mxBean.getNonHeapMemoryUsage().getCommitted());
+        }
+
+        private void getCpuData(@NotNull ManagementServerHostStatsEntry 
newEntry) {
+            java.lang.management.OperatingSystemMXBean bean = 
ManagementFactory.getOperatingSystemMXBean();
+            newEntry.setAvailableProcessors(bean.getAvailableProcessors());
+            newEntry.setLoadAverage(bean.getSystemLoadAverage());
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format(
+                        "Metrics processors - %d , loadavg - %f ",
+                        newEntry.getAvailableProcessors(),
+                        newEntry.getLoadAverage()));
+            }
+            if (bean instanceof OperatingSystemMXBean) {
+                OperatingSystemMXBean mxBean = (OperatingSystemMXBean) bean;
+                
newEntry.setSystemMemoryTotal(mxBean.getTotalPhysicalMemorySize());
+                
newEntry.setSystemMemoryFree(mxBean.getFreePhysicalMemorySize());
+                
newEntry.setSystemMemoryUsed(mxBean.getCommittedVirtualMemorySize());
+                if (LOGGER.isTraceEnabled()) {
+                    LOGGER.trace(String.format("data from 
'OperatingSystemMXBean': total mem: %d, free mem: %d, used mem: %d",
+                            newEntry.getSystemMemoryTotal(),
+                            newEntry.getSystemMemoryFree(),
+                            newEntry.getSystemMemoryUsed()));
+                }
+            }
+        }
+
+        private void getRuntimeData(@NotNull ManagementServerHostStatsEntry 
newEntry) {
+            final RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean();
+            newEntry.setUptime(mxBean.getUptime());
+            newEntry.setStartTime(mxBean.getStartTime());
+            newEntry.setProcessId(mxBean.getPid());
+            newEntry.setJvmName(mxBean.getName());
+            newEntry.setJvmVendor(mxBean.getVmVendor());
+            newEntry.setJvmVersion(mxBean.getVmVersion());
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format(
+                        "Metrics uptime - %d , starttime - %d",
+                        newEntry.getUptime(),
+                        newEntry.getStartTime()));
+            }
+        }
+
+        private void getJvmDimensions(@NotNull ManagementServerHostStatsEntry 
newEntry) {
+            Runtime runtime = Runtime.getRuntime();
+            newEntry.setTotalMemoryBytes(runtime.totalMemory());
+            newEntry.setFreeMemoryBytes(runtime.freeMemory());
+            newEntry.setAvailableProcessors(runtime.availableProcessors());
+            newEntry.setTotalMax(runtime.maxMemory());
+            //long maxMem = runtime.maxMemory();
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format(
+                        "Metrics proc - %d , maxMem - %d , totalMemory - %d , 
freeMemory - %f ",
+                        newEntry.getAvailableProcessors(),
+                        newEntry.getTotalMax(),
+                        newEntry.getTotalMemoryBytes(),
+                        newEntry.getFreeMemoryBytes()));
+            }
+        }
+
+        /**
+         * As for data from outside the JVM, we only rely on /proc/ contained 
data.
+         *
+         * @param newEntry
+         */
+        private void getProcFsData(@NotNull ManagementServerHostStatsEntry 
newEntry) {

Review comment:
       
   ```suggestion
           private void getProcFileSystemData(@NotNull 
ManagementServerHostStatsEntry newEntry) {
   ```




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to