Author: andy
Date: Wed May 29 14:00:37 2013
New Revision: 1487491
URL: http://svn.apache.org/r1487491
Log:
JENA-427 : Reorganise counters for operations.
Added:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/mgt/ActionBackup.java
Wed May 29 14:00:37 2013
@@ -95,7 +95,7 @@ public class ActionBackup extends Servle
private void scheduleBackup(final HttpAction action)
{
- String dsName = action.desc.name ;
+ String dsName = action.dsRef.name ;
final String ds = dsName.startsWith("/")? dsName : "/"+dsName ;
String timestamp = Utils.nowAsString("yyyy-MM-dd_HH-mm-ss") ;
Added:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java?rev=1487491&view=auto
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java
(added)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Counter.java
Wed May 29 14:00:37 2013
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.jena.fuseki.server;
+
+import java.util.concurrent.atomic.AtomicLong ;
+
+/** A statistics counter */
+public class Counter
+{
+ private AtomicLong counter = new AtomicLong(0) ;
+
+ public Counter() {}
+
+ public void inc() { counter.incrementAndGet() ; }
+ public void dec() { counter.decrementAndGet() ; }
+ public long value() { return counter.get() ; }
+}
+
Added:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java?rev=1487491&view=auto
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
(added)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterName.java
Wed May 29 14:00:37 2013
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.jena.fuseki.server;
+
+/** Names for all counters */
+public enum CounterName {
+ // Per datasset
+ DatasetRequests("requests"),
+ DatasetRequestsGood("requests.good"),
+ DatasetRequestsBad("requests.bad") ,
+
+ // Service specific
+ QueryRequests("query.requests") ,
+ QueryRequestsGood("query.requests.good") ,
+ QueryRequestsBad("query.requests.bad") ,
+ QueryTimeouts("query.timeouts") ,
+ QueryExecErrors("query.execerrors") ,
+
+ UpdateRequests("update.requests") ,
+ UpdateRequestsGood("update.requests.good") ,
+ UpdateRequestsBad("update.requests.bsd") ,
+ UpdateExecErrors("update.execerrors"),
+
+ GSPrequests("gsp.requests") ,
+ GSPrequestsGood("gsp.requests.good") ,
+ GSPrequestsBad("gsp.requests.bad") ,
+
+ GSPget("gsp.requests.get") ,
+ GSPgetGood("gsp.requests.get.good") ,
+ GSPgetBad("gsp.requests.get.bad") ,
+
+ GSPpost("gsp.requests.post") ,
+ GSPpostGood("gsp.requests.post.good") ,
+ GSPpostBad("gsp.requests.post.bad") ,
+
+ GSPdelete("gsp.requests.delete") ,
+ GSPdeleteGood("gsp.requests.delete.good") ,
+ GSPdeleteBad("gsp.requests.delete.bad") ,
+
+ GSPput("gsp.requests.put") ,
+ GSPputGood("gsp.requests.put.good") ,
+ GSPputBad("gsp.requests.put.bad") ,
+
+ GSPhead("gsp.requests.head") ,
+ GSPheadGood("gsp.requests.head.good") ,
+ GSPheadBad("gsp.requests.head.bad") ,
+
+ GSPpatch("gsp.requests.patch") ,
+ GSPpatchGood("gsp.requests.patch.good") ,
+ GSPpatchBad("gsp.requests.patch.bad") ,
+
+ UploadRequests("upload.requests") ,
+ UploadRequestsGood("upload.requests.good") ,
+ UploadRequestsBad("upload.requests.bad") ,
+
+ ;
+
+ private String name ;
+ private CounterName(String name) { this.name = name ; }
+
+}
Added:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java?rev=1487491&view=auto
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
(added)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/CounterSet.java
Wed May 29 14:00:37 2013
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.jena.fuseki.server;
+
+import java.util.HashMap ;
+import java.util.Map ;
+
+import org.apache.jena.fuseki.Fuseki ;
+
+/** A collection of counters */
+public class CounterSet
+{
+ private Map<CounterName, Counter> counters = new HashMap<CounterName,
Counter>() ;
+
+ public CounterSet() {}
+
+ public void inc(CounterName c) { get(c).inc() ; }
+ public void dec(CounterName c) { get(c).dec() ; }
+ public long value(CounterName c) { return get(c).value() ; }
+
+ public void add(CounterName counterName) {
+ if ( counters.containsKey(counterName) ) {
+ Fuseki.serverLog.warn("Duplicate counter in counter set:
"+counterName) ;
+ return ;
+ }
+ counters.put(counterName, new Counter()) ;
+ }
+
+ private Counter get(CounterName cn) {
+ Counter c = counters.get(cn) ;
+ if ( c == null )
+ Fuseki.serverLog.warn("No counter in counter set: "+cn) ;
+
+ return c ;
+ }
+}
+
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
Wed May 29 14:00:37 2013
@@ -18,8 +18,12 @@
package org.apache.jena.fuseki.server;
+import java.util.HashMap ;
+import java.util.Map ;
import java.util.concurrent.atomic.AtomicLong ;
+import org.apache.jena.fuseki.Fuseki ;
+
import com.hp.hpl.jena.query.ReadWrite ;
import com.hp.hpl.jena.sparql.core.DatasetGraph ;
@@ -33,13 +37,44 @@ public class DatasetRef
public ServiceRef upload = new ServiceRef("upload") ;
public ServiceRef readGraphStore = new ServiceRef("gspRead") ;
public ServiceRef readWriteGraphStore = new
ServiceRef("gspReadWrite") ;
+
+ // Dataset-level counters.
+ public final CounterSet counters = new CounterSet() ;
+ private Map<String, ServiceRef> serviceRefs = new HashMap<String,
ServiceRef>() ;
+ private boolean initialized = false ;
+
+ // Two step initiation (c.f. Builder pattern)
+ // Create object - incrementally set state - call init to calculate
internal datastructures.
+ public DatasetRef() {}
+ public void init() {
+ if ( initialized )
+ Fuseki.serverLog.warn("Already initialized: dataset = "+name) ;
+ initialized = true ;
+ initServices() ;
+ }
-// public List<String> queryEP = new ArrayList<String>() ;
-// public List<String> updateEP = new ArrayList<String>() ;
-// public List<String> uploadEP = new ArrayList<String>() ;
-// public List<String> readGraphStoreEP = new ArrayList<String>() ;
-// public List<String> readWriteGraphStoreEP = new ArrayList<String>() ;
-
+ private void initServices() {
+ add(serviceRefs, query) ;
+ add(serviceRefs, update) ;
+ add(serviceRefs, upload) ;
+ add(serviceRefs, readGraphStore) ;
+ add(serviceRefs, readWriteGraphStore) ;
+ }
+
+ private static void add(Map<String, ServiceRef> serviceRefs, ServiceRef
srvRef)
+ {
+ for ( String ep : srvRef.endpoints )
+ serviceRefs.put(ep, srvRef) ;
+ }
+
+ public ServiceRef getServiceRef(String service) {
+ if ( ! initialized )
+ Fuseki.serverLog.error("Not initialized: dataset = "+name) ;
+ if ( service.startsWith("/") )
+ service = service.substring(1, service.length()) ;
+ return serviceRefs.get(service) ;
+ }
+
/** Counter of active read transactions */
public AtomicLong activeReadTxn = new AtomicLong(0) ;
@@ -52,23 +87,23 @@ public class DatasetRef
/** Cumulative counter of writer transactions */
public AtomicLong totalWriteTxn = new AtomicLong(0) ;
- /** Count of requests received - any service */
- public AtomicLong countServiceRequests = new AtomicLong(0) ;
- /** Count of requests received that fail in some way */
- public AtomicLong countServiceRequestsBad = new AtomicLong(0) ;
- /** Count of requests received that fail in some way */
- public AtomicLong countServiceRequestsOK = new AtomicLong(0) ;
-
- // SPARQL Query
-
- /** Count of SPARQL Queries successfully executed */
- public AtomicLong countQueryOK = new AtomicLong(0) ;
- /** Count of SPARQL Queries with syntax errors */
- public AtomicLong countQueryBadSyntax = new AtomicLong(0) ;
- /** Count of SPARQL Queries with timeout on execution */
- public AtomicLong countQueryTimeout = new AtomicLong(0) ;
- /** Count of SPARQL Queries with execution errors (not timeouts) */
- public AtomicLong countQueryBadExecution = new AtomicLong(0) ;
+// /** Count of requests received - anyzservice */
+// public AtomicLong countServiceRequests = new AtomicLong(0) ;
+// /** Count of requests received that fail in some way */
+// public AtomicLong countServiceRequestsBad = new AtomicLong(0) ;
+// /** Count of requests received that fail in some way */
+// public AtomicLong countServiceRequestsOK = new AtomicLong(0) ;
+//
+// // SPARQL Query
+//
+// /** Count of SPARQL Queries successfully executed */
+// public AtomicLong countQueryOK = new AtomicLong(0) ;
+// /** Count of SPARQL Queries with syntax errors */
+// public AtomicLong countQueryBadSyntax = new AtomicLong(0) ;
+// /** Count of SPARQL Queries with timeout on execution */
+// public AtomicLong countQueryTimeout = new AtomicLong(0) ;
+// /** Count of SPARQL Queries with execution errors (not timeouts) */
+// public AtomicLong countQueryBadExecution = new AtomicLong(0) ;
public void startTxn(ReadWrite mode)
{
@@ -112,5 +147,4 @@ public class DatasetRef
! readWriteGraphStore.isActive()
;
}
-
}
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
Wed May 29 14:00:37 2013
@@ -109,6 +109,7 @@ public class FusekiConfig
config.jettyConfigFile = null ;
config.pages = Fuseki.PagesStatic ;
config.enableCompression = true ;
+ dbDesc.init() ;
return config ;
}
@@ -209,18 +210,16 @@ public class FusekiConfig
private static DatasetRef processService(Resource svc)
{
- DatasetRef sDesc = new DatasetRef() ;
log.info("Service: "+nodeLabel(svc)) ;
-
+ DatasetRef sDesc = new DatasetRef() ;
sDesc.name = ((Literal)getOne(svc, "fu:name")).getLexicalForm() ;
log.info(" name = "+sDesc.name) ;
addServiceEP("query", sDesc.name, sDesc.query, svc, "fu:serviceQuery")
;
addServiceEP("update", sDesc.name, sDesc.update, svc,
"fu:serviceUpdate") ;
- addServiceEP("upload", sDesc.name, sDesc.upload, svc,
"fu:serviceUpload") ;
+ addServiceEP("upload", sDesc.name, sDesc.upload, svc,
"fu:serviceUpload") ;
addServiceEP("graphStore(RW)", sDesc.name, sDesc.readWriteGraphStore,
svc, "fu:serviceReadWriteGraphStore") ;
addServiceEP("graphStore(R)", sDesc.name, sDesc.readGraphStore, svc,
"fu:serviceReadGraphStore") ;
-
// Extract timeout overriding configuration if present.
if (svc.hasProperty(FusekiVocab.pAllowTimeoutOverride)) {
sDesc.allowTimeoutOverride =
svc.getProperty(FusekiVocab.pAllowTimeoutOverride).getObject().asLiteral().getBoolean();
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java
Wed May 29 14:00:37 2013
@@ -228,7 +228,10 @@ public class SPARQLServer
if ( datasetPath.endsWith("/") )
datasetPath = datasetPath.substring(0, datasetPath.length()-1) ;
-
+
+ addCounters(dsDesc) ;
+ dsDesc.init() ;
+
DatasetRegistry.get().put(datasetPath, dsDesc) ;
serverLog.info(format("Dataset path = %s", datasetPath)) ;
@@ -368,4 +371,63 @@ public class SPARQLServer
context.addFilter(GzipFilter.class, pathSpec,
EnumSet.allOf(DispatcherType.class));
}
+ private static void addCounters(DatasetRef sDesc) {
+ sDesc.counters.add(CounterName.DatasetRequests) ;
+ sDesc.counters.add(CounterName.DatasetRequestsGood) ;
+ sDesc.counters.add(CounterName.DatasetRequestsBad) ;
+
+ sDesc.counters.add(CounterName.GSPrequests) ;
+ sDesc.counters.add(CounterName.GSPrequestsGood) ;
+ sDesc.counters.add(CounterName.GSPrequestsBad) ;
+
+ sDesc.query.counters.add(CounterName.QueryRequests) ;
+ sDesc.query.counters.add(CounterName.QueryRequestsGood) ;
+ sDesc.query.counters.add(CounterName.QueryRequestsBad) ;
+ sDesc.query.counters.add(CounterName.QueryTimeouts) ;
+ sDesc.query.counters.add(CounterName.QueryExecErrors) ;
+
+ sDesc.update.counters.add(CounterName.UpdateRequests) ;
+ sDesc.update.counters.add(CounterName.UpdateRequestsGood) ;
+ sDesc.update.counters.add(CounterName.UpdateRequestsBad) ;
+ sDesc.update.counters.add(CounterName.UpdateExecErrors) ;
+
+ sDesc.upload.counters.add(CounterName.UploadRequests) ;
+ sDesc.upload.counters.add(CounterName.UploadRequestsGood) ;
+ sDesc.upload.counters.add(CounterName.UploadRequestsBad) ;
+
+ addCountersForGSP(sDesc.readGraphStore.counters, true) ;
+ addCountersForGSP(sDesc.readWriteGraphStore.counters, false) ;
+ sDesc.init() ;
+ }
+
+ private static void addCountersForGSP(CounterSet cs, boolean readWrite) {
+ cs.add(CounterName.GSPget) ;
+ cs.add(CounterName.GSPgetGood) ;
+ cs.add(CounterName.GSPgetBad) ;
+
+ cs.add(CounterName.GSPhead) ;
+ cs.add(CounterName.GSPheadGood) ;
+ cs.add(CounterName.GSPheadBad) ;
+
+ // Add anyway.
+// if ( ! readWrite )
+// return ;
+
+ cs.add(CounterName.GSPput) ;
+ cs.add(CounterName.GSPputGood) ;
+ cs.add(CounterName.GSPputBad) ;
+
+ cs.add(CounterName.GSPpost) ;
+ cs.add(CounterName.GSPpostGood) ;
+ cs.add(CounterName.GSPpostBad) ;
+
+ cs.add(CounterName.GSPdelete) ;
+ cs.add(CounterName.GSPdeleteGood) ;
+ cs.add(CounterName.GSPdeleteBad) ;
+
+ cs.add(CounterName.GSPpatch) ;
+ cs.add(CounterName.GSPpatchGood) ;
+ cs.add(CounterName.GSPpatchBad) ;
+ }
+
}
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java
Wed May 29 14:00:37 2013
@@ -20,32 +20,23 @@ package org.apache.jena.fuseki.server;
import java.util.ArrayList ;
import java.util.List ;
-import java.util.concurrent.atomic.AtomicLong ;
/** Configuration of an individual service */
public class ServiceRef
{
public final String name ;
-
+ // Service-level counters.
+ public final CounterSet counters = new CounterSet() ;
+
/** Endpoints (as absolute path URLs) */
public List<String> endpoints = new ArrayList<String>() ;
// Attach counters to services or datasets
// Can we have a counter of the same name on different services?
// Cost : number of maps.
+ // +ve: Multiple services with the same name counter
-
- /** Count of requests received - good or bad */
- public AtomicLong countRequests = new AtomicLong(0) ;
- /** Count of requests received that fail request checking in some way */
- public AtomicLong countRequestsBad = new AtomicLong(0) ;
- /** Count of requests that are cancelled (e..g timeouts) */
- public AtomicLong countRequestsCancelled = new AtomicLong(0) ;
- /** Count of requests that fail because of internal server issues (bugs) */
- public AtomicLong countRequestsOK = new AtomicLong(0) ;
-
- public ServiceRef(String serviceName)
- {
+ public ServiceRef(String serviceName) {
this.name = serviceName ;
}
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/Stats.java
Wed May 29 14:00:37 2013
@@ -20,12 +20,5 @@ package org.apache.jena.fuseki.server;
public class Stats
{
- public enum Counters {
- DatasetRequests,
- DatasetRequestsOK,
- DatasetRequestsBad,
- QueryRequests , QueryRequestsOK, QueryBadRequests , QueryExecErrors
,
- UpdateRequests , UpdateRequestsOK, UpdateBadRequests ,
UpdateExecErrors ,
- }
}
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
Wed May 29 14:00:37 2013
@@ -32,6 +32,7 @@ import org.apache.jena.atlas.web.MediaTy
import org.apache.jena.fuseki.DEF ;
import org.apache.jena.fuseki.conneg.ConNeg ;
import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.ServiceRef ;
import com.hp.hpl.jena.query.ReadWrite ;
import com.hp.hpl.jena.shared.Lock ;
@@ -42,13 +43,13 @@ import com.hp.hpl.jena.sparql.core.Trans
public class HttpAction
{
- public final long id ;
+ public final long id ;
public final boolean verbose ;
-
// Phase two items - set and valida after the datasetRef is known.
private DatasetGraph dsg ; // The data
- public DatasetRef desc ;
+ public DatasetRef dsRef ;
+ public ServiceRef srvRef ;
private Transactional transactional ;
private boolean isTransactional;
@@ -61,6 +62,9 @@ public class HttpAction
private long startTime = -2 ;
private long finishTime = -2 ;
+ // Incoming
+ //public final
+
// Outcome.
int statusCode = -1 ;
String message = null ;
@@ -71,6 +75,7 @@ public class HttpAction
Map <String, String> headers = new HashMap<String, String>() ;
public HttpServletRequest request;
public HttpServletResponseTracker response ;
+
// // ---- Concurrency checking.
@@ -99,7 +104,7 @@ public class HttpAction
public void setDataset(DatasetRef desc)
{
- this.desc = desc ;
+ this.dsRef = desc ;
this.dsg = desc.dataset ;
if ( dsg instanceof Transactional )
@@ -118,6 +123,10 @@ public class HttpAction
}
}
+ public void setService(ServiceRef srvRef) {
+ this.srvRef = srvRef ;
+ }
+
/**
* Returns whether or not the underlying DatasetGraph is fully
transactional (supports rollback)
*/
@@ -131,12 +140,12 @@ public class HttpAction
activeMode = READ ;
transactional.begin(READ) ;
activeDSG = dsg ;
- desc.startTxn(READ) ;
+ dsRef.startTxn(READ) ;
}
public void endRead()
{
- desc.finishTxn(READ) ;
+ dsRef.finishTxn(READ) ;
activeMode = null ;
transactional.end() ;
activeDSG = null ;
@@ -147,7 +156,7 @@ public class HttpAction
transactional.begin(WRITE) ;
activeMode = WRITE ;
activeDSG = dsg ;
- desc.startTxn(WRITE) ;
+ dsRef.startTxn(WRITE) ;
}
public void commit()
@@ -164,7 +173,7 @@ public class HttpAction
public void endWrite()
{
- desc.finishTxn(WRITE) ;
+ dsRef.finishTxn(WRITE) ;
activeMode = null ;
if (transactional.isInTransaction())
@@ -176,15 +185,13 @@ public class HttpAction
transactional.end() ;
activeDSG = null ;
}
-
- public final DatasetGraph getActiveDSG()
- {
+
+ public final DatasetGraph getActiveDSG() {
return activeDSG ;
}
-
- public final DatasetRef getDatasetRef()
- {
- return desc ;
+
+ public final DatasetRef getDatasetRef() {
+ return dsRef ;
}
/** Reduce to a size that can be kept around for sometime */
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Query.java
Wed May 29 14:00:37 2013
@@ -34,6 +34,7 @@ import org.apache.jena.atlas.web.MediaTy
import org.apache.jena.fuseki.FusekiException ;
import org.apache.jena.fuseki.FusekiLib ;
import org.apache.jena.fuseki.HttpNames ;
+import static org.apache.jena.fuseki.server.CounterName.* ;
import org.apache.jena.riot.WebContent ;
import org.apache.jena.riot.web.HttpOp ;
import org.apache.jena.web.HttpSC ;
@@ -115,8 +116,8 @@ public abstract class SPARQL_Query exten
paramTimeout) ;
@Override
- protected void startRequest(HttpAction action)
- {
+ protected void startRequest(HttpAction action) {
+ action.srvRef.counters.inc(QueryRequests) ;
}
/** Called to validate arguments */
@@ -138,7 +139,10 @@ public abstract class SPARQL_Query exten
try {
validateParams(action.request, allParams) ;
validateRequest(action) ;
- } catch (ActionErrorException ex) {
inc(action.desc.countQueryBadSyntax) ; throw ex ; }
+ } catch (ActionErrorException ex) {
+ action.srvRef.counters.inc(QueryRequestsBad) ;
+ throw ex ;
+ }
// Query not yet parsed.
}
@@ -226,15 +230,15 @@ public abstract class SPARQL_Query exten
queryStringLog = formatForLog(query) ;
validateQuery(action, query) ;
} catch (ActionErrorException ex) {
- inc(action.desc.countQueryBadSyntax) ;
+ action.srvRef.counters.inc(QueryRequestsBad) ;
throw ex ;
} catch (QueryParseException ex) {
- inc(action.desc.countQueryBadSyntax) ;
+ action.srvRef.counters.inc(QueryRequestsBad) ;
errorBadRequest("Parse error: \n" + queryString + "\n\r" +
messageForQPE(ex)) ;
}
// Should not happen.
catch (QueryException ex) {
- inc(action.desc.countQueryBadSyntax) ;
+ action.srvRef.counters.inc(QueryRequestsBad) ;
errorBadRequest("Error: \n" + queryString + "\n\r" +
ex.getMessage()) ;
}
@@ -248,11 +252,14 @@ public abstract class SPARQL_Query exten
// Deals with exceptions itself.
sendResults(action, result, query.getPrologue()) ;
- inc(action.desc.countQueryOK) ;
- }
- catch (QueryCancelledException ex) {
inc(action.desc.countQueryTimeout) ; throw ex ; }
- catch (QueryExecException ex) {
inc(action.desc.countQueryBadExecution) ; throw ex ; }
- finally {
+ action.srvRef.counters.inc(QueryRequestsGood) ;
+ } catch (QueryCancelledException ex) {
+ action.srvRef.counters.inc(QueryTimeouts) ;
+ throw ex ;
+ } catch (QueryExecException ex) {
+ action.srvRef.counters.inc(QueryExecErrors) ;
+ throw ex ;
+ } finally {
if ( qExec != null )
qExec.close() ;
action.endRead() ;
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST.java
Wed May 29 14:00:37 2013
@@ -348,7 +348,6 @@ public abstract class SPARQL_REST extend
// Without content length, reading to end of file is
occassionaly fraught.
// Reason unknown - maybe some client mishandling of the
stream.
String x = FileUtils.readWholeFileAsUTF8(input) ;
- //System.out.println(x) ;
input = new ByteArrayInputStream(x.getBytes("UTF-8")) ;
}
}
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
Wed May 29 14:00:37 2013
@@ -31,8 +31,10 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse ;
import org.apache.jena.fuseki.HttpNames ;
+import static org.apache.jena.fuseki.server.CounterName.* ;
import org.apache.jena.fuseki.server.DatasetRef ;
import org.apache.jena.fuseki.server.DatasetRegistry ;
+import org.apache.jena.fuseki.server.ServiceRef ;
import org.apache.jena.web.HttpSC ;
import com.hp.hpl.jena.query.ARQ ;
@@ -109,7 +111,7 @@ public abstract class SPARQL_ServletBase
return new HttpAction(id, request, response, verbose_debug) ;
}
-//XXX protected abstract void startRequest(HttpAction action) ;
+ //protected abstract void startRequest(HttpAction action) ;
protected void startRequest(HttpAction action) {}
protected abstract void validate(HttpAction action) ;
@@ -125,23 +127,30 @@ public abstract class SPARQL_ServletBase
private void execCommonWorker(HttpAction action)
{
- DatasetRef desc = null ;
+ DatasetRef dsRef = null ;
String uri = action.request.getRequestURI() ;
- uri = mapRequestToDataset(uri) ;
-
- if ( uri != null ) {
- desc = DatasetRegistry.get().get(uri) ;
- if ( desc == null ) {
- errorNotFound("No dataset for URI: "+uri) ;
+ String datasetUri = mapRequestToDataset(uri) ;
+
+ if ( datasetUri != null ) {
+ dsRef = DatasetRegistry.get().get(datasetUri) ;
+ if ( dsRef == null ) {
+ errorNotFound("No dataset for URI: "+datasetUri) ;
return ;
}
} else {
- // ????
- desc = new DatasetRef();
- desc.dataset = dummyDSG;
+ // General SPARQL processor
+ // - is this the right way to do it?
+ // = or make it a completely separate servlet.
+ dsRef = new DatasetRef();
+ dsRef.dataset = dummyDSG;
+ dsRef.init() ;
}
- action.setDataset(desc) ;
+
+ action.setDataset(dsRef) ;
+ String serviceName = mapRequestToService(dsRef, uri, datasetUri) ;
+ ServiceRef srvRef = dsRef.getServiceRef(serviceName) ;
+ action.setService(srvRef) ;
executeAction(action) ;
}
@@ -158,28 +167,27 @@ public abstract class SPARQL_ServletBase
}
// This is the service request lifecycle.
- // Called directly by the UberServlet which as not done any stats by this
point.
+ // Called directly by the UberServlet which has not done any stats by this
point.
protected void executeLifecycle(HttpAction action)
{
- // Fits with uberservlet?
- inc(action.desc.countServiceRequests) ;
+ action.dsRef.counters.inc(DatasetRequests) ;
startRequest(action) ;
try {
validate(action) ;
} catch (ActionErrorException ex) {
- inc(action.desc.countServiceRequestsBad) ;
+ action.dsRef.counters.inc(DatasetRequestsBad) ;
throw ex ;
}
try {
perform(action) ;
// Success
- inc(action.desc.countServiceRequestsOK) ;
+ action.dsRef.counters.inc(DatasetRequestsGood) ;
} catch (ActionErrorException ex) {
- inc(action.desc.countServiceRequestsBad) ;
+ action.dsRef.counters.inc(DatasetRequestsBad) ;
throw ex ;
} catch (QueryCancelledException ex) {
- inc(action.desc.countServiceRequestsBad) ;
+ action.dsRef.counters.inc(DatasetRequestsBad) ;
throw ex ;
}
@@ -269,7 +277,7 @@ public abstract class SPARQL_ServletBase
protected static String mapRequestToDataset$(String uri)
{
// Chop off trailing part - the service selector
- // e.f. /dataset/sparql => /dataset
+ // e.g. /dataset/sparql => /dataset
int i = uri.lastIndexOf('/') ;
if ( i == -1 )
return null ;
@@ -280,6 +288,23 @@ public abstract class SPARQL_ServletBase
}
return uri.substring(0, i) ;
+ } /** Find the dataset name even if direct naming */
+ protected static String findTrailing(String uri, String dsname)
+ {
+ if ( dsname.length() >= uri.length() )
+ return "" ;
+ return uri.substring(dsname.length()+1) ; // Skip the separating "/"
+ }
+
+
+
+
+ protected static String mapRequestToService(DatasetRef dsRef, String uri,
String serviceName)
+ {
+ if ( dsRef.name.length() >= uri.length() )
+ return "" ;
+ return uri.substring(dsRef.name.length()+1) ; // Skip the separating
"/"
+
}
/** Implementation of mapRequestToDataset(String) that looks for the
longest match.
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
Wed May 29 14:00:37 2013
@@ -72,13 +72,13 @@ public abstract class SPARQL_UberServlet
public static class AccessByConfig extends SPARQL_UberServlet
{
public AccessByConfig(boolean verbose_debug) { super(verbose_debug) ; }
- @Override protected boolean allowQuery(HttpAction action) { return
isEnabled(action.desc.query) ; }
- @Override protected boolean allowUpdate(HttpAction action) { return
isEnabled(action.desc.update) ; }
- @Override protected boolean allowREST_R(HttpAction action) { return
isEnabled(action.desc.readGraphStore) || allowREST_W(action); }
- @Override protected boolean allowREST_W(HttpAction action) { return
isEnabled(action.desc.readWriteGraphStore) ; }
+ @Override protected boolean allowQuery(HttpAction action) { return
isEnabled(action.dsRef.query) ; }
+ @Override protected boolean allowUpdate(HttpAction action) { return
isEnabled(action.dsRef.update) ; }
+ @Override protected boolean allowREST_R(HttpAction action) { return
isEnabled(action.dsRef.readGraphStore) || allowREST_W(action); }
+ @Override protected boolean allowREST_W(HttpAction action) { return
isEnabled(action.dsRef.readWriteGraphStore) ; }
// Quad operations tied to presence/absence of GSP.
- @Override protected boolean allowQuadsR(HttpAction action) { return
isEnabled(action.desc.readGraphStore) ; }
- @Override protected boolean allowQuadsW(HttpAction action) { return
isEnabled(action.desc.readWriteGraphStore) ; }
+ @Override protected boolean allowQuadsR(HttpAction action) { return
isEnabled(action.dsRef.readGraphStore) ; }
+ @Override protected boolean allowQuadsW(HttpAction action) { return
isEnabled(action.dsRef.readWriteGraphStore) ; }
private boolean isEnabled(ServiceRef service) { return
service.isActive() ; }
}
@@ -130,7 +130,7 @@ public abstract class SPARQL_UberServlet
}
- /** Intercept the processing cycle at the point where the action has been
set up,
+ /** Intercept the processing cycle at the point where the action has been
set up,
* the dataset target decided but no validation or execution has been
done,
* nor any stats have been done.
*/
@@ -142,7 +142,7 @@ public abstract class SPARQL_UberServlet
HttpServletResponse response = action.response ;
String uri = request.getRequestURI() ;
String method = request.getMethod() ;
- DatasetRef desc = action.desc ;
+ DatasetRef desc = action.dsRef ;
String trailing = findTrailing(uri, desc.name) ;
String qs = request.getQueryString() ;
@@ -211,11 +211,11 @@ public abstract class SPARQL_UberServlet
// There is a trailing part.
// Check it's not the same name as a registered service.
// If so, dispatch to that service.
- if ( checkDispatch(action, desc.query, trailing, queryServlet) )
return ;
- if ( checkDispatch(action, desc.update, trailing, updateServlet) )
return ;
- if ( checkDispatch(action, desc.upload, trailing, uploadServlet) )
return ;
- if ( checkDispatch(action, desc.readGraphStore, trailing,
restServlet_R) ) return ;
- if ( checkDispatch(action, desc.readWriteGraphStore, trailing,
restServlet_RW) ) return ;
+ if ( serviceDispatch(action, desc.query, trailing, queryServlet) )
return ;
+ if ( serviceDispatch(action, desc.update, trailing, updateServlet)
) return ;
+ if ( serviceDispatch(action, desc.upload, trailing, uploadServlet)
) return ;
+ if ( serviceDispatch(action, desc.readGraphStore, trailing,
restServlet_R) ) return ;
+ if ( serviceDispatch(action, desc.readWriteGraphStore, trailing,
restServlet_RW) ) return ;
}
// There is a trailing part - params are illegal by this point.
if ( hasParams )
@@ -229,7 +229,7 @@ public abstract class SPARQL_UberServlet
private void doGraphStoreProtocol(HttpAction action)
{
// The GSP servlets handle direct and indirect naming.
- DatasetRef desc = action.desc ;
+ DatasetRef desc = action.dsRef ;
String method = action.request.getMethod() ;
if ( HttpNames.METHOD_GET.equalsIgnoreCase(method) ||
@@ -291,7 +291,8 @@ public abstract class SPARQL_UberServlet
return mt ;
}
- private boolean checkDispatch(HttpAction action, ServiceRef service,
String srvName , SPARQL_ServletBase servlet)
+ /** return true if dispatched */
+ private boolean serviceDispatch(HttpAction action, ServiceRef service,
String srvName , SPARQL_ServletBase servlet)
{
if ( ! service.endpoints.contains(srvName) )
return false ;
Modified:
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java?rev=1487491&r1=1487490&r2=1487491&view=diff
==============================================================================
---
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
(original)
+++
jena/trunk/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/StatsServlet.java
Wed May 29 14:00:37 2013
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServlet ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
+import org.apache.jena.fuseki.server.CounterName ;
import org.apache.jena.fuseki.server.DatasetRef ;
import org.apache.jena.fuseki.server.DatasetRegistry ;
@@ -57,25 +58,43 @@ public class StatsServlet extends HttpSe
private void stats(PrintWriter out, DatasetRef desc)
{
out.println("Dataset: "+desc.name) ;
- out.println(" Requests = "+desc.countServiceRequests) ;
- out.println(" Good = "+desc.countServiceRequestsOK) ;
- out.println(" Bad = "+desc.countServiceRequestsBad) ;
+ out.println(" Requests =
"+desc.counters.value(CounterName.DatasetRequests)) ;
+ out.println(" Good =
"+desc.counters.value(CounterName.DatasetRequestsGood)) ;
+ out.println(" Bad =
"+desc.counters.value(CounterName.DatasetRequestsBad)) ;
+
out.println(" SPARQL Query:") ;
- out.println(" OK = "+desc.countQueryOK) ;
- out.println(" Bad Syntax = "+desc.countQueryBadSyntax) ;
- out.println(" Timeouts = "+desc.countQueryTimeout) ;
- out.println(" Bad exec = "+desc.countQueryBadExecution);
+ out.println(" Request =
"+desc.query.counters.value(CounterName.QueryRequests)) ;
+ out.println(" Good =
"+desc.query.counters.value(CounterName.QueryRequestsGood)) ;
+ out.println(" Bad requests =
"+desc.query.counters.value(CounterName.QueryRequestsBad)) ;
+ out.println(" Timeouts =
"+desc.query.counters.value(CounterName.QueryTimeouts)) ;
+ out.println(" Bad exec =
"+desc.query.counters.value(CounterName.QueryExecErrors)) ;
+
out.println(" SPARQL Update:") ;
-// out.println(" Updates = "+desc.update.
-// out.println(" Upload:") ;
-// out.println(" Uploads = "+desc.countUpload) ;
-// out.println(" SPARQL Graph Store Protocol:") ;
-// out.println(" GETs = "+desc.countGET) ;
-// out.println(" POSTs = "+desc.countPOST) ;
-// out.println(" PUTs = "+desc.countPUT) ;
-// out.println(" DELETEs = "+desc.countDELETE) ;
- //out.println(" HEADs = "+desc.countHEAD) ;
+ out.println(" Request =
"+desc.update.counters.value(CounterName.UpdateRequests)) ;
+ out.println(" Good =
"+desc.update.counters.value(CounterName.UpdateRequestsGood)) ;
+ out.println(" Bad requests =
"+desc.update.counters.value(CounterName.UpdateRequestsBad)) ;
+ out.println(" Bad exec =
"+desc.update.counters.value(CounterName.UpdateExecErrors)) ;
+
+ out.println(" Upload:") ;
+ out.println(" Requests =
"+desc.upload.counters.value(CounterName.UploadRequests)) ;
+ out.println(" Good =
"+desc.upload.counters.value(CounterName.UploadRequestsGood)) ;
+ out.println(" Bad =
"+desc.upload.counters.value(CounterName.UploadRequestsBad)) ;
+
+ out.println(" SPARQL Graph Store Protocol:") ;
+ out.println(" GETs = "+gspValue(desc, CounterName.GSPget)+
" (good="+gspValue(desc, CounterName.GSPgetGood)+"/bad="+gspValue(desc,
CounterName.GSPgetBad)+")") ;
+ out.println(" PUTs = "+gspValue(desc, CounterName.GSPput)+
" (good="+gspValue(desc, CounterName.GSPputGood)+"/bad="+gspValue(desc,
CounterName.GSPputBad)+")") ;
+ out.println(" POSTs = "+gspValue(desc,
CounterName.GSPpost)+ " (good="+gspValue(desc,
CounterName.GSPpostGood)+"/bad="+gspValue(desc, CounterName.GSPpostBad)+")") ;
+ out.println(" DELETEs = "+gspValue(desc,
CounterName.GSPdelete)+ " (good="+gspValue(desc,
CounterName.GSPdeleteGood)+"/bad="+gspValue(desc,
CounterName.GSPdeleteBad)+")") ;
+ out.println(" HEADs = "+gspValue(desc,
CounterName.GSPhead)+ " (good="+gspValue(desc,
CounterName.GSPheadGood)+"/bad="+gspValue(desc, CounterName.GSPheadBad)+")") ;
+ }
+
+ private long gspValue(DatasetRef desc, CounterName cn) {
+ long x1 = desc.readGraphStore.counters.value(cn) ;
+ long x2 = desc.readWriteGraphStore.counters.value(cn) ;
+ return x1+x2 ;
}
+
}
+