Skip to content

Commit 1dea553

Browse files
authored
Reduce the number of metrics exported to stackdriver. (#311)
The change only exports metrics for "public" gradle tasks. The reason for doing this is that we are hitting maximim quota limit of active timeseries, which causes failure to upload metrics.
1 parent e78fb3e commit 1dea553

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/ci/metrics/Metrics.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
package com.google.firebase.gradle.plugins.ci.metrics;
1616

17+
import java.util.function.Predicate;
1718
import org.gradle.api.Task;
19+
import org.gradle.api.logging.LogLevel;
20+
import org.gradle.api.logging.Logger;
1821

1922
/** Provides methods for measuring various parts of the build. */
2023
interface Metrics {
@@ -23,4 +26,41 @@ interface Metrics {
2326

2427
/** Measure task execution failure. */
2528
void measureFailure(Task task);
29+
30+
/**
31+
* Creates a {@link Metrics} implementation that uses a {@code predicate} to determine whether to
32+
* emit measurements for it.
33+
*/
34+
static Metrics filtered(Metrics metrics, Predicate<Task> predicate) {
35+
return new Metrics() {
36+
@Override
37+
public void measureSuccess(Task task, long elapsedTime) {
38+
if (predicate.test(task)) {
39+
metrics.measureSuccess(task, elapsedTime);
40+
}
41+
}
42+
43+
@Override
44+
public void measureFailure(Task task) {
45+
if (predicate.test(task)) {
46+
metrics.measureFailure(task);
47+
}
48+
}
49+
};
50+
}
51+
52+
/** Creates a {@link Metrics} implementation that logs results at the specified level. */
53+
static Metrics toLog(Logger toLogger, LogLevel level) {
54+
return new Metrics() {
55+
@Override
56+
public void measureSuccess(Task task, long elapsedTime) {
57+
toLogger.log(level, "[METRICS] Task {} took {}ms.", task.getPath(), elapsedTime);
58+
}
59+
60+
@Override
61+
public void measureFailure(Task task) {
62+
toLogger.log(level, "[METRICS] Task {} failed.", task.getPath());
63+
}
64+
};
65+
}
2666
}

buildSrc/src/main/groovy/com/google/firebase/gradle/plugins/ci/metrics/MetricsPlugin.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,39 @@
1616

1717
import org.gradle.api.Plugin;
1818
import org.gradle.api.Project;
19+
import org.gradle.api.Task;
1920
import org.gradle.api.execution.TaskExecutionGraph;
21+
import org.gradle.api.logging.LogLevel;
2022

2123
/** Instruments Gradle to measure latency and success rate of all executed tasks. */
2224
public class MetricsPlugin implements Plugin<Project> {
2325
@Override
2426
public void apply(Project project) {
25-
if (!isCollectionEnabled()) {
26-
project.getLogger().lifecycle("Metrics collection is disabled.");
27-
return;
28-
}
29-
project.getLogger().lifecycle("Metrics collection is enabled.");
3027

31-
Metrics metrics = new StackdriverMetrics(project.getGradle(), project.getLogger());
28+
Metrics metrics = Metrics.filtered(initializeMetrics(project), MetricsPlugin::isTaskPublic);
3229

3330
TaskExecutionGraph taskGraph = project.getGradle().getTaskGraph();
3431
taskGraph.addTaskExecutionListener(new MeasuringTaskExecutionListener(metrics, taskGraph));
3532
}
3633

34+
private static Metrics initializeMetrics(Project project) {
35+
if (!isCollectionEnabled()) {
36+
project.getLogger().lifecycle("Metrics collection is disabled. Logging to stdout...");
37+
return Metrics.toLog(project.getLogger(), LogLevel.LIFECYCLE);
38+
}
39+
project.getLogger().lifecycle("Metrics collection is enabled.");
40+
return new StackdriverMetrics(project.getGradle(), project.getLogger());
41+
}
42+
3743
private static boolean isCollectionEnabled() {
3844
String enabled = System.getenv("FIREBASE_ENABLE_METRICS");
3945
return enabled != null && enabled.equals("1");
4046
}
47+
48+
/**
49+
* Determines whether a given gradle {@link Task} is "public", e.g. visible with `gradle tasks`.
50+
*/
51+
private static boolean isTaskPublic(Task task) {
52+
return task.getGroup() != null;
53+
}
4154
}

0 commit comments

Comments
 (0)