我使用watch机制来监控另一个集群中的资源,例如特定命名空间下的Pod。我想及时检测手表连接的健康状况,包括连接延迟、连接是否断开等。我注意到断开连接后 30 秒内会生成错误日志,但我没有找到任何可以收集的相关指标。
我想公开有关手表操作延迟的指标。在阅读了 client-go 和基于组件的源代码后,我仍然不知道该怎么做(使用其他预打包库的解决方案对我来说也很好)。 或者有没有办法让我直接监控目标集群的延迟?
我第一次尝试在这里添加观察。
informer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
FilterFunc: func(obj interface{}) bool {
// Update last synced time.
UpdateLastSyncedTime()
return true
},
}
但经过讨论我发现这可能不是一个好方法。因此,更新函数是由通知事件触发的,这些事件源于集群中项目的更改或定期重新同步。为了使前面提到的方法发挥作用,需要减少重新同步间隔,这可能会导致效率低下。
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()
操作的往返时间。