/* * RHQ Management Platform * Copyright (C) 2005-2014 Red Hat, Inc. * All rights reserved. * * 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 version 2 of the License. * * 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, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.enterprise.server.performance.test; import java.lang.reflect.Method; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.Query; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.event.Event; import org.rhq.core.domain.event.EventDefinition; import org.rhq.core.domain.event.EventSeverity; import org.rhq.core.domain.event.EventSource; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; import org.rhq.enterprise.server.core.AgentManagerLocal; import org.rhq.enterprise.server.event.EventManagerLocal; import org.rhq.enterprise.server.measurement.AvailabilityManagerLocal; import org.rhq.enterprise.server.purge.PurgeManagerLocal; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.system.SystemManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3PerformanceTest; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.helpers.perftest.support.reporting.ExcelExporter; import org.rhq.helpers.perftest.support.testng.DatabaseSetupInterceptor; import org.rhq.helpers.perftest.support.testng.DatabaseState; import org.rhq.helpers.perftest.support.testng.PerformanceReporting; /** * Performance test the events subsystem * * @author Heiko W. Rupp */ @Test(groups = "PERF") @Listeners({ DatabaseSetupInterceptor.class }) @PerformanceReporting(exporter = ExcelExporter.class) @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion = "2.125") public class EventsInsertPurgeTest extends AbstractEJB3PerformanceTest { private static final int ROUNDS = 20000; private static final int NUM_SOURCES = 10; private static final int LINES_PER_REPORT = 50; ResourceManagerLocal resourceManager; AvailabilityManagerLocal availabilityManager; AgentManagerLocal agentManager; SystemManagerLocal systemManager; AlertDefinitionManagerLocal alertDefinitionManager; EventManagerLocal eventManager; PurgeManagerLocal purgeManager; @Override protected void beforeMethod(Method method) { super.setupTimings(method); try { this.availabilityManager = LookupUtil.getAvailabilityManager(); this.resourceManager = LookupUtil.getResourceManager(); this.agentManager = LookupUtil.getAgentManager(); this.systemManager = LookupUtil.getSystemManager(); this.alertDefinitionManager = LookupUtil.getAlertDefinitionManager(); this.eventManager = LookupUtil.getEventManager(); this.purgeManager = LookupUtil.getPurgeManager(); /* * NOTE: do not try to get Subjects or other DB stuff in here, as they will only * be available after this method has finished and the DatabaseSetupInterceptor * has initialized the database. */ } catch (Throwable t) { // Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them // and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)! t.printStackTrace(); throw new RuntimeException(t); } } /** * This test insertsevents from NUM_SOURCES sources into the * event subsystem, where each set of events is LINES_PER_REPORT long. * In total ROUNDS are inserted. * After this, events are purged in two steps: first the first half of them * and then the remaining ones. * @throws Exception */ public void testSimpleInserts() throws Exception { Subject overlord = LookupUtil.getSubjectManager().getOverlord(); Query q = em.createQuery("SELECT r FROM Resource r"); List<Resource> resources = q.getResultList(); Resource res = resources.get(0); if (!(res.getResourceType().getCategory() == ResourceCategory.PLATFORM)) res = resourceManager.getPlaformOfResource(overlord, res.getId()); ResourceType type = res.getResourceType(); EventDefinition def; Set<EventDefinition> eventDefs = type.getEventDefinitions(); if (eventDefs != null && !eventDefs.isEmpty()) { def = eventDefs.iterator().next(); } else { throw new RuntimeException("No event definition found, should not happen"); } EventSource[] evSrc = new EventSource[NUM_SOURCES]; for (int i = 0; i < NUM_SOURCES; i++) { evSrc[i] = new EventSource("ESource" + 1, def, res); } long now = new Date().getTime() - ROUNDS * LINES_PER_REPORT; for (int round = 1; round < ROUNDS; round++) { Map<EventSource, Set<Event>> events = new HashMap<EventSource, Set<Event>>(); for (int sourceNum = 0; sourceNum < NUM_SOURCES; sourceNum++) { Set<Event> eventSet = new HashSet<Event>(); for (int i = 0; i < LINES_PER_REPORT; i++) { Event ev = new Event("EType", "ESource" + sourceNum, now + round * i, EventSeverity.INFO, "This is a 2nd test", evSrc[sourceNum]); eventSet.add(ev); } events.put(evSrc[sourceNum], eventSet); } startTiming("add"); eventManager.addEventData(events); endTiming("add"); } startTiming("purge_half"); purgeManager.purgeEventData(now + (ROUNDS / 2) * LINES_PER_REPORT); endTiming("purge_half"); startTiming("purge_final"); purgeManager.purgeEventData(System.currentTimeMillis()); endTiming("purge_final"); } }