/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* 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.linkedin.pinot.transport.metrics;
import com.linkedin.pinot.common.metrics.AggregatedCounter;
import com.linkedin.pinot.common.metrics.AggregatedHistogram;
import com.linkedin.pinot.common.metrics.AggregatedLongGauge;
import com.linkedin.pinot.common.metrics.AggregatedMetricsRegistry;
import com.linkedin.pinot.common.metrics.LatencyMetric;
import com.linkedin.pinot.common.metrics.MetricsHelper;
import com.yammer.metrics.core.Gauge;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.core.Sampling;
import com.yammer.metrics.core.Summarizable;
/**
*
* Aggregated Transport Client Metrics. Provides multi-level aggregation.
*
*/
public class AggregatedTransportClientMetrics implements TransportClientMetrics {
public static final String CONNECT_TIME = "CONNECT-MS";
public static final String REQUESTS_SENT = "Requests-Sent";
public static final String BYTES_SENT = "bytes-Sent";
public static final String BYTES_RECEIVED = "bytes-received";
public static final String ERRORS = "errors";
public static final String SEND_REQUEST_MS = "Send-Request-MS";
public static final String RESPONSE_LATENCY_MS = "Latency-MS";
// Number of Requests Sent
private final AggregatedCounter _requestsSent;
// Number of Request bytes sent
private final AggregatedCounter _bytesSent;
// Number of Response bytes sent
private final AggregatedCounter _bytesReceived;
// Number of Errors
private final AggregatedCounter _errors;
// Send Request Latency Ms
private final AggregatedHistogram<Sampling> _sendRequestMsHistogram;
// Response Latency Ms
private final AggregatedHistogram<Sampling> _responseLatencyMsHistogram;
// Connect Time (MS)
private final AggregatedLongGauge<Long, Gauge<Long>> _connectMsGauge;
public AggregatedTransportClientMetrics(AggregatedMetricsRegistry registry, String group) {
_requestsSent = MetricsHelper.newAggregatedCounter(registry, new MetricName(group, "", REQUESTS_SENT));
_bytesSent = MetricsHelper.newAggregatedCounter(registry, new MetricName(group, "", BYTES_SENT));
_bytesReceived = MetricsHelper.newAggregatedCounter(registry, new MetricName(group, "", BYTES_RECEIVED));
_errors = MetricsHelper.newAggregatedCounter(registry, new MetricName(group, "", ERRORS));
_sendRequestMsHistogram =
MetricsHelper.newAggregatedHistogram(registry, new MetricName(group, "", SEND_REQUEST_MS));
_responseLatencyMsHistogram =
MetricsHelper.newAggregatedHistogram(registry, new MetricName(group, "", RESPONSE_LATENCY_MS));
_connectMsGauge = MetricsHelper.newAggregatedLongGauge(registry, new MetricName(group, "", CONNECT_TIME));
}
/**
* Add NettyClientMetrics to aggregated metrics
* @param metric metric to be aggregated
*/
public void addTransportClientMetrics(NettyClientMetrics metric) {
_requestsSent.add(metric.getRequestsSent());
_bytesSent.add(metric.getBytesSent());
_bytesReceived.add(metric.getBytesReceived());
_errors.add(metric.getErrors());
_connectMsGauge.add(metric.getConnectMsGauge());
_sendRequestMsHistogram.add(metric.getSendRequestMsHistogram());
_responseLatencyMsHistogram.add(metric.getResponseLatencyMsHistogram());
}
/**
* Add another AggregatedTransportClientMetrics to this aggregated metrics to create
* multi-level aggregation
* @param metric metric to be aggregated
*/
public void addTransportClientMetrics(AggregatedTransportClientMetrics metric) {
_requestsSent.add(metric.getRequestsSent());
_bytesSent.add(metric.getBytesSent());
_bytesReceived.add(metric.getBytesReceived());
_errors.add(metric.getErrors());
_connectMsGauge.add(metric.getConnectMsGauge());
_sendRequestMsHistogram.add(metric.getSendRequestMsHistogram());
_responseLatencyMsHistogram.add(metric.getResponseLatencyMsHistogram());
}
/**
* Remove NettyClientMetrics to aggregated metrics
* @param metric metric to be be removed
*/
public void removeTransportClientMetrics(NettyClientMetrics metric) {
_requestsSent.remove(metric.getRequestsSent());
_bytesSent.remove(metric.getBytesSent());
_bytesReceived.remove(metric.getBytesReceived());
_errors.remove(metric.getErrors());
_connectMsGauge.remove(metric.getConnectMsGauge());
_sendRequestMsHistogram.remove(metric.getSendRequestMsHistogram());
_responseLatencyMsHistogram.remove(metric.getResponseLatencyMsHistogram());
}
/**
* Remove AggregatedTransportClientMetrics to aggregated metrics
* @param metric metric to be be removed
*/
public void removeTransportClientMetrics(AggregatedTransportClientMetrics metric) {
_requestsSent.remove(metric.getRequestsSent());
_bytesSent.remove(metric.getBytesSent());
_bytesReceived.remove(metric.getBytesReceived());
_errors.remove(metric.getErrors());
_connectMsGauge.remove(metric.getConnectMsGauge());
_sendRequestMsHistogram.remove(metric.getSendRequestMsHistogram());
_responseLatencyMsHistogram.remove(metric.getResponseLatencyMsHistogram());
}
@Override
public long getTotalRequests() {
return _requestsSent.count();
}
@Override
public long getTotalBytesSent() {
return _bytesSent.count();
}
@Override
public long getTotalBytesReceived() {
return _bytesReceived.count();
}
@Override
public long getTotalErrors() {
return _errors.count();
}
@Override
public <T extends Sampling & Summarizable> LatencyMetric<T> getSendRequestLatencyMs() {
return new LatencyMetric(_sendRequestMsHistogram);
}
@Override
public <T extends Sampling & Summarizable> LatencyMetric<T> getResponseLatencyMs() {
return new LatencyMetric(_responseLatencyMsHistogram);
}
@Override
public long getConnectTimeMs() {
return _connectMsGauge.value();
}
private AggregatedCounter getRequestsSent() {
return _requestsSent;
}
private AggregatedCounter getBytesSent() {
return _bytesSent;
}
private AggregatedCounter getBytesReceived() {
return _bytesReceived;
}
private AggregatedCounter getErrors() {
return _errors;
}
private AggregatedHistogram<Sampling> getSendRequestMsHistogram() {
return _sendRequestMsHistogram;
}
private AggregatedHistogram<Sampling> getResponseLatencyMsHistogram() {
return _responseLatencyMsHistogram;
}
private AggregatedLongGauge<Long, Gauge<Long>> getConnectMsGauge() {
return _connectMsGauge;
}
}