modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java | 15 + modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java | 2 modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml | 15 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java | 12 - modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java | 83 ++++++++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java | 2 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java | 2 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java | 34 +++- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java | 21 ++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java | 6 10 files changed, 175 insertions(+), 17 deletions(-)
New commits: commit 1b567f2f9eb2e81f86dbedf60cf85b42283aea05 Author: Jirka Kremser jkremser@redhat.com Date: Thu Sep 26 22:36:43 2013 +0200
api checks: Adding back the org.rhq.enterprise.server.measurement.MeasurementAggregate see the commit c2a609f48 for more details.
diff --git a/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml b/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml index 40508c6..488adc3 100644 --- a/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml +++ b/modules/enterprise/server/jar/intentional-api-changes-since-4.9.0.xml @@ -41,4 +41,19 @@ <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification> </difference>
+ <difference> + <className>org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote</className> + <differenceType>7006</differenceType> <!-- method return type changed --> + <method>org.rhq.core.domain.measurement.MeasurementAggregate getAggregate(org.rhq.core.domain.auth.Subject, int, long, long)</method> + <to>org.rhq.enterprise.server.measurement.MeasurementAggregate</to> + <justification>In RHQ 4.8 the MeasurementAggregate class was moved from server jar module to core domain module. This change is not backward compatible with Java clients using the remote EJB API. The breaking change was introduced by commit 2f6e74080e2299 the backward compatible change was introduced by c2a609f48d5f36.</justification> + </difference> + + <difference> + <className>org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote</className> + <differenceType>7012</differenceType> <!-- method added to an interface --> + <method>org.rhq.core.domain.measurement.MeasurementAggregate getMeasurementAggregate(org.rhq.core.domain.auth.Subject, int, long, long)</method> + <justification>Adding a method to a remote API interface is safe. This is method is added in order to deprecate the getAggregate. For more details see the previous intentional change.</justification> + </difference> + </differences>
commit c2a609f48d5f364310060d031069495679b69c6f Author: Jirka Kremser jkremser@redhat.com Date: Thu Sep 26 22:32:46 2013 +0200
Adding back the org.rhq.enterprise.server.measurement.MeasurementAggregate because of the JON 3.2 backward compatibility breakage (for EJB remote clients). This contains also adding a new method, deprecating the old method and the added class so that it can be removed in the next major release.
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java index dbd03ae..e07fb65 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java @@ -258,7 +258,7 @@ public class MeasurementDataManagerBeanTest extends AbstractEJB3Test { dataManager.mergeMeasurementReport(report); waitForRawInserts();
- MeasurementAggregate actual = dataManager.getAggregate(getOverlord(), dynamicSchedule.getId(), + MeasurementAggregate actual = dataManager.getMeasurementAggregate(getOverlord(), dynamicSchedule.getId(), beginTime.getMillis(), endTime.getMillis());
MeasurementAggregate expected = new MeasurementAggregate(1.1, divide((1.1 + 2.2 + 3.3 + 4.4 + 5.5 + 6.6), 6), diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java index 97dd33f..70a0e60 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java @@ -347,7 +347,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN // find the aggregates and enrich the result instance if (!scheduleIdsMap.isEmpty()) { if ((scheduleId = scheduleIdsMap.get(METRIC_TOKENS)) != null) { - MeasurementAggregate tokensAggregate = measurementManager.getAggregate(subject, scheduleId, beginTime, + MeasurementAggregate tokensAggregate = measurementManager.getMeasurementAggregate(subject, scheduleId, beginTime, endTime); result.setTokens(tokensAggregate); } @@ -369,7 +369,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN result.setTotalDiskUsedPercentage(totalDiskUsedPercentageAggregateWithUnits); } if ((scheduleId = scheduleIdsMap.get(METRIC_FREE_DISK_TO_DATA_RATIO)) != null) { - MeasurementAggregate freeDiskToDataRatioAggregate = measurementManager.getAggregate(subject, + MeasurementAggregate freeDiskToDataRatioAggregate = measurementManager.getMeasurementAggregate(subject, scheduleId, beginTime, endTime); result.setFreeDiskToDataSizeRatio(freeDiskToDataRatioAggregate); } @@ -383,17 +383,17 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN } if ((scheduleId = scheduleIdsMap.get(METRIC_KEY_CACHE_SIZE)) != null) { updateAggregateTotal(totalDiskUsedAggregate, - measurementManager.getAggregate(subject, scheduleId, beginTime, endTime)); + measurementManager.getMeasurementAggregate(subject, scheduleId, beginTime, endTime));
} if ((scheduleId = scheduleIdsMap.get(METRIC_ROW_CACHE_SIZE)) != null) { updateAggregateTotal(totalDiskUsedAggregate, - measurementManager.getAggregate(subject, scheduleId, beginTime, endTime)); + measurementManager.getMeasurementAggregate(subject, scheduleId, beginTime, endTime)); }
if ((scheduleId = scheduleIdsMap.get(METRIC_TOTAL_COMMIT_LOG_SIZE)) != null) { updateAggregateTotal(totalDiskUsedAggregate, - measurementManager.getAggregate(subject, scheduleId, beginTime, endTime)); + measurementManager.getMeasurementAggregate(subject, scheduleId, beginTime, endTime)); } if (totalDiskUsedAggregate.getMax() > 0) { StorageNodeLoadComposite.MeasurementAggregateWithUnits totalDiskUsedAggregateWithUnits = new StorageNodeLoadComposite.MeasurementAggregateWithUnits( @@ -539,7 +539,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
private StorageNodeLoadComposite.MeasurementAggregateWithUnits getMeasurementAggregateWithUnits(Subject subject, int schedId, MeasurementUnits units, long beginTime, long endTime) { - MeasurementAggregate measurementAggregate = measurementManager.getAggregate(subject, schedId, beginTime, + MeasurementAggregate measurementAggregate = measurementManager.getMeasurementAggregate(subject, schedId, beginTime, endTime); StorageNodeLoadComposite.MeasurementAggregateWithUnits measurementAggregateWithUnits = new StorageNodeLoadComposite.MeasurementAggregateWithUnits( measurementAggregate, units); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java new file mode 100644 index 0000000..7acc5f6 --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java @@ -0,0 +1,83 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2008 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.enterprise.server.measurement;; + +import java.io.Serializable; + +/** + * Simple Java Bean to hold aggregate values + * + * @author <a href="mailto:heiko.rupp@redhat.com">Heiko W. Rupp</a> + * @deprecated As of release RHQ 4.8, replaced by {@link org.rhq.core.domain.measurement.MeasurementAggregate}. Use this class from core domain instead. + */ +public class MeasurementAggregate implements Serializable { + + static final long serialVersionUID = 5673395371271765240L; + + Double min; + Double avg; + Double max; + + public MeasurementAggregate() { + } + + public MeasurementAggregate(Double min, Double avg, Double max) { + this.min = (min != null) ? min : Double.NaN; + this.avg = (avg != null) ? avg : Double.NaN; + this.max = (max != null) ? max : Double.NaN; + } + + public Double getMin() { + return min; + } + + public void setMin(Double min) { + this.min = min; + } + + public Double getAvg() { + return avg; + } + + public void setAvg(Double avg) { + this.avg = avg; + } + + public Double getMax() { + return max; + } + + public void setMax(Double max) { + this.max = max; + } + + @Override + public String toString() { + return "Min: " + min + ", Max: " + max + ", Avg: " + avg; + } + + /** + * Return true if the aggregate has "no real data" I.e. when all values are Not A Number. + * + * @return + */ + public boolean isEmpty() { + return min.isNaN() && avg.isNaN() && max.isNaN(); + } +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java index 3504cdc..1470337 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java @@ -480,7 +480,7 @@ public class MeasurementBaselineManagerBean implements MeasurementBaselineManage throw new BaselineCreationException("Baseline calculation is only valid for a dynamic measurement"); }
- MeasurementAggregate agg = dataManager.getAggregate(subjectManager.getOverlord(), schedule.getId(), startDate, + MeasurementAggregate agg = dataManager.getMeasurementAggregate(subjectManager.getOverlord(), schedule.getId(), startDate, endDate);
// attach the entity, so we can find the baseline diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java index c481c6e..618bcc7 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java @@ -373,7 +373,7 @@ public class MeasurementChartsManagerBean implements MeasurementChartsManagerLoc summary.setCollectionType(collectionType);
if (!narrowed) { - MeasurementAggregate compositeHighLow = dataManager.getAggregate(subject, schedule.getId(), begin, end); + MeasurementAggregate compositeHighLow = dataManager.getMeasurementAggregate(subject, schedule.getId(), begin, end); if (compositeHighLow.isEmpty()) { summary.setValuesPresent(false); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java index 19c5ecf..ee679f1 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java @@ -605,9 +605,41 @@ public class MeasurementDataManagerBean implements MeasurementDataManagerLocal, log.debug(callingMethod + ": " + stats.toString()); }
+ @Deprecated @Override @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) - public MeasurementAggregate getAggregate(Subject subject, int scheduleId, long startTime, long endTime) { + public org.rhq.enterprise.server.measurement.MeasurementAggregate getAggregate(Subject subject, int scheduleId, long startTime, long endTime) { + MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria(); + criteria.addFilterId(scheduleId); + criteria.fetchResource(true); + + PageList<MeasurementSchedule> schedules = measurementScheduleManager.findSchedulesByCriteria( + subjectManager.getOverlord(), criteria); + if (schedules.isEmpty()) { + throw new MeasurementException("Could not fine MeasurementSchedule with the id[" + scheduleId + "]"); + } + MeasurementSchedule schedule = schedules.get(0); + + if (authorizationManager.canViewResource(subject, schedule.getResource().getId()) == false) { + throw new PermissionException("User[" + subject.getName() + + "] does not have permission to view schedule[id=" + scheduleId + "]"); + } + + if (schedule.getDefinition().getDataType() != DataType.MEASUREMENT) { + throw new IllegalArgumentException(schedule + " is not about numerical values. Can't compute aggregates"); + } + + if (startTime > endTime) { + throw new IllegalArgumentException("Start date " + startTime + " is not before " + endTime); + } + + MetricsServer metricsServer = storageClientManager.getMetricsServer(); + AggregateNumericMetric summary = metricsServer.getSummaryAggregate(scheduleId, startTime, endTime); + + return new org.rhq.enterprise.server.measurement.MeasurementAggregate(summary.getMin(), summary.getAvg(), summary.getMax()); + } + + public MeasurementAggregate getMeasurementAggregate(Subject subject, int scheduleId, long startTime, long endTime) { MeasurementScheduleCriteria criteria = new MeasurementScheduleCriteria(); criteria.addFilterId(scheduleId); criteria.fetchResource(true); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java index 116c82a..1a049c3 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java @@ -51,8 +51,27 @@ public interface MeasurementDataManagerRemote { * * @throws FetchException if the schedule does not reference numerical data or if the user is not allowed to view * the {@link Resource} corresponding to this scheduleId + * @deprecated class {@link org.rhq.enterprise.server.measurement.MeasurementAggregate} has been deprecated + * since RHQ 4.8, therefore this method was deprecated as well and + * replaced by {@link #getMeasurementAggregate(org.rhq.core.domain.auth.Subject,int,long,long)} */ - MeasurementAggregate getAggregate(Subject subject, int scheduleId, long startTime, long endTime); + org.rhq.enterprise.server.measurement.MeasurementAggregate getAggregate(Subject subject, int scheduleId, long startTime, long endTime); + + /** + * Get the aggregate values of the numerical values for a given schedule. This can only provide aggregates for data + * in the "live" table + * + * @param subject the user requesting the aggregate + * @param scheduleId the id of the {@link MeasurementSchedule} for which this aggregate is being requested + * @param start the start time + * @param end the end time + * + * @return MeasurementAggregate bean with the data + * + * @throws FetchException if the schedule does not reference numerical data or if the user is not allowed to view + * the {@link Resource} corresponding to this scheduleId + */ + MeasurementAggregate getMeasurementAggregate(Subject subject, int scheduleId, long startTime, long endTime);
/** * Return all known trait data for the passed schedule, defined by resourceId and definitionId diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java index d5ca8dc..fb927ec 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java @@ -162,7 +162,7 @@ public class MetricHandlerBean extends AbstractRestBean {
MeasurementSchedule schedule = obtainSchedule(scheduleId, false, DataType.MEASUREMENT);
- MeasurementAggregate aggr = dataManager.getAggregate(caller, scheduleId, startTime, endTime); + MeasurementAggregate aggr = dataManager.getMeasurementAggregate(caller, scheduleId, startTime, endTime); MetricAggregate res = new MetricAggregate(scheduleId, aggr.getMin(),aggr.getAvg(),aggr.getMax());
int definitionId = schedule.getDefinition().getId(); @@ -387,7 +387,7 @@ public class MetricHandlerBean extends AbstractRestBean { List<List<MeasurementDataNumericHighLowComposite>> listList = dataManager.findDataForContext(caller, EntityContext.forResource(sched.getResource().getId()),definitionId,startTime,endTime,dataPoints); if (!listList.isEmpty()) { - MeasurementAggregate measurementAggregate = dataManager.getAggregate(caller,scheduleId,startTime,endTime); + MeasurementAggregate measurementAggregate = dataManager.getMeasurementAggregate(caller,scheduleId,startTime,endTime); List<MeasurementDataNumericHighLowComposite> list = listList.get(0); MetricAggregate res = new MetricAggregate(scheduleId,measurementAggregate.getMin(),measurementAggregate.getAvg(),measurementAggregate.getMax()); boolean isHtml = mediaType.equals(MediaType.TEXT_HTML_TYPE); @@ -552,7 +552,7 @@ public class MetricHandlerBean extends AbstractRestBean { List<MetricAggregate> ret = new ArrayList<MetricAggregate>(schedules.size());
for (MeasurementSchedule schedule: schedules) { - MeasurementAggregate aggr = dataManager.getAggregate(caller,schedule.getId(),startTime,endTime); + MeasurementAggregate aggr = dataManager.getMeasurementAggregate(caller,schedule.getId(),startTime,endTime); MetricAggregate res = new MetricAggregate(schedule.getId(), aggr.getMin(),aggr.getAvg(),aggr.getMax());
if (includeDataPoints) {
commit 0d40ad930ba3248614e366f28f0a98ad8c98f136 Author: Jirka Kremser jkremser@redhat.com Date: Thu Sep 26 22:32:11 2013 +0200
[BZ 967542] - UI shows confusing units when editing Availability Duration alert condition type - The table with listed conditions should now display the same number-unit tuple as the popup dialog.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java index ce95963..6d75a27 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertFormatUtility.java @@ -28,6 +28,7 @@ import org.rhq.core.domain.alert.AlertConditionCategory; import org.rhq.core.domain.alert.AlertConditionOperator; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.measurement.MeasurementUnits; +import org.rhq.core.domain.measurement.composite.MeasurementNumericValueAndUnits; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.Messages; import org.rhq.enterprise.gui.coregui.client.util.MeasurementConverterClient; @@ -93,9 +94,17 @@ public class AlertFormatUtility { } str.append(" For ");
- // value is stored in seconds but should be presented in minutes - String value = String.valueOf(Integer.valueOf(condition.getOption()) / 60); - String formatted = MeasurementConverterClient.format(value, MeasurementUnits.MINUTES); + long longValue = Long.valueOf(condition.getOption()); + MeasurementNumericValueAndUnits valueWithUnits; + if (longValue % 3600 == 0) { + valueWithUnits = MeasurementConverterClient.fit((double) longValue, MeasurementUnits.SECONDS, + MeasurementUnits.HOURS, MeasurementUnits.HOURS); + } else { + valueWithUnits = MeasurementConverterClient.fit((double) longValue, MeasurementUnits.SECONDS, + MeasurementUnits.MINUTES, MeasurementUnits.MINUTES); + } + String formatted = MeasurementConverterClient.format(String.valueOf(valueWithUnits.getValue()), + valueWithUnits.getUnits()); str.append(formatted); str.append("]");