【发布时间】:2019-11-12 11:25:18
【问题描述】:
Prometheus 日志记录的一个统计数据是服务调用的持续时间,但我想测量同一服务的多次调用的时间。
所以我想创建一个字符串到 time.Time 的映射
type SomeService struct {
durations map[string]time.Time
}
在第一次进入时,当前时间被存储为该帐户 ID
durations[GetId()] = time.Now()
然后最后……在另一个调用中……存储总时间。
startTime := c.durations[id]
duration, _ := c.durationStat.GetMetricWith(prometheus.Labels{"type": duration})
duration.Set(time.Now().Sub(startTime).Seconds())
delete(c.durations, id)
这适用于只有一个副本但它在 Kubernetes 集群中发生故障的情况,对吗?下一个呼叫可能来自另一个端点?如何在微服务中缓存值,以便每个副本都可以访问它们?
【问题讨论】:
-
能否请您也添加为您的实施发生的错误?
-
听说不能这样缓存,没有错误
-
只是在寻找一种如何轻松做到的好方法
-
我不确定您在此处缓存了什么,因为这是我第一次看到有人将 Prometheus 用于收集指标以外的其他用途。处理多个实例之间的缓存的一般问题是数据一致性,因为同一缓存键的数据可以在不同实例之间重写。
-
“下一个呼叫可能来自另一个端点”是否意味着您对“开始服务呼叫”和“结束服务呼叫”有单独的单独请求?或者只是你可能会得到不同的副本处理不同的“服务调用”(每个包括“开始服务调用”、有用的工作和“结束服务调用”)?
标签: go kubernetes microservices prometheus