/* * Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved * http://www.griddynamics.com * * This library is free software; you can redistribute it and/or modify it under the terms of * the Apache License; either * version 2.0 of the License, or any later version. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.griddynamics.jagger.monitoring; import com.google.common.collect.Maps; import com.griddynamics.jagger.coordinator.*; import com.griddynamics.jagger.storage.fs.logging.LogWriter; import com.griddynamics.jagger.util.Nothing; import com.griddynamics.jagger.util.Timeout; import org.hibernate.SessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Required; import java.util.Map; import java.util.concurrent.ExecutorService; /** * Coordinator based API for monitoring of agents. * * @author Mairbek Khadikov */ public class MonitoringWorker extends ConfigurableWorker { private static final Logger log = LoggerFactory.getLogger(MonitoringWorker.class); private ExecutorService executor; private Coordinator coordinator; private long pollingInterval; private long profilerPollingInterval; private MonitoringProcessor monitoringProcessor; private LogWriter logWriter; private Map<String, MonitorProcess> processes = Maps.newConcurrentMap(); private SessionFactory sessionFactory; private Timeout ttl; @Override public void configure() { onCommandReceived(StartMonitoring.class).execute(new CommandExecutor<StartMonitoring, String>() { @Override public Qualifier<StartMonitoring> getQualifier() { return Qualifier.of(StartMonitoring.class); } @Override public String execute(StartMonitoring command, NodeContext nodeContext) { MonitorProcess process = new MonitorProcess(command.getSessionId(), command.getAgentNode(), nodeContext, coordinator, executor, pollingInterval, profilerPollingInterval, monitoringProcessor, command.getTaskId(), logWriter, sessionFactory, ttl); String processId = generateProcessId(); processes.put(processId, process); process.start(); return processId; } }); onCommandReceived(PollMonitoringStatus.class).execute(new CommandExecutor<PollMonitoringStatus, MonitoringStatus>() { @Override public Qualifier<PollMonitoringStatus> getQualifier() { return Qualifier.of(PollMonitoringStatus.class); } @Override public MonitoringStatus execute(PollMonitoringStatus command, NodeContext nodeContext) { String processId = command.getProcessId(); MonitorProcess process = processes.get(processId); return process.getStatus(); } }); onCommandReceived(StopMonitoring.class).execute(new CommandExecutor<StopMonitoring, Nothing>() { @Override public Qualifier<StopMonitoring> getQualifier() { return Qualifier.of(StopMonitoring.class); } @Override public Nothing execute(StopMonitoring command, NodeContext nodeContext) { log.debug("StopMonitoring command received on node {}", nodeContext.getId()); String processId = command.getProcessId(); MonitorProcess process = processes.get(processId); log.debug("Going to stop MonitorProcess with id {}", processId); process.stop(); return Nothing.INSTANCE; } }); } private static String generateProcessId() { return "process-" + System.nanoTime(); } @Required public void setExecutor(ExecutorService executor) { this.executor = executor; } @Required public void setCoordinator(Coordinator coordinator) { this.coordinator = coordinator; } @Required public void setPollingInterval(long pollingInterval) { this.pollingInterval = pollingInterval; } @Required public void setMonitoringProcessor(MonitoringProcessor monitoringProcessor) { this.monitoringProcessor = monitoringProcessor; } @Required public void setLogWriter(LogWriter logWriter) { this.logWriter = logWriter; } public void setProfilerPollingInterval(long profilerPollingInterval) { this.profilerPollingInterval = profilerPollingInterval; } public final void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public SessionFactory getSessionFactory() { return sessionFactory; } public void setTtl(Timeout ttl) { this.ttl = ttl; } public Timeout getTtl() { return ttl; } }