package com.apigee.sdk.apm.android; import com.apigee.sdk.apm.android.model.ClientNetworkMetrics; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; /** * @y.exclude */ public class NetworkMetricsCollector implements NetworkMetricsCollectorService { public final static int MAX_NUM_METRICS = 100; private ApigeeActiveSettings activeSettings; ArrayList<ClientNetworkMetrics> metrics; public Collection<ClientNetworkMetrics> getMetrics() { return metrics; } public NetworkMetricsCollector(ApigeeActiveSettings activeSettings) { this.activeSettings = activeSettings; initializeMetrics(); } private void initializeMetrics() { metrics = new ArrayList<ClientNetworkMetrics>(); clear(); } public void analyze(String url, long start, long end, boolean error, Map<String,Object> httpHeaders) { // is monitoring paused? ApigeeMonitoringClient client = ApigeeMonitoringClient.getInstance(); if (client != null) { if (client.isPaused()) { return; } } long latency = end - start; ClientNetworkMetrics metric = new ClientNetworkMetrics(); metric.setUrl(url); metric.setAppConfigType(this.activeSettings.getActiveConfigType()); metric.setStartTime(new Date(start)); metric.setEndTime(new Date(end)); metric.setLatency(new Long(latency)); metric.setNumSamples(new Long(1)); if( httpHeaders != null ) { Integer statusCode = (Integer) httpHeaders.get(ClientNetworkMetrics.HttpStatusCode); Long responseDataSize = (Long) httpHeaders.get(ClientNetworkMetrics.HttpContentLength); Date serverResponseTime = (Date) httpHeaders.get(ClientNetworkMetrics.HeaderResponseTime); Date serverReceiptTime = (Date) httpHeaders.get(ClientNetworkMetrics.HeaderReceiptTime); Long serverProcessingTime = (Long) httpHeaders.get(ClientNetworkMetrics.HeaderProcessingTime); String serverId = (String) httpHeaders.get(ClientNetworkMetrics.HeaderServerId); metric.setHttpStatusCode(statusCode); metric.setResponseDataSize(responseDataSize); metric.setServerResponseTime(serverResponseTime); metric.setServerReceiptTime(serverReceiptTime); metric.setServerProcessingTime(serverProcessingTime); metric.setServerId(serverId); } // Note - the request was an error, metrics collector will not // consider the latency associated with the request. // TODO: Need to get crisp what type of errors. e.g. Time yes, but // Data errors, no if (error) { metric.setNumErrors(new Long(1)); } else { metric.setNumErrors(new Long(0)); } synchronized(metrics) { if( ! this.isMaxedSize() ) { metrics.add(metric); } } } /** * Discards any metrics that have already been collected. */ public void clear() { if (metrics != null) { synchronized(metrics) { metrics.clear(); } } } public List<ClientNetworkMetrics> flush() { List<ClientNetworkMetrics> populatedMetrics = null; if( metrics != null ) { synchronized(metrics) { populatedMetrics = new ArrayList<ClientNetworkMetrics>(metrics.size()); for (ClientNetworkMetrics metricsBean : metrics) { populatedMetrics.add((ClientNetworkMetrics) metricsBean .clone()); } } clear(); } else { populatedMetrics = new ArrayList<ClientNetworkMetrics>(); } return populatedMetrics; } public List<ClientNetworkMetrics> getPopulatedMetrics() { List<ClientNetworkMetrics> populatedMetrics = null; if( metrics != null ) { synchronized(metrics) { populatedMetrics = new ArrayList<ClientNetworkMetrics>(metrics); } } else { populatedMetrics = new ArrayList<ClientNetworkMetrics>(); } return populatedMetrics; } public ApigeeActiveSettings getActiveSettings() { return this.activeSettings; } /** * @return the isMaxedSize */ public boolean isMaxedSize() { boolean isMaxedSize = false; if (metrics != null) { synchronized(metrics) { isMaxedSize = metrics.size() >= MAX_NUM_METRICS; } } return isMaxedSize; } @Override public long getNumSamples() { long sum = 0; if (metrics != null) { synchronized(metrics) { sum = metrics.size(); } } return sum; } public boolean haveSamples() { if (metrics != null) { synchronized(metrics) { if( metrics.size() > 0 ) { return true; } } } return false; } }