Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
datamining integration
Browse files Browse the repository at this point in the history
  • Loading branch information
pavolloffay committed Jan 18, 2016
1 parent 85c8cdd commit 3c74ba9
Show file tree
Hide file tree
Showing 6 changed files with 316 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,26 @@ <h2>JVM Heap Usage</h2>
</div>
</div>

<!-- Predicted chart -->
<div class="row row-cards-pf">
<div class="col-xs-12">
<div class="card-pf hk-graph" ng-if="vm.chartHeapData">
<h2>JVM Heap Used Predicted</h2>
<div class="hk-graph-container hk-graph-metrics">
<!-- HINT: colors for the chart can be changed in the hawkular-charts.css -->
<hawkular-chart
data="vm.predictedData.original"
forecast-data="vm.predictedData.predicted"
chart-type="line"
alert-value="480"
y-axis-units="Usage (MB)">
<!--show-data-points="true"-->
</hawkular-chart>
</div>
</div>
</div>
</div>

<div class="row row-cards-pf">
<div class="col-xs-12">
<div class="card-pf hk-graph" ng-if="vm.chartNonHeapData">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ module HawkularMetrics {
public endTimeStamp:TimestampInMillis;
public chartGCDurationData:IChartDataPoint[];

public predictedData:any = {};

public contextChartHeapUsedData:IContextChartDataPoint[];
public contextChartNonHeapUsedData:IContextChartDataPoint[];
public contextChartGCDurationData:IContextChartDataPoint[];
Expand All @@ -108,7 +110,8 @@ module HawkularMetrics {
private HawkularNav:any,
private HawkularAlertRouterManager:IHawkularAlertRouterManager,
private MetricsService:IMetricsService,
private $q:ng.IQService) {
private $q:ng.IQService,
private HawkularDatamining:any) {
$scope.vm = this;

this.feedId = this.$routeParams.feedId;
Expand All @@ -118,6 +121,7 @@ module HawkularMetrics {
this.endTimeStamp = +moment();
this.chartHeapData = [];
this.chartNonHeapData = [];
this.predictedData = [];

if ($rootScope.currentPersona) {
this.refresh();
Expand Down Expand Up @@ -266,6 +270,7 @@ module HawkularMetrics {
let heapPromises = [];
let tmpChartNonHeapData = [];
let nonHeapPromises = [];
let tmpPredictedData = { predicted: [], original: []};

const heapCommitted = JVMMetricsTabType.HEAP_COMMITTED;
if (!this.skipChartData[heapCommitted.getKey()]) {
Expand Down Expand Up @@ -299,6 +304,9 @@ module HawkularMetrics {
color: heapUsed.getColor(),
values: chartHeapDataUsed
};

tmpPredictedData.original =
MetricsService.formatBucketedChartOutput(data, AppServerJvmDetailsController.BYTES2MB);
});
}

Expand All @@ -317,8 +325,35 @@ module HawkularMetrics {
};
});
}

/**
* get predicted data
*/
if (!this.skipChartData['Heap Used Forecast']) {
let hUsedPredictPromise = this.HawkularDatamining.Predict(this.$rootScope.currentPersona.id).predict({
metricId: MetricsService.getMetricId('M', this.feedId, this.resourceId,
heapUsed.getWildflyFullMetricName()),
ahead: 20
}).$promise;
heapPromises.push(hUsedPredictPromise);
hUsedPredictPromise.then((data) => {
// todo remove
console.log('Predicted data');
console.log('startTimestamp = ' + this.startTimeStamp + ' -> ' + (new Date(this.startTimeStamp)));
console.log('endTimestamp = ' + this.endTimeStamp + ' -> ' + (new Date(this.endTimeStamp)));
console.log(data);

console.log('tmpPredictedData');
tmpPredictedData.predicted = this.HawkularDatamining.formatPredictedData(data);
_.map(tmpPredictedData.predicted, (point: any) => {
console.log('timestamp = ' + (new Date(point.timestamp)) + ' value = ' + point.value);
});
});
}

this.$q.all(heapPromises).finally(()=> {
this.chartHeapData = tmpChartHeapData;
this.predictedData = tmpPredictedData;
});

const nonHeapCommitted = JVMMetricsTabType.NON_HEAP_COMMITTED;
Expand Down
90 changes: 90 additions & 0 deletions console/src/main/scripts/plugins/metrics/ts/hawkularDatamining.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
///
/// Copyright 2015-2016 Red Hat, Inc. and/or its affiliates
/// and other contributors as indicated by the @author tags.
///
/// 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.
///

/// <reference path="metricsPlugin.ts"/>
/// <reference path="../../includes.ts"/>

