blob: a11d5ca1603f059933b9cee3bb97beb4f2110a5b [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.ratis.grpc.metrics.intercept.server;
import org.apache.ratis.protocol.RaftPeerId;
import org.apache.ratis.thirdparty.io.grpc.Metadata;
import org.apache.ratis.thirdparty.io.grpc.MethodDescriptor;
import org.apache.ratis.thirdparty.io.grpc.ServerCall;
import org.apache.ratis.thirdparty.io.grpc.ServerCallHandler;
import org.apache.ratis.grpc.metrics.MessageMetrics;
import org.apache.ratis.thirdparty.io.grpc.ServerInterceptor;
import java.io.Closeable;
import java.util.function.Supplier;
/**
* An implementation of a server interceptor.
* Intercepts the inbound/outbound messages and increments metrics accordingly
* before handling them.
*/
public class MetricServerInterceptor implements ServerInterceptor, Closeable {
private String identifier;
private MessageMetrics metrics;
private final Supplier<RaftPeerId> peerIdSupplier;
private final String defaultIdentifier;
public MessageMetrics getMetrics() {
return metrics;
}
public MetricServerInterceptor(Supplier<RaftPeerId> idSupplier, String defaultIdentifier){
this.peerIdSupplier = idSupplier;
this.identifier = null;
this.defaultIdentifier = defaultIdentifier;
}
private String getMethodMetricPrefix(MethodDescriptor<?, ?> method){
String serviceName = MethodDescriptor.extractFullServiceName(method.getFullMethodName());
String methodName = method.getFullMethodName().substring(serviceName.length() + 1);
return identifier + "_" + serviceName + "_" + methodName;
}
@Override
public <R, S> ServerCall.Listener<R> interceptCall(
ServerCall<R, S> call,
Metadata requestHeaders,
ServerCallHandler<R, S> next) {
MethodDescriptor<R, S> method = call.getMethodDescriptor();
if (identifier == null) {
try {
identifier = peerIdSupplier.get().toString();
} catch (Exception e) {
identifier = defaultIdentifier;
}
}
if (metrics == null) {
metrics = new MessageMetrics(identifier, "server");
}
String metricNamePrefix = getMethodMetricPrefix(method);
ServerCall<R,S> monitoringCall = new MetricServerCall<>(call, metricNamePrefix, metrics);
return new MetricServerCallListener<>(
next.startCall(monitoringCall, requestHeaders), metricNamePrefix, metrics);
}
@Override
public void close() {
final MessageMetrics m = metrics;
if (m != null) {
m.unregister();
}
}
}