All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.testvagrant.monitor.performance.ScenarioMonitor Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2017.  TestVagrant Technologies
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 *
 */

package com.testvagrant.monitor.performance;

import com.testvagrant.monitor.entities.*;
import com.testvagrant.monitor.entities.performance.Activity;
import com.testvagrant.monitor.entities.performance.CpuStatistics;
import com.testvagrant.monitor.entities.performance.MemoryStatistics;
import com.testvagrant.monitor.requests.Scenario;
import com.testvagrant.monitor.services.ScenariosServiceImpl;
import com.testvagrant.monitor.utils.Commons;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Timer;

public class ScenarioMonitor {
    private final int PERIOD = 1000;
    private List cpuStat = new ArrayList<>();
    private List memoryStat = new ArrayList<>();
    private List screenShots = new ArrayList<>();
    private List activities = new ArrayList<>();
    private SmartBOT smartBOT;
    private Thread countdown;
    private Timer timer = new Timer(true);
    private boolean takeScreenshots = Boolean.parseBoolean(System.getProperty("screenshots","true"));

    public ScenarioMonitor(SmartBOT smartBOT) {
        this.smartBOT = smartBOT;
        countdown = new Thread(() -> {
            try {
                Thread.sleep(300 * PERIOD);
                timer.cancel();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

    public void start() {
        int interval = PERIOD / 1000;
        new Commons().createTempFolder(smartBOT);
        timer.schedule(new CPUMonitor(cpuStat, smartBOT, interval), 0, PERIOD);
        timer.schedule(new ActivityMonitor(activities, smartBOT, interval), 0, PERIOD);
        timer.schedule(new MemoryMonitor(memoryStat, smartBOT, interval), 0, PERIOD);
        scheduleScreenShots(interval);
        countdown.start();
    }

    private void scheduleScreenShots(int interval) {
        if(takeScreenshots) {
            timer.schedule(new ScreenShotGenerator(screenShots, smartBOT, interval), 0, PERIOD);
        }
    }

    public void stop() {
        timer.cancel();
        List scenarioTimelines = new ArrayList<>();
        final Activity[] activity = {getBaseActivity()};
        final MemoryStatistics[] memoryStatistics = {new MemoryStatistics()};
        final ScreenshotStatistics[] screenshotStats = {new ScreenshotStatistics()};
        ScreenShotGenerator generator = new ScreenShotGenerator(smartBOT);
        generator.importScreenshots();
        generator.updateScreenshotStatistics(screenShots);
        cpuStat.forEach(cpuStatistics -> {
            Optional activityOptional = activities.stream().filter(activity1 -> activity1.getInterval() == cpuStatistics.getInterval()).findFirst();
            activityOptional.ifPresent(activity1 -> activity[0] = activity1);
            Optional optionalMemoryStatistics = memoryStat.stream().filter(memoryStatistics1 -> memoryStatistics1.getInterval() == cpuStatistics.getInterval()).findFirst();
            optionalMemoryStatistics.ifPresent(memoryStatistics1 -> memoryStatistics[0] = memoryStatistics1);
            Optional statisticsOptional = screenShots.stream().filter(screenshotStatistics -> screenshotStatistics.getInterval() == cpuStatistics.getInterval()).findFirst();
            statisticsOptional.ifPresent(screenshotStatistics -> screenshotStats[0] = screenshotStatistics);
            setScreenshotStatisticsForMonitoringOff(screenshotStats[0]);
            ScenarioTimeline scenarioTimeline = getScenarioTimeLine(cpuStatistics.getInterval(), activity[0], cpuStatistics, memoryStatistics[0], screenshotStats[0]);
            scenarioTimelines.add(scenarioTimeline);
        });
        generator.deleteImageFolder();
        new ScenariosServiceImpl().updateScenarioTimeLine(smartBOT, scenarioTimelines);
        new Commons().deleteTempFolder(smartBOT);
    }

    private ScreenshotStatistics setScreenshotStatisticsForMonitoringOff(ScreenshotStatistics screenshotStats) {
        if(!takeScreenshots) {
            ScreenshotStatistics screenshotStatistics = new ScreenshotStatistics();
            screenshotStatistics.setUnique(false);
            screenshotStats = screenshotStatistics;
        }
        return screenshotStats;
    }

    public void stop(Scenario scenario) {
        timer.cancel();
        List scenarioTimelines = new ArrayList<>();
        final Activity[] activity = {getBaseActivity()};
        final MemoryStatistics[] memoryStatistics = {new MemoryStatistics()};
        final ScreenshotStatistics[] screenshotStats = {new ScreenshotStatistics()};
        ScreenShotGenerator generator = new ScreenShotGenerator(smartBOT);
        generator.importScreenshots();
        generator.updateScreenshotStatistics(screenShots);
        cpuStat.forEach(cpuStatistics -> {
            Optional activityOptional = activities.stream().filter(activity1 -> activity1.getInterval() == cpuStatistics.getInterval()).findFirst();
            activityOptional.ifPresent(activity1 -> activity[0] = activity1);
            Optional optionalMemoryStatistics = memoryStat.stream().filter(memoryStatistics1 -> memoryStatistics1.getInterval() == cpuStatistics.getInterval()).findFirst();
            optionalMemoryStatistics.ifPresent(memoryStatistics1 -> memoryStatistics[0] = memoryStatistics1);
            Optional statisticsOptional = screenShots.stream().filter(screenshotStatistics -> screenshotStatistics.getInterval() == cpuStatistics.getInterval()).findFirst();
            statisticsOptional.ifPresent(screenshotStatistics -> screenshotStats[0] = screenshotStatistics);
            ScenarioTimeline scenarioTimeline = getScenarioTimeLine(cpuStatistics.getInterval(), activity[0], cpuStatistics, memoryStatistics[0], screenshotStats[0]);
            scenarioTimelines.add(scenarioTimeline);
        });
        generator.deleteImageFolder();
        new ScenariosServiceImpl().updateScenarioTimeLine(scenario, smartBOT, scenarioTimelines);
        new Commons().deleteTempFolder(smartBOT);
    }


    private ScenarioTimeline getScenarioTimeLine(int interval, Activity activity, CpuStatistics cpuStatistics, MemoryStatistics memoryStatistics, ScreenshotStatistics screenshotStatistics) {
        ScenarioTimeline scenarioTimeline = new ScenarioTimeline();
        scenarioTimeline.setInterval(interval);
        scenarioTimeline.setActivity(activity.getFocussedActivity());
        scenarioTimeline.setCpuData(new CpuData().setUser(cpuStatistics.getUser()).setKernel(cpuStatistics.getKernel()));
        scenarioTimeline.setMemoryData(new MemoryData().setTotal(memoryStatistics.getTotal()).setActual(memoryStatistics.getActual()));
        if(screenshotStatistics.isUnique()) {
            scenarioTimeline.setScreenshotData(screenshotStatistics.getScreenshot());
        }
        return scenarioTimeline;
    }

    private Activity getBaseActivity() {
        Activity activity = new Activity();
        activity.setFocussedActivity("undefinedActivity");
        return activity;
    }


    private ScreenshotStatistics getLastScreenshotStatistics() {
        Optional reduce = screenShots.stream().filter(ScreenshotStatistics::isUnique).reduce((first, second) -> second);
        if(reduce.isPresent()) {
            return reduce.get();
        }
        ScreenshotStatistics screenshot = new ScreenshotStatistics();
        screenshot.setScreenshot(new byte[]{});
        return screenshot;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy