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;

Reply via email to