/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*******************************************************************************/
package org.ebayopensource.turmeric.runtime.common.impl.internal.service;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import org.ebayopensource.turmeric.runtime.common.impl.internal.monitoring.SystemMetricDefs;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.runtime.common.monitoring.MetricDef;
import org.ebayopensource.turmeric.runtime.common.monitoring.MetricsCollector;
import org.ebayopensource.turmeric.runtime.common.monitoring.value.MetricValueAggregator;
import org.ebayopensource.turmeric.runtime.common.pipeline.MessageContext;
import org.ebayopensource.turmeric.runtime.common.service.ServiceId;
/**
* @author ichernyshev
*/
final class ServiceMetricHolder {
private final ServiceId m_svcId;
private final String m_opName;
private Map<String,MetricValueAggregator> m_metrics;
private Set<MetricDef> m_failedDefs;
public ServiceMetricHolder(ServiceId svcId, String opName) {
m_svcId = svcId;
m_opName = opName;
}
public void update(MessageContext ctx, MetricDef def, long count) {
try {
if (m_metrics == null) {
// build definitions lazily to save memory on unused and fallback operations/services
if (m_opName != null) {
m_metrics = buildValues(SystemMetricDefs.getAllOperationMetrics());
} else {
m_metrics = buildValues(SystemMetricDefs.getAllSvcMetrics());
}
}
MetricValueAggregator value = m_metrics.get(def.getMetricName());
if (value == null) {
if (addFailedDef(def)) {
LogManager.getInstance(ServiceMetricHolder.class).log(
Level.WARNING, "Attempt to update unknown metric '" + def.getMetricName() +
" on service '" + m_svcId.getAdminName() + "." + m_opName + "'");
}
return;
}
value.update(ctx, count);
} catch (Throwable e) {
if (addFailedDef(def)) {
LogManager.getInstance(ServiceMetricHolder.class).log(
Level.WARNING, "Error updating metric '" + def.getMetricName() +
" on service '" + m_svcId.getAdminName() + "." + m_opName + "': " +
e.toString(), e);
}
}
}
private synchronized boolean addFailedDef(MetricDef def) {
if (m_failedDefs == null) {
m_failedDefs = new HashSet<MetricDef>();
}
if (m_failedDefs.contains(def)) {
return false;
}
m_failedDefs.add(def);
return true;
}
private Map<String,MetricValueAggregator> buildValues(List defs)
{
MetricsCollector collector;
if (m_svcId.isClientSide()) {
collector = MetricsCollector.getClientInstance();
} else {
collector = MetricsCollector.getServerInstance();
}
Map<String,MetricValueAggregator> metrics = new HashMap<String,MetricValueAggregator>();
for (Iterator it=defs.iterator(); it.hasNext(); ) {
MetricDef def = (MetricDef)it.next();
String name = def.getMetricName();
MetricValueAggregator value = collector.getMetricValue(name, m_svcId, m_opName);
metrics.put(name, value);
}
return metrics;
}
}