(TK-316) Create subclasses for ClientTimer

This commit is contained in:
Chris Price 2016-05-04 16:48:29 -07:00
parent e403b2abc8
commit bf5ef21454
8 changed files with 117 additions and 73 deletions

View file

@ -2,8 +2,11 @@ package com.puppetlabs.http.client.impl.metrics;
import com.codahale.metrics.MetricFilter; import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.Metric; import com.codahale.metrics.Metric;
import com.puppetlabs.http.client.metrics.MetricIdClientTimer;
import com.puppetlabs.http.client.metrics.Metrics; import com.puppetlabs.http.client.metrics.Metrics;
import com.puppetlabs.http.client.metrics.ClientTimer; import com.puppetlabs.http.client.metrics.ClientTimer;
import com.puppetlabs.http.client.metrics.UrlAndMethodClientTimer;
import com.puppetlabs.http.client.metrics.UrlClientTimer;
import java.util.ArrayList; import java.util.ArrayList;
@ -14,6 +17,8 @@ public class ClientMetricFilter implements MetricFilter{
private ArrayList<String> metricId; private ArrayList<String> metricId;
private Metrics.MetricType metricType; private Metrics.MetricType metricType;
// TODO: break this class up into two or more filter classes; it's combining a lot of logic at the moment
public ClientMetricFilter(String category, Metrics.MetricType metricType) { public ClientMetricFilter(String category, Metrics.MetricType metricType) {
this.category = category; this.category = category;
this.metricType = metricType; this.metricType = metricType;
@ -32,20 +37,40 @@ public class ClientMetricFilter implements MetricFilter{
if ( metric.getMetricType().equals(metricType) ) { if ( metric.getMetricType().equals(metricType) ) {
if ( category != null ) { if ( category != null ) {
switch (category) { switch (category) {
// TODO: we should be able to break this up into multiple methods that accept the more
// concrete types in their signatures
case Metrics.ID_NAMESPACE: case Metrics.ID_NAMESPACE:
return metric.getMetricId() != null; return metric instanceof MetricIdClientTimer;
case Metrics.URL_METHOD_NAMESPACE: case Metrics.URL_METHOD_NAMESPACE:
return metric.getMethod() != null; return metric instanceof UrlAndMethodClientTimer;
case Metrics.URL_NAMESPACE: case Metrics.URL_NAMESPACE:
return metric.getUrl() != null && metric.getMethod() == null; return (metric instanceof UrlClientTimer) &&
!(metric instanceof UrlAndMethodClientTimer);
} }
} else { } else {
if ( method != null ) { if ( method != null ) {
return url.equals(metric.getUrl()) && method.equals(metric.getMethod()) ; // TODO: we should be able to break this up into multiple methods that accept the more
if (metric instanceof UrlAndMethodClientTimer) {
UrlAndMethodClientTimer urlAndMethodClientTimer = (UrlAndMethodClientTimer) metric;
return url.equals(urlAndMethodClientTimer.getUrl()) && method.equals(urlAndMethodClientTimer.getMethod());
} else {
return false;
}
} else if ( url != null ) { } else if ( url != null ) {
return url.equals(metric.getUrl()) && metric.getMethod() == null; if ((metric instanceof UrlClientTimer) &&
!(metric instanceof UrlAndMethodClientTimer)) {
UrlClientTimer urlClientTimer = (UrlClientTimer) metric;
return url.equals(urlClientTimer.getUrl());
} else {
return false;
}
} else { } else {
return metricId.equals(metric.getMetricId()); if (metric instanceof MetricIdClientTimer) {
MetricIdClientTimer metricIdClientTimer = (MetricIdClientTimer) metric;
return metricId.equals(metricIdClientTimer.getMetricId());
} else {
return false;
}
} }
} }
} }

View file

@ -4,7 +4,10 @@ import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer; import com.codahale.metrics.Timer;
import com.puppetlabs.http.client.metrics.ClientTimer; import com.puppetlabs.http.client.metrics.ClientTimer;
import com.puppetlabs.http.client.metrics.MetricIdClientTimer;
import com.puppetlabs.http.client.metrics.Metrics; import com.puppetlabs.http.client.metrics.Metrics;
import com.puppetlabs.http.client.metrics.UrlAndMethodClientTimer;
import com.puppetlabs.http.client.metrics.UrlClientTimer;
import org.apache.http.HttpRequest; import org.apache.http.HttpRequest;
import org.apache.http.RequestLine; import org.apache.http.RequestLine;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -53,7 +56,7 @@ public class TimerUtils {
String metric_name = MetricRegistry.name(Metrics.METRIC_NAMESPACE, String metric_name = MetricRegistry.name(Metrics.METRIC_NAMESPACE,
currentIdWithNamespace.toArray(new String[currentIdWithNamespace.size()])); currentIdWithNamespace.toArray(new String[currentIdWithNamespace.size()]));
ClientTimer timer = new ClientTimer(metric_name, currentId, Metrics.MetricType.FULL_RESPONSE); ClientTimer timer = new MetricIdClientTimer(metric_name, currentId, Metrics.MetricType.FULL_RESPONSE);
timerContexts.add(getOrAddTimer(registry, metric_name, timer).time()); timerContexts.add(getOrAddTimer(registry, metric_name, timer).time());
} }
return timerContexts; return timerContexts;
@ -72,10 +75,10 @@ public class TimerUtils {
final String urlAndMethodName = MetricRegistry.name(Metrics.METRIC_NAMESPACE, Metrics.URL_METHOD_NAMESPACE, final String urlAndMethodName = MetricRegistry.name(Metrics.METRIC_NAMESPACE, Metrics.URL_METHOD_NAMESPACE,
strippedUrl, method, Metrics.FULL_RESPONSE_STRING); strippedUrl, method, Metrics.FULL_RESPONSE_STRING);
ClientTimer urlTimer = new ClientTimer(urlName, strippedUrl, Metrics.MetricType.FULL_RESPONSE); ClientTimer urlTimer = new UrlClientTimer(urlName, strippedUrl, Metrics.MetricType.FULL_RESPONSE);
timerContexts.add(getOrAddTimer(registry, urlName, urlTimer).time()); timerContexts.add(getOrAddTimer(registry, urlName, urlTimer).time());
ClientTimer urlMethodTimer = new ClientTimer(urlAndMethodName, strippedUrl, ClientTimer urlMethodTimer = new UrlAndMethodClientTimer(urlAndMethodName, strippedUrl,
method, Metrics.MetricType.FULL_RESPONSE); method, Metrics.MetricType.FULL_RESPONSE);
timerContexts.add(getOrAddTimer(registry, urlAndMethodName, urlMethodTimer).time()); timerContexts.add(getOrAddTimer(registry, urlAndMethodName, urlMethodTimer).time());
} catch (URISyntaxException e) { } catch (URISyntaxException e) {

View file

@ -1,6 +1,6 @@
package com.puppetlabs.http.client.metrics; package com.puppetlabs.http.client.metrics;
import java.util.ArrayList; import java.util.List;
public class ClientMetricData { public class ClientMetricData {
private String metricName; private String metricName;
@ -9,10 +9,10 @@ public class ClientMetricData {
private Long aggregate; private Long aggregate;
private String url; private String url;
private String method; private String method;
private ArrayList<String> metricId; private List<String> metricId;
ClientMetricData(String metricName, Long count, Long mean, Long aggregate, ClientMetricData(String metricName, Long count, Long mean, Long aggregate,
String url, String method, ArrayList<String> metricId) { String url, String method, List<String> metricId) {
this.metricName = metricName; this.metricName = metricName;
this.count = count; this.count = count;
this.mean = mean; this.mean = mean;
@ -46,7 +46,7 @@ public class ClientMetricData {
return method; return method;
} }
public ArrayList<String> getMetricId() { public List<String> getMetricId() {
return metricId; return metricId;
} }
} }

View file

@ -2,37 +2,14 @@ package com.puppetlabs.http.client.metrics;
import com.codahale.metrics.Timer; import com.codahale.metrics.Timer;
import java.util.ArrayList; public abstract class ClientTimer extends Timer {
private final String metricName;
public class ClientTimer extends Timer { private final Metrics.MetricType metricType;
private String metricName;
private String url;
private String method;
private ArrayList<String> metricId;
private Metrics.MetricType metricType; ClientTimer(String metricName, Metrics.MetricType metricType) {
public ClientTimer(String metricName, String url, Metrics.MetricType metricType) {
super(); super();
this.metricName = metricName; this.metricName = metricName;
this.url = url;
this.metricType = metricType;
}
public ClientTimer(String metricName, String url, String method,
Metrics.MetricType metricType) {
super();
this.metricName = metricName;
this.url = url;
this.method = method;
this.metricType = metricType;
}
public ClientTimer(String metricName, ArrayList<String> metricId,
Metrics.MetricType metricType) {
super();
this.metricName = metricName;
this.metricId = metricId;
this.metricType = metricType; this.metricType = metricType;
} }
@ -40,18 +17,6 @@ public class ClientTimer extends Timer {
return metricName; return metricName;
} }
public String getUrl() {
return url;
}
public String getMethod() {
return method;
}
public ArrayList<String> getMetricId() {
return metricId;
}
public Metrics.MetricType getMetricType() { public Metrics.MetricType getMetricType() {
return metricType; return metricType;
} }

View file

@ -0,0 +1,19 @@
package com.puppetlabs.http.client.metrics;
import java.util.ArrayList;
import java.util.List;
public class MetricIdClientTimer extends ClientTimer {
private final List<String> metricId;
public MetricIdClientTimer(String metricName, List<String> metricId,
Metrics.MetricType metricType) {
super(metricName, metricType);
this.metricId = metricId;
}
public List<String> getMetricId() {
return metricId;
}
}

View file

@ -9,6 +9,7 @@ import java.net.URISyntaxException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -27,8 +28,8 @@ public class Metrics {
return convertedUri.toString(); return convertedUri.toString();
} }
public static ArrayList<ClientTimer> getClientTimerArray(Map<String, Timer> timers){ public static List<ClientTimer> getClientTimerArray(Map<String, Timer> timers){
ArrayList<ClientTimer> timerArray = new ArrayList<>(); List<ClientTimer> timerArray = new ArrayList<>();
for (Map.Entry<String, Timer> entry : timers.entrySet()) { for (Map.Entry<String, Timer> entry : timers.entrySet()) {
ClientTimer timer = (ClientTimer)entry.getValue(); ClientTimer timer = (ClientTimer)entry.getValue();
timerArray.add(timer); timerArray.add(timer);
@ -36,9 +37,9 @@ public class Metrics {
return timerArray; return timerArray;
} }
public static Map<String, ArrayList<ClientTimer>> getClientMetrics(MetricRegistry metricRegistry){ public static Map<String, List<ClientTimer>> getClientMetrics(MetricRegistry metricRegistry){
if (metricRegistry != null) { if (metricRegistry != null) {
Map<String, ArrayList<ClientTimer>> timers = new HashMap<>(); Map<String, List<ClientTimer>> timers = new HashMap<>();
timers.put("url", getClientTimerArray(metricRegistry.getTimers( timers.put("url", getClientTimerArray(metricRegistry.getTimers(
new ClientMetricFilter(URL_NAMESPACE, MetricType.FULL_RESPONSE)))); new ClientMetricFilter(URL_NAMESPACE, MetricType.FULL_RESPONSE))));
timers.put("url-and-method", getClientTimerArray(metricRegistry.getTimers( timers.put("url-and-method", getClientTimerArray(metricRegistry.getTimers(
@ -51,7 +52,7 @@ public class Metrics {
} }
} }
public static ArrayList<ClientTimer> getClientMetricsByUrl(MetricRegistry metricRegistry, public static List<ClientTimer> getClientMetricsByUrl(MetricRegistry metricRegistry,
final String url){ final String url){
if (metricRegistry != null) { if (metricRegistry != null) {
Map<String, Timer> timers = metricRegistry.getTimers( Map<String, Timer> timers = metricRegistry.getTimers(
@ -62,7 +63,7 @@ public class Metrics {
} }
} }
public static ArrayList<ClientTimer> getClientMetricsByUrlAndMethod(MetricRegistry metricRegistry, public static List<ClientTimer> getClientMetricsByUrlAndMethod(MetricRegistry metricRegistry,
final String url, final String url,
final String method){ final String method){
if (metricRegistry != null) { if (metricRegistry != null) {
@ -74,7 +75,7 @@ public class Metrics {
} }
} }
public static ArrayList<ClientTimer> getClientMetricsByMetricId(MetricRegistry metricRegistry, public static List<ClientTimer> getClientMetricsByMetricId(MetricRegistry metricRegistry,
final String[] metricId){ final String[] metricId){
if (metricRegistry != null) { if (metricRegistry != null) {
if (metricId.length == 0) { if (metricId.length == 0) {
@ -93,18 +94,20 @@ public class Metrics {
} }
} }
public static ArrayList<ClientMetricData> computeClientMetricsData(ArrayList<ClientTimer> timers){ public static List<ClientMetricData> computeClientMetricsData(List<ClientTimer> timers){
if (timers != null) { if (timers != null) {
ArrayList<ClientMetricData> metricsData = new ArrayList<>(); List<ClientMetricData> metricsData = new ArrayList<>();
for (ClientTimer timer: timers) { for (ClientTimer timer: timers) {
Double mean = timer.getSnapshot().getMean(); Double mean = timer.getSnapshot().getMean();
Long meanMillis = TimeUnit.NANOSECONDS.toMillis(mean.longValue()); Long meanMillis = TimeUnit.NANOSECONDS.toMillis(mean.longValue());
Long count = timer.getCount(); Long count = timer.getCount();
Long aggregate = count * meanMillis; Long aggregate = count * meanMillis;
String metricName = timer.getMetricName(); String metricName = timer.getMetricName();
String url = timer.getUrl(); // TODO: create subclasses of ClientMetricData to prevent null values from being necessary,
String method = timer.getMethod(); // refactor into methods with types in signatures to get rid of instanceof stuff.
ArrayList<String> metricId = timer.getMetricId(); String url = timer instanceof UrlClientTimer ? ((UrlClientTimer)(timer)).getUrl() : null;
String method = timer instanceof UrlAndMethodClientTimer ? ((UrlAndMethodClientTimer)(timer)).getMethod() : null;
List<String> metricId = timer instanceof MetricIdClientTimer ? ((MetricIdClientTimer)(timer)).getMetricId() : null;
ClientMetricData data = new ClientMetricData(metricName, count, meanMillis, ClientMetricData data = new ClientMetricData(metricName, count, meanMillis,
aggregate, url, method, metricId); aggregate, url, method, metricId);
@ -116,10 +119,10 @@ public class Metrics {
} }
} }
public static Map<String, ArrayList<ClientMetricData>> getClientMetricsData(MetricRegistry metricRegistry){ public static Map<String, List<ClientMetricData>> getClientMetricsData(MetricRegistry metricRegistry){
if ( metricRegistry != null ) { if ( metricRegistry != null ) {
Map<String, ArrayList<ClientTimer>> timers = getClientMetrics(metricRegistry); Map<String, List<ClientTimer>> timers = getClientMetrics(metricRegistry);
Map<String, ArrayList<ClientMetricData>> data = new HashMap<>(); Map<String, List<ClientMetricData>> data = new HashMap<>();
data.put("url", computeClientMetricsData(timers.get("url"))); data.put("url", computeClientMetricsData(timers.get("url")));
data.put("url-and-method", computeClientMetricsData(timers.get("url-and-method"))); data.put("url-and-method", computeClientMetricsData(timers.get("url-and-method")));
data.put("metric-id", computeClientMetricsData(timers.get("metric-id"))); data.put("metric-id", computeClientMetricsData(timers.get("metric-id")));
@ -129,22 +132,22 @@ public class Metrics {
} }
} }
public static ArrayList<ClientMetricData> getClientMetricsDataByUrl(MetricRegistry metricRegistry, public static List<ClientMetricData> getClientMetricsDataByUrl(MetricRegistry metricRegistry,
String url){ String url){
ArrayList<ClientTimer> timers = getClientMetricsByUrl(metricRegistry, url); List<ClientTimer> timers = getClientMetricsByUrl(metricRegistry, url);
return computeClientMetricsData(timers); return computeClientMetricsData(timers);
} }
public static ArrayList<ClientMetricData> getClientMetricsDataByUrlAndMethod(MetricRegistry metricRegistry, public static List<ClientMetricData> getClientMetricsDataByUrlAndMethod(MetricRegistry metricRegistry,
String url, String url,
String method){ String method){
ArrayList<ClientTimer> timers = getClientMetricsByUrlAndMethod(metricRegistry, url, method); List<ClientTimer> timers = getClientMetricsByUrlAndMethod(metricRegistry, url, method);
return computeClientMetricsData(timers); return computeClientMetricsData(timers);
} }
public static ArrayList<ClientMetricData> getClientMetricsDataByMetricId(MetricRegistry metricRegistry, public static List<ClientMetricData> getClientMetricsDataByMetricId(MetricRegistry metricRegistry,
String[] metricId){ String[] metricId){
ArrayList<ClientTimer> timers = getClientMetricsByMetricId(metricRegistry, metricId); List<ClientTimer> timers = getClientMetricsByMetricId(metricRegistry, metricId);
return computeClientMetricsData(timers); return computeClientMetricsData(timers);
} }
} }

View file

@ -0,0 +1,15 @@
package com.puppetlabs.http.client.metrics;
public class UrlAndMethodClientTimer extends UrlClientTimer {
private final String method;
public UrlAndMethodClientTimer(String metricName, String url, String method,
Metrics.MetricType metricType) {
super(metricName, url, metricType);
this.method = method;
}
public String getMethod() {
return method;
}
}

View file

@ -0,0 +1,14 @@
package com.puppetlabs.http.client.metrics;
public class UrlClientTimer extends ClientTimer {
private final String url;
public UrlClientTimer(String metricName, String url, Metrics.MetricType metricType) {
super(metricName, metricType);
this.url = url;
}
public String getUrl() {
return url;
}
}