以CollectAllPodMetricsLast()举例,看看koordinator怎样使用tsdb进行查询。
CollectAllPodMetricsLast()
- GenerateQueryParamsLast()传入metric采集间隔2倍时间
- 调用CollectAllPodMetrics()
func CollectAllPodMetricsLast(statesInformer statesinformer.StatesInformer, metricCache metriccache.MetricCache,
metricResource metriccache.MetricResource, metricCollectInterval time.Duration) map[string]float64 {
queryParam := GenerateQueryParamsLast(metricCollectInterval * 2)
return CollectAllPodMetrics(statesInformer, metricCache, *queryParam, metricResource)
}
GenerateQueryParamsLast()
- end为当前时间
- start为传入offset
- 构造metriccache.QueryParam,参数aggregate为Last(最近)
func GenerateQueryParamsLast(windowDuration time.Duration) *metriccache.QueryParam {
end := time.Now()
start := end.Add(-windowDuration)
queryParam := &metriccache.QueryParam{
Aggregate: metriccache.AggregationTypeLast,
Start: &start,
End: &end,
}
return queryParam
}
CollectAllPodMetrics()
- 构建BuildQueryMeta
- 调用CollectPodMetric()
- 参数:metric缓存、queryMeta、startTime、endTime。
- 获取结果后,设置aggregate
func CollectAllPodMetrics(statesInformer statesinformer.StatesInformer, metricCache metriccache.MetricCache,
queryParam metriccache.QueryParam, metricResource metriccache.MetricResource) map[string]float64 {
podsMeta := statesInformer.GetAllPods()
podsMetrics := make(map[string]float64)
for _, podMeta := range podsMeta {
queryMeta, err := metricResource.BuildQueryMeta(metriccache.MetricPropertiesFunc.Pod(string(podMeta.Pod.UID)))
if err != nil {
klog.Warningf("build pod %s/%s query meta failed, kind: %s, error: %v", podMeta.Pod.Namespace, podMeta.Pod.Name, queryMeta.GetKind(), err)
continue
}
podQueryResult, err := CollectPodMetric(metricCache, queryMeta, *queryParam.Start, *queryParam.End)
if err != nil {
klog.Warningf("query pod %s/%s metric failed, kind: %s, error: %v", podMeta.Pod.Namespace, podMeta.Pod.Name, queryMeta.GetKind(), err)
continue
}
if podQueryResult.Count() == 0 {
klog.V(5).Infof("query pod %s/%s metric is empty, kind: %s", podMeta.Pod.Namespace, podMeta.Pod.Name, queryMeta.GetKind())
continue
}
value, err := podQueryResult.Value(queryParam.Aggregate)
if err != nil {