module HawkularMetrics {

_module.provider('HawkularDatamining', function() {
this.setProtocol = function(protocol) {
this.protocol = protocol;
return this;
};


this.setHost = function(host) {
this.host = host;
return this;
};

this.setPort = function(port) {
this.port = 8080;
return this;
};

this.$get = ['$resource', '$location', function($resource, $location) {

this.setProtocol(this.protocol || $location.protocol() || 'http');
this.setHost(this.host || $location.host() || 'localhost');
this.setPort(this.port || $location.port() || '8080');

var prefix = this.protocol + '://' + this.host + ':' + this.port;
var predictionUrlPart = '/hawkular/datamining';
var url = prefix + predictionUrlPart;
var factory: any = {};


factory.Predict = function(tenantId) {
return $resource(url + '/models/:metricId/predict', null, {
predict: {
method: 'GET',
isArray: true,
params: {ahead: '1'},
headers: {'Hawkular-Tenant': tenantId}
}
});
};

factory.formatPredictedData = function(data): IChartDataPoint[] {
function convertBytesToMegaBytes(bytes:number):number {
return bytes / 1024 / 1024;
}

// The schema is different for bucketed output
return _.map(data, (point:IChartDataPoint) => {

//point.timestamp = currentTimestamp;

return {
timestamp: point.timestamp,
date: new Date(point.timestamp),
value: convertBytesToMegaBytes(point.value),
avg: convertBytesToMegaBytes(point.value),
min: 0,
max: 0,
percentile95th: 0,
median: 0,
empty: false
};
});
};

return factory;
}];
});
}
11 changes: 11 additions & 0 deletions dist/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@
<version>${version.org.hawkular.agent}</version>
</dependency>

<dependency>
<groupId>org.hawkular.datamining</groupId>
<artifactId>hawkular-datamining-dist</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>org.hawkular.inventory</groupId>
<artifactId>hawkular-inventory-dist</artifactId>
Expand Down Expand Up @@ -278,6 +283,12 @@
<version>${version.org.hawkular.inventory}</version>
<type>war</type>
</artifactItem>
<artifactItem>
<groupId>org.hawkular.datamining</groupId>
<artifactId>hawkular-datamining-dist</artifactId>
<version>${version.org.hawkular.datamining}</version>
<type>war</type>
</artifactItem>

</artifactItems>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* Copyright 2015-2016 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* 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 org.hawkular.integration.test
import org.hawkular.inventory.api.model.Metric
import org.hawkular.inventory.api.model.MetricDataType
import org.hawkular.inventory.api.model.MetricType
import org.hawkular.inventory.api.model.MetricUnit
import org.junit.Assert
import org.junit.BeforeClass
import org.junit.Test

import static org.junit.Assert.assertEquals

class DataminingITest extends AbstractTestBase {

private static final String invBasePath = "/hawkular/inventory"
private static final String dtmBasePath = "/hawkular/datamining"

private static final String predictionRelationshipName = "__inPrediction"

private static final String environmentId = "test"
private static final String feedId = "itest-dtm-feed"
private static final String metricTypeId = "itest-dtm-mt"
private static final String metricId = "itest-dtm-m"

private static String tenantId;

@BeforeClass
public static void setUpData() {

def payload = null;
def response = null
String path = "/hawkular/inventory/environments/$environmentId";
int attemptCount = 5;
int delay = 500;
for (int i = 0; i < attemptCount; i++) {
try {
response = client.get(path: path)
/* all is well, we can leave the loop */
break;
} catch (groovyx.net.http.HttpResponseException e) {
/* some initial attempts may fail */
}
println "'$path' not ready yet, about to retry after $delay ms"
/* sleep one second */
Thread.sleep(delay);
}
if (response.status != 200) {
Assert.fail("Getting path '$path' returned status ${response.status}, tried $attemptCount times");
}
assertEquals(environmentId, response.data.id)

String path2 = "/hawkular/inventory/tenant"
for (int i = 0; i < attemptCount; i++) {
try {
response = client.get(path: path2)
/* all is well, we can leave the loop */
break;
} catch (groovyx.net.http.HttpResponseException e) {
/* some initial attempts may fail */
}
println "'$path2' not ready yet, about to retry after $delay ms"
/* sleep one second */
Thread.sleep(delay);
}
if (response.status != 200) {
Assert.fail("Getting path '$path2' returned status ${response.status}, tried $attemptCount times");
}
tenantId = response.data.id


/**
* Create Feed
*/
payload = [
id: "$feedId".toString()
]
response = client.post(path: "$invBasePath/feeds", body: payload)
assertEquals(201, response.status)

/**
* Create metricType
*/
def metricType = MetricType.Blueprint.builder(MetricDataType.GAUGE)
.withId(metricTypeId).withUnit(MetricUnit.BYTES).withInterval(2000).build()
response = client.post(path: "$invBasePath/feeds/$feedId/metricTypes", body: metricType)
assertEquals(201, response.status)

/**
* Create metric
*/
def metric = Metric.Blueprint.builder().withId(metricId).withMetricTypePath(metricTypeId).build()
response = client.post(path: "$invBasePath/feeds/$feedId/metrics", body: metric)
assertEquals(201, response.status)

/**
* Create prediction relationship
*/
payload = [
name: "$predictionRelationshipName".toString(),
source: "/t;$tenantId".toString(),
target: "/t;$tenantId/f;$feedId/m;$metricId".toString()
]
response = client.post(path: "$invBasePath/tenants/relationships", body: payload)
assertEquals(201, response.status)


Thread.sleep(2000);
}


@Test
public void testModelExists() {
def response = client.get(path: "$dtmBasePath/models/$metricId", headers: ["Hawkular-Tenant": tenantId])
assertEquals(200, response.status)
}
}


0 comments on commit 3c74ba9

Please sign in to comment.