io.grpc.ServerStreamTracer Maven / Gradle / Ivy
/*
* Copyright 2017 The gRPC Authors
*
* 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 io.grpc;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
/**
* Listens to events on a stream to collect metrics.
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/2861")
@ThreadSafe
public abstract class ServerStreamTracer extends StreamTracer {
/**
* Called before the interceptors and the call handlers and make changes to the Context object
* if needed.
*/
public Context filterContext(Context context) {
return context;
}
/**
* Called when {@link ServerCall} is created. This is for the tracer to access information about
* the {@code ServerCall}. Called after {@link #filterContext} and before the application call
* handler.
*/
@SuppressWarnings("deprecation")
public void serverCallStarted(ServerCallInfo, ?> callInfo) {
serverCallStarted(ReadOnlyServerCall.create(callInfo));
}
/**
* Called when {@link ServerCall} is created. This is for the tracer to access information about
* the {@code ServerCall}. Called after {@link #filterContext} and before the application call
* handler.
*
* @deprecated Implement {@link #serverCallStarted(ServerCallInfo)} instead. This method will be
* removed in a future release of gRPC.
*/
@Deprecated
public void serverCallStarted(ServerCall, ?> call) {
}
public abstract static class Factory {
/**
* Creates a {@link ServerStreamTracer} for a new server stream.
*
* Called right before the stream is created
*
* @param fullMethodName the fully qualified method name
* @param headers the received request headers. It can be safely mutated within this method.
* It should not be saved because it is not safe for read or write after the method
* returns.
*/
public abstract ServerStreamTracer newServerStreamTracer(
String fullMethodName, Metadata headers);
}
/**
* A data class with info about the started {@link ServerCall}.
*/
public abstract static class ServerCallInfo {
public abstract MethodDescriptor getMethodDescriptor();
public abstract Attributes getAttributes();
@Nullable
public abstract String getAuthority();
}
/**
* This class exists solely to help transition to the {@link ServerCallInfo} based API.
*
* @deprecated Will be deleted when {@link #serverCallStarted(ServerCall)} is removed.
*/
@Deprecated
private static final class ReadOnlyServerCall
extends ForwardingServerCall {
private final ServerCallInfo callInfo;
private static ReadOnlyServerCall create(
ServerCallInfo callInfo) {
return new ReadOnlyServerCall<>(callInfo);
}
private ReadOnlyServerCall(ServerCallInfo callInfo) {
this.callInfo = callInfo;
}
@Override
public MethodDescriptor getMethodDescriptor() {
return callInfo.getMethodDescriptor();
}
@Override
public Attributes getAttributes() {
return callInfo.getAttributes();
}
@Override
public boolean isReady() {
// a dummy value
return false;
}
@Override
public boolean isCancelled() {
// a dummy value
return false;
}
@Override
public String getAuthority() {
return callInfo.getAuthority();
}
@Override
protected ServerCall delegate() {
throw new UnsupportedOperationException();
}
}
}