/* (c) 2017 Open Source Geospatial Foundation - all rights reserved
*
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.jdbc.metrics;
import org.geotools.jdbc.JDBCFeatureReader;
import org.geotools.jdbc.JDBCReaderCallback;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
/**
* JDBC reader callback that tracks metrics on a request by request basis.
* <p>
* Metrics are stored in a thread local variable. See {@link RequestMetricsFilter}.
* </p>
*/
public class RequestMetricsCallback implements JDBCReaderCallback {
static ThreadLocal<Map<String,Object>> metrics = new ThreadLocal<>();
long start;
long count;
@Override
public void init(JDBCFeatureReader reader) {
metrics.set(new HashMap<>());
count = 0;
}
@Override
public void beforeQuery(Statement st) {
start = System.currentTimeMillis();
metrics.get().put("start", start);
}
@Override
public void afterQuery(Statement st) {
metrics.get().put("query", System.currentTimeMillis()- start);
}
@Override
public void queryError(Exception e) {
}
@Override
public void beforeNext(ResultSet rs) {
}
@Override
public void afterNext(ResultSet rs, boolean hasMore) {
if (hasMore) {
count++;
}
else {
metrics.get().put("total", System.currentTimeMillis()- start);
metrics.get().put("count", count);
}
}
@Override
public void rowError(Exception e) {
}
@Override
public void finish(JDBCFeatureReader reader) {
}
}