如何获取 informer watch 操作延迟的 prometheus 指标?

问题描述 投票:0回答:1

我使用watch机制来监控另一个集群中的资源,例如特定命名空间下的Pod。我想及时检测手表连接的健康状况,包括连接延迟、连接是否断开等。我注意到断开连接后 30 秒内会生成错误日志,但我没有找到任何可以收集的相关指标。

我想公开有关手表操作延迟的指标。在阅读了 client-go 和基于组件的源代码后,我仍然不知道该怎么做(使用其他预打包库的解决方案对我来说也很好)。 或者有没有办法让我直接监控目标集群的延迟?

我第一次尝试在这里添加观察。

informer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
    FilterFunc: func(obj interface{}) bool {
        // Update last synced time.
        UpdateLastSyncedTime()
        return true
    },
}

但经过讨论我发现这可能不是一个好方法。因此,更新函数是由通知事件触发的,这些事件源于集群中项目的更改或定期重新同步。为了使前面提到的方法发挥作用,需要减少重新同步间隔,这可能会导致效率低下。

kubernetes metrics client-go
1个回答
0
投票

在程序的顶层,当您调用

kubernetes.NewForConfig()
时,它需要
*rest.Config
作为参数。 典型的客户端程序只是从读取 kubeconfig 文件的工厂函数传递配置,但您可以修改它。 特别是,
(*rest.Config).Wrap()
允许您注入在 HTTP 层运行的自己的包装器对象。

例如,如果您想对 HTTP 调用进行计时,那么您可以编写

type HttpTimer struct {
  rt http.RoundTripper
}

func (ht HttpTimer) RoundTrip(req *http.Request) (*http.Response, error) {
  before := time.Now()
  resp, err := ht.rt.RoundTrip(req)
  duration := time.Since(before)
  // handle or report errors; retry; report duration; ...
}

loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
configOverrides := &clientcmd.ConfigOverrides{}
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)
restConfig := kubeConfig.ClientConfig()

// add to top-level setup
restConfig.Wrap(func (rt http.RoundTripper) http.RoundTripper {
  return HttpTimer{rt}
})

clientSet := kubernetes.NewForConfig(restConfig)

由于它粘合到 HTTP 层,因此可能没有您正在寻找的特定内容。 通知者接口可能使用 Kubernetes watch API。 它有一个长期运行的连接,可以返回响应的stream。 这意味着您可能会看到一个持续几分钟的 HTTP 连接,实际上返回了数十个响应。 这也意味着“延迟”本身并不是一个有意义的概念。 不过,这仍然可以测量各个

.Get()
.Update()
操作的往返时间。

© www.soinside.com 2019 - 2024. All rights reserved.