This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 2a5223865b62cbdc25cf70cc27546048659afb90 Author: Andy Seaborne <[email protected]> AuthorDate: Mon Dec 23 22:11:08 2024 +0000 GH-2046: Add runtime new datasets to metrics --- .../apache/jena/fuseki/metrics/MetricsProvider.java | 21 +++++++++++++++------ .../org/apache/jena/fuseki/servlets/HttpAction.java | 19 +++++++++++++++++++ .../apache/jena/fuseki/main/cmds/FusekiMain.java | 16 ++++++++-------- .../apache/jena/fuseki/main/sys/FusekiModules.java | 15 +++++---------- .../org/apache/jena/fuseki/mgt/ActionDatasets.java | 9 ++++++++- .../org/apache/jena/fuseki/mod/FusekiModServer.java | 1 + 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/metrics/MetricsProvider.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/metrics/MetricsProvider.java index 2dcd79cea9..c9ade6ee05 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/metrics/MetricsProvider.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/metrics/MetricsProvider.java @@ -21,7 +21,9 @@ import java.util.Objects; import io.micrometer.core.instrument.MeterRegistry; import jakarta.servlet.ServletContext; +import org.apache.jena.atlas.logging.Log; import org.apache.jena.fuseki.Fuseki; +import org.apache.jena.fuseki.server.DataAccessPoint; import org.apache.jena.fuseki.server.DataAccessPointRegistry; import org.apache.jena.fuseki.servlets.HttpAction; @@ -33,17 +35,24 @@ public interface MetricsProvider { /** Bind each data access point in a DataAccessPointRegistry to the system Micrometer {@link MeterRegistry}. */ public default void dataAccessPointMetrics(MetricsProvider metricsProvider, DataAccessPointRegistry dapRegistry) { try { - MeterRegistry meterRegistry = metricsProvider.getMeterRegistry(); - if (meterRegistry != null) { - dapRegistry.accessPoints().forEach(dap->{ - new FusekiRequestsMetrics( dap ).bindTo( meterRegistry ); - }); - } + dapRegistry.accessPoints().forEach(dap->addDataAccessPointMetrics(dap)); } catch (Throwable th) { Fuseki.configLog.error("Failed to bind all data access points to netrics provider", th); } } + public default void addDataAccessPointMetrics(DataAccessPoint dataAccessPoint) { + MeterRegistry meterRegistry = this.getMeterRegistry(); + if (meterRegistry != null ) + addDataAccessPointMetrics(meterRegistry, dataAccessPoint); + } + + private static void addDataAccessPointMetrics(MeterRegistry meterRegistry, DataAccessPoint dataAccessPoint) { + if ( dataAccessPoint == null ) + Log.warn(MetricsProvider.class, "addDataAccessPointMetrics: Null DataAccessPoint"); + new FusekiRequestsMetrics(dataAccessPoint).bindTo(meterRegistry); + } + public static void setMetricsProvider(ServletContext servletContext, MetricsProvider provider) { Objects.requireNonNull(servletContext); if ( provider == null ) diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java index 9e35cd3310..220625f9a3 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.zip.DeflaterInputStream; import java.util.zip.GZIPInputStream; +import jakarta.servlet.ServletContext; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -41,6 +42,7 @@ import org.apache.jena.atlas.logging.FmtLog; import org.apache.jena.atlas.logging.Log; import org.apache.jena.fuseki.Fuseki; import org.apache.jena.fuseki.FusekiException; +import org.apache.jena.fuseki.metrics.MetricsProvider; import org.apache.jena.fuseki.server.*; import org.apache.jena.fuseki.system.ActionCategory; import org.apache.jena.query.ReadWrite; @@ -251,6 +253,23 @@ public class HttpAction return dataAccessPointRegistry; } + /** + * Get {@link ServletContext} (may be null). + */ + public ServletContext getServletContext() { + return request.getServletContext(); + } + + /** + * Get the {@link MetricsProvider} for this action. + */ + public MetricsProvider getMetricsProvider() { + ServletContext servletContext = getServletContext(); + if ( servletContext == null ) + return null; + return MetricsProvider.getMetricsProvider(servletContext); + } + /** * Set the endpoint and endpoint name that this is an action for. * @param endpoint {@link Endpoint} diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java index bfcf5efda1..d902c9ce10 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java @@ -97,8 +97,8 @@ public class FusekiMain extends CmdARQ { private static ArgDecl argWithMetrics = new ArgDecl(ArgDecl.NoValue, "withMetrics", "metrics"); private static ArgDecl argWithCompact = new ArgDecl(ArgDecl.NoValue, "withCompact", "compact"); - // Default is "true" and use modules found by the ServiceLoader. - private static ArgDecl argEnableModules = new ArgDecl(ArgDecl.HasValue, "modules", "fuseki-modules"); +// // Use modules found by the ServiceLoader. +// private static ArgDecl argEnableModules = new ArgDecl(ArgDecl.HasValue, "modules", "fuseki-modules"); private static ArgDecl argAuth = new ArgDecl(ArgDecl.HasValue, "auth"); @@ -306,7 +306,7 @@ public class FusekiMain extends CmdARQ { add(argWithMetrics, "--metrics", "Enable /$/metrics"); add(argWithCompact, "--compact", "Enable /$/compact/*"); - add(argEnableModules, "--modules=true|false", "Enable Fuseki modules"); + //add(argEnableModules, "--modules=true|false", "Enable Fuseki modules"); super.modVersion.addClass("Fuseki", Fuseki.class); @@ -575,12 +575,12 @@ public class FusekiMain extends CmdARQ { serverArgs.jettyConfigFile = jettyConfigFile; } + // Allows for external setting of serverArgs.fusekiModules if ( serverArgs.fusekiModules == null ) { - // Allows for external setting of serverArgs.fusekiModules - boolean withModules = hasValueOfTrue(argEnableModules); - serverArgs.fusekiModules = withModules - ? FusekiModules.getSystemModules() - : FusekiModules.empty(); + // Get modules from system-wide setup. + // This (Fuseki 5.3.0- defaults to an empty set of modules. +// boolean withModules = hasValueOfTrue(argEnableModules); + serverArgs.fusekiModules = FusekiModules.getSystemModules(); } if ( contains(argCORS) ) { diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java index 5d0d524de8..e3603b4d6d 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiModules.java @@ -32,9 +32,8 @@ import java.util.function.Consumer; */ public class FusekiModules { - private static FusekiModules autoLoadedFusekiModules = FusekiAutoModules.get(); // Never null, maybe empty - private static FusekiModules systemFusekiModules = autoLoadedFusekiModules; + private static FusekiModules systemFusekiModules = FusekiModules.create(); /** * There is a system wide set of modules used when no other modules are indicated. @@ -46,15 +45,12 @@ public class FusekiModules { /** Restore the original setting of the system default collection. */ public static void restoreSystemDefault() { - systemFusekiModules = autoLoadedFusekiModules; + systemFusekiModules = FusekiModules.create(); } public static FusekiModules getSystemModules() { - if ( systemFusekiModules == null ) { - if ( autoLoadedFusekiModules == null ) - autoLoadedFusekiModules = FusekiAutoModules.get(); - systemFusekiModules = autoLoadedFusekiModules; - } + if ( systemFusekiModules == null ) + systemFusekiModules = FusekiAutoModules.get(); return systemFusekiModules; } @@ -69,8 +65,7 @@ public class FusekiModules { // Testing. /*package*/ static void resetSystemDefault() { // Reload, reset. Fresh objects. - autoLoadedFusekiModules = FusekiAutoModules.load(); - systemFusekiModules = autoLoadedFusekiModules; + systemFusekiModules = FusekiAutoModules.get(); } /** Create a collection of Fuseki modules */ diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java index 977bcfea69..27cfd88836 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java @@ -42,6 +42,7 @@ import org.apache.jena.fuseki.build.DatasetDescriptionMap; import org.apache.jena.fuseki.build.FusekiConfig; import org.apache.jena.fuseki.ctl.ActionContainerItem; import org.apache.jena.fuseki.ctl.JsonDescription; +import org.apache.jena.fuseki.metrics.MetricsProvider; import org.apache.jena.fuseki.server.DataAccessPoint; import org.apache.jena.fuseki.server.DataService; import org.apache.jena.fuseki.server.FusekiVocab; @@ -107,6 +108,7 @@ public class ActionDatasets extends ActionContainerItem { // ---- POST + /** Create dataset */ @Override protected JsonValue execPostContainer(HttpAction action) { UUID uuid = UUID.randomUUID(); @@ -208,8 +210,13 @@ public class ActionDatasets extends ActionContainerItem { if ( ! datasetPath.equals(dataAccessPoint.getName()) ) FmtLog.warn(action.log, "Inconsistent names: datasetPath = %s; DataAccessPoint name = %s", datasetPath, dataAccessPoint); succeeded = true; - action.getDataAccessPointRegistry().register(dataAccessPoint); + + // Add to metrics + MetricsProvider metricProvider = action.getMetricsProvider(); + if ( metricProvider != null ) + action.getMetricsProvider().addDataAccessPointMetrics(dataAccessPoint); + action.setResponseContentType(WebContent.contentTypeTextPlain); ServletOps.success(action); } catch (IOException ex) { IO.exception(ex); } diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/FusekiModServer.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/FusekiModServer.java index 99bd550b4f..84f0fb72f6 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/FusekiModServer.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/FusekiModServer.java @@ -75,6 +75,7 @@ public class FusekiModServer { } FusekiModules modules = serverModules; + // Set system modules - these are picked up in FusekiMain FusekiModules.setSystemDefault(modules); FusekiServer server = FusekiServer.construct(args); return server;
