aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/ByteStreamUploader.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/CacheNotFoundException.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/Chunker.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteCache.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/GrpcRemoteExecutor.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteActionContextProvider.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/SimpleBlobStoreActionCache.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/logging/BUILD23
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/logging/LoggingHandler.java44
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/logging/LoggingInterceptor.java121
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/util/BUILD22
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java (renamed from src/main/java/com/google/devtools/build/lib/remote/DigestUtil.java)2
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/util/TracingMetadataUtils.java (renamed from src/main/java/com/google/devtools/build/lib/remote/TracingMetadataUtils.java)23
-rw-r--r--src/main/protobuf/BUILD20
-rw-r--r--src/main/protobuf/remote_execution_log.proto36
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;
+}