milvus/internal/util/metricsinfo/cache.go
dragondriver 82c28d225c
Fix golint warning of metrics info (#8501)
Signed-off-by: dragondriver <jiquan.long@zilliz.com>
2021-09-24 20:35:56 +08:00

110 lines
3.3 KiB
Go

// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
package metricsinfo
import (
"sync"
"time"
"github.com/milvus-io/milvus/internal/proto/milvuspb"
)
// TODO(dragondriver): load from config file
const DefaultMetricsRetention = time.Second * 5
// TODO(dragondriver): we can use a map to manage the metrics if there are too many kind metrics
type MetricsCacheManager struct {
systemInfoMetrics *milvuspb.GetMetricsResponse
systemInfoMetricsInvalid bool
systemInfoMetricsLastUpdatedTime time.Time
systemInfoMetricsMtx sync.RWMutex
retention time.Duration
retentionMtx sync.RWMutex // necessary?
}
func NewMetricsCacheManager() *MetricsCacheManager {
manager := &MetricsCacheManager{
systemInfoMetrics: nil,
systemInfoMetricsInvalid: false,
systemInfoMetricsLastUpdatedTime: time.Now(),
systemInfoMetricsMtx: sync.RWMutex{},
retention: DefaultMetricsRetention,
}
return manager
}
func (manager *MetricsCacheManager) GetRetention() time.Duration {
manager.retentionMtx.RLock()
defer manager.retentionMtx.RUnlock()
return manager.retention
}
func (manager *MetricsCacheManager) SetRetention(retention time.Duration) {
manager.retentionMtx.Lock()
defer manager.retentionMtx.Unlock()
manager.retention = retention
}
func (manager *MetricsCacheManager) ResetRetention() {
manager.retentionMtx.Lock()
defer manager.retentionMtx.Unlock()
manager.retention = DefaultMetricsRetention
}
func (manager *MetricsCacheManager) InvalidateSystemInfoMetrics() {
manager.systemInfoMetricsMtx.Lock()
defer manager.systemInfoMetricsMtx.Unlock()
manager.systemInfoMetricsInvalid = true
}
func (manager *MetricsCacheManager) IsSystemInfoMetricsValid() bool {
retention := manager.GetRetention()
manager.systemInfoMetricsMtx.RLock()
defer manager.systemInfoMetricsMtx.RUnlock()
return (!manager.systemInfoMetricsInvalid) &&
(manager.systemInfoMetrics != nil) &&
(time.Since(manager.systemInfoMetricsLastUpdatedTime) < retention)
}
func (manager *MetricsCacheManager) GetSystemInfoMetrics() (*milvuspb.GetMetricsResponse, error) {
retention := manager.GetRetention()
manager.systemInfoMetricsMtx.RLock()
defer manager.systemInfoMetricsMtx.RUnlock()
if manager.systemInfoMetricsInvalid ||
manager.systemInfoMetrics == nil ||
time.Since(manager.systemInfoMetricsLastUpdatedTime) >= retention {
return nil, errInvalidSystemInfosMetricCache
}
return manager.systemInfoMetrics, nil
}
func (manager *MetricsCacheManager) UpdateSystemInfoMetrics(infos *milvuspb.GetMetricsResponse) {
manager.systemInfoMetricsMtx.Lock()
defer manager.systemInfoMetricsMtx.Unlock()
manager.systemInfoMetrics = infos
manager.systemInfoMetricsInvalid = false
manager.systemInfoMetricsLastUpdatedTime = time.Now()
}