Skip to content

Commit e33da57

Browse files
lberkicopybara-github
authored andcommitted
Report remote analysis cache statistics on the BEP.
RELNOTES: None. PiperOrigin-RevId: 761848466 Change-Id: Ied7a4ea7dcbc6d50a8e666c06247c0b434224d06
1 parent a7dc3eb commit e33da57

File tree

8 files changed

+107
-18
lines changed

8 files changed

+107
-18
lines changed

src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,18 @@ message BuildMetrics {
13631363
message RemoteAnalysisCacheStatistics {
13641364
int64 cache_hits = 1;
13651365
int64 cache_misses = 2;
1366+
int64 value_store_value_bytes_received = 3;
1367+
int64 value_store_value_bytes_sent = 4;
1368+
int64 value_store_key_bytes_sent = 5;
1369+
int64 value_store_write_ops = 6;
1370+
int64 value_store_read_ops_successful = 7;
1371+
int64 value_store_read_ops_not_found = 8;
1372+
int64 value_store_read_batches = 10;
1373+
int64 value_store_write_batches = 11;
1374+
int64 analysis_cache_bytes_received = 12;
1375+
int64 analysis_cache_key_bytes_sent = 13;
1376+
int64 analysis_cache_ops = 14;
1377+
int64 analysis_cache_batches = 15;
13661378
}
13671379
RemoteAnalysisCacheStatistics remote_analysis_cache_statistics = 13;
13681380
}

src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,17 @@ public BuildResult processRequest(
900900
return result;
901901
}
902902

903+
private void reportRemoteAnalysisServiceStats(
904+
RemoteAnalysisCachingDependenciesProvider dependenciesProvider) throws InterruptedException {
905+
FingerprintValueStore.Stats fvsStats =
906+
dependenciesProvider.getFingerprintValueService().getStats();
907+
RemoteAnalysisCacheClient.Stats raccStats =
908+
dependenciesProvider.getAnalysisCacheClient() == null
909+
? null
910+
: dependenciesProvider.getAnalysisCacheClient().getStats();
911+
env.getRemoteAnalysisCachingEventListener().recordServiceStats(fvsStats, raccStats);
912+
}
913+
903914
/**
904915
* Handles post-build analysis caching operations.
905916
*
@@ -919,14 +930,15 @@ private void logAnalysisCachingStatsAndMaybeUploadFrontier(
919930

920931
switch (dependenciesProvider.mode()) {
921932
case UPLOAD:
922-
// fall through
923-
case DUMP_UPLOAD_MANIFEST_ONLY:
924933
uploadFrontier(dependenciesProvider);
934+
reportRemoteAnalysisServiceStats(dependenciesProvider);
935+
break;
936+
case DUMP_UPLOAD_MANIFEST_ONLY:
937+
uploadFrontier(dependenciesProvider); // In this case, uploadFrontier() won't upload
925938
break;
926939
case DOWNLOAD:
927-
reportRemoteAnalysisCachingStats(
928-
dependenciesProvider.getFingerprintValueService().getStats(),
929-
dependenciesProvider.getAnalysisCacheClient().getStats());
940+
reportRemoteAnalysisServiceStats(dependenciesProvider);
941+
reportRemoteAnalysisCachingStats();
930942
env.getSkyframeExecutor()
931943
.setRemoteAnalysisCachingStateForLatestBuild(
932944
env.getRemoteAnalysisCachingEventListener().getRemoteAnalysisCachingState());
@@ -1411,10 +1423,8 @@ private void uploadFrontier(RemoteAnalysisCachingDependenciesProvider dependenci
14111423
}
14121424
}
14131425

1414-
private void reportRemoteAnalysisCachingStats(
1415-
FingerprintValueStore.Stats fvsStats, RemoteAnalysisCacheClient.Stats raccStats) {
1426+
private void reportRemoteAnalysisCachingStats() {
14161427
var listener = env.getRemoteAnalysisCachingEventListener();
1417-
14181428
var hitsByFunction = listener.getHitsBySkyFunctionName();
14191429
var missesByFunction = listener.getMissesBySkyFunctionName();
14201430
long totalHits = hitsByFunction.values().stream().mapToLong(AtomicInteger::get).sum();
@@ -1444,15 +1454,25 @@ private void reportRemoteAnalysisCachingStats(
14441454
})
14451455
.collect(joining(", "));
14461456

1457+
FingerprintValueStore.Stats fvsStats = listener.getFingerprintValueStoreStats();
1458+
RemoteAnalysisCacheClient.Stats raccStats = listener.getRemoteAnalysisCacheStats();
1459+
1460+
long bytesReceived = fvsStats.valueBytesReceived();
1461+
long requests = fvsStats.entriesFound() + fvsStats.entriesNotFound();
1462+
1463+
if (raccStats != null) {
1464+
bytesReceived += raccStats.bytesReceived();
1465+
requests += raccStats.requestsSent();
1466+
}
14471467
double overallHitRate = totalRequests == 0 ? 0.0 : (double) totalHits / totalRequests * 100;
14481468
env.getReporter()
14491469
.handle(
14501470
Event.info(
14511471
String.format(
14521472
"Remote analysis caching stats: %s bytes received in %s requests, %s/%s cache"
14531473
+ " hits (%.2f%%) [Breakdown: %s]",
1454-
raccStats.bytesReceived() + fvsStats.valueBytesReceived(),
1455-
raccStats.requestsSent() + fvsStats.entriesFound() + fvsStats.entriesNotFound(),
1474+
bytesReceived,
1475+
requests,
14561476
totalHits,
14571477
totalRequests,
14581478
overallHitRate,

src/main/java/com/google/devtools/build/lib/metrics/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ java_library(
5353
"//src/main/java/com/google/devtools/build/lib/skyframe:sky_key_stats",
5454
"//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_stats",
5555
"//src/main/java/com/google/devtools/build/lib/skyframe:top_level_status_events",
56+
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
57+
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis:remote_analysis_cache_client",
5658
"//src/main/java/com/google/devtools/build/lib/worker:worker_process_metrics",
5759
"//src/main/java/com/google/devtools/build/lib/worker:worker_process_status",
5860
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",

src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
import com.google.devtools.build.lib.skyframe.SkyframeStats;
7171
import com.google.devtools.build.lib.skyframe.TopLevelStatusEvents.SomeExecutionStartedEvent;
7272
import com.google.devtools.build.lib.skyframe.TopLevelStatusEvents.TopLevelTargetPendingExecutionEvent;
73+
import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueStore;
74+
import com.google.devtools.build.lib.skyframe.serialization.analysis.RemoteAnalysisCacheClient;
7375
import com.google.devtools.build.lib.worker.WorkerProcessMetrics;
7476
import com.google.devtools.build.lib.worker.WorkerProcessMetricsCollector;
7577
import com.google.devtools.build.lib.worker.WorkerProcessStatus;
@@ -331,11 +333,7 @@ private BuildMetrics createBuildMetrics() {
331333

332334
addSkyframeStats(buildGraphMetrics);
333335

334-
RemoteAnalysisCacheStatistics remoteAnalysisCacheStatistics =
335-
RemoteAnalysisCacheStatistics.newBuilder()
336-
.setCacheHits(env.getRemoteAnalysisCachingEventListener().getCacheHits().size())
337-
.setCacheMisses(env.getRemoteAnalysisCachingEventListener().getCacheMisses().size())
338-
.build();
336+
RemoteAnalysisCacheStatistics remoteAnalysisCacheStatistics = collectRemoteAnalysisCacheStats();
339337

340338
BuildMetrics.Builder buildMetrics =
341339
BuildMetrics.newBuilder()
@@ -360,6 +358,39 @@ private BuildMetrics createBuildMetrics() {
360358
return buildMetrics.build();
361359
}
362360

361+
private RemoteAnalysisCacheStatistics collectRemoteAnalysisCacheStats() {
362+
RemoteAnalysisCacheStatistics.Builder result =
363+
RemoteAnalysisCacheStatistics.newBuilder()
364+
.setCacheHits(env.getRemoteAnalysisCachingEventListener().getCacheHits().size())
365+
.setCacheMisses(env.getRemoteAnalysisCachingEventListener().getCacheMisses().size());
366+
367+
FingerprintValueStore.Stats fvsStats =
368+
env.getRemoteAnalysisCachingEventListener().getFingerprintValueStoreStats();
369+
if (fvsStats != null) {
370+
result
371+
.setValueStoreValueBytesReceived(fvsStats.valueBytesReceived())
372+
.setValueStoreValueBytesSent(fvsStats.valueBytesSent())
373+
.setValueStoreKeyBytesSent(fvsStats.keyBytesSent())
374+
.setValueStoreWriteOps(fvsStats.entriesWritten())
375+
.setValueStoreReadOpsSuccessful(fvsStats.entriesFound())
376+
.setValueStoreReadOpsNotFound(fvsStats.entriesNotFound())
377+
.setValueStoreReadBatches(fvsStats.getBatches())
378+
.setValueStoreWriteBatches(fvsStats.setBatches());
379+
}
380+
381+
RemoteAnalysisCacheClient.Stats raccStats =
382+
env.getRemoteAnalysisCachingEventListener().getRemoteAnalysisCacheStats();
383+
if (raccStats != null) {
384+
result
385+
.setAnalysisCacheBytesReceived(raccStats.bytesReceived())
386+
.setAnalysisCacheKeyBytesSent(raccStats.bytesSent())
387+
.setAnalysisCacheOps(raccStats.requestsSent())
388+
.setAnalysisCacheBatches(raccStats.batches());
389+
}
390+
391+
return result.build();
392+
}
393+
363394
private ActionData buildActionData(ActionStats actionStats) {
364395
NanosToMillisSinceEpochConverter nanosToMillisSinceEpochConverter =
365396
BlazeClock.createNanosToMillisSinceEpochConverter();

src/main/java/com/google/devtools/build/lib/skyframe/serialization/FingerprintValueStore.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ record Stats(
3232
long keyBytesSent,
3333
long entriesWritten,
3434
long entriesFound,
35-
long entriesNotFound) {}
35+
long entriesNotFound,
36+
long getBatches,
37+
long setBatches) {}
3638

3739
default Stats getStats() {
38-
return new Stats(0, 0, 0, 0, 0, 0);
40+
return new Stats(0, 0, 0, 0, 0, 0, 0, 0);
3941
}
4042

4143
/**

src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ java_library(
1515
name = "event_listener",
1616
srcs = ["RemoteAnalysisCachingEventListener.java"],
1717
deps = [
18+
":remote_analysis_cache_client",
1819
":remote_analysis_caching_state",
1920
"//src/main/java/com/google/devtools/build/lib/concurrent",
2021
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
2122
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
2223
"//third_party:guava",
24+
"//third_party:jsr305",
2325
],
2426
)
2527

src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCacheClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
/** Interface to the remote analysis cache. */
2121
public interface RemoteAnalysisCacheClient {
2222
/** Usage statistics. */
23-
record Stats(long bytesSent, long bytesReceived, long requestsSent) {}
23+
record Stats(long bytesSent, long bytesReceived, long requestsSent, long batches) {}
2424

2525
/** Looks up an entry in the remote analysis cache based on a serialized key. */
2626
ListenableFuture<ByteString> lookup(ByteString key);

src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/RemoteAnalysisCachingEventListener.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.google.common.eventbus.Subscribe;
2424
import com.google.devtools.build.lib.concurrent.ThreadSafety;
2525
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
26+
import com.google.devtools.build.lib.skyframe.serialization.FingerprintValueStore;
2627
import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
2728
import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.FrontierNodeVersion;
2829
import com.google.devtools.build.lib.skyframe.serialization.SkyValueRetriever.NoCachedData;
@@ -35,6 +36,7 @@
3536
import java.util.concurrent.ConcurrentHashMap;
3637
import java.util.concurrent.atomic.AtomicInteger;
3738
import java.util.concurrent.atomic.AtomicReference;
39+
import javax.annotation.Nullable;
3840

3941
/** An {@link com.google.common.eventbus.EventBus} listener for remote analysis caching events. */
4042
@ThreadSafety.ThreadSafe
@@ -61,6 +63,9 @@ public record SerializedNodeEvent(SkyKey key) {
6163

6264
private final AtomicReference<FrontierNodeVersion> skyValueVersion = new AtomicReference<>();
6365

66+
@Nullable private FingerprintValueStore.Stats fingerprintValueStoreStats;
67+
@Nullable private RemoteAnalysisCacheClient.Stats remoteAnalysisCacheStats;
68+
6469
@Subscribe
6570
@AllowConcurrentEvents
6671
@SuppressWarnings("unused")
@@ -92,6 +97,21 @@ public Set<SkyKey> getCacheMisses() {
9297
return ImmutableSet.copyOf(cacheMisses);
9398
}
9499

100+
public void recordServiceStats(
101+
@Nullable FingerprintValueStore.Stats fvsStats,
102+
@Nullable RemoteAnalysisCacheClient.Stats raccStats) {
103+
fingerprintValueStoreStats = fvsStats;
104+
remoteAnalysisCacheStats = raccStats;
105+
}
106+
107+
public FingerprintValueStore.Stats getFingerprintValueStoreStats() {
108+
return fingerprintValueStoreStats;
109+
}
110+
111+
public RemoteAnalysisCacheClient.Stats getRemoteAnalysisCacheStats() {
112+
return remoteAnalysisCacheStats;
113+
}
114+
95115
@ThreadSafe
96116
public void recordRetrievalResult(RetrievalResult result, SkyKey key) {
97117
if (result instanceof Restart) {

0 commit comments

Comments
 (0)