mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-02 20:02:29 +01:00
Display dates in Quota and Usage messages according to the timezone configurations (#8230)
Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com>
This commit is contained in:
parent
240db19567
commit
9a73a2f9e1
@ -17,6 +17,7 @@
|
||||
package com.cloud.usage;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
@ -27,9 +28,11 @@ import javax.persistence.Table;
|
||||
import javax.persistence.Temporal;
|
||||
import javax.persistence.TemporalType;
|
||||
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.cloudstack.api.InternalIdentity;
|
||||
import org.apache.cloudstack.usage.Usage;
|
||||
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
@Entity
|
||||
@Table(name = "cloud_usage")
|
||||
@ -400,6 +403,12 @@ public class UsageVO implements Usage, InternalIdentity {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "usageId", "usageType", "startDate", "endDate");
|
||||
return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "usageId", "usageType");
|
||||
}
|
||||
|
||||
public String toString(TimeZone timeZone) {
|
||||
String startDateString = DateUtil.displayDateInTimezone(timeZone, getStartDate());
|
||||
String endDateString = DateUtil.displayDateInTimezone(timeZone, getEndDate());
|
||||
return String.format("%s,\"startDate\":\"%s\",\"endDate\":\"%s\"}", StringUtils.chop(this.toString()), startDateString, endDateString);
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
|
||||
import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||
import org.apache.cloudstack.quota.constant.QuotaConfig;
|
||||
import org.apache.cloudstack.quota.constant.QuotaConfig.QuotaEmailTemplateTypes;
|
||||
@ -156,9 +157,9 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana
|
||||
if (account == null) {
|
||||
continue; // the account is removed
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("checkAndSendQuotaAlertEmails: Check id=" + account.getId() + " bal=" + accountBalance + ", alertDate=" + alertDate + ", lockable=" + lockable);
|
||||
}
|
||||
logger.debug("checkAndSendQuotaAlertEmails: Check id={} bal={}, alertDate={}, lockable={}", account.getId(),
|
||||
accountBalance, DateUtil.displayDateInTimezone(QuotaManagerImpl.getUsageAggregationTimeZone(), alertDate),
|
||||
lockable);
|
||||
if (accountBalance.compareTo(zeroBalance) < 0) {
|
||||
if (_lockAccountEnforcement && (lockable == 1)) {
|
||||
if (_quotaManager.isLockable(account)) {
|
||||
|
||||
@ -49,9 +49,9 @@ import org.apache.cloudstack.usage.UsageUnitTypes;
|
||||
import org.apache.cloudstack.utils.bytescale.ByteScaleUtils;
|
||||
import org.apache.cloudstack.utils.jsinterpreter.JsInterpreter;
|
||||
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
|
||||
import org.apache.cloudstack.utils.usage.UsageUtils;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.math.NumberUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -85,8 +85,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
@Inject
|
||||
protected PresetVariableHelper presetVariableHelper;
|
||||
|
||||
private TimeZone _usageTimezone;
|
||||
private int _aggregationDuration = 0;
|
||||
private static TimeZone usageAggregationTimeZone = TimeZone.getTimeZone("GMT");
|
||||
static final BigDecimal GiB_DECIMAL = BigDecimal.valueOf(ByteScaleUtils.GiB);
|
||||
List<Account.Type> lockablesAccountTypes = Arrays.asList(Account.Type.NORMAL, Account.Type.DOMAIN_ADMIN);
|
||||
|
||||
@ -112,24 +111,16 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
mergeConfigs(configs, params);
|
||||
}
|
||||
|
||||
String aggregationRange = configs.get("usage.stats.job.aggregation.range");
|
||||
String timeZoneStr = configs.get("usage.aggregation.timezone");
|
||||
|
||||
if (timeZoneStr == null) {
|
||||
timeZoneStr = "GMT";
|
||||
}
|
||||
_usageTimezone = TimeZone.getTimeZone(timeZoneStr);
|
||||
|
||||
_aggregationDuration = Integer.parseInt(aggregationRange);
|
||||
if (_aggregationDuration < UsageUtils.USAGE_AGGREGATION_RANGE_MIN) {
|
||||
logger.warn("Usage stats job aggregation range is to small, using the minimum value of " + UsageUtils.USAGE_AGGREGATION_RANGE_MIN);
|
||||
_aggregationDuration = UsageUtils.USAGE_AGGREGATION_RANGE_MIN;
|
||||
}
|
||||
logger.info("Usage timezone = " + _usageTimezone + " AggregationDuration=" + _aggregationDuration);
|
||||
String usageAggregationTimeZoneStr = ObjectUtils.defaultIfNull(configs.get("usage.aggregation.timezone"), "GMT");
|
||||
usageAggregationTimeZone = TimeZone.getTimeZone(usageAggregationTimeZoneStr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static TimeZone getUsageAggregationTimeZone() {
|
||||
return usageAggregationTimeZone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean start() {
|
||||
if (logger.isInfoEnabled()) {
|
||||
@ -158,8 +149,9 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
Date startDate = firstQuotaUsage.getStartDate();
|
||||
Date endDate = firstQuotaUsage.getStartDate();
|
||||
|
||||
logger.info(String.format("Processing quota balance for account [%s] between [%s] and [%s].", accountToString, startDate,
|
||||
accountQuotaUsages.get(accountQuotaUsages.size() - 1).getEndDate()));
|
||||
logger.info("Processing quota balance for account [{}] between [{}] and [{}].", accountToString,
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, startDate),
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, accountQuotaUsages.get(accountQuotaUsages.size() - 1).getEndDate()));
|
||||
|
||||
BigDecimal aggregatedUsage = BigDecimal.ZERO;
|
||||
long accountId = accountVo.getAccountId();
|
||||
@ -246,17 +238,20 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
|
||||
protected BigDecimal aggregateCreditBetweenDates(Long accountId, Long domainId, Date startDate, Date endDate, String accountToString) {
|
||||
List<QuotaBalanceVO> creditsReceived = _quotaBalanceDao.findCreditBalance(accountId, domainId, startDate, endDate);
|
||||
logger.debug(String.format("Account [%s] has [%s] credit entries before [%s].", accountToString, creditsReceived.size(), endDate));
|
||||
logger.debug("Account [{}] has [{}] credit entries before [{}].", accountToString, creditsReceived.size(),
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, endDate));
|
||||
|
||||
BigDecimal aggregatedUsage = BigDecimal.ZERO;
|
||||
|
||||
logger.debug(String.format("Aggregating the account [%s] credit entries before [%s].", accountToString, endDate));
|
||||
logger.debug("Aggregating the account [{}] credit entries before [{}].", accountToString,
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, endDate));
|
||||
|
||||
for (QuotaBalanceVO credit : creditsReceived) {
|
||||
aggregatedUsage = aggregatedUsage.add(credit.getCreditBalance());
|
||||
}
|
||||
|
||||
logger.debug(String.format("The aggregation of the account [%s] credit entries before [%s] resulted in the value [%s].", accountToString, endDate, aggregatedUsage));
|
||||
logger.debug("The aggregation of the account [{}] credit entries before [{}] resulted in the value [{}].",
|
||||
accountToString, DateUtil.displayDateInTimezone(usageAggregationTimeZone, endDate), aggregatedUsage);
|
||||
|
||||
return aggregatedUsage;
|
||||
}
|
||||
@ -306,7 +301,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
protected List<QuotaUsageVO> createQuotaUsagesAccordingToQuotaTariffs(AccountVO account, List<UsageVO> usageRecords,
|
||||
Map<Integer, Pair<List<QuotaTariffVO>, Boolean>> mapQuotaTariffsPerUsageType) {
|
||||
String accountToString = account.reflectionToString();
|
||||
logger.info(String.format("Calculating quota usage of [%s] usage records for account [%s].", usageRecords.size(), accountToString));
|
||||
logger.info("Calculating quota usage of [{}] usage records for account [{}].", usageRecords.size(), accountToString);
|
||||
|
||||
List<Pair<UsageVO, QuotaUsageVO>> pairsUsageAndQuotaUsage = new ArrayList<>();
|
||||
|
||||
@ -314,7 +309,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
for (UsageVO usageRecord : usageRecords) {
|
||||
int usageType = usageRecord.getUsageType();
|
||||
|
||||
if (Boolean.FALSE.equals(shouldCalculateUsageRecord(account,usageRecord))) {
|
||||
if (!shouldCalculateUsageRecord(account, usageRecord)) {
|
||||
pairsUsageAndQuotaUsage.add(new Pair<>(usageRecord, null));
|
||||
continue;
|
||||
}
|
||||
@ -339,8 +334,8 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
|
||||
protected boolean shouldCalculateUsageRecord(AccountVO accountVO, UsageVO usageRecord) {
|
||||
if (Boolean.FALSE.equals(QuotaConfig.QuotaAccountEnabled.valueIn(accountVO.getAccountId()))) {
|
||||
logger.debug(String.format("Considering usage record [%s] as calculated and skipping it because account [%s] has the quota plugin disabled.",
|
||||
usageRecord, accountVO.reflectionToString()));
|
||||
logger.debug("Considering usage record [{}] as calculated and skipping it because account [{}] has the quota plugin disabled.",
|
||||
usageRecord.toString(usageAggregationTimeZone), accountVO.reflectionToString());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -366,9 +361,8 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
|
||||
protected BigDecimal aggregateQuotaTariffsValues(UsageVO usageRecord, List<QuotaTariffVO> quotaTariffs, boolean hasAnyQuotaTariffWithActivationRule,
|
||||
JsInterpreter jsInterpreter, String accountToString) {
|
||||
String usageRecordToString = usageRecord.toString();
|
||||
logger.debug(String.format("Validating usage record [%s] for account [%s] against [%s] quota tariffs.", usageRecordToString, accountToString,
|
||||
quotaTariffs.size()));
|
||||
String usageRecordToString = usageRecord.toString(usageAggregationTimeZone);
|
||||
logger.debug("Validating usage record [{}] for account [{}] against [{}] quota tariffs.", usageRecordToString, accountToString, quotaTariffs.size());
|
||||
|
||||
PresetVariables presetVariables = getPresetVariables(hasAnyQuotaTariffWithActivationRule, usageRecord);
|
||||
BigDecimal aggregatedQuotaTariffsValue = BigDecimal.ZERO;
|
||||
@ -406,7 +400,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
protected BigDecimal getQuotaTariffValueToBeApplied(QuotaTariffVO quotaTariff, JsInterpreter jsInterpreter, PresetVariables presetVariables) {
|
||||
String activationRule = quotaTariff.getActivationRule();
|
||||
BigDecimal quotaTariffValue = quotaTariff.getCurrencyValue();
|
||||
String quotaTariffToString = quotaTariff.toString();
|
||||
String quotaTariffToString = quotaTariff.toString(usageAggregationTimeZone);
|
||||
|
||||
if (StringUtils.isEmpty(activationRule)) {
|
||||
logger.debug(String.format("Quota tariff [%s] does not have an activation rule, therefore we will use the quota tariff value [%s] in the calculation.",
|
||||
@ -468,10 +462,11 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
Date quotaTariffEndDate = quotaTariff.getEndDate();
|
||||
|
||||
if ((quotaTariffEndDate != null && usageRecordStartDate.after(quotaTariffEndDate)) || usageRecordEndDate.before(quotaTariffStartDate)) {
|
||||
logger.debug(String.format("Not applying quota tariff [%s] in usage record [%s] of account [%s] due to it is out of the period to be applied. Period of the usage"
|
||||
+ " record [startDate: %s, endDate: %s], period of the quota tariff [startDate: %s, endDate: %s].", quotaTariff, usageRecord.toString(), accountToString,
|
||||
DateUtil.getOutputString(usageRecordStartDate), DateUtil.getOutputString(usageRecordEndDate), DateUtil.getOutputString(quotaTariffStartDate),
|
||||
DateUtil.getOutputString(quotaTariffEndDate)));
|
||||
logger.debug("Not applying quota tariff [{}] in usage record [{}] of account [{}] due to it is out of the period to be applied. Period of the usage"
|
||||
+ " record [startDate: {}, endDate: {}], period of the quota tariff [startDate: {}, endDate: {}].", quotaTariff.toString(usageAggregationTimeZone),
|
||||
usageRecord.toString(usageAggregationTimeZone), accountToString, DateUtil.displayDateInTimezone(usageAggregationTimeZone, usageRecordStartDate),
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, usageRecordEndDate), DateUtil.displayDateInTimezone(usageAggregationTimeZone, quotaTariffStartDate),
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, quotaTariffEndDate));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -497,11 +492,11 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
||||
}
|
||||
|
||||
protected QuotaUsageVO createQuotaUsageAccordingToUsageUnit(UsageVO usageRecord, BigDecimal aggregatedQuotaTariffsValue, String accountToString) {
|
||||
String usageRecordToString = usageRecord.toString();
|
||||
String usageRecordToString = usageRecord.toString(usageAggregationTimeZone);
|
||||
|
||||
if (aggregatedQuotaTariffsValue.equals(BigDecimal.ZERO)) {
|
||||
logger.debug(String.format("Usage record [%s] for account [%s] does not have quota tariffs to be calculated, therefore we will mark it as calculated.",
|
||||
usageRecordToString, accountToString));
|
||||
logger.debug("No tariffs were applied to usage record [{}] of account [{}] or they resulted in 0; We will only mark the usage record as calculated.",
|
||||
usageRecordToString, accountToString);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@ -16,11 +16,13 @@
|
||||
//under the License.
|
||||
package org.apache.cloudstack.quota.vo;
|
||||
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.cloudstack.api.InternalIdentity;
|
||||
import org.apache.cloudstack.quota.constant.QuotaTypes;
|
||||
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
@ -33,6 +35,7 @@ import javax.persistence.TemporalType;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity
|
||||
@ -261,6 +264,12 @@ public class QuotaTariffVO implements InternalIdentity {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "uuid", "name", "effectiveOn", "endDate");
|
||||
};
|
||||
return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "uuid", "name", "usageName");
|
||||
}
|
||||
|
||||
public String toString(TimeZone timeZone) {
|
||||
String startDateString = DateUtil.displayDateInTimezone(timeZone, getEffectiveOn());
|
||||
String endDateString = DateUtil.displayDateInTimezone(timeZone, getEndDate());
|
||||
return String.format("%s,\"startDate\":\"%s\",\"endDate\":\"%s\"}", StringUtils.chop(this.toString()), startDateString, endDateString);
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,6 +34,7 @@ import java.util.function.Consumer;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.ServerApiException;
|
||||
import org.apache.cloudstack.api.command.QuotaBalanceCmd;
|
||||
@ -44,6 +45,7 @@ import org.apache.cloudstack.api.command.QuotaTariffCreateCmd;
|
||||
import org.apache.cloudstack.api.command.QuotaTariffListCmd;
|
||||
import org.apache.cloudstack.api.command.QuotaTariffUpdateCmd;
|
||||
import org.apache.cloudstack.quota.QuotaManager;
|
||||
import org.apache.cloudstack.quota.QuotaManagerImpl;
|
||||
import org.apache.cloudstack.quota.QuotaService;
|
||||
import org.apache.cloudstack.quota.QuotaStatement;
|
||||
import org.apache.cloudstack.quota.constant.QuotaConfig;
|
||||
@ -470,12 +472,14 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
|
||||
}
|
||||
|
||||
if (endDate.compareTo(startDate) < 0) {
|
||||
throw new InvalidParameterValueException(String.format("The quota tariff's end date [%s] cannot be less than the start date [%s]", endDate, startDate));
|
||||
throw new InvalidParameterValueException(String.format("The quota tariff's end date [%s] cannot be less than the start date [%s].",
|
||||
endDate, startDate));
|
||||
}
|
||||
|
||||
Date now = _quotaService.computeAdjustedTime(new Date());
|
||||
if (endDate.compareTo(now) < 0) {
|
||||
throw new InvalidParameterValueException(String.format("The quota tariff's end date [%s] cannot be less than now [%s].", endDate, now));
|
||||
throw new InvalidParameterValueException(String.format("The quota tariff's end date [%s] cannot be less than now [%s].",
|
||||
endDate, now));
|
||||
}
|
||||
|
||||
newQuotaTariff.setEndDate(endDate);
|
||||
@ -487,7 +491,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
|
||||
QuotaBalanceVO qb = _quotaBalanceDao.findLaterBalanceEntry(accountId, domainId, despositedOn);
|
||||
|
||||
if (qb != null) {
|
||||
throw new InvalidParameterValueException("Incorrect deposit date: " + despositedOn + " there are balance entries after this date");
|
||||
throw new InvalidParameterValueException(String.format("Incorrect deposit date [%s], as there are balance entries after this date.",
|
||||
despositedOn));
|
||||
}
|
||||
|
||||
QuotaCreditsVO credits = new QuotaCreditsVO(accountId, domainId, new BigDecimal(amount), updatedBy);
|
||||
@ -500,9 +505,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
|
||||
}
|
||||
final boolean lockAccountEnforcement = "true".equalsIgnoreCase(QuotaConfig.QuotaEnableEnforcement.value());
|
||||
final BigDecimal currentAccountBalance = _quotaBalanceDao.lastQuotaBalance(accountId, domainId, startOfNextDay(new Date(despositedOn.getTime())));
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("AddQuotaCredits: Depositing " + amount + " on adjusted date " + despositedOn + ", current balance " + currentAccountBalance);
|
||||
}
|
||||
logger.debug("Depositing [{}] credits on adjusted date [{}]; current balance is [{}].", amount,
|
||||
DateUtil.displayDateInTimezone(QuotaManagerImpl.getUsageAggregationTimeZone(), despositedOn), currentAccountBalance);
|
||||
// update quota account with the balance
|
||||
_quotaService.saveQuotaAccount(account, currentAccountBalance, despositedOn);
|
||||
if (lockAccountEnforcement) {
|
||||
@ -581,9 +585,10 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
|
||||
QuotaBalanceResponse resp = new QuotaBalanceResponse();
|
||||
BigDecimal lastCredits = new BigDecimal(0);
|
||||
for (QuotaBalanceVO entry : quotaBalance) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("createQuotaLastBalanceResponse Date=" + entry.getUpdatedOn() + " balance=" + entry.getCreditBalance() + " credit=" + entry.getCreditsId());
|
||||
}
|
||||
logger.debug("createQuotaLastBalanceResponse Date={} balance={} credit={}",
|
||||
DateUtil.displayDateInTimezone(QuotaManagerImpl.getUsageAggregationTimeZone(), entry.getUpdatedOn()),
|
||||
entry.getCreditBalance(), entry.getCreditsId());
|
||||
|
||||
lastCredits = lastCredits.add(entry.getCreditBalance());
|
||||
}
|
||||
resp.setStartQuota(lastCredits);
|
||||
@ -638,7 +643,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
|
||||
}
|
||||
|
||||
if (startDate.compareTo(now) < 0) {
|
||||
throw new InvalidParameterValueException(String.format("The quota tariff's start date [%s] cannot be less than now [%s]", startDate, now));
|
||||
throw new InvalidParameterValueException(String.format("The value passed as Quota tariff's start date is in the past: [%s]. " +
|
||||
"Please, inform a date in the future or do not pass the parameter to use the current date and time.", startDate));
|
||||
}
|
||||
|
||||
return persistNewQuotaTariff(null, name, usageType, startDate, cmd.getEntityOwnerId(), endDate, value, description, activationRule);
|
||||
|
||||
@ -51,7 +51,7 @@ import org.apache.cloudstack.quota.dao.QuotaUsageDao;
|
||||
import org.apache.cloudstack.quota.vo.QuotaAccountVO;
|
||||
import org.apache.cloudstack.quota.vo.QuotaBalanceVO;
|
||||
import org.apache.cloudstack.quota.vo.QuotaUsageVO;
|
||||
import org.apache.cloudstack.utils.usage.UsageUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.configuration.Config;
|
||||
@ -83,7 +83,6 @@ public class QuotaServiceImpl extends ManagerBase implements QuotaService, Confi
|
||||
private QuotaResponseBuilder _respBldr;
|
||||
|
||||
private TimeZone _usageTimezone;
|
||||
private int _aggregationDuration = 0;
|
||||
|
||||
public QuotaServiceImpl() {
|
||||
super();
|
||||
@ -92,21 +91,10 @@ public class QuotaServiceImpl extends ManagerBase implements QuotaService, Confi
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
super.configure(name, params);
|
||||
String timeZoneStr = _configDao.getValue(Config.UsageAggregationTimezone.toString());
|
||||
String aggregationRange = _configDao.getValue(Config.UsageStatsJobAggregationRange.toString());
|
||||
if (timeZoneStr == null) {
|
||||
timeZoneStr = "GMT";
|
||||
}
|
||||
|
||||
String timeZoneStr = ObjectUtils.defaultIfNull(_configDao.getValue(Config.UsageAggregationTimezone.toString()), "GMT");
|
||||
_usageTimezone = TimeZone.getTimeZone(timeZoneStr);
|
||||
|
||||
_aggregationDuration = Integer.parseInt(aggregationRange);
|
||||
if (_aggregationDuration < UsageUtils.USAGE_AGGREGATION_RANGE_MIN) {
|
||||
logger.warn("Usage stats job aggregation range is to small, using the minimum value of " + UsageUtils.USAGE_AGGREGATION_RANGE_MIN);
|
||||
_aggregationDuration = UsageUtils.USAGE_AGGREGATION_RANGE_MIN;
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Usage timezone = " + _usageTimezone + " AggregationDuration=" + _aggregationDuration);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -99,7 +99,6 @@ public class QuotaServiceImplTest extends TestCase {
|
||||
QuotaResponseBuilderField.set(quotaService, respBldr);
|
||||
|
||||
Mockito.when(configDao.getValue(Mockito.eq(Config.UsageAggregationTimezone.toString()))).thenReturn("IST");
|
||||
Mockito.when(configDao.getValue(Mockito.eq(Config.UsageStatsJobAggregationRange.toString()))).thenReturn("1");
|
||||
quotaService.configure("randomName", null);
|
||||
}
|
||||
|
||||
|
||||
@ -27,6 +27,7 @@ import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import com.cloud.domain.Domain;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
|
||||
import org.apache.cloudstack.api.command.admin.usage.ListUsageRecordsCmd;
|
||||
import org.apache.cloudstack.api.command.admin.usage.RemoveRawUsageRecordsCmd;
|
||||
@ -36,6 +37,7 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||
import org.apache.cloudstack.usage.Usage;
|
||||
import org.apache.cloudstack.usage.UsageService;
|
||||
import org.apache.cloudstack.usage.UsageTypes;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -97,7 +99,7 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
|
||||
private ConfigurationDao _configDao;
|
||||
@Inject
|
||||
private ProjectManager _projectMgr;
|
||||
private TimeZone _usageTimezone;
|
||||
private TimeZone _usageTimezone = TimeZone.getTimeZone("GMT");
|
||||
@Inject
|
||||
private AccountService _accountService;
|
||||
@Inject
|
||||
@ -127,10 +129,7 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
super.configure(name, params);
|
||||
String timeZoneStr = _configDao.getValue(Config.UsageAggregationTimezone.toString());
|
||||
if (timeZoneStr == null) {
|
||||
timeZoneStr = "GMT";
|
||||
}
|
||||
String timeZoneStr = ObjectUtils.defaultIfNull(_configDao.getValue(Config.UsageAggregationTimezone.toString()), "GMT");
|
||||
_usageTimezone = TimeZone.getTimeZone(timeZoneStr);
|
||||
return true;
|
||||
}
|
||||
@ -211,10 +210,10 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
|
||||
Date adjustedStartDate = computeAdjustedTime(startDate, usageTZ);
|
||||
Date adjustedEndDate = computeAdjustedTime(endDate, usageTZ);
|
||||
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("getting usage records for account: " + accountId + ", domainId: " + domainId + ", between " + adjustedStartDate + " and " + adjustedEndDate +
|
||||
", using pageSize: " + cmd.getPageSizeVal() + " and startIndex: " + cmd.getStartIndex());
|
||||
}
|
||||
logger.debug("Getting usage records for account ID [{}], domain ID [{}] between [{}] and [{}] using page size [{}] and start index [{}].",
|
||||
accountId, domainId, DateUtil.displayDateInTimezone(_usageTimezone, adjustedStartDate),
|
||||
DateUtil.displayDateInTimezone(_usageTimezone, adjustedEndDate), cmd.getPageSizeVal(),
|
||||
cmd.getStartIndex());
|
||||
|
||||
Filter usageFilter = new Filter(UsageVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
||||
|
||||
|
||||
@ -61,6 +61,7 @@ import com.cloud.user.VmDiskStatisticsVO;
|
||||
import com.cloud.user.dao.AccountDao;
|
||||
import com.cloud.user.dao.UserStatisticsDao;
|
||||
import com.cloud.user.dao.VmDiskStatisticsDao;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import com.cloud.utils.component.ManagerBase;
|
||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.DB;
|
||||
@ -172,7 +173,6 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
private boolean _runQuota=false;
|
||||
String _hostname = null;
|
||||
int _pid = 0;
|
||||
TimeZone _usageTimezone = TimeZone.getTimeZone("GMT");;
|
||||
private final GlobalLock _heartbeatLock = GlobalLock.getInternLock("usage.job.heartbeat.check");
|
||||
private final List<UsageNetworkVO> usageNetworks = new ArrayList<UsageNetworkVO>();
|
||||
private final List<UsageVmDiskVO> usageVmDisks = new ArrayList<UsageVmDiskVO>();
|
||||
@ -184,6 +184,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
private Future _heartbeat = null;
|
||||
private Future _sanity = null;
|
||||
private boolean usageSnapshotSelection = false;
|
||||
private static TimeZone usageAggregationTimeZone = TimeZone.getTimeZone("GMT");
|
||||
|
||||
public UsageManagerImpl() {
|
||||
}
|
||||
@ -226,7 +227,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
String execTime = configs.get("usage.stats.job.exec.time");
|
||||
String aggregationRange = configs.get("usage.stats.job.aggregation.range");
|
||||
String execTimeZone = configs.get("usage.execution.timezone");
|
||||
String aggreagationTimeZone = configs.get("usage.aggregation.timezone");
|
||||
String aggregationTimeZone = configs.get("usage.aggregation.timezone");
|
||||
String sanityCheckInterval = configs.get("usage.sanity.check.interval");
|
||||
String quotaEnable = configs.get("quota.enable.service");
|
||||
_runQuota = Boolean.valueOf(quotaEnable == null ? "false" : quotaEnable );
|
||||
@ -235,10 +236,9 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
_sanityCheckInterval = Integer.parseInt(sanityCheckInterval);
|
||||
}
|
||||
|
||||
if (aggreagationTimeZone != null && !aggreagationTimeZone.isEmpty()) {
|
||||
_usageTimezone = TimeZone.getTimeZone(aggreagationTimeZone);
|
||||
if (aggregationTimeZone != null && !aggregationTimeZone.isEmpty()) {
|
||||
usageAggregationTimeZone = TimeZone.getTimeZone(aggregationTimeZone);
|
||||
}
|
||||
logger.debug("Usage stats aggregation time zone: " + aggreagationTimeZone);
|
||||
|
||||
try {
|
||||
if ((execTime == null) || (aggregationRange == null)) {
|
||||
@ -254,25 +254,27 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
}
|
||||
int hourOfDay = Integer.parseInt(execTimeSegments[0]);
|
||||
int minutes = Integer.parseInt(execTimeSegments[1]);
|
||||
_jobExecTime.setTime(new Date());
|
||||
|
||||
Date currentDate = new Date();
|
||||
_jobExecTime.setTime(currentDate);
|
||||
|
||||
_jobExecTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
|
||||
_jobExecTime.set(Calendar.MINUTE, minutes);
|
||||
_jobExecTime.set(Calendar.SECOND, 0);
|
||||
_jobExecTime.set(Calendar.MILLISECOND, 0);
|
||||
if (execTimeZone != null && !execTimeZone.isEmpty()) {
|
||||
_jobExecTime.setTimeZone(TimeZone.getTimeZone(execTimeZone));
|
||||
}
|
||||
|
||||
TimeZone jobExecTimeZone = execTimeZone != null ? TimeZone.getTimeZone(execTimeZone) : Calendar.getInstance().getTimeZone();
|
||||
_jobExecTime.setTimeZone(jobExecTimeZone);
|
||||
|
||||
// if the hour to execute the job has already passed, roll the day forward to the next day
|
||||
Date execDate = _jobExecTime.getTime();
|
||||
if (execDate.before(new Date())) {
|
||||
if (_jobExecTime.getTime().before(currentDate)) {
|
||||
_jobExecTime.roll(Calendar.DAY_OF_YEAR, true);
|
||||
}
|
||||
|
||||
logger.debug("Execution Time: " + execDate.toString());
|
||||
Date currentDate = new Date(System.currentTimeMillis());
|
||||
logger.debug("Current Time: " + currentDate.toString());
|
||||
logger.info("Usage is configured to execute in time zone [{}], at [{}], each [{}] minutes; the current time in that timezone is [{}] and the " +
|
||||
"next job is scheduled to execute at [{}]. During its execution, Usage will aggregate stats according to the time zone [{}] defined in global setting [usage.aggregation.timezone].",
|
||||
jobExecTimeZone.getID(), execTime, aggregationRange, DateUtil.displayDateInTimezone(jobExecTimeZone, currentDate),
|
||||
DateUtil.displayDateInTimezone(jobExecTimeZone, _jobExecTime.getTime()), usageAggregationTimeZone.getID());
|
||||
|
||||
_aggregationDuration = Integer.parseInt(aggregationRange);
|
||||
if (_aggregationDuration < UsageUtils.USAGE_AGGREGATION_RANGE_MIN) {
|
||||
@ -298,6 +300,10 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
return true;
|
||||
}
|
||||
|
||||
public static TimeZone getUsageAggregationTimeZone() {
|
||||
return usageAggregationTimeZone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean start() {
|
||||
if (logger.isInfoEnabled()) {
|
||||
@ -380,7 +386,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
// For executing the job, we treat hourly and daily as special time ranges, using the previous full hour or the previous
|
||||
// full day. Otherwise we just subtract off the aggregation range from the current time and use that as start date with
|
||||
// current time as end date.
|
||||
Calendar cal = Calendar.getInstance(_usageTimezone);
|
||||
Calendar cal = Calendar.getInstance(usageAggregationTimeZone);
|
||||
cal.setTime(new Date());
|
||||
long startDate = 0;
|
||||
long endDate = 0;
|
||||
@ -488,9 +494,8 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
}
|
||||
Date startDate = new Date(startDateMillis);
|
||||
Date endDate = new Date(endDateMillis);
|
||||
if (logger.isInfoEnabled()) {
|
||||
logger.info("Parsing usage records between " + startDate + " and " + endDate);
|
||||
}
|
||||
logger.info("Parsing usage records between [{}] and [{}].", DateUtil.displayDateInTimezone(usageAggregationTimeZone, startDate),
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, endDate));
|
||||
|
||||
List<AccountVO> accounts = null;
|
||||
List<UserStatisticsVO> userStats = null;
|
||||
@ -705,7 +710,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
// get user stats in order to compute network usage
|
||||
networkStats = _usageNetworkDao.getRecentNetworkStats();
|
||||
|
||||
Calendar recentlyDeletedCal = Calendar.getInstance(_usageTimezone);
|
||||
Calendar recentlyDeletedCal = Calendar.getInstance(usageAggregationTimeZone);
|
||||
recentlyDeletedCal.setTimeInMillis(startDateMillis);
|
||||
recentlyDeletedCal.add(Calendar.MINUTE, -1 * THREE_DAYS_IN_MINUTES);
|
||||
Date recentlyDeletedDate = recentlyDeletedCal.getTime();
|
||||
@ -814,7 +819,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
Date currentEndDate = endDate;
|
||||
Date tempDate = endDate;
|
||||
|
||||
Calendar aggregateCal = Calendar.getInstance(_usageTimezone);
|
||||
Calendar aggregateCal = Calendar.getInstance(usageAggregationTimeZone);
|
||||
|
||||
while ((tempDate.after(startDate)) && ((tempDate.getTime() - startDate.getTime()) > 60000)) {
|
||||
currentEndDate = tempDate;
|
||||
@ -1850,8 +1855,9 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
deleteUsageVpnUser(event, account);
|
||||
break;
|
||||
default:
|
||||
logger.debug(String.format("The event [type=%s, zoneId=%s, accountId=%s, userId=%s, resourceName=%s, createDate=%s] is neither of type [%s] nor [%s]",
|
||||
event.getType(), zoneId, accountId, userId, event.getResourceName(), event.getCreateDate(), EventTypes.EVENT_VPN_USER_ADD, EventTypes.EVENT_VPN_USER_REMOVE));
|
||||
logger.debug("The event [type={}, zoneId={}, accountId={}, userId={}, resourceName={}, createDate={}] is neither of type [{}] nor [{}].",
|
||||
event.getType(), zoneId, accountId, userId, event.getResourceName(), DateUtil.displayDateInTimezone(usageAggregationTimeZone, event.getCreateDate()),
|
||||
EventTypes.EVENT_VPN_USER_ADD, EventTypes.EVENT_VPN_USER_REMOVE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1967,8 +1973,10 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
deleteUsageVMSnapshot(event);
|
||||
break;
|
||||
default:
|
||||
logger.debug(String.format("The event [type=%s, zoneId=%s, accountId=%s, resourceName=%s, diskOfferingId=%s, createDate=%s] is neither of type [%s] nor [%s]",
|
||||
event.getType(), event.getZoneId(), event.getAccountId(), event.getResourceName(), event.getOfferingId(), event.getCreateDate(), EventTypes.EVENT_VM_SNAPSHOT_CREATE, EventTypes.EVENT_VM_SNAPSHOT_DELETE));
|
||||
logger.debug("The event [type={}, zoneId={}, accountId={}, resourceName={}, diskOfferingId={}, createDate={}] is neither of type [{}] nor [{}].",
|
||||
event.getType(), event.getZoneId(), event.getAccountId(), event.getResourceName(), event.getOfferingId(),
|
||||
DateUtil.displayDateInTimezone(usageAggregationTimeZone, event.getCreateDate()), EventTypes.EVENT_VM_SNAPSHOT_CREATE,
|
||||
EventTypes.EVENT_VM_SNAPSHOT_DELETE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1992,8 +2000,8 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
|
||||
String snapId = detailVO.getValue();
|
||||
vmSnapshotId = Long.valueOf(snapId);
|
||||
}
|
||||
logger.debug(String.format("Creating usage VM Snapshot for VM id [%s] assigned to account [%s] domain [%s], zone [%s], and created at [%s]", vmId, accountId, domainId, zoneId,
|
||||
event.getCreateDate()));
|
||||
logger.debug("Creating usage VM Snapshot for VM id [{}] assigned to account [{}] domain [{}], zone [{}], and created at [{}].",
|
||||
vmId, accountId, domainId, zoneId, DateUtil.displayDateInTimezone(usageAggregationTimeZone, event.getCreateDate()));
|
||||
UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, accountId, domainId, vmId, offeringId, size, created, null);
|
||||
vsVO.setVmSnapshotId(vmSnapshotId);
|
||||
_usageVMSnapshotDao.persist(vsVO);
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -149,10 +151,9 @@ public class IPAddressUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating IP usage record with id: " + ipId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate +
|
||||
", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating IP usage record with id [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
ipId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
String usageDesc = "IPAddress: " + ipAddress;
|
||||
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -146,10 +148,9 @@ public class LoadBalancerUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating Volume usage record for load balancer: " + lbId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " +
|
||||
endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating usage record for load balancer with id [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
lbId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "Load Balancing Policy: " + lbId + " usage time";
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -148,10 +150,9 @@ public class NetworkOfferingUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating network offering:" + noId + " usage record for Vm : " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate +
|
||||
", endDate: " + endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating network offering usage record for id [{}], vm [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
noId, vmId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "Network offering:" + noId + " for Vm : " + vmId + " usage time";
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -103,10 +105,10 @@ public class NetworkUsageParser {
|
||||
long totalBytesReceived = networkInfo.getBytesRcvd();
|
||||
|
||||
if ((totalBytesSent > 0L) || (totalBytesReceived > 0L)) {
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating usage record, total bytes sent: " + toHumanReadableSize(totalBytesSent) + ", total bytes received: " + toHumanReadableSize(totalBytesReceived) + " for account: " +
|
||||
account.getId() + " in availability zone " + networkInfo.getZoneId() + ", start: " + startDate + ", end: " + endDate);
|
||||
}
|
||||
LOGGER.debug("Creating usage record, total bytes sent [{}], total bytes received [{}], startDate [{}], and endDate [{}], for account [{}] in " +
|
||||
"availability zone [{}].", toHumanReadableSize(totalBytesSent), toHumanReadableSize(totalBytesReceived),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId(), networkInfo.getZoneId());
|
||||
|
||||
Long hostId = null;
|
||||
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -146,10 +148,9 @@ public class PortForwardingUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating usage record for port forwarding rule: " + pfId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " +
|
||||
endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating usage record for port forwarding rule [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
pfId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "Port Forwarding Rule: " + pfId + " usage time";
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -147,10 +149,9 @@ public class SecurityGroupUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating security group:" + sgId + " usage record for Vm : " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate +
|
||||
", endDate: " + endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating security group usage record for id [{}], vm [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
sgId, vmId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "Security Group: " + sgId + " for Vm : " + vmId + " usage time";
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -159,10 +161,9 @@ public class StorageUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating Storage usage record for type: " + type + " with id: " + storageId + ", usage: " + usageDisplay + ", startDate: " + startDate +
|
||||
", endDate: " + endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating Storage usage record for type [{}], with id [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
type, storageId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
String usageDesc = "";
|
||||
Long tmplSourceId = null;
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -173,10 +175,9 @@ public class VMInstanceUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating VM usage record for vm: " + vmName + ", type: " + type + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " +
|
||||
endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating VM usage record for vm [{}], type [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
vmName, type, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = vmName;
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -115,10 +117,9 @@ public class VMSnapshotOnPrimaryParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating VMSnapshot Id: " + vmSnapshotId + " On Primary usage record for vm: " + vmId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate
|
||||
+ ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating usage record for VMSnapshot with id [{}] in primary, vm [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
vmSnapshotId, vmId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "VMSnapshot Id: " + vmSnapshotId + " On Primary Usage: VM Id: " + vmId;
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -134,10 +136,9 @@ public class VMSnapshotUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating VMSnapshot Id:" + vmSnapshotId + " Volume usage record for vol: " + volId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " +
|
||||
endDate + ", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating usage record for VMSnapshot with id [{}], vol [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
vmSnapshotId, volId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "VMSnapshot Id: " + vmSnapshotId + " Usage: " + "VM Id: " + vmId + " Volume Id: " + volId + " ";
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -142,10 +144,9 @@ public class VPNUserUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating VPN user:" + userId + " usage record, usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate +
|
||||
", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating usage record for VPN user [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
userId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "VPN User: " + userName + ", Id: " + userId + " usage time";
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -108,11 +110,10 @@ public class VmDiskUsageParser {
|
||||
long bytesWrite = vmDiskInfo.getBytesWrite();
|
||||
|
||||
if ((ioRead > 0L) || (ioWrite > 0L) || (bytesRead > 0L) || (bytesWrite > 0L)) {
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating vm disk usage record, io read:" + toHumanReadableSize(ioRead) + ", io write: " + toHumanReadableSize(ioWrite) + ", bytes read:" + toHumanReadableSize(bytesRead) + ", bytes write: " +
|
||||
toHumanReadableSize(bytesWrite) + " for account: " + account.getId() + " in availability zone " + vmDiskInfo.getZoneId() + ", start: " + startDate + ", end: " +
|
||||
endDate);
|
||||
}
|
||||
LOGGER.debug("Creating vm disk usage record, io read [{}], io write [{}], bytes read [{}], bytes write [{}], startDate [{}], and endDate [{}], " +
|
||||
"for account [{}] in availability zone [{}].", toHumanReadableSize(ioRead), toHumanReadableSize(ioWrite), toHumanReadableSize(bytesRead),
|
||||
toHumanReadableSize(bytesWrite), DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId(), vmDiskInfo.getZoneId());
|
||||
|
||||
Long vmId = null;
|
||||
Long volumeId = null;
|
||||
|
||||
@ -25,6 +25,8 @@ import java.util.Map;
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.usage.UsageManagerImpl;
|
||||
import com.cloud.utils.DateUtil;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -153,10 +155,9 @@ public class VolumeUsageParser {
|
||||
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||
String usageDisplay = dFormat.format(usage);
|
||||
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Creating Volume usage record for vol: " + volId + ", usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate +
|
||||
", for account: " + account.getId());
|
||||
}
|
||||
LOGGER.debug("Creating Volume usage record for vol [{}], usage [{}], startDate [{}], and endDate [{}], for account [{}].",
|
||||
volId, usageDisplay, DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), startDate),
|
||||
DateUtil.displayDateInTimezone(UsageManagerImpl.getUsageAggregationTimeZone(), endDate), account.getId());
|
||||
|
||||
// Create the usage record
|
||||
String usageDesc = "Volume Id: " + volId + " usage time";
|
||||
|
||||
@ -48,11 +48,12 @@ public class DateUtil {
|
||||
|
||||
public static final TimeZone GMT_TIMEZONE = TimeZone.getTimeZone("GMT");
|
||||
public static final String YYYYMMDD_FORMAT = "yyyyMMddHHmmss";
|
||||
private static final DateFormat s_outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
|
||||
private static final String ZONED_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
|
||||
private static final DateFormat ZONED_DATETIME_SIMPLE_FORMATTER = new SimpleDateFormat(ZONED_DATETIME_FORMAT);
|
||||
|
||||
private static final DateTimeFormatter[] parseFormats = new DateTimeFormatter[]{
|
||||
DateTimeFormatter.ISO_OFFSET_DATE_TIME,
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"),
|
||||
DateTimeFormatter.ofPattern(ZONED_DATETIME_FORMAT),
|
||||
DateTimeFormatter.ISO_INSTANT,
|
||||
// with milliseconds
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX"),
|
||||
@ -95,7 +96,7 @@ public class DateUtil {
|
||||
}
|
||||
|
||||
public static String displayDateInTimezone(TimeZone tz, Date time) {
|
||||
return getDateDisplayString(tz, time, "yyyy-MM-dd HH:mm:ss z");
|
||||
return getDateDisplayString(tz, time, ZONED_DATETIME_FORMAT);
|
||||
}
|
||||
|
||||
public static String getDateDisplayString(TimeZone tz, Date time) {
|
||||
@ -103,6 +104,10 @@ public class DateUtil {
|
||||
}
|
||||
|
||||
public static String getDateDisplayString(TimeZone tz, Date time, String formatString) {
|
||||
if (time == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
DateFormat df = new SimpleDateFormat(formatString);
|
||||
df.setTimeZone(tz);
|
||||
|
||||
@ -113,9 +118,9 @@ public class DateUtil {
|
||||
if (date == null) {
|
||||
return "";
|
||||
}
|
||||
String formattedString = null;
|
||||
synchronized (s_outputFormat) {
|
||||
formattedString = s_outputFormat.format(date);
|
||||
String formattedString;
|
||||
synchronized (ZONED_DATETIME_SIMPLE_FORMATTER) {
|
||||
formattedString = ZONED_DATETIME_SIMPLE_FORMATTER.format(date);
|
||||
}
|
||||
return formattedString;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user