[Hawkular-dev] [Metrics] Pluggable aggregation functions: next steps
Jay Shaughnessy
jshaughn at redhat.com
Tue Jul 21 17:27:40 EDT 2015
Right, you may find what you need is already in place, or you may find
that you can spend time on higher-level functions. In particular, see:
MetricsService:
<T> Observable<T> findGaugeData(String tenantId, MetricId id, Long
start, Long end,Func1<Observable<DataPoint<Double>>, Observable<T>>...
funcs);
Aggregate:
predefined functions.
Here is an example snippen from
org.hawkular.alerts.external.metrics.Manager to gather multiple
aggregates in one call and determine the range:
case range: {
Iterator<Double> iterator =
metrics.findGaugeData(tenantId, metricId, start, end,
Aggregate.Min, Aggregate.Max)
.toBlocking().toIterable().iterator();
Double min = iterator.next();
Double max = iterator.next();
value = max - min;
break;
}
-Jay
On 7/21/2015 10:43 AM, John Sanda wrote:
> Keep the following in mind. Since the core metrics API is now built on
> RxJava, function params and return types should probably be
> rx.Observable. Some of the work described below may already be covered
> by the work Jay did for HWKMETRICS-144 which involved adding
> min/max/avg functions. To be honest, I think functions like
> min/max/avg are poor candidates for some of the changes being
> discussed because they are so simple. Here is our avg function,
>
> Func1<Observable<DataPoint<Double>>, Observable<Double>> Average =
> data ->
> MathObservable.averageDouble(data.map(DataPoint::getValue));
>
> For other, more involved functions, I think we should look first at
> the core operators in Rx.Observable and then maybe consider custom
> operators[1].
>
> [1]
> https://github.com/ReactiveX/RxJava/wiki/Implementing-Your-Own-Operators
>
>> On Jul 21, 2015, at 5:43 AM, Thomas Segismont <tsegismo at redhat.com
>> <mailto:tsegismo at redhat.com>> wrote:
>>
>> Hi,
>>
>> I have looked at Aakarsh's repo:
>> https://github.com/Akki5/hawkular_plugin/
>>
>> It's a good start with an interface describing a doubles to double
>> function, a classloader for implementation loading and a set of initial
>> implementations.
>>
>> In order to integrate this work into Metrics, I think we should follow
>> the following steps:
>>
>> =====
>> #1 Change the contract
>>
>> Doubles to double works great for avg/min/max/... functions on gauge
>> metrics. But we need to consider other metric types.
>>
>> Also, the interface should not only accept data point values, but whole
>> data points. Because some functions need the timestamp to compute the
>> result. % of up availability is a good example.
>>
>> And functions may return different types: Double, Long, AvailabilityType.
>>
>> #2 Update configuration options to let the user set a plugins directory
>>
>> Metrics doc needs will have to be updated.
>>
>> #3 Create a function repository for each metric type
>>
>> We can build on JDK's service loader + Aakarsh's classloader
>> implementation.
>>
>> #4 Add builtin aggregate functions
>>
>> Extract existing Metrics code (min, max, avg, % of up avail, downtime
>> duration) into builtin functions.
>>
>> #5 Document the process of implementing a pluggable function
>>
>> We need to think about function naming as well. Should we use a prefix
>> to identify a builtin function?
>> =====
>>
>> I will start another thread to discuss REST and Core API data query
>> changes.
>>
>> Thoughts?
>>
>> Thanks,
>> Thomas
>> _______________________________________________
>> hawkular-dev mailing list
>> hawkular-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/hawkular-dev
>
>
>
> _______________________________________________
> hawkular-dev mailing list
> hawkular-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hawkular-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/hawkular-dev/attachments/20150721/19882597/attachment.html
More information about the hawkular-dev
mailing list