/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.vm.settings; /* * #%L * Intuit Tank Api * %% * 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.io.Serializable; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.annotation.Nonnull; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * VmManagerConfig * * @author dangleton * */ public class AgentConfig implements Serializable { private static final long serialVersionUID = 1L; private static final Logger LOG = LogManager.getLogger(AgentConfig.class); private static final String KEY_AGENT_DATA_FILE_STORAGE = "agent-data-file-storage"; private static final String KEY_TANK_CLIENT_DEFUALT = "default-tank-client"; private static final String KEY_MAX_BODY_REPORT_SIZE = "max-body-report-size"; private static final String KEY_SSL_TIMEOUT = "ssl-timeout"; private static final String KEY_MAX_RESPONSE_TIME = "max-response-time"; private static final String KEY_TPS_PERIOD = "tps-period"; private static final String KEY_VALID_MIME_TYPES = "valid-mime-types/mime-type-regex"; private static final String KEY_TANK_HTTP_CLIENTS = "tank-http-clients/tank-client"; private static final String KEY_POLL_TIME_MILIS = "status_report_interval_milis"; private static final String KEY_MAX_FAILED_WAIT_TIME = "max-failed-wait-time"; private static final String KEY_OVER_SIMULATION_MAX_TIME = "over-simulation-max-time"; private static final String KEY_AGENT_PORT = "agent-port"; private static final String KEY_LOG_POST_RESPONSE = "log-post-response"; private static final String KEY_LOG_POST_REQUEST = "log-post-request"; private static final String KEY_LOG_VARIABLES = "log-variables"; private static final String KEY_CONNECTION_TIMEOUT = "connection-timeout"; private static final String KEY_REQUEST_HEADERS = "request-headers/header"; // private static final String KEY_RESULT_PROVIDERS = // "result-providers/provider"; private static final String KEY_HEADER_KEY = "@key"; // private static final String KEY_DISPLAY_NAME = "@displayName"; // private static final String KEY_DEFUALT = "@isDefault"; private static final String KEY_DURATION_SIMULATION = "duration-simulation/simulation"; private static final String KEY_MIN = "@min"; private static final String KEY_MAX = "@max"; private static final String KEY_FOR = "@for"; private static final String KEY_NAME = "@name"; private HierarchicalConfiguration config; private Set<String> validMimeTypes; private Map<String, String> resultsProviderMap; private Map<String, String> tankClientMap; private Map<String, String> requestHeaderMap; private Map<String, String> resultsTypeMap; private String defaultResultProvider; private Map<String, Range> minMaxMap; private Range defaultRange = new Range(50L, 300L); @SuppressWarnings("unchecked") public AgentConfig(@Nonnull HierarchicalConfiguration config) { this.config = config; validMimeTypes = new HashSet<String>(); List<HierarchicalConfiguration> validMimes = config.configurationsAt(KEY_VALID_MIME_TYPES); if (validMimes != null) { for (HierarchicalConfiguration c : validMimes) { validMimeTypes.add(c.getString("")); } } tankClientMap = new HashMap<String, String>(); // <tank-http-clients> // <tank-client name="Apache HttpClient // 3.1">com.intuit.tank.httpclient3.TankHttpClient3</tank-client> // <tank-client name="apache HttpClient // 4.5">com.intuit.tank.httpclient4.TankHttpClient4</tank-client> // <tank-http-clients> List<HierarchicalConfiguration> tankClients = config.configurationsAt(KEY_TANK_HTTP_CLIENTS); if (tankClients != null) { for (HierarchicalConfiguration c : tankClients) { tankClientMap.put(c.getString(KEY_NAME), c.getString("")); } } if (tankClientMap.isEmpty()) { tankClientMap.put("Apache HttpClient 3.1", "com.intuit.tank.httpclient3.TankHttpClient3"); tankClientMap.put("Apache HttpClient 4.5", "com.intuit.tank.httpclient4.TankHttpClient4"); } resultsProviderMap = new HashMap<String, String>(); resultsTypeMap = new HashMap<String, String>(); requestHeaderMap = new HashMap<String, String>(); List<HierarchicalConfiguration> requestHeaders = config.configurationsAt(KEY_REQUEST_HEADERS); if (requestHeaders != null) { for (HierarchicalConfiguration c : requestHeaders) { String key = c.getString(KEY_HEADER_KEY); requestHeaderMap.put(key, c.getString("")); } } minMaxMap = new HashMap<String, Range>(); List<HierarchicalConfiguration> durations = config.configurationsAt(KEY_DURATION_SIMULATION); if (durations != null) { for (HierarchicalConfiguration c : durations) { try { String key = c.getString(KEY_FOR).trim(); int min = c.getInt(KEY_MIN); int max = c.getInt(KEY_MAX); Range r = new Range(min, max); minMaxMap.put(key.toLowerCase(), r); } catch (Exception e) { LOG.warn("Error parsing duration: " + e); } } } if (!minMaxMap.containsKey("post")) { minMaxMap.put("post", new Range(500L, 1000L)); } if (!minMaxMap.containsKey("get")) { minMaxMap.put("get", new Range(50L, 300L)); } if (!minMaxMap.containsKey("process")) { minMaxMap.put("process", new Range(10L, 50L)); } } /** * @return the requestHeaderMap */ public Map<String, String> getRequestHeaderMap() { return requestHeaderMap; } public Range getRange(String type) { Range ret = minMaxMap.get(type.toLowerCase()); return ret != null ? ret : defaultRange; } /** * @return the defaultResultProvider */ public String getDefaultResultProvider() { return defaultResultProvider; } /** * @return the resultsTypeMap */ public Map<String, String> getResultsTypeMap() { return resultsTypeMap; } /** * @param resultsTypeMap * the resultsTypeMap to set */ public void setResultsTypeMap(Map<String, String> resultsTypeMap) { this.resultsTypeMap = resultsTypeMap; } /** * @param results */ public String getResultsProviderClass(String providerKey) { return resultsProviderMap.get(providerKey); } /** * * @return */ public Long getConnectionTimeout() { return config.getLong(KEY_CONNECTION_TIMEOUT, 40000L); } /** * * @return */ public int getTPSPeriod() { return config.getInt(KEY_TPS_PERIOD, 15); } /** * @return the Datafile storage root dir */ public int getAgentPort() { return config.getInt(KEY_AGENT_PORT, 8090); } /** * * @return whether to log each post request info. */ public boolean getLogPostRequest() { return config.getBoolean(KEY_LOG_POST_REQUEST, false); } /** * * @return whether to log each post request info. */ public boolean getLogVariables() { return config.getBoolean(KEY_LOG_VARIABLES, false); } /** * * @return */ public boolean getLogPostResponse() { return config.getBoolean(KEY_LOG_POST_RESPONSE, false); } /** * @return the Datafile storage root dir */ public String getAgentDataFileStorageDir() { return config.getString(KEY_AGENT_DATA_FILE_STORAGE, "/tmp"); } /** * @return the SSL Timeout */ public long getSSLTimeout() { return config.getLong(KEY_SSL_TIMEOUT, 90000L); } /** * @return the Max amount of time to wait for a response to a request */ public long getMaxAgentResponseTime() { return config.getLong(KEY_MAX_RESPONSE_TIME, 5000L); } /** * @return the Max amount of time to wait for a response to a request */ public long getMaxAgentWaitTime() { return config.getLong(KEY_MAX_FAILED_WAIT_TIME, 180000L); } /** * @return the Max amount of time to allow a thread to run after simulation * time has been met */ public long getOverSimulationMaxTime() { return config.getLong(KEY_OVER_SIMULATION_MAX_TIME, (1000 * 60 * 60 * 2)); } /** * @return */ public int getMaxBodyReportSize() { return config.getInt(KEY_MAX_BODY_REPORT_SIZE, 5000); } /** * Gets the valid regex patterns for text mime types. * * @return */ public Collection<String> getTextMimeTypeRegex() { return validMimeTypes; } /** * @return the Datafile storage root dir */ public String getTankClientDefault() { return config.getString(KEY_TANK_CLIENT_DEFUALT, "Apache HttpClient 4.5"); } /** * @return the Datafile storage root dir */ public String getTankClientClassDefault() { String ret = getTankClientMap().get(getTankClientDefault()); return ret != null ? ret : "com.intuit.tank.httpclient4.TankHttpClient4"; } /** * @return the Datafile storage root dir */ public String getTankClientName(String clientClass) { String ret = getTankClientDefault(); for (Entry<String, String> entry : getTankClientMap().entrySet()) { if (entry.getValue().equals(clientClass)) { ret = entry.getKey(); break; } } return ret; } /** * @return the tankClientMap map of Tank Client name and class */ public Map<String, String> getTankClientMap() { return tankClientMap; } /** * @param pollTime * @return */ public long getStatusReportIntervalMilis(long pollTime) { return config.getLong(KEY_POLL_TIME_MILIS, pollTime); } }