Use generic types for Context classes in metric timers
Signed-off-by: Edwin Kempin <ekempin@google.com> Change-Id: Ia28988a916ae67f7508bfebdff4b495e3762055d
This commit is contained in:
@@ -37,13 +37,12 @@ import java.util.concurrent.TimeUnit;
|
||||
public abstract class Timer1<F1> implements RegistrationHandle {
|
||||
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
|
||||
|
||||
public static class Context extends TimerContext {
|
||||
private final Timer1<Object> timer;
|
||||
private final Object fieldValue;
|
||||
public static class Context<F1> extends TimerContext {
|
||||
private final Timer1<F1> timer;
|
||||
private final F1 fieldValue;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
<F1> Context(Timer1<F1> timer, F1 fieldValue) {
|
||||
this.timer = (Timer1<Object>) timer;
|
||||
Context(Timer1<F1> timer, F1 fieldValue) {
|
||||
this.timer = timer;
|
||||
this.fieldValue = fieldValue;
|
||||
}
|
||||
|
||||
@@ -67,8 +66,8 @@ public abstract class Timer1<F1> implements RegistrationHandle {
|
||||
* @param fieldValue bucket to record the timer
|
||||
* @return timer context
|
||||
*/
|
||||
public Context start(F1 fieldValue) {
|
||||
return new Context(this, fieldValue);
|
||||
public Context<F1> start(F1 fieldValue) {
|
||||
return new Context<>(this, fieldValue);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -38,14 +38,13 @@ import java.util.concurrent.TimeUnit;
|
||||
public abstract class Timer2<F1, F2> implements RegistrationHandle {
|
||||
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
|
||||
|
||||
public static class Context extends TimerContext {
|
||||
private final Timer2<Object, Object> timer;
|
||||
private final Object fieldValue1;
|
||||
private final Object fieldValue2;
|
||||
public static class Context<F1, F2> extends TimerContext {
|
||||
private final Timer2<F1, F2> timer;
|
||||
private final F1 fieldValue1;
|
||||
private final F2 fieldValue2;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
<F1, F2> Context(Timer2<F1, F2> timer, F1 fieldValue1, F2 fieldValue2) {
|
||||
this.timer = (Timer2<Object, Object>) timer;
|
||||
Context(Timer2<F1, F2> timer, F1 fieldValue1, F2 fieldValue2) {
|
||||
this.timer = timer;
|
||||
this.fieldValue1 = fieldValue1;
|
||||
this.fieldValue2 = fieldValue2;
|
||||
}
|
||||
@@ -73,8 +72,8 @@ public abstract class Timer2<F1, F2> implements RegistrationHandle {
|
||||
* @param fieldValue2 bucket to record the timer
|
||||
* @return timer context
|
||||
*/
|
||||
public Context start(F1 fieldValue1, F2 fieldValue2) {
|
||||
return new Context(this, fieldValue1, fieldValue2);
|
||||
public Context<F1, F2> start(F1 fieldValue1, F2 fieldValue2) {
|
||||
return new Context<>(this, fieldValue1, fieldValue2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -39,15 +39,14 @@ import java.util.concurrent.TimeUnit;
|
||||
public abstract class Timer3<F1, F2, F3> implements RegistrationHandle {
|
||||
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
|
||||
|
||||
public static class Context extends TimerContext {
|
||||
private final Timer3<Object, Object, Object> timer;
|
||||
private final Object fieldValue1;
|
||||
private final Object fieldValue2;
|
||||
private final Object fieldValue3;
|
||||
public static class Context<F1, F2, F3> extends TimerContext {
|
||||
private final Timer3<F1, F2, F3> timer;
|
||||
private final F1 fieldValue1;
|
||||
private final F2 fieldValue2;
|
||||
private final F3 fieldValue3;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
<F1, F2, F3> Context(Timer3<F1, F2, F3> timer, F1 f1, F2 f2, F3 f3) {
|
||||
this.timer = (Timer3<Object, Object, Object>) timer;
|
||||
Context(Timer3<F1, F2, F3> timer, F1 f1, F2 f2, F3 f3) {
|
||||
this.timer = timer;
|
||||
this.fieldValue1 = f1;
|
||||
this.fieldValue2 = f2;
|
||||
this.fieldValue3 = f3;
|
||||
@@ -79,8 +78,8 @@ public abstract class Timer3<F1, F2, F3> implements RegistrationHandle {
|
||||
* @param fieldValue3 bucket to record the timer
|
||||
* @return timer context
|
||||
*/
|
||||
public Context start(F1 fieldValue1, F2 fieldValue2, F3 fieldValue3) {
|
||||
return new Context(this, fieldValue1, fieldValue2, fieldValue3);
|
||||
public Context<F1, F2, F3> start(F1 fieldValue1, F2 fieldValue2, F3 fieldValue3) {
|
||||
return new Context<>(this, fieldValue1, fieldValue2, fieldValue3);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -143,7 +143,7 @@ public class UiActions {
|
||||
|
||||
String name = e.getExportName().substring(d + 1);
|
||||
UiAction.Description dsc;
|
||||
try (Timer1.Context ignored = uiActionLatency.start(name)) {
|
||||
try (Timer1.Context<String> ignored = uiActionLatency.start(name)) {
|
||||
dsc = ((UiAction<R>) view).getDescription(resource);
|
||||
}
|
||||
|
||||
|
@@ -139,7 +139,7 @@ public abstract class AbstractChangeNotes<T> {
|
||||
if (args.failOnLoadForTest.get()) {
|
||||
throw new StorageException("Reading from NoteDb is disabled");
|
||||
}
|
||||
try (Timer1.Context timer = args.metrics.readLatency.start(CHANGES);
|
||||
try (Timer1.Context<NoteDbTable> timer = args.metrics.readLatency.start(CHANGES);
|
||||
Repository repo = args.repoManager.openRepository(getProjectName());
|
||||
// Call openHandle even if reading is disabled, to trigger
|
||||
// auto-rebuilding before this object may get passed to a ChangeUpdate.
|
||||
|
@@ -187,7 +187,7 @@ class ChangeNotesParser {
|
||||
walk.reset();
|
||||
walk.markStart(walk.parseCommit(tip));
|
||||
|
||||
try (Timer1.Context timer = metrics.parseLatency.start(CHANGES)) {
|
||||
try (Timer1.Context<NoteDbTable> timer = metrics.parseLatency.start(CHANGES)) {
|
||||
ChangeNotesCommit commit;
|
||||
while ((commit = walk.next()) != null) {
|
||||
parse(commit);
|
||||
|
@@ -267,7 +267,7 @@ public class NoteDbUpdateManager implements AutoCloseable {
|
||||
* @throws IOException if a storage layer error occurs.
|
||||
*/
|
||||
private void stage() throws IOException {
|
||||
try (Timer1.Context timer = metrics.stageUpdateLatency.start(CHANGES)) {
|
||||
try (Timer1.Context<NoteDbTable> timer = metrics.stageUpdateLatency.start(CHANGES)) {
|
||||
if (isEmpty()) {
|
||||
return;
|
||||
}
|
||||
@@ -302,7 +302,7 @@ public class NoteDbUpdateManager implements AutoCloseable {
|
||||
executed = true;
|
||||
return null;
|
||||
}
|
||||
try (Timer1.Context timer = metrics.updateLatency.start(CHANGES)) {
|
||||
try (Timer1.Context<NoteDbTable> timer = metrics.updateLatency.start(CHANGES)) {
|
||||
stage();
|
||||
// ChangeUpdates must execute before ChangeDraftUpdates.
|
||||
//
|
||||
|
@@ -100,25 +100,29 @@ public class Sequences {
|
||||
}
|
||||
|
||||
public int nextAccountId() {
|
||||
try (Timer2.Context timer = nextIdLatency.start(SequenceType.ACCOUNTS, false)) {
|
||||
try (Timer2.Context<SequenceType, Boolean> timer =
|
||||
nextIdLatency.start(SequenceType.ACCOUNTS, false)) {
|
||||
return accountSeq.next();
|
||||
}
|
||||
}
|
||||
|
||||
public int nextChangeId() {
|
||||
try (Timer2.Context timer = nextIdLatency.start(SequenceType.CHANGES, false)) {
|
||||
try (Timer2.Context<SequenceType, Boolean> timer =
|
||||
nextIdLatency.start(SequenceType.CHANGES, false)) {
|
||||
return changeSeq.next();
|
||||
}
|
||||
}
|
||||
|
||||
public ImmutableList<Integer> nextChangeIds(int count) {
|
||||
try (Timer2.Context timer = nextIdLatency.start(SequenceType.CHANGES, count > 1)) {
|
||||
try (Timer2.Context<SequenceType, Boolean> timer =
|
||||
nextIdLatency.start(SequenceType.CHANGES, count > 1)) {
|
||||
return changeSeq.next(count);
|
||||
}
|
||||
}
|
||||
|
||||
public int nextGroupId() {
|
||||
try (Timer2.Context timer = nextIdLatency.start(SequenceType.GROUPS, false)) {
|
||||
try (Timer2.Context<SequenceType, Boolean> timer =
|
||||
nextIdLatency.start(SequenceType.GROUPS, false)) {
|
||||
return groupSeq.next();
|
||||
}
|
||||
}
|
||||
|
@@ -140,7 +140,7 @@ public class PluginContext<T> {
|
||||
exportNameField);
|
||||
}
|
||||
|
||||
Timer3.Context startLatency(Extension<?> extension) {
|
||||
Timer3.Context<String, String, String> startLatency(Extension<?> extension) {
|
||||
return latency.start(
|
||||
extension.getPluginName(),
|
||||
extension.get().getClass().getName(),
|
||||
@@ -198,7 +198,7 @@ public class PluginContext<T> {
|
||||
return;
|
||||
}
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
extensionImplConsumer.run(extensionImpl);
|
||||
} catch (Throwable e) {
|
||||
pluginMetrics.incrementErrorCount(extension);
|
||||
@@ -227,7 +227,7 @@ public class PluginContext<T> {
|
||||
}
|
||||
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
extensionConsumer.run(extension);
|
||||
} catch (Throwable e) {
|
||||
pluginMetrics.incrementErrorCount(extension);
|
||||
@@ -261,7 +261,7 @@ public class PluginContext<T> {
|
||||
}
|
||||
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
extensionImplConsumer.run(extensionImpl);
|
||||
} catch (Throwable e) {
|
||||
Throwables.throwIfInstanceOf(e, exceptionClass);
|
||||
@@ -298,7 +298,7 @@ public class PluginContext<T> {
|
||||
}
|
||||
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
extensionConsumer.run(extension);
|
||||
} catch (Throwable e) {
|
||||
Throwables.throwIfInstanceOf(e, exceptionClass);
|
||||
@@ -324,7 +324,7 @@ public class PluginContext<T> {
|
||||
Extension<T> extension,
|
||||
ExtensionImplFunction<T, R> extensionImplFunction) {
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
return extensionImplFunction.call(extension.get());
|
||||
}
|
||||
}
|
||||
@@ -349,7 +349,7 @@ public class PluginContext<T> {
|
||||
Class<X> exceptionClass)
|
||||
throws X {
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
try {
|
||||
return checkedExtensionImplFunction.call(extension.get());
|
||||
} catch (Exception e) {
|
||||
@@ -378,7 +378,7 @@ public class PluginContext<T> {
|
||||
Extension<T> extension,
|
||||
ExtensionFunction<Extension<T>, R> extensionFunction) {
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
return extensionFunction.call(extension);
|
||||
}
|
||||
}
|
||||
@@ -404,7 +404,7 @@ public class PluginContext<T> {
|
||||
Class<X> exceptionClass)
|
||||
throws X {
|
||||
try (TraceContext traceContext = newTrace(extension);
|
||||
Timer3.Context ctx = pluginMetrics.startLatency(extension)) {
|
||||
Timer3.Context<String, String, String> ctx = pluginMetrics.startLatency(extension)) {
|
||||
try {
|
||||
return checkedExtensionFunction.call(extension);
|
||||
} catch (Exception e) {
|
||||
|
@@ -354,14 +354,15 @@ public class ProjectState {
|
||||
* cached. Callers should try to cache this result per-request as much as possible.
|
||||
*/
|
||||
public List<SectionMatcher> getAllSections() {
|
||||
try (Timer1.Context ignored = computationLatency.start("getAllSections")) {
|
||||
try (Timer1.Context<String> ignored = computationLatency.start("getAllSections")) {
|
||||
if (isAllProjects) {
|
||||
return getLocalAccessSections();
|
||||
}
|
||||
|
||||
List<SectionMatcher> all = new ArrayList<>();
|
||||
Iterable<ProjectState> tree = tree();
|
||||
try (Timer1.Context ignored2 = computationLatency.start("getAllSections-parsing-only")) {
|
||||
try (Timer1.Context<String> ignored2 =
|
||||
computationLatency.start("getAllSections-parsing-only")) {
|
||||
for (ProjectState s : tree) {
|
||||
all.addAll(s.getLocalAccessSections());
|
||||
}
|
||||
|
Reference in New Issue
Block a user