Skip to content

Commit 3d08605

Browse files
committed
append custom annotation & remove unused thread local object
1 parent 4dc71ae commit 3d08605

File tree

7 files changed

+43
-34
lines changed

7 files changed

+43
-34
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88
}
99

1010
group = "hyeon9mak"
11-
version = "1.1.5-spring-boot-3"
11+
version = "2.0.1-spring-boot-3"
1212

1313
java {
1414
toolchain {

src/main/java/hyeon9mak/multidatasourcequerycounter/ConnectionQueryMonitor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ public class ConnectionQueryMonitor implements MethodInterceptor {
88

99
private static final String JDBC_PREPARE_STATEMENT_METHOD_NAME = "prepareStatement";
1010

11-
private final QueryCounterRequestContextScopeHolder queryCounterRequestContextScopeHolder;
11+
private final QueryCountPerRequest queryCountPerRequest;
1212
private final Object connection;
1313

14-
public ConnectionQueryMonitor(QueryCounterRequestContextScopeHolder queryCounterRequestContextScopeHolder, Object connection) {
15-
this.queryCounterRequestContextScopeHolder = queryCounterRequestContextScopeHolder;
14+
public ConnectionQueryMonitor(QueryCountPerRequest queryCountPerRequest, Object connection) {
15+
this.queryCountPerRequest = queryCountPerRequest;
1616
this.connection = connection;
1717
}
1818

@@ -22,7 +22,7 @@ public Object invoke(MethodInvocation invocation) throws Throwable {
2222

2323
if (result != null && wasPreparedStatementInvoked(invocation)) {
2424
ProxyFactory proxyFactory = new ProxyFactory(result);
25-
proxyFactory.addAdvice(new PreparedStatementQueryMonitor(queryCounterRequestContextScopeHolder));
25+
proxyFactory.addAdvice(new PreparedStatementQueryMonitor(queryCountPerRequest));
2626
return proxyFactory.getProxy();
2727
}
2828

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package hyeon9mak.multidatasourcequerycounter;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Target({ElementType.METHOD, ElementType.TYPE})
9+
@Retention(RetentionPolicy.RUNTIME)
10+
public @interface CountQueries {
11+
/**
12+
* prefix for query count log message.
13+
*/
14+
String prefix() default "";
15+
}

src/main/java/hyeon9mak/multidatasourcequerycounter/HikariDataSourceQueryCounter.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import jakarta.servlet.http.HttpServletRequest;
44
import org.aspectj.lang.ProceedingJoinPoint;
5-
import org.aspectj.lang.annotation.After;
65
import org.aspectj.lang.annotation.Around;
76
import org.aspectj.lang.annotation.Aspect;
7+
import org.aspectj.lang.reflect.MethodSignature;
88
import org.springframework.stereotype.Component;
99
import org.springframework.web.context.request.RequestContextHolder;
1010
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -24,21 +24,29 @@ public HikariDataSourceQueryCounter(QueryCountPerRequest queryCountPerRequest, Q
2424
@Around("execution( * com.zaxxer.hikari.HikariDataSource.getConnection())")
2525
public Object aroundConnection(ProceedingJoinPoint joinPoint) throws Throwable {
2626
Object connection = joinPoint.proceed();
27-
QueryCounterRequestContextScopeHolder queryCounterRequestContextScopeHolder = new QueryCounterRequestContextScopeHolder(queryCountPerRequest);
28-
ConnectionQueryMonitor connectionQueryMonitor = new ConnectionQueryMonitor(queryCounterRequestContextScopeHolder, connection);
27+
ConnectionQueryMonitor connectionQueryMonitor = new ConnectionQueryMonitor(queryCountPerRequest, connection);
2928
return connectionQueryMonitor.getProxy();
3029
}
3130

32-
@After("within(@org.springframework.web.bind.annotation.RestController *)")
33-
public void afterApiFinished() {
31+
@Around("@annotation(countQueries)")
32+
public Object aroundCountQueriesMethod(ProceedingJoinPoint joinPoint, CountQueries countQueries) throws Throwable {
33+
Object result = joinPoint.proceed();
34+
3435
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
3536

3637
if (isInRequestScope(attributes)) {
3738
HttpServletRequest request = attributes.getRequest();
38-
queryCountPerRequest.updateApiUrl(request.getMethod() + request.getRequestURI());
39+
queryCountPerRequest.updateApiUrl(request.getMethod() + " " + request.getRequestURI());
40+
} else {
41+
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
42+
String methodName = methodSignature.getMethod().getName();
43+
String className = methodSignature.getDeclaringType().getSimpleName();
44+
queryCountPerRequest.updateApiUrl(countQueries.prefix() + className + "." + methodName);
3945
}
4046

4147
queryCountLogger.logQueryCount(queryCountPerRequest);
48+
49+
return result;
4250
}
4351

4452
private boolean isInRequestScope(ServletRequestAttributes attributes) {

src/main/java/hyeon9mak/multidatasourcequerycounter/PreparedStatementQueryMonitor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ public class PreparedStatementQueryMonitor implements MethodInterceptor {
1111

1212
private static final List<String> QUERY_METHODS = Arrays.asList("execute", "executeQuery", "executeUpdate");
1313

14-
private final QueryCounterRequestContextScopeHolder queryCounterRequestContextScopeHolder;
14+
private final QueryCountPerRequest queryCountPerRequest;
1515

16-
public PreparedStatementQueryMonitor(QueryCounterRequestContextScopeHolder queryCounterRequestContextScopeHolder) {
17-
this.queryCounterRequestContextScopeHolder = queryCounterRequestContextScopeHolder;
16+
public PreparedStatementQueryMonitor(QueryCountPerRequest queryCountPerRequest) {
17+
this.queryCountPerRequest = queryCountPerRequest;
1818
}
1919

2020
@Override
@@ -24,7 +24,7 @@ public Object invoke(MethodInvocation invocation) throws Throwable {
2424
Object result = invocation.proceed();
2525
long endTime = System.currentTimeMillis();
2626

27-
queryCounterRequestContextScopeHolder.get().incrementQueryCount(endTime - startTime);
27+
queryCountPerRequest.incrementQueryCount(endTime - startTime);
2828

2929
return result;
3030
}

src/main/java/hyeon9mak/multidatasourcequerycounter/QueryCountLogger.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
@Component
88
public class QueryCountLogger {
99

10+
private static final String LOG_MESSAGE_FORMAT = "{} - totalQueryCount: {}, totalSpendTime: {}ms";
11+
1012
private final Logger logger = LoggerFactory.getLogger(getClass());
1113
private final QueryCounterLoggingLevelProperties properties;
1214

@@ -16,11 +18,11 @@ public QueryCountLogger(QueryCounterLoggingLevelProperties properties) {
1618

1719
public void logQueryCount(QueryCountPerRequest queryCountPerRequest) {
1820
if (properties.getError().isEnable() && queryCountPerRequest.getTotalQueryCount() >= properties.getError().getCount()) {
19-
logger.error("{}, totalQueryCount: {}, totalSpendTime: {}ms", queryCountPerRequest.getApiUrl(), queryCountPerRequest.getTotalQueryCount(), queryCountPerRequest.getTotalQueryMilliSeconds());
21+
logger.error(LOG_MESSAGE_FORMAT, queryCountPerRequest.getApiUrl(), queryCountPerRequest.getTotalQueryCount(), queryCountPerRequest.getTotalQueryMilliSeconds());
2022
} else if (properties.getWarn().isEnable() && queryCountPerRequest.getTotalQueryCount() >= properties.getWarn().getCount()) {
21-
logger.warn("{}, totalQueryCount: {}, totalSpendTime: {}ms", queryCountPerRequest.getApiUrl(), queryCountPerRequest.getTotalQueryCount(), queryCountPerRequest.getTotalQueryMilliSeconds());
23+
logger.warn(LOG_MESSAGE_FORMAT, queryCountPerRequest.getApiUrl(), queryCountPerRequest.getTotalQueryCount(), queryCountPerRequest.getTotalQueryMilliSeconds());
2224
} else if (properties.getInfo().isEnable() && queryCountPerRequest.getTotalQueryCount() >= properties.getInfo().getCount()) {
23-
logger.info("{}, totalQueryCount: {}, totalSpendTime: {}ms", queryCountPerRequest.getApiUrl(), queryCountPerRequest.getTotalQueryCount(), queryCountPerRequest.getTotalQueryMilliSeconds());
25+
logger.info(LOG_MESSAGE_FORMAT, queryCountPerRequest.getApiUrl(), queryCountPerRequest.getTotalQueryCount(), queryCountPerRequest.getTotalQueryMilliSeconds());
2426
}
2527
}
2628
}

src/main/java/hyeon9mak/multidatasourcequerycounter/QueryCounterRequestContextScopeHolder.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)