Skip to content

Commit dd0dc34

Browse files
committed
Merge pull request #910 from mattrjacobs/servo-metrics-abstraction
Adding a layer of abstraction to Servo integration for Hystrix command metrics that doesn't assume a specific implementation
2 parents a8b064d + a97cc6a commit dd0dc34

File tree

3 files changed

+228
-149
lines changed

3 files changed

+228
-149
lines changed

hystrix-contrib/hystrix-servo-metrics-publisher/src/main/java/com/netflix/hystrix/contrib/servopublisher/HystrixServoMetricsPublisherAbstract.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package com.netflix.hystrix.contrib.servopublisher;
1717

18-
import com.netflix.hystrix.HystrixCommandMetrics;
1918
import com.netflix.hystrix.HystrixMetrics;
2019
import com.netflix.hystrix.util.HystrixRollingNumberEvent;
2120
import com.netflix.servo.annotations.DataSourceLevel;

hystrix-contrib/hystrix-servo-metrics-publisher/src/main/java/com/netflix/hystrix/contrib/servopublisher/HystrixServoMetricsPublisherCommand.java

Lines changed: 104 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,20 @@
2323
import com.netflix.hystrix.HystrixCommandKey;
2424
import com.netflix.hystrix.HystrixCommandMetrics;
2525
import com.netflix.hystrix.HystrixCommandProperties;
26+
import com.netflix.hystrix.HystrixEventType;
2627
import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisherCommand;
27-
import com.netflix.hystrix.util.HystrixRollingNumberEvent;
2828
import com.netflix.servo.DefaultMonitorRegistry;
2929
import com.netflix.servo.annotations.DataSourceLevel;
3030
import com.netflix.servo.monitor.BasicCompositeMonitor;
3131
import com.netflix.servo.monitor.Monitor;
3232
import com.netflix.servo.monitor.MonitorConfig;
3333
import com.netflix.servo.tag.Tag;
34+
import rx.functions.Func0;
3435

3536
/**
36-
* Implementation of {@link HystrixMetricsPublisherCommand} using Servo (https://github.com/Netflix/servo)
37+
* Concrete Implementation of {@link HystrixMetricsPublisherCommand} using Servo (https://github.com/Netflix/servo)
3738
*/
38-
public class HystrixServoMetricsPublisherCommand extends HystrixServoMetricsPublisherAbstract implements HystrixMetricsPublisherCommand {
39+
public class HystrixServoMetricsPublisherCommand extends HystrixServoMetricsPublisherCommandAbstract implements HystrixMetricsPublisherCommand {
3940

4041
private final HystrixCommandKey key;
4142
private final HystrixCommandGroupKey commandGroupKey;
@@ -111,6 +112,50 @@ protected Tag getServoInstanceTag() {
111112
return servoInstanceTag;
112113
}
113114

115+
@Override
116+
protected long getCumulativeCount(HystrixEventType event) {
117+
return metrics.getCumulativeCount(getRollingNumberTypeFromEventType(event));
118+
}
119+
120+
@Override
121+
protected long getRollingCount(HystrixEventType event) {
122+
return metrics.getRollingCount(getRollingNumberTypeFromEventType(event));
123+
}
124+
125+
@Override
126+
protected int getExecutionLatencyMean() {
127+
return metrics.getExecutionTimeMean();
128+
}
129+
130+
@Override
131+
protected int getExecutionLatencyPercentile(double percentile) {
132+
return metrics.getExecutionTimePercentile(percentile);
133+
}
134+
135+
@Override
136+
protected int getTotalLatencyMean() {
137+
return metrics.getTotalTimeMean();
138+
}
139+
140+
@Override
141+
protected int getTotalLatencyPercentile(double percentile) {
142+
return metrics.getTotalTimePercentile(percentile);
143+
}
144+
145+
private final Func0<Number> currentConcurrentExecutionCountThunk = new Func0<Number>() {
146+
@Override
147+
public Integer call() {
148+
return metrics.getCurrentConcurrentExecutionCount();
149+
}
150+
};
151+
152+
private final Func0<Number> errorPercentageThunk = new Func0<Number>() {
153+
@Override
154+
public Integer call() {
155+
return metrics.getHealthCounts().getErrorPercentage();
156+
}
157+
};
158+
114159
/**
115160
* Servo will flatten metric names as: getServoTypeTag()_getServoInstanceTag()_monitorName
116161
*/
@@ -134,153 +179,64 @@ public Number getValue() {
134179
});
135180

136181
// cumulative counts
137-
monitors.add(getCumulativeCountForEvent("countBadRequests", metrics, HystrixRollingNumberEvent.BAD_REQUEST));
138-
monitors.add(getCumulativeCountForEvent("countCollapsedRequests", metrics, HystrixRollingNumberEvent.COLLAPSED));
139-
monitors.add(getCumulativeCountForEvent("countEmit", metrics, HystrixRollingNumberEvent.EMIT));
140-
monitors.add(getCumulativeCountForEvent("countExceptionsThrown", metrics, HystrixRollingNumberEvent.EXCEPTION_THROWN));
141-
monitors.add(getCumulativeCountForEvent("countFailure", metrics, HystrixRollingNumberEvent.FAILURE));
142-
monitors.add(getCumulativeCountForEvent("countFallbackEmit", metrics, HystrixRollingNumberEvent.FALLBACK_EMIT));
143-
monitors.add(getCumulativeCountForEvent("countFallbackFailure", metrics, HystrixRollingNumberEvent.FALLBACK_FAILURE));
144-
monitors.add(getCumulativeCountForEvent("countFallbackRejection", metrics, HystrixRollingNumberEvent.FALLBACK_REJECTION));
145-
monitors.add(getCumulativeCountForEvent("countFallbackSuccess", metrics, HystrixRollingNumberEvent.FALLBACK_SUCCESS));
146-
monitors.add(getCumulativeCountForEvent("countResponsesFromCache", metrics, HystrixRollingNumberEvent.RESPONSE_FROM_CACHE));
147-
monitors.add(getCumulativeCountForEvent("countSemaphoreRejected", metrics, HystrixRollingNumberEvent.SEMAPHORE_REJECTED));
148-
monitors.add(getCumulativeCountForEvent("countShortCircuited", metrics, HystrixRollingNumberEvent.SHORT_CIRCUITED));
149-
monitors.add(getCumulativeCountForEvent("countSuccess", metrics, HystrixRollingNumberEvent.SUCCESS));
150-
monitors.add(getCumulativeCountForEvent("countThreadPoolRejected", metrics, HystrixRollingNumberEvent.THREAD_POOL_REJECTED));
151-
monitors.add(getCumulativeCountForEvent("countTimeout", metrics, HystrixRollingNumberEvent.TIMEOUT));
182+
monitors.add(getCumulativeMonitor("countBadRequests", HystrixEventType.BAD_REQUEST));
183+
monitors.add(getCumulativeMonitor("countCollapsedRequests", HystrixEventType.COLLAPSED));
184+
monitors.add(getCumulativeMonitor("countEmit", HystrixEventType.EMIT));
185+
monitors.add(getCumulativeMonitor("countExceptionsThrown", HystrixEventType.EXCEPTION_THROWN));
186+
monitors.add(getCumulativeMonitor("countFailure", HystrixEventType.FAILURE));
187+
monitors.add(getCumulativeMonitor("countFallbackEmit", HystrixEventType.FALLBACK_EMIT));
188+
monitors.add(getCumulativeMonitor("countFallbackFailure", HystrixEventType.FALLBACK_FAILURE));
189+
monitors.add(getCumulativeMonitor("countFallbackRejection", HystrixEventType.FALLBACK_REJECTION));
190+
monitors.add(getCumulativeMonitor("countFallbackSuccess", HystrixEventType.FALLBACK_SUCCESS));
191+
monitors.add(getCumulativeMonitor("countResponsesFromCache", HystrixEventType.RESPONSE_FROM_CACHE));
192+
monitors.add(getCumulativeMonitor("countSemaphoreRejected", HystrixEventType.SEMAPHORE_REJECTED));
193+
monitors.add(getCumulativeMonitor("countShortCircuited", HystrixEventType.SHORT_CIRCUITED));
194+
monitors.add(getCumulativeMonitor("countSuccess", HystrixEventType.SUCCESS));
195+
monitors.add(getCumulativeMonitor("countThreadPoolRejected", HystrixEventType.THREAD_POOL_REJECTED));
196+
monitors.add(getCumulativeMonitor("countTimeout", HystrixEventType.TIMEOUT));
152197

153198
// rolling counts
154-
monitors.add(getRollingCountForEvent("rollingCountBadRequests", metrics, HystrixRollingNumberEvent.BAD_REQUEST));
155-
monitors.add(getRollingCountForEvent("rollingCountCollapsedRequests", metrics, HystrixRollingNumberEvent.COLLAPSED));
156-
monitors.add(getRollingCountForEvent("rollingCountEmit", metrics, HystrixRollingNumberEvent.EMIT));
157-
monitors.add(getRollingCountForEvent("rollingCountExceptionsThrown", metrics, HystrixRollingNumberEvent.EXCEPTION_THROWN));
158-
monitors.add(getRollingCountForEvent("rollingCountFailure", metrics, HystrixRollingNumberEvent.FAILURE));
159-
monitors.add(getRollingCountForEvent("rollingCountFallbackEmit", metrics, HystrixRollingNumberEvent.FALLBACK_EMIT));
160-
monitors.add(getRollingCountForEvent("rollingCountFallbackFailure", metrics, HystrixRollingNumberEvent.FALLBACK_FAILURE));
161-
monitors.add(getRollingCountForEvent("rollingCountFallbackRejection", metrics, HystrixRollingNumberEvent.FALLBACK_REJECTION));
162-
monitors.add(getRollingCountForEvent("rollingCountFallbackSuccess", metrics, HystrixRollingNumberEvent.FALLBACK_SUCCESS));
163-
monitors.add(getRollingCountForEvent("rollingCountResponsesFromCache", metrics, HystrixRollingNumberEvent.RESPONSE_FROM_CACHE));
164-
monitors.add(getRollingCountForEvent("rollingCountSemaphoreRejected", metrics, HystrixRollingNumberEvent.SEMAPHORE_REJECTED));
165-
monitors.add(getRollingCountForEvent("rollingCountShortCircuited", metrics, HystrixRollingNumberEvent.SHORT_CIRCUITED));
166-
monitors.add(getRollingCountForEvent("rollingCountSuccess", metrics, HystrixRollingNumberEvent.SUCCESS));
167-
monitors.add(getRollingCountForEvent("rollingCountThreadPoolRejected", metrics, HystrixRollingNumberEvent.THREAD_POOL_REJECTED));
168-
monitors.add(getRollingCountForEvent("rollingCountTimeout", metrics, HystrixRollingNumberEvent.TIMEOUT));
169-
170-
// the number of executionSemaphorePermits in use right now
171-
monitors.add(new GaugeMetric(MonitorConfig.builder("executionSemaphorePermitsInUse").build()) {
172-
@Override
173-
public Number getValue() {
174-
return metrics.getCurrentConcurrentExecutionCount();
175-
}
176-
});
177-
178-
// error percentage derived from current metrics
179-
monitors.add(new GaugeMetric(MonitorConfig.builder("errorPercentage").build()) {
180-
@Override
181-
public Number getValue() {
182-
return metrics.getHealthCounts().getErrorPercentage();
183-
}
184-
});
185-
186-
// latency metrics
187-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_mean").build()) {
188-
@Override
189-
public Number getValue() {
190-
return metrics.getExecutionTimeMean();
191-
}
192-
});
193-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_5").build()) {
194-
@Override
195-
public Number getValue() {
196-
return metrics.getExecutionTimePercentile(5);
197-
}
198-
});
199-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_25").build()) {
200-
@Override
201-
public Number getValue() {
202-
return metrics.getExecutionTimePercentile(25);
203-
}
204-
});
205-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_50").build()) {
206-
@Override
207-
public Number getValue() {
208-
return metrics.getExecutionTimePercentile(50);
209-
}
210-
});
211-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_75").build()) {
212-
@Override
213-
public Number getValue() {
214-
return metrics.getExecutionTimePercentile(75);
215-
}
216-
});
217-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_90").build()) {
218-
@Override
219-
public Number getValue() {
220-
return metrics.getExecutionTimePercentile(90);
221-
}
222-
});
223-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_99").build()) {
224-
@Override
225-
public Number getValue() {
226-
return metrics.getExecutionTimePercentile(99);
227-
}
228-
});
229-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyExecute_percentile_995").build()) {
230-
@Override
231-
public Number getValue() {
232-
return metrics.getExecutionTimePercentile(99.5);
233-
}
234-
});
235-
236-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_mean").build()) {
237-
@Override
238-
public Number getValue() {
239-
return metrics.getTotalTimeMean();
240-
}
241-
});
242-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_5").build()) {
243-
@Override
244-
public Number getValue() {
245-
return metrics.getTotalTimePercentile(5);
246-
}
247-
});
248-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_25").build()) {
249-
@Override
250-
public Number getValue() {
251-
return metrics.getTotalTimePercentile(25);
252-
}
253-
});
254-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_50").build()) {
255-
@Override
256-
public Number getValue() {
257-
return metrics.getTotalTimePercentile(50);
258-
}
259-
});
260-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_75").build()) {
261-
@Override
262-
public Number getValue() {
263-
return metrics.getTotalTimePercentile(75);
264-
}
265-
});
266-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_90").build()) {
267-
@Override
268-
public Number getValue() {
269-
return metrics.getTotalTimePercentile(90);
270-
}
271-
});
272-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_99").build()) {
273-
@Override
274-
public Number getValue() {
275-
return metrics.getTotalTimePercentile(99);
276-
}
277-
});
278-
monitors.add(new GaugeMetric(MonitorConfig.builder("latencyTotal_percentile_995").build()) {
279-
@Override
280-
public Number getValue() {
281-
return metrics.getTotalTimePercentile(99.5);
282-
}
283-
});
199+
monitors.add(getRollingMonitor("rollingCountBadRequests", HystrixEventType.BAD_REQUEST));
200+
monitors.add(getRollingMonitor("rollingCountCollapsedRequests", HystrixEventType.COLLAPSED));
201+
monitors.add(getRollingMonitor("rollingCountEmit", HystrixEventType.EMIT));
202+
monitors.add(getRollingMonitor("rollingCountExceptionsThrown", HystrixEventType.EXCEPTION_THROWN));
203+
monitors.add(getRollingMonitor("rollingCountFailure", HystrixEventType.FAILURE));
204+
monitors.add(getRollingMonitor("rollingCountFallbackEmit", HystrixEventType.FALLBACK_EMIT));
205+
monitors.add(getRollingMonitor("rollingCountFallbackFailure", HystrixEventType.FALLBACK_FAILURE));
206+
monitors.add(getRollingMonitor("rollingCountFallbackRejection", HystrixEventType.FALLBACK_REJECTION));
207+
monitors.add(getRollingMonitor("rollingCountFallbackSuccess", HystrixEventType.FALLBACK_SUCCESS));
208+
monitors.add(getRollingMonitor("rollingCountResponsesFromCache", HystrixEventType.RESPONSE_FROM_CACHE));
209+
monitors.add(getRollingMonitor("rollingCountSemaphoreRejected", HystrixEventType.SEMAPHORE_REJECTED));
210+
monitors.add(getRollingMonitor("rollingCountShortCircuited", HystrixEventType.SHORT_CIRCUITED));
211+
monitors.add(getRollingMonitor("rollingCountSuccess", HystrixEventType.SUCCESS));
212+
monitors.add(getRollingMonitor("rollingCountThreadPoolRejected", HystrixEventType.THREAD_POOL_REJECTED));
213+
monitors.add(getRollingMonitor("rollingCountTimeout", HystrixEventType.TIMEOUT));
214+
215+
// the number of executionSemaphorePermits in use right now
216+
monitors.add(getCurrentValueMonitor("executionSemaphorePermitsInUse", currentConcurrentExecutionCountThunk));
217+
218+
// error percentage derived from current metrics
219+
monitors.add(getCurrentValueMonitor("errorPercentage", errorPercentageThunk));
220+
221+
// execution latency metrics
222+
monitors.add(getExecutionLatencyMeanMonitor("latencyExecute_mean"));
223+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_5", 5));
224+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_25", 25));
225+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_50", 50));
226+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_75", 75));
227+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_90", 90));
228+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_99", 99));
229+
monitors.add(getExecutionLatencyPercentileMonitor("latencyExecute_percentile_995", 99.5));
230+
231+
// total latency metrics
232+
monitors.add(getTotalLatencyMeanMonitor("latencyTotal_mean"));
233+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_5", 5));
234+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_25", 25));
235+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_50", 50));
236+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_75", 75));
237+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_90", 90));
238+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_99", 99));
239+
monitors.add(getTotalLatencyPercentileMonitor("latencyTotal_percentile_995", 995));
284240

285241
// group
286242
monitors.add(new InformationalMetric<String>(MonitorConfig.builder("commandGroup").build()) {

0 commit comments

Comments
 (0)