2323import com .netflix .hystrix .HystrixCommandKey ;
2424import com .netflix .hystrix .HystrixCommandMetrics ;
2525import com .netflix .hystrix .HystrixCommandProperties ;
26+ import com .netflix .hystrix .HystrixEventType ;
2627import com .netflix .hystrix .strategy .metrics .HystrixMetricsPublisherCommand ;
27- import com .netflix .hystrix .util .HystrixRollingNumberEvent ;
2828import com .netflix .servo .DefaultMonitorRegistry ;
2929import com .netflix .servo .annotations .DataSourceLevel ;
3030import com .netflix .servo .monitor .BasicCompositeMonitor ;
3131import com .netflix .servo .monitor .Monitor ;
3232import com .netflix .servo .monitor .MonitorConfig ;
3333import 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