如何从发送到 Cloudwatch 的指标中删除子节点名称?

Posted

技术标签:

【中文标题】如何从发送到 Cloudwatch 的指标中删除子节点名称?【英文标题】:How can I remove the child node name from the metrics sent to Cloudwatch? 【发布时间】:2021-07-09 15:23:15 【问题描述】:

我正在使用使用 Ktor 构建的 Java API。它使用 MicrometerMetrics 功能将指标发布到 CloudWatch。我的问题是我创建了一个拦截器,它使 CloudWatch 中的路由名称变得混乱。

下面是拦截器:

fun Route.test(callback: Route.() -> Unit): Route 
    val routeTest = createChild(object : RouteSelector(1.0) 
        override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
            RouteSelectorEvaluation.Constant
    )
    routeTest.intercept(ApplicationCallPipeline.Call) 
        call.response.header("X-Next-Polling-In", pollTime)
    
    callback(routeTest)
    return routeTest


下面是请求 /users 的路由(被之前的拦截器拦截)在 CloudWatch 中的显示方式:

/users/my.package.TestInterceptor$test$routeTest$1@6cdas3a85

有什么方法可以删除子节点名称或硬编码一个唯一值而不是 my.package.TestInterceptor$test$routeTest$1@6cdas3a85

【问题讨论】:

【参考方案1】:

我设法通过覆盖RouteSelector 上的toString 方法解决了这个问题,如下所示:

fun Route.test(callback: Route.() -> Unit): Route 
    val routeTest = createChild(object : RouteSelector(1.0) 
        override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation =
            RouteSelectorEvaluation.Constant

        override fun toString() = "customName"

    )
    routeTest.intercept(ApplicationCallPipeline.Call) 
        call.response.header("X-Next-Polling-In", pollTime)
    
    callback(routeTest)
    return routeTest

这导致以下路线名称:

/users/customName

【讨论】:

以上是关于如何从发送到 Cloudwatch 的指标中删除子节点名称?的主要内容,如果未能解决你的问题,请参考以下文章

AWS CloudWatch 中的指标、日志和事件之间有啥区别? [关闭]

如何使用 AWS CLI 访问跨账户的 cloudwatch 指标

为不同客户隔离 CloudWatch 指标

通过 CDK 从 CfnDeliveryStream 获取 cloudwatch 警报的指标

AWS CloudWatch - 及时从不同的数据点创建指标

Terraform:Cloudwatch Canary Synthetics,如何创建指标警报