/** * Analytica - beta version - Systems Monitoring Tool * * Copyright (C) 2013, KleeGroup, direction.technique@kleegroup.com (http://www.kleegroup.com) * KleeGroup, Centre d'affaire la Boursidi�re - BP 159 - 92357 Le Plessis Robinson Cedex - France * * 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 <http://www.gnu.org/licenses> */ package io.analytica.museum; import io.analytica.api.KProcess; import io.analytica.api.KProcessBuilder; import io.vertigo.lang.Assertion; import io.vertigo.util.DateBuilder; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * @author statchum */ public final class Museum { public static final String APP_NAME = "museum"; private static final String QOS = "qos"; private static final String HEALTH = "health"; private final PageListener pageListener; // private long pages = 0; public Museum(final PageListener pageListener) { Assertion.checkNotNull(pageListener); // --------------------------------------------------------------------- this.pageListener = pageListener; } public void load(final int days, final int visitsByDay) { Assertion.checkArgument(days >= 0, "days must be >= 0"); //--------------------------------------------------------------------- //Toutes les visites sur 3h, 100visites par heures final Calendar today = new GregorianCalendar(); today.set(Calendar.HOUR_OF_DAY, 0); today.set(Calendar.MINUTE, 0); today.set(Calendar.SECOND, 0); final Date startDate = new DateBuilder(today.getTime()).addDays(2).build(); System.out.println("|---------------------------------------------"); System.out.println("|---days :" + days); System.out.println("|---visitsByDay :" + visitsByDay); System.out.println("|---------------------------------------------"); System.out.println("|"); final long start = System.currentTimeMillis(); for (int day = 0; day < days; day++) { final Date visitDate = new DateBuilder(startDate).addDays(-day).build(); final Calendar calendar = new GregorianCalendar(); calendar.setTime(visitDate); loadVisitors(day, visitDate, StatsUtil.random(visitsByDay, Activity.getCoefPerDay(calendar.get(Calendar.DAY_OF_WEEK)))); // checkMemory(day); } System.out.println("|"); System.out.println("|"); System.out.println("|---------------------------------------------"); System.out.println("|---data loaded in " + (System.currentTimeMillis() - start) / 1000 + "seconds"); System.out.println("|---------------------------------------------"); } // private void checkMemory(final long day) { // if (Runtime.getRuntime().freeMemory() * 10 / Runtime.getRuntime().maxMemory() < 1) { // System.gc(); // //--- // if (Runtime.getRuntime().freeMemory() * 10 / Runtime.getRuntime().maxMemory() < 1) { // System.out.println(); // System.out.println(">>>> free mem =" + Runtime.getRuntime().freeMemory()); // System.out.println(">>>> max mem =" + Runtime.getRuntime().maxMemory()); // System.out.println(">>>> mem total > 90% - days =" + day); // System.out.println(">>>> pages =" + pages); // // // System.out.println(">>>> cube footprint =" + Runtime.getRuntime().maxMemory() / cubeManager.getApp(APP_NAME).size(null) + " octets"); // try { // Thread.sleep(1000 * 20); //20s // } catch (final InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // System.exit(0); // } // } // } private void loadVisitors(final int day, final Date startDate, final double visitsByDay) { System.out.println("|"); System.out.println("|---day : " + day); System.out.println("| |---visits : " + visitsByDay); System.out.println("| |---date : " + startDate); double visitRatioSum = 0; final double[] visitRatioPerHour = new double[24]; for (int h = 0; h < 24; h++) { visitRatioPerHour[h] = Math.round(StatsUtil.random(visitsByDay, Activity.getCoefPerHour(h))); visitRatioSum += visitRatioPerHour[h]; } final double visitPerHourRatio = visitsByDay / visitRatioSum; System.out.print("| |---distribution : "); for (int h = 0; h < 24; h++) { final int nbHourVisit = (int) Math.round(visitRatioPerHour[h] * visitPerHourRatio); System.out.print(h + "h:" + nbHourVisit + ", "); final Date dateHour = new DateBuilder(startDate).addHours(h).toDateTime(); for (int i = 0; i < nbHourVisit; i++) { final int defaultMinute = (int) Math.round((i + 1) * 60d / (nbHourVisit + 1)); final int randomMinute = (int) (defaultMinute + (4 * 5 - StatsUtil.random(4 * 5, 1))); //default +/- 5 minutes (on joue sur le battement de 20%) final Date startVisit = new DateBuilder(dateHour).addMinutes(randomMinute).toDateTime(); addVisitorScenario(startVisit); } loadHealthInfos(dateHour, nbHourVisit); loadQOS(dateHour, nbHourVisit); } System.out.println(); } private void addVisitorScenario(final Date startVisit) { final KProcess visiteur = new KProcessBuilder(APP_NAME, "session", startVisit, 0)// .withCategory("mexico") .withLocation("visitor") .setMeasure("sessionHttp", 1) //1 session .build(); //On notifie le listener pageListener.onPage(visiteur); addPages(startVisit, Pages.HOME, Pages.ARTIST_SEARCH, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.EXPOSITION, Pages.EXPOSITION, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.ARTIST_SEARCH, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.ARTIST, Pages.IMAGE_ARTIST, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE_SEARCH, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.OEUVRE, Pages.IMAGE_OEUVRE, Pages.EXPOSITION, Pages.ARTIST, Pages.IMAGE_ARTIST); } private void addPages(final Date startVisit, final PageBuilder... pageBuilders) { Date startDate = startVisit; int pagesVue = 0; final int pagesAVoir = (int) StatsUtil.random(pageBuilders.length, 1); //en moyen on voie le max mais 20% voient moins for (final PageBuilder pageBuilder : pageBuilders) { startDate = addPage(pageBuilder, startDate); if (++pagesVue > pagesAVoir) { break; } } } private Date addPage(final PageBuilder pageBuilder, final Date startDate) { final KProcess page = pageBuilder.createPage(startDate); //On notifie le listener pageListener.onPage(page); // pages++; return addWaitTime(startDate, pageBuilder); } private static Date addWaitTime(final Date startVisit, final PageBuilder pageBuilder) { final long waitTime; if (pageBuilder == Pages.IMAGE_ARTIST || pageBuilder == Pages.IMAGE_OEUVRE) { waitTime = 100; } else { waitTime = 30 * 1000;//30s } return new Date(startVisit.getTime() + StatsUtil.random(waitTime, 1)); } private void loadQOS(final Date dateHour, final double nbVisitsHour) { final double activity = Math.min(100, StatsUtil.random(100, nbVisitsHour / 50)); final double perfs = Math.min(100, StatsUtil.random(100, 1.4 - nbVisitsHour / 50)); final double health = Math.min(100, StatsUtil.random(100, 1.5 - nbVisitsHour / 50)); final KProcess qosProcess = new KProcessBuilder(APP_NAME, QOS, dateHour, 0) .withCategory("qos") .withLocation("mexico") .setMeasure("activity", activity) .setMeasure("activityMax", 100) .setMeasure("performance", perfs) .setMeasure("performanceMax", 100) .setMeasure("health", health) .setMeasure("healthMax", 100) .build(); pageListener.onPage(qosProcess); } private void loadHealthInfos(final Date dateHour, final double nbVisitsHour) { for (int min = 0; min < 60; min += 6) { final Date dateMinute = new DateBuilder(dateHour).addMinutes(min).toDateTime(); final KProcess healthProcess = new KProcessBuilder(APP_NAME, HEALTH, dateMinute, 0) .withLocation("mexico") .withCategory("physical") .setMeasure("cpu", Math.min(100, 5 + (nbVisitsHour > 0 ? StatsUtil.random(nbVisitsHour, 1) : 0))) .setMeasure("ram", Math.min(3096, 250 + (nbVisitsHour > 0 ? StatsUtil.random(nbVisitsHour, 10) : 0))) .setMeasure("io", 10 + (nbVisitsHour > 0 ? StatsUtil.random(nbVisitsHour, 5) : 0)) .build(); pageListener.onPage(healthProcess); } } }