package com.intuit.tank.harness; /* * #%L * Intuit Tank Agent (apiharness) * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.util.Date; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.CloudServiceClient; import com.intuit.tank.api.model.v1.cloud.CloudVmStatus; import com.intuit.tank.api.model.v1.cloud.ValidationStatus; import com.intuit.tank.harness.logging.LogUtil; import com.intuit.tank.reporting.api.TPSInfoContainer; import com.intuit.tank.vm.agent.messages.WatsAgentStatusResponse; import com.intuit.tank.vm.api.enumerated.JobStatus; import com.intuit.tank.vm.api.enumerated.WatsAgentCommand; public class APIMonitor implements Runnable { /** * */ private static final int MIN_REPORT_TIME = 15000; private static Logger LOG = LogManager.getLogger(APIMonitor.class); private static boolean doMonitor = true; private static CloudServiceClient client; private static CloudVmStatus status; private long reportInterval = APIMonitor.MIN_REPORT_TIME; public APIMonitor(CloudVmStatus vmStatus) { status = vmStatus; try { client = new CloudServiceClient(APITestHarness.getInstance().getTankConfig().getControllerBase()); reportInterval = Math.max(APITestHarness.getInstance().getTankConfig().getAgentConfig() .getStatusReportIntervalMilis(reportInterval), MIN_REPORT_TIME); } catch (Exception e) { LOG.error("Error initializing monitor: " + e, e); } } @Override public void run() { while (doMonitor) { try { CloudVmStatus newStatus = createStatus(APITestHarness.getInstance().getStats()); newStatus.setUserDetails(APITestHarness.getInstance().getUserTracker().getSnapshot()); TPSInfoContainer tpsInfo = APITestHarness.getInstance().getTPMonitor().getTPSInfo(); if (tpsInfo != null) { newStatus.setTotalTps(tpsInfo.getTotalTps()); sendTps(tpsInfo); } client.setVmStatus(newStatus.getInstanceId(), newStatus); APITestHarness.getInstance().checkAgentThreads(); Thread.sleep(reportInterval); } catch (Exception t) { LOG.error(LogUtil.getLogMessage("Unable to send status metrics | " + t.getMessage()), t); } } CloudVmStatus newStatus = createStatus(APITestHarness.getInstance().getStats()); client.setVmStatus(newStatus.getInstanceId(), newStatus); } private void sendTps(final TPSInfoContainer tpsInfo) { APITestHarness.getInstance().getResultsReporter() .sendTpsResults(APITestHarness.getInstance().getAgentRunData().getJobId(), APITestHarness .getInstance().getAgentRunData().getInstanceId(), tpsInfo, true); } /** * @param Statistics * for this instance * @return */ private CloudVmStatus createStatus(WatsAgentStatusResponse stats) { CloudVmStatus ret = new CloudVmStatus(status.getInstanceId(), status.getJobId(), status.getSecurityGroup(), calculateJobStatus(stats, status.getJobStatus()), status.getRole(), status.getVmRegion(), status.getVmStatus(), new ValidationStatus(stats.getKills(), stats.getAborts(), stats.getGotos(), stats.getSkips(), stats.getSkipGroups(), stats.getRestarts()), stats.getMaxVirtualUsers(), stats.getCurrentNumberUsers(), status.getStartTime(), status.getEndTime()); return ret; } /** * @param Statistics * for this instance * @return */ private JobStatus calculateJobStatus(WatsAgentStatusResponse stats, JobStatus currentStatus) { if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.pause) { return JobStatus.Paused; } else if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.stop) { return JobStatus.Stopped; } else if (APITestHarness.getInstance().getCmd() == WatsAgentCommand.pause_ramp) { return JobStatus.RampPaused; } else if ((currentStatus == JobStatus.Unknown || currentStatus == JobStatus.Starting) && stats.getCurrentNumberUsers() > 0) { return JobStatus.Running; } return currentStatus; } public static void setDoMonitor(boolean monitor) { doMonitor = monitor; } public synchronized static void setJobStatus(JobStatus jobStatus) { if (status.getJobStatus() != JobStatus.Completed) { try { WatsAgentStatusResponse stats = APITestHarness.getInstance().getStats(); Date endTime = (jobStatus == JobStatus.Completed) ? new Date() : status .getEndTime(); status = new CloudVmStatus(status.getInstanceId(), status.getJobId(), status.getSecurityGroup(), jobStatus, status.getRole(), status.getVmRegion(), status.getVmStatus(), new ValidationStatus(stats.getKills(), stats.getAborts(), stats.getGotos(), stats.getSkips(), stats.getSkipGroups(), stats.getRestarts()), stats.getMaxVirtualUsers(), stats.getCurrentNumberUsers(), status.getStartTime(), endTime); status.setUserDetails(APITestHarness.getInstance().getUserTracker().getSnapshot()); client.setVmStatus(status.getInstanceId(), status); } catch (Exception e) { LOG.error("Error sending status to controller: " + e.toString(), e); } } } }