Diagnostic tools

Guicey provide many bundled console reports to help with problems diagnostic (or to simply clarify how application works) during development. All reports may be enabled on main guice bundle:

.printDiagnosticInfo()
Detailed guicey configuration information
.printAvailableInstallers()
Prints available installers (helps understanding supported extensions)
.printCustomConfigurationBindings()
.printConfigurationBindings()
Show yaml config introspection result (shows available yaml value bindings)
.printGuiceBindings()
.printAllGuiceBindings()
Guice bindings from registered modules
.printGuiceAopMap()
.printGuiceAopMap(GuiceAopConfig config)
AOP appliance map
.printWebMappings()
Prints all registered resvlets and filters (including guice ServletModule declarations)
.printJerseyConfig()
Prints all registered jersey extensions (exception mappers, filters etc.): including everything registered by dropwizard itself and all direct manual registrations.
.printLifecyclePhases()
.printLifecyclePhasesDetailed()
Guicey lifecycle stages (separates logs to clearly see what messages relates to what phase)
.strictScopeControl()
In case of doubts about extension owner (guice or HK2) and suspicious for duplicate instantiation, you can enable strict control which will throw exception in case of wrong owner.

Diagnostic hook

It is obviously impossible to enable diagnostic reports without application re-compilation. But, sometimes, it is required to validate installed application. To workaround this situation, guicey provides special diagnostic hook, which can be enabled with a system property:

-Dguicey.hooks=diagnostic

Hook activates the most commonly used reports:

public class DiagnosticHook implements GuiceyConfigurationHook {
    public void configure(final GuiceBundle.Builder builder) {
        builder.printDiagnosticInfo()
                .printLifecyclePhasesDetailed()
                .printCustomConfigurationBindings()
                .printGuiceBindings()
                .printWebMappings()
                .printJerseyConfig();
    }
}

Tip

If provided hook doesn't cover all required reports, you can always make your own hook and register it's shortcut for simplified usage

Reports implementation

Report is implemented as guicey event listener. All sub-reports provide additional configuration options, so if default configuration (from shortcut methods above) does not fit your needs you can register listener directly with required configuration.

For example, available installers report is re-configured configuration report:

public Builder<T> printAvailableInstallers() {
    return listen(ConfigurationDiagnostic.builder("Available installers report")
            .printConfiguration(new DiagnosticConfig()
                    .printInstallers()
                    .printNotUsedInstallers()
                    .printInstallerInterfaceMarkers())
            .printContextTree(new ContextTreeConfig()
                    .hideCommands()
                    .hideDuplicateRegistrations()
                    .hideEmptyBundles()
                    .hideExtensions()
                    .hideModules())
            .build());
}

Report rendering logic may also be used directly as all reports (except lifecycle) provide separate renderer object implementing ReportRenderer. Renderers not bound to guice context and assume direct instantiation.

For examples of direct renderers usage see events implementation:

  • RunPhaseEvent.renderConfigurationBindings()
  • InjectorPhaseEvent.ReportRenderer

Note

These shortcut methods allow easy render of report into string using received event object (in listener).