Ktor 后端服务器需要 Elastic APM 支持

Need Elastic APM support for Ktor backend server

正在尝试监控我们的 Ktor 后端应用程序的性能并能够将 Elastic APM 代理附加到它。服务器作为服务在 Kibana 仪表板中可见。但它不会为每个传入请求自动创建事务。当我们手动启动事务并在特定路由中结束它时,只有它会记录该请求的性能。还有其他方法可以解决这种情况吗?

尝试了以下方法

  1. 在设置阶段拦截了每个请求并启动了一个事务,但是在最后拦截相同的调用时无法结束事务面临的问题。
  2. 对于 controller/route 中的每个请求,在下面的一段代码中定义并且它正在运行。
    get("/api/path") {
        val transaction: Transaction = ElasticApm.startTransaction()
        try {
            transaction.setName("MyTransaction#getApi")
            transaction.setType(Transaction.TYPE_REQUEST)
            // do business logic and response
         } catch (e: java.lang.Exception) {
            transaction.captureException(e)
            throw e
         } finally {
            transaction.end()
         }  
    }
    

Adding below line for better search result for other developers.
How to add interceptor on starting and ending on each request in ktor. Example of ApplicationCallPipeline.Monitoring and proceed()

您可以使用执行管道其余部分的 proceed 方法来捕获任何发生的异常并完成事务:

intercept(ApplicationCallPipeline.Monitoring) {
    val transaction: Transaction = ElasticApm.startTransaction()
    try {
        transaction.setName("MyTransaction#getApi")
        transaction.setType(Transaction.TYPE_REQUEST)
        proceed() // This will call the rest of a pipeline
    } catch (e: Exception) {
        transaction.captureException(e)
        throw e
    } finally {
        transaction.end()
    }
}

此外,您可以使用 attributes 来存储一个调用持续时间的交易(从请求开始到发送响应结束)。