人
我在Kotlin中编写了一个服务请求,该服务向其他服务发出了异步请求,他在我的另一个服务中称为回调。收到回调后,我将请求状态更新为已接收并完成请求过程。使用prometheus,当收到如下请求时,我创建了一个计数器来注册指标:
fun registryRequest(requestId: String){
val counter = Metrics.counter(REQUEST_PENDING_CALLBACK_NAME,
arrayListOf(Tag.of(REQUEST_PENDING_CALLBACK_TAG, requestId)))
counter.increment()
}
当我收到回调时,我将删除指标,如下所示:
fun removeRegistryRequest(requestId: String) {
var meterId = Meter.Id(REQUEST_PENDING_CALLBACK_NAME,
Tags.of(Tag.of(REQUEST_PENDING_CALLBACK_TAG, REQUEST_PENDING_CALLBACK_NAME)),
null, null, Meter.Type.COUNTER)
val meters = Metrics.globalRegistry.meters
meters.forEach {
if(it.id.name == REQUEST_PENDING_CALLBACK_NAME
&& it.id.tags.contains(Tag.of(REQUEST_PENDING_CALLBACK_TAG, requestId)))
meterId = it.id
}
Metrics.globalRegistry.remove(meterId)
}
对于单个容器来说,它工作正常,但是当我复制实例时,Metric是容器A 中的注册表,但是回调到达容器B 中,为此指标未删除。 所以我的答案是,有什么建议可以在不使用数据库的情况下创建像这样的观测系统?? 我做对了吗?
Obs .: REQUEST_PENDING_CALLBACK_NAME
和REQUEST_PENDING_CALLBACK_TAG
是电表名称和标签名称的常量。