package com.codahale.metrics.jdbi3;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jdbi3.strategies.SmartNameStrategy;
import com.codahale.metrics.jdbi3.strategies.StatementNameStrategy;
import org.jdbi.v3.core.statement.SqlLogger;
import org.jdbi.v3.core.statement.StatementContext;
import java.sql.SQLException;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.TimeUnit;
A SqlLogger
implementation for JDBI which uses the SQL objects' class names and method names for nanosecond-precision timers. /**
* A {@link SqlLogger} implementation for JDBI which uses the SQL objects' class names and
* method names for nanosecond-precision timers.
*/
public class InstrumentedSqlLogger implements SqlLogger {
private final MetricRegistry registry;
private final StatementNameStrategy statementNameStrategy;
public InstrumentedSqlLogger(MetricRegistry registry) {
this(registry, new SmartNameStrategy());
}
public InstrumentedSqlLogger(MetricRegistry registry,
StatementNameStrategy statementNameStrategy) {
this.registry = registry;
this.statementNameStrategy = statementNameStrategy;
}
@Override
public void logAfterExecution(StatementContext context) {
log(context);
}
@Override
public void logException(StatementContext context, SQLException ex) {
log(context);
}
private void log(StatementContext context) {
String statementName = statementNameStrategy.getStatementName(context);
if (statementName != null) {
final long elapsed = context.getElapsedTime(ChronoUnit.NANOS);
registry.timer(statementName).update(elapsed, TimeUnit.NANOSECONDS);
}
}
}