/* * 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.bootstrap.context.*; import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.profiler.context.TraceFactory; /** * @author emeroad */ public class MetricTraceFactory implements TraceFactory { private final TraceFactory delegate; private final MetricRegistry metricRegistry; private MetricTraceFactory(TraceFactory traceFactory, ServiceType serviceType) { if (traceFactory == null) { throw new NullPointerException("traceFactory must not be null"); } if (serviceType == null) { throw new NullPointerException("serviceType must not be null"); } this.delegate = traceFactory; this.metricRegistry = new MetricRegistry(serviceType); } public static TraceFactory wrap(TraceFactory traceFactory, ServiceType serviceType) { return new MetricTraceFactory(traceFactory, serviceType); } @Override public Trace currentTraceObject() { return delegate.currentTraceObject(); } @Override public Trace currentRpcTraceObject() { return delegate.currentRpcTraceObject(); } @Override public Trace currentRawTraceObject() { return delegate.currentRawTraceObject(); } @Override public Trace disableSampling() { return delegate.disableSampling(); } @Override public Trace continueTraceObject(TraceId traceId) { return delegate.continueTraceObject(traceId); } @Override public Trace continueTraceObject(Trace trace) { return delegate.continueTraceObject(trace); } @Override public Trace newAsyncTraceObject() { return delegate.newAsyncTraceObject(); } @Override public Trace continueAsyncTraceObject(TraceId traceId) { return delegate.continueAsyncTraceObject(traceId); } @Override public Trace continueAsyncTraceObject(AsyncTraceId traceId, int asyncId, long startTime) { return delegate.continueAsyncTraceObject(traceId, asyncId, startTime); } @Override public Trace newTraceObject() { return delegate.newTraceObject(); } @Override public Trace removeTraceObject() { final Trace trace = delegate.removeTraceObject(); // TODO; // long time = trace.getSpanRecorder().getResponseTime(); // metricRegistry.addResponseTime(time); return trace; } public Metric getRpcMetric(ServiceType serviceType) { if (serviceType == null) { throw new NullPointerException("serviceType must not be null"); } return this.metricRegistry.getRpcMetric(serviceType); } public void recordContextMetric(int elapsedTime, boolean error) { final ContextMetric contextMetric = this.metricRegistry.getResponseMetric(); contextMetric.addResponseTime(elapsedTime, error); } public void recordAcceptResponseTime(String parentApplicationName, short parentApplicationType, int elapsedTime, boolean error) { final ContextMetric contextMetric = this.metricRegistry.getResponseMetric(); contextMetric.addAcceptHistogram(parentApplicationName, parentApplicationType, elapsedTime, error); } public void recordUserAcceptResponseTime(int elapsedTime, boolean error) { final ContextMetric contextMetric = this.metricRegistry.getResponseMetric(); contextMetric.addUserAcceptHistogram(elapsedTime, error); } }