/**
* 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.AggregatedMetricsRegistry;
import com.linkedin.pinot.common.metrics.LatencyMetric;
import com.linkedin.pinot.common.metrics.MetricsHelper;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.core.Sampling;
import com.yammer.metrics.core.Summarizable;
/**
*
* Aggregated Transport Server Metrics. Provides multi-level aggregation.
*
*/
public class AggregatedTransportServerMetrics implements TransportServerMetrics {
public static final String REQUESTS_RECEIVED = "Requests-Sent";
public static final String BYTES_SENT = "bytes-Sent";
public static final String BYTES_RECEIVED = "bytes-received";
public static final String SEND_RESPONSE_MS = "Send-Response-MS";
public static final String PROCESSING_LATENCY_MS = "Processing-Latency-MS";
public static final String ERRORS = "errors";
// Num Requests
private final AggregatedCounter _requestsReceived;
// Request bytes
private final AggregatedCounter _bytesSent;
// Response Bytes
private final AggregatedCounter _bytesReceived;
// Errors
private final AggregatedCounter _errors;
// Latency for sending response
private final AggregatedHistogram<Sampling> _sendResponseMsHistogram;
// Total processing latency including that of sending response
private final AggregatedHistogram<Sampling> _processingLatencyMsHistogram;
public AggregatedTransportServerMetrics(AggregatedMetricsRegistry registry, String group) {
_requestsReceived = MetricsHelper.newAggregatedCounter(registry, new MetricName(group, "", REQUESTS_RECEIVED));
_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));
_sendResponseMsHistogram =
MetricsHelper.newAggregatedHistogram(registry, new MetricName(group, "", SEND_RESPONSE_MS));
_processingLatencyMsHistogram =
MetricsHelper.newAggregatedHistogram(registry, new MetricName(group, "", PROCESSING_LATENCY_MS));
}
/**
* Add NettyServerMetrics to aggregated metrics
* @param metric metric to be aggregated
*/
public void addTransportClientMetrics(NettyServerMetrics metric) {
_requestsReceived.add(metric.getRequestsReceived());
_bytesSent.add(metric.getBytesSent());
_bytesReceived.add(metric.getBytesReceived());
_errors.add(metric.getErrors());
_sendResponseMsHistogram.add(metric.getSendResponseMsHistogram());
_processingLatencyMsHistogram.add(metric.getProcessingLatencyMsHistogram());
}
/**
* Add another AggregatedTransportServerMetrics to this aggregated metrics to create
* multi-level aggregation
* @param metric metric to be aggregated
*/
public void addTransportClientMetrics(AggregatedTransportServerMetrics metric) {
_requestsReceived.add(metric.getRequestsReceived());
_bytesSent.add(metric.getBytesSent());
_bytesReceived.add(metric.getBytesReceived());
_errors.add(metric.getErrors());
_sendResponseMsHistogram.add(metric.getSendResponseMsHistogram());
_processingLatencyMsHistogram.add(metric.getProcessingLatencyMsHistogram());
}
/**
* Remove NettyServerMetrics to aggregated metrics
* @param metric metric to be be removed
*/
public void removeTransportClientMetrics(NettyServerMetrics metric) {
_requestsReceived.remove(metric.getRequestsReceived());
_bytesSent.remove(metric.getBytesSent());
_bytesReceived.remove(metric.getBytesReceived());
_errors.remove(metric.getErrors());
_sendResponseMsHistogram.remove(metric.getSendResponseMsHistogram());
_processingLatencyMsHistogram.remove(metric.getProcessingLatencyMsHistogram());
}
/**
* Remove AggregatedTransportServerMetrics to aggregated metrics
* @param metric metric to be be removed
*/
public void removeTransportClientMetrics(AggregatedTransportServerMetrics metric) {
_requestsReceived.remove(metric.getRequestsReceived());
_bytesSent.remove(metric.getBytesSent());
_bytesReceived.remove(metric.getBytesReceived());
_errors.remove(metric.getErrors());
_sendResponseMsHistogram.remove(metric.getSendResponseMsHistogram());
_processingLatencyMsHistogram.remove(metric.getProcessingLatencyMsHistogram());
}
@Override
public long getTotalRequests() {
return _requestsReceived.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> getSendResponseLatencyMs() {
return new LatencyMetric(_sendResponseMsHistogram);
}
@Override
public <T extends Sampling & Summarizable> LatencyMetric<T> getProcessingLatencyMs() {
return new LatencyMetric(_processingLatencyMsHistogram);
}
private AggregatedCounter getRequestsReceived() {
return _requestsReceived;
}
private AggregatedCounter getBytesSent() {
return _bytesSent;
}
private AggregatedCounter getBytesReceived() {
return _bytesReceived;
}
private AggregatedCounter getErrors() {
return _errors;
}
private AggregatedHistogram<Sampling> getSendResponseMsHistogram() {
return _sendResponseMsHistogram;
}
private AggregatedHistogram<Sampling> getProcessingLatencyMsHistogram() {
return _processingLatencyMsHistogram;
}
}