Linkerd com.twitter.finagle.stats.Stat значения не отображаются внутри /admin/metrics.json
Я работаю над академическим проектом, используя Linkerd для решения сервисной сетки.
Внутри моего сервиса у меня есть дюжина метрик для сообщения о некоторых конкретных сервисных номерах. Я разработал свой плагин Linkerd, который принимает объект com.twitter.finagle.stats.StatsReceiver в моем настраиваемом имени, а затем этот объект передается моему сервисному объекту, где я создаю экземпляр объекта com.twitter.finagle.stats.Counter с помощью следующего вызов
com.twitter.finagle.stats.Counter counter = this.statsReceiver.counter(getSeq("numberOfRetries"));
Затем внутри соответствующих методов я увеличиваю этот счетчик следующим образом ->
com.twitter.finagle.stats.Counter counter = getServiceMetricsCounter(svc, "numberOfRetries");
if (counter != null) {
counter.incrementAndGet();
}
Когда я запускаю Linkerd, я вижу свои метрики счетчика в соответствии с предоставленным мной идентификатором конфигурации для имени пользователя собственного плагина Linkerd внутри /admin/metrics.json как -> "namer/#/com.usf.twitter.hydration/numberOfRetries": 12 Я получаю аналогичные результаты для других показателей. Тем не менее, я столкнулся с серьезной трудностью в 2 случаях:: ==>
1) Я хочу получить процентили / гистограмму для моих метрик временных рядов, особенно для этих. Я могу видеть эти показатели в качестве примера внутри /admin/metrics.json, когда я запускаю Linkerd:
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.count" : 2648,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.max" : 529, "rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.min" : 0, "rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.p50" : 246,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.p90" : 575, "rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.p95" : 529,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.p99" : 615,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.p9990" : 429,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.p9999" : 529,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.sum" : 1173897,
"rt/outgoing_http2/client/$/inet/kubeservice.com/16024/request_latency_ms.avg" : 254.07148219833456
Я вижу, что они определили объект stat для метрики request_latency_ms здесь. Затем они применяют приращение к этому объекту здесь.
Я делаю именно что-то подобное
com.twitter.finagle.stats.Stat stat = this.statsReceiver.stat(getSeq("retryLatencyInMillisecs"));
с последующим
com.twitter.finagle.stats.Stat stat = getServiceMetricsStat(svc, "retryLatencyInMillisecs");
if (stat != null) {
stat.add(val); // where val = 25.0f or something
}
Однако, когда я запускаю Linkerd, я не вижу эти показатели com.twitter.finagle.stats.Stat внутри /admin/metrics.json, как я это делаю для com.twitter.finagle.stats.Counter. Зачем? Как я могу получить эти метрики статистики, чтобы получить процентили в /admin/metrics.json?
Я понимаю, что эти процентили, основанные на гистограмме, происходят из Stat внутри io.buoyant.telemetry.Metric. Я не хочу добавлять зависимость linkerd в мой сервис, чтобы избежать циклической зависимости.
Я думал по следующим направлениям ->
class HydrationNamer(
server: String,
srStats: StatsReceiver = NullStatsReceiver,
metrics: MetricsTree
) extends Namer {
private[this] val log = Logger.get("com.usf.twitter.hydration")
val cfg: Hydration.conf = new Hydration.conf(srStats, server)
Hydration.init(cfg)
val hydration: Hydration = new Hydration()
val m = metrics.mkStat(Verbosity.Default)
// Теперь, как мне связать srStats.stat("Моя метрика") с metrics.mkStat(Verbosity.Default), чтобы увидеть мои показатели статистики и процентили внутри /admin/metrics.json???
2) Это простое продолжение предыдущего вопроса. Некоторые из моих показателей являются числами с плавающей запятой или двойными. Как отобразить показатели с плавающей запятой так же, как для счетчиков? Я не хочу просто добавлять +1, как я делаю для счетчиков, я хочу специально отображать значения в определенное время, или я могу добиться этого только с помощью вашего Linkerd Metric/Stat? Нужно ли для этого использовать датчик из StatsReceiver? Если да, у вас есть пример для этого случая?