diff options
Diffstat (limited to 'src/main')
22 files changed, 305 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 8b5135122e..dafeecec87 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -40,6 +40,8 @@ filegroup( "//src/main/java/com/google/devtools/build/lib/remote:srcs", "//src/main/java/com/google/devtools/build/lib/remote/blobstore:srcs", "//src/main/java/com/google/devtools/build/lib/remote/blobstore/http:srcs", + "//src/main/java/com/google/devtools/build/lib/remote/logging:srcs", + "//src/main/java/com/google/devtools/build/lib/remote/util:srcs", "//src/main/java/com/google/devtools/build/lib/rules/apple/cpp:srcs", "//src/main/java/com/google/devtools/build/lib/rules/apple:srcs", "//src/main/java/com/google/devtools/build/lib/rules/apple/swift:srcs", diff --git a/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java b/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java index 6b2c4560f1..d0a05fa473 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java +++ b/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java @@ -17,6 +17,7 @@ import com.google.devtools.build.lib.actions.EnvironmentalExecException; import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.concurrent.ThreadSafety; import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; +import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.build.lib.util.io.FileOutErr; import com.google.devtools.build.lib.vfs.Dirent; import com.google.devtools.build.lib.vfs.FileSystemUtils; diff --git a/src/main/java/com/google/devtools/build/lib/remote/BUILD b/src/main/java/com/google/devtools/build/lib/remote/BUILD index 050a555698..42bf402027 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/BUILD +++ b/src/main/java/com/google/devtools/build/lib/remote/BUILD @@ -31,6 +31,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/exec/local:options", "//src/main/java/com/google/devtools/build/lib/remote/blobstore", "//src/main/java/com/google/devtools/build/lib/remote/blobstore/http", + "//src/main/java/com/google/devtools/build/lib/remote/util", "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/common/options", "//third_party:auth", diff --git a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java index 609ee3c669..000bfc38ee 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java +++ b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java @@ -33,6 +33,7 @@ import com.google.common.util.concurrent.ListeningScheduledExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.SettableFuture; import com.google.devtools.build.lib.remote.Retrier.RetryException; +import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; import com.google.devtools.remoteexecution.v1test.Digest; import io.grpc.CallCredentials; import io.grpc.CallOptions; diff --git a/src/main/java/com/google/devtools/build/lib/remote/CacheNotFoundException.java b/src/main/java/com/google/devtools/build/lib/remote/CacheNotFoundException.java index 2f9e0c3ed0..717d5f538f 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/CacheNotFoundException.java +++ b/src/main/java/com/google/devtools/build/lib/remote/CacheNotFoundException.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.remote; +import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.remoteexecution.v1test.Digest; import java.io.IOException; diff --git a/src/main/java/com/google/devtools/build/lib/remote/Chunker.java b/src/main/java/com/google/devtools/build/lib/remote/Chunker.java index 9f14fa3f0b..fb3202c214 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/Chunker.java +++ b/src/main/java/com/google/devtools/build/lib/remote/Chunker.java @@ -22,6 +22,7 @@ import com.google.common.base.Throwables; import com.google.common.io.ByteStreams; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.MetadataProvider; +import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.remoteexecution.v1test.Digest; import com.google.protobuf.ByteString; diff --git a/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java b/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java index 377c50d091..3f5a48176b 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java +++ b/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java @@ -27,9 +27,11 @@ import com.google.common.util.concurrent.MoreExecutors; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.MetadataProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -import com.google.devtools.build.lib.remote.DigestUtil.ActionKey; import com.google.devtools.build.lib.remote.Retrier.RetryException; import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; +import com.google.devtools.build.lib.remote.util.DigestUtil; +import com.google.devtools.build.lib.remote.util.DigestUtil.ActionKey; +import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; import com.google.devtools.build.lib.util.io.FileOutErr; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.remoteexecution.v1test.ActionCacheGrpc; diff --git a/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteExecutor.java b/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteExecutor.java index dbff8e7e88..3b91174a06 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteExecutor.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.remote; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; import com.google.devtools.remoteexecution.v1test.ExecuteRequest; import com.google.devtools.remoteexecution.v1test.ExecuteResponse; import com.google.devtools.remoteexecution.v1test.ExecutionGrpc; diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java index c761c10f3c..67acd0f93e 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.exec.local.LocalExecutionOptions; import com.google.devtools.build.lib.exec.local.LocalSpawnRunner; import com.google.devtools.build.lib.exec.local.PosixLocalEnvProvider; import com.google.devtools.build.lib.exec.local.WindowsLocalEnvProvider; +import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.build.lib.runtime.CommandEnvironment; import com.google.devtools.build.lib.util.OS; import javax.annotation.Nullable; diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java index 235f97137c..72c58d312b 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.buildeventstream.PathConverter; import com.google.devtools.build.lib.buildtool.BuildRequest; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.exec.ExecutorBuilder; +import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.build.lib.runtime.BlazeModule; import com.google.devtools.build.lib.runtime.Command; import com.google.devtools.build.lib.runtime.CommandEnvironment; diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java index 8886f37de4..6d766923ab 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java @@ -26,8 +26,10 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.exec.SpawnCache; import com.google.devtools.build.lib.exec.SpawnRunner.SpawnExecutionPolicy; -import com.google.devtools.build.lib.remote.DigestUtil.ActionKey; import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; +import com.google.devtools.build.lib.remote.util.DigestUtil; +import com.google.devtools.build.lib.remote.util.DigestUtil.ActionKey; +import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; import com.google.devtools.build.lib.skyframe.FileArtifactValue; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java index a061bedcf0..0d113830b9 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java @@ -33,9 +33,11 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.exec.SpawnExecException; import com.google.devtools.build.lib.exec.SpawnRunner; -import com.google.devtools.build.lib.remote.DigestUtil.ActionKey; import com.google.devtools.build.lib.remote.Retrier.RetryException; import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; +import com.google.devtools.build.lib.remote.util.DigestUtil; +import com.google.devtools.build.lib.remote.util.DigestUtil.ActionKey; +import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; import com.google.devtools.build.lib.util.ExitCode; import com.google.devtools.build.lib.util.io.FileOutErr; import com.google.devtools.build.lib.vfs.Path; diff --git a/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreActionCache.java b/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreActionCache.java index 21ad4489bb..656288b7c0 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreActionCache.java +++ b/src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreActionCache.java @@ -18,9 +18,10 @@ import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.MetadataProvider; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -import com.google.devtools.build.lib.remote.DigestUtil.ActionKey; import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; import com.google.devtools.build.lib.remote.blobstore.SimpleBlobStore; +import com.google.devtools.build.lib.remote.util.DigestUtil; +import com.google.devtools.build.lib.remote.util.DigestUtil.ActionKey; import com.google.devtools.build.lib.util.io.FileOutErr; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; diff --git a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java index 8a1dfe9fa4..2d2de7e92a 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java +++ b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.build.lib.vfs.Dirent; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; diff --git a/src/main/java/com/google/devtools/build/lib/remote/logging/BUILD b/src/main/java/com/google/devtools/build/lib/remote/logging/BUILD new file mode 100644 index 0000000000..9d8af5875d --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/remote/logging/BUILD @@ -0,0 +1,23 @@ +package(default_visibility = ["//src:__subpackages__"]) + +filegroup( + name = "srcs", + srcs = glob(["**"]), + visibility = ["//src/main/java/com/google/devtools/build/lib:__pkg__"], +) + +java_library( + name = "logging", + srcs = glob(["*.java"]), + tags = ["bazel"], + deps = [ + "//src/main/java/com/google/devtools/build/lib/remote/util", + "//src/main/protobuf:remote_execution_log_java_proto", + "//third_party:guava", + "//third_party/grpc:grpc-jar", + "@googleapis//:google_devtools_remoteexecution_v1test_remote_execution_java_proto", + "@googleapis//:google_longrunning_operations_java_proto", + "@googleapis//:google_rpc_status_java_proto", + "@googleapis//:google_watch_v1_java_proto", + ], +) diff --git a/src/main/java/com/google/devtools/build/lib/remote/logging/LoggingHandler.java b/src/main/java/com/google/devtools/build/lib/remote/logging/LoggingHandler.java new file mode 100644 index 0000000000..fb23d6ca4b --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/remote/logging/LoggingHandler.java @@ -0,0 +1,44 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// 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.google.devtools.build.lib.remote.logging; + +import com.google.devtools.build.lib.remote.logging.RemoteExecutionLog.LogEntry; + +/** + * An interface for building {@link LogEntry}s specialized for a specific gRPC call with specific + * request and response types. + * + * @param <ReqT> request type of the gRPC call + * @param <RespT> response type of the gRPC call + */ +public interface LoggingHandler<ReqT, RespT> { + + /** + * Handle logging for an issued message. + * + * @param message the issued request message + */ + void handleReq(ReqT message); + + /** + * Handle logging for a received response. + * + * @param message the received response message + */ + void handleResp(RespT message); + + /** Returns a {@link LogEntry} based on the requests and responses handled by this handler * */ + LogEntry getEntry(); +} diff --git a/src/main/java/com/google/devtools/build/lib/remote/logging/LoggingInterceptor.java b/src/main/java/com/google/devtools/build/lib/remote/logging/LoggingInterceptor.java new file mode 100644 index 0000000000..37629d7ae1 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/remote/logging/LoggingInterceptor.java @@ -0,0 +1,121 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// 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.google.devtools.build.lib.remote.logging; + +import com.google.devtools.build.lib.remote.logging.RemoteExecutionLog.LogEntry; +import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; +import com.google.devtools.remoteexecution.v1test.RequestMetadata; +import io.grpc.CallOptions; +import io.grpc.Channel; +import io.grpc.ClientCall; +import io.grpc.ClientInterceptor; +import io.grpc.ForwardingClientCall; +import io.grpc.ForwardingClientCallListener; +import io.grpc.Metadata; +import io.grpc.MethodDescriptor; +import io.grpc.Status; +import javax.annotation.Nullable; + +/** Client interceptor for logging details of certain gRPC calls. */ +public class LoggingInterceptor implements ClientInterceptor { + + /** + * Returns a {@link LoggingHandler} to handle logging details for the specified method. If there + * is no handler for the given method, returns {@code null}. + * + * @param method Method to return handler for. + */ + protected <ReqT, RespT> @Nullable LoggingHandler<ReqT, RespT> selectHandler( + MethodDescriptor<ReqT, RespT> method) { + // TODO(cdlee): add handlers for methods + return null; + } + + @Override + public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall( + MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) { + ClientCall<ReqT, RespT> call = next.newCall(method, callOptions); + LoggingHandler<ReqT, RespT> handler = selectHandler(method); + if (handler != null) { + return new LoggingForwardingCall<>(call, handler, method); + } else { + return call; + } + } + + /** + * Wraps client call to log call details by building a {@link LogEntry} and writing it to a log. + */ + private static class LoggingForwardingCall<ReqT, RespT> + extends ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT> { + private final LoggingHandler<ReqT, RespT> handler; + private final LogEntry.Builder entryBuilder; + + protected LoggingForwardingCall( + ClientCall<ReqT, RespT> delegate, + LoggingHandler<ReqT, RespT> handler, + MethodDescriptor<ReqT, RespT> method) { + super(delegate); + this.handler = handler; + this.entryBuilder = LogEntry.newBuilder().setMethodName(method.getFullMethodName()); + } + + @Override + public void start(Listener<RespT> responseListener, Metadata headers) { + RequestMetadata metadata = TracingMetadataUtils.requestMetadataFromHeaders(headers); + if (metadata != null) { + entryBuilder.setMetadata(metadata); + } + super.start( + new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>( + responseListener) { + @Override + public void onMessage(RespT message) { + handler.handleResp(message); + super.onMessage(message); + } + + @Override + public void onClose(Status status, Metadata trailers) { + entryBuilder.setStatus(makeStatusProto(status)); + // TODO(cdlee): Actually store this and log the entry. + entryBuilder.mergeFrom(handler.getEntry()).build(); + super.onClose(status, trailers); + } + }, + headers); + } + + @Override + public void sendMessage(ReqT message) { + handler.handleReq(message); + super.sendMessage(message); + } + } + + /** Converts io.grpc.Status to com.google.rpc.Status proto for logging. */ + private static com.google.rpc.Status makeStatusProto(Status status) { + String message = ""; + if (status.getCause() != null) { + message = status.getCause().toString(); + } else if (status.getDescription() != null) { + message = status.getDescription(); + } + return com.google.rpc.Status.newBuilder() + .setCode(status.getCode().value()) + .setMessage(message) + .build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/remote/util/BUILD b/src/main/java/com/google/devtools/build/lib/remote/util/BUILD new file mode 100644 index 0000000000..41834376ff --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/remote/util/BUILD @@ -0,0 +1,22 @@ +package(default_visibility = ["//src:__subpackages__"]) + +filegroup( + name = "srcs", + srcs = glob(["**"]), + visibility = ["//src/main/java/com/google/devtools/build/lib:__pkg__"], +) + +java_library( + name = "util", + srcs = glob(["*.java"]), + tags = ["bazel"], + deps = [ + "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib/actions", + "//src/main/java/com/google/devtools/build/lib/vfs", + "//third_party:guava", + "//third_party/grpc:grpc-jar", + "//third_party/protobuf:protobuf_java", + "@googleapis//:google_devtools_remoteexecution_v1test_remote_execution_java_proto", + ], +) diff --git a/src/main/java/com/google/devtools/build/lib/remote/DigestUtil.java b/src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java index d3c93bbde2..afd31ccdeb 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/DigestUtil.java +++ b/src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java @@ -11,7 +11,7 @@ // 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.google.devtools.build.lib.remote; +package com.google.devtools.build.lib.remote.util; import static java.nio.charset.StandardCharsets.UTF_8; diff --git a/src/main/java/com/google/devtools/build/lib/remote/TracingMetadataUtils.java b/src/main/java/com/google/devtools/build/lib/remote/util/TracingMetadataUtils.java index a7958617af..eac9e5aac8 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/TracingMetadataUtils.java +++ b/src/main/java/com/google/devtools/build/lib/remote/util/TracingMetadataUtils.java @@ -11,11 +11,11 @@ // 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.google.devtools.build.lib.remote; +package com.google.devtools.build.lib.remote.util; import com.google.common.annotations.VisibleForTesting; import com.google.devtools.build.lib.analysis.BlazeVersionInfo; -import com.google.devtools.build.lib.remote.DigestUtil.ActionKey; +import com.google.devtools.build.lib.remote.util.DigestUtil.ActionKey; import com.google.devtools.remoteexecution.v1test.RequestMetadata; import com.google.devtools.remoteexecution.v1test.ToolDetails; import io.grpc.ClientInterceptor; @@ -28,6 +28,7 @@ import io.grpc.ServerCallHandler; import io.grpc.ServerInterceptor; import io.grpc.protobuf.ProtoUtils; import io.grpc.stub.MetadataUtils; +import javax.annotation.Nullable; /** Utility functions to handle Metadata for remote Grpc calls. */ public class TracingMetadataUtils { @@ -42,11 +43,11 @@ public class TracingMetadataUtils { ProtoUtils.keyForProto(RequestMetadata.getDefaultInstance()); /** - * Returns a new gRPC context derived from the current context, with - * {@link RequestMetadata} accessible by the {@link fromCurrentContext()} method. + * Returns a new gRPC context derived from the current context, with {@link RequestMetadata} + * accessible by the {@link fromCurrentContext()} method. * - * <p>The {@link RequestMetadata} is constructed using the provided arguments - * and the current tool version. + * <p>The {@link RequestMetadata} is constructed using the provided arguments and the current tool + * version. */ public static Context contextWithMetadata( String buildRequestId, String commandId, ActionKey actionKey) { @@ -88,6 +89,14 @@ public class TracingMetadataUtils { return headers; } + /** + * Extracts a {@link RequestMetadata} from a {@link Metadata} and returns it if it exists. If it + * does not exist, returns {@code null}. + */ + public static @Nullable RequestMetadata requestMetadataFromHeaders(Metadata headers) { + return headers.get(METADATA_KEY); + } + public static ClientInterceptor attachMetadataFromContextInterceptor() { return MetadataUtils.newAttachHeadersInterceptor(headersFromCurrentContext()); } @@ -97,7 +106,7 @@ public class TracingMetadataUtils { @Override public <ReqT, RespT> Listener<ReqT> interceptCall( ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) { - RequestMetadata meta = headers.get(METADATA_KEY); + RequestMetadata meta = requestMetadataFromHeaders(headers); if (meta == null) { throw new IllegalStateException("RequestMetadata not received from the client."); } diff --git a/src/main/protobuf/BUILD b/src/main/protobuf/BUILD index 2223fb5a4e..4154a17fa5 100644 --- a/src/main/protobuf/BUILD +++ b/src/main/protobuf/BUILD @@ -128,6 +128,25 @@ cc_proto_library( deps = [":execution_statistics_proto"], ) +proto_library( + name = "remote_execution_log_proto", + srcs = ["remote_execution_log.proto"], + deps = [ + "@googleapis//:google_devtools_remoteexecution_v1test_remote_execution_proto", + "@googleapis//:google_rpc_status_proto", + ], +) + +java_proto_library( + name = "remote_execution_log_java_proto", + deps = [":remote_execution_log_proto"], +) + +java_library_srcs( + name = "remote_execution_log_java_proto_srcs", + deps = [":remote_execution_log_java_proto"], +) + filegroup( name = "srcs", srcs = glob(["**"]), @@ -140,5 +159,6 @@ filegroup( ":command_server_java_grpc_srcs", ":option_filters_java_proto_srcs", ":profile_java_proto_srcs", + ":remote_execution_log_java_proto_srcs", ], ) diff --git a/src/main/protobuf/remote_execution_log.proto b/src/main/protobuf/remote_execution_log.proto new file mode 100644 index 0000000000..c685bd3fff --- /dev/null +++ b/src/main/protobuf/remote_execution_log.proto @@ -0,0 +1,36 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// 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. + +syntax = "proto3"; + +package remote_logging; + +import "google/devtools/remoteexecution/v1test/remote_execution.proto"; +import "google/rpc/status.proto"; + +option java_package = "com.google.devtools.build.lib.remote.logging"; + +// A single log entry for gRPC calls related to remote execution. +message LogEntry { + // Request metadata included in call. + google.devtools.remoteexecution.v1test.RequestMetadata metadata = 1; + + // Status of the call on close. + google.rpc.Status status = 2; + + // Full method name of the method called as returned from + // io.grpc.MethodDescriptor.getFullMethodName() (i.e. in format + // $FULL_SERVICE_NAME/$METHOD_NAME). + string method_name = 3; +} |