围绕 Kotlin 挂起函数创建切面的正确方法是什么?
根据我的观察,Micrometer 的 @Timed 方面确实可以与它们配合使用,但显示不正确的结果 - 看起来它测量的是方法调用和挂起之间的时间,而不是方法中花费的全部时间(应包括挂起后的时间)
我想要实现的目标的示例:
@CoroutineTimer
suspend fun dbCall() {
repository.someQuery().awaitFirst() // suspension point
}
在本例中,我想知道花费在
dbCall
函数上的全部时间,并用自定义 @CoroutineTimer
注释进行标记。有办法吗?
您可以像这样测量执行时间:
suspend fun dbCall() {
val (result, duration) = measureTimedValue {
repository.someQuery().awaitFirst() // suspension point
}
println(duration)
return result
}
是的,你只需要使用KSP等代码生成工具即可。 这篇文章解释了如何使用它,因此您的注释处理器可以更改您的源代码:
@CoroutineTimer
suspend fun dbCall() {
repository.someQuery().awaitFirst() // suspension point
}
对此:
suspend fun dbCall() {
val (result, duration) = measureTimedValue {
_dbCallMeasurable()
}
Log.d(duration)
return result
}
suspend fun _dbCallMeasurable() {
repository.someQuery().awaitFirst()
}