Проблема с несколькими потоками, вызывающими одну и ту же функцию - PullRequest
1 голос
/ 03 марта 2020

В моем коде два раза есть вызов покоя для приложения, хотя вызов выполняется с одной и той же конечной точки, я хочу различать guish между вызовами в микрометре. Для этого я пытаюсь добавить новое поле, как показано ниже:

@Component
class MyMeterFilter : MeterFilter {

    var isRequired: Boolean = false
    override fun map(id: Meter.Id): Meter.Id {
        return if (id.name.startsWith("http")) {
            id.withTag(Tag.of("extra.tag", isRequired.toString()))
        } else id
    }

}

Перед первым вызовом я устанавливаю для поля isRequired значение true, а перед вторым устанавливаю значение false (оба вызова являются асинхронными c от одного зерна). Но, как видно из кода, поскольку создан только один экземпляр класса, значение isRequired переопределяется между двумя вызовами. как я могу избежать этого?

1 Ответ

0 голосов
/ 05 марта 2020

Если он основан на потоке, выполняющем вызов, который ThreadLocal может удерживать это состояние, MeterFilter может проверить его, просто обязательно очистите ThreadLocal, как только вы закончите с ним.

Похоже, вы пытаетесь установить дополнительные теги для http.server.request metri c, верно? Это очень умно.

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class MetricDecoratingFilter : OncePerRequestFilter(), MeterFilter {
    private val additionalTags = ThreadLocal<Tags>()

    override fun doFilterInternal(req: HttpServletRequest, resp: HttpServletResponse, chain: FilterChain) {
        //add logic to compute the tags
        additionalTags.set(Tags.of("app", "bob"))
        chain.doFilter(req, resp)
        additionalTags.remove()
    }

    override fun map(id: Meter.Id): Meter.Id {
        return if (id.name.startsWith("http")) {
            val moreTags = additionalTags.get()
            id.withTags(moreTags)
        } else id
    }
}
...