/*
* Copyright 2017 NAVER Corp.
*
* 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 com.navercorp.pinpoint.profiler.monitor.metric.rpc;
import com.navercorp.pinpoint.common.trace.ServiceType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* @author emeroad
*/
public class MetricRegistry {
private final ConcurrentMap<Short, RpcMetric> rpcCache = new ConcurrentHashMap<Short, RpcMetric>();
private final ContextMetric contextMetric;
public MetricRegistry(ServiceType serviceType) {
if (serviceType == null) {
throw new NullPointerException("serviceType must not be null");
}
if (!serviceType.isWas()) {
throw new IllegalArgumentException("illegal serviceType:" + serviceType);
}
this.contextMetric = new ContextMetric(serviceType);
}
public RpcMetric getRpcMetric(ServiceType serviceType) {
if (serviceType == null) {
throw new NullPointerException("serviceType must not be null");
}
if (!serviceType.isRecordStatistics()) {
throw new IllegalArgumentException("illegal serviceType:" + serviceType);
}
final Short code = serviceType.getCode();
final RpcMetric hit = rpcCache.get(code);
if (hit != null) {
return hit;
}
final RpcMetric rpcMetric = new DefaultRpcMetric(serviceType);
final RpcMetric exist = rpcCache.putIfAbsent(code, rpcMetric);
if (exist != null) {
return exist;
}
return rpcMetric;
}
public ContextMetric getResponseMetric() {
return contextMetric;
}
public void addResponseTime(int mills, boolean error) {
this.contextMetric.addResponseTime(mills, error);
}
public Collection<HistogramSnapshot> createRpcResponseSnapshot() {
final List<HistogramSnapshot> histogramSnapshotList = new ArrayList<HistogramSnapshot>(16);
for (RpcMetric metric : rpcCache.values()) {
histogramSnapshotList.addAll(metric.createSnapshotList());
}
return histogramSnapshotList;
}
public HistogramSnapshot createWasResponseSnapshot() {
return null;
}
}