With this logging tag one can easily see in the log file which logs have been triggered by the plugin. For traces this is interesting because then for actions such as loading files, doing index queries etc. one can see if they have been triggered by a plugin. E.g. if there is an extensive number of index queries that are triggered by a plugin we want to see this in the trace. Such logging tags are mostly useful for extension points that are likely to have complex or expensive implementations. We may not want to set such a logging tag for extension points which only have trivial implementations. Setting the logging tag with the plugin name when an extension point is invoked is done by opening a trace context. To invoke extension points with such a trace context they should be invoked through a plugin context. The plugin context can be directly injected. Instead of injecting DynamicItem/DynamicSet/DynamicMap you can now inject PluginItemContext/PluginSetContext/PluginMapContext. The plugin context classes offer methods to invoke the extension points that automatically set the trace context. In addition they provide functionality for catching and logging exceptions from plugins. This makes the logging and exception handling for plugin invocations more consistent across the code base and removes the need to have code for this in multiple places. Since exception handling with plugin contexts is easy now more plugin invocations handle exceptions now which makes Gerrit more resilient against plugin failures. This change adapts calls to most important extensions points, such as validators and listeners. Change-Id: Iab41d0059049f06ca41b697e93aa6a1f9668de5b Signed-off-by: Edwin Kempin <ekempin@google.com>
53 lines
1.8 KiB
Java
53 lines
1.8 KiB
Java
// Copyright (C) 2017 The Android Open Source Project
|
|
//
|
|
// 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.gerrit.server;
|
|
|
|
import com.google.gerrit.extensions.events.LifecycleListener;
|
|
import com.google.gerrit.extensions.registration.DynamicSet;
|
|
import com.google.gerrit.lifecycle.LifecycleModule;
|
|
import com.google.gerrit.server.account.UniversalGroupBackend;
|
|
import com.google.gerrit.server.group.SystemGroupBackend;
|
|
import com.google.gerrit.server.plugincontext.PluginSetContext;
|
|
import com.google.inject.Inject;
|
|
import com.google.inject.Singleton;
|
|
|
|
@Singleton
|
|
public class StartupChecks implements LifecycleListener {
|
|
public static class Module extends LifecycleModule {
|
|
@Override
|
|
protected void configure() {
|
|
DynamicSet.setOf(binder(), StartupCheck.class);
|
|
listener().to(StartupChecks.class);
|
|
DynamicSet.bind(binder(), StartupCheck.class).to(UniversalGroupBackend.ConfigCheck.class);
|
|
DynamicSet.bind(binder(), StartupCheck.class).to(SystemGroupBackend.NameCheck.class);
|
|
}
|
|
}
|
|
|
|
private final PluginSetContext<StartupCheck> startupChecks;
|
|
|
|
@Inject
|
|
StartupChecks(PluginSetContext<StartupCheck> startupChecks) {
|
|
this.startupChecks = startupChecks;
|
|
}
|
|
|
|
@Override
|
|
public void start() throws StartupException {
|
|
startupChecks.runEach(c -> c.check(), StartupException.class);
|
|
}
|
|
|
|
@Override
|
|
public void stop() {}
|
|
}
|