All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.hystrix.metric.consumer.BucketedRollingCounterStream Maven / Gradle / Ivy

There is a newer version: 1.5.18
Show newest version
/**
 * Copyright 2015 Netflix, Inc.
 * 

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.netflix.hystrix.metric.consumer; import com.netflix.hystrix.metric.HystrixEvent; import com.netflix.hystrix.metric.HystrixEventStream; import rx.Observable; import rx.functions.Action0; import rx.functions.Func1; import rx.functions.Func2; import java.util.concurrent.atomic.AtomicBoolean; /** * Refinement of {@link BucketedCounterStream} which reduces numBuckets at a time. * * @param type of raw data that needs to get summarized into a bucket * @param type of data contained in each bucket * @param type of data emitted to stream subscribers (often is the same as A but does not have to be) */ public abstract class BucketedRollingCounterStream extends BucketedCounterStream { private Observable sourceStream; private final AtomicBoolean isSourceCurrentlySubscribed = new AtomicBoolean(false); protected BucketedRollingCounterStream(HystrixEventStream stream, final int numBuckets, int bucketSizeInMs, final Func2 appendRawEventToBucket, final Func2 reduceBucket) { super(stream, numBuckets, bucketSizeInMs, appendRawEventToBucket); Func1, Observable> reduceWindowToSummary = new Func1, Observable>() { @Override public Observable call(Observable window) { return window.scan(getEmptyOutputValue(), reduceBucket).skip(numBuckets); } }; this.sourceStream = bucketedStream //stream broken up into buckets .window(numBuckets, 1) //emit overlapping windows of buckets .flatMap(reduceWindowToSummary) //convert a window of bucket-summaries into a single summary .doOnSubscribe(new Action0() { @Override public void call() { isSourceCurrentlySubscribed.set(true); } }) .doOnUnsubscribe(new Action0() { @Override public void call() { isSourceCurrentlySubscribed.set(false); } }) .share() //multiple subscribers should get same data .onBackpressureDrop(); //if there are slow consumers, data should not buffer } @Override public Observable observe() { return sourceStream; } /* package-private */ boolean isSourceCurrentlySubscribed() { return isSourceCurrentlySubscribed.get(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy