xframe/vendor/github.com/polarismesh/polaris-go/pkg/model/stat.go

260 lines
6.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Tencent is pleased to support the open source community by making polaris-go available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* 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 model
import (
"time"
)
// InstanceGauge 针对单个实例的单次评估指标.
type InstanceGauge interface {
// GetNamespace 获取服务的命名空间
GetNamespace() string
// GetService 获取服务名
GetService() string
// GetAPI 获取调用api
GetAPI() ApiOperation
// GetHost 实例的节点信息
GetHost() string
// GetPort 实例的端口信息
GetPort() int
// GetRetStatus 实例的调用返回状态
GetRetStatus() RetStatus
// GetCircuitBreakerStatus 实例的熔断状态
GetCircuitBreakerStatus() CircuitBreakerStatus
// GetRetCodeValue 实例的返回码
GetRetCodeValue() int32
// GetDelay 调用时延
GetDelay() *time.Duration
// GetDelayRange 调用时延
GetDelayRange() ApiDelayRange
// GetCalledInstance 获取被调节点
GetCalledInstance() Instance
// Validate 检测指标是否合法
Validate() error
}
// MetricType 统计类型.
type MetricType int
const (
SDKAPIStat MetricType = iota
ServiceStat
InstanceStat
SDKCfgStat
CircuitBreakStat
PluginAPIStat
LoadBalanceStat
RateLimitStat
RouteStat
)
func DescMetricType(t MetricType) string {
switch t {
case SDKAPIStat:
return "SDKAPIStat"
case ServiceStat:
return "ServiceStat"
case InstanceStat:
return "InstanceStat"
case SDKCfgStat:
return "SDKCfgStat"
case CircuitBreakStat:
return "CircuitBreakStat"
case PluginAPIStat:
return "PluginAPIStat"
case LoadBalanceStat:
return "LoadBalanceStat"
case RateLimitStat:
return "RateLimitStat"
case RouteStat:
return "RouteStat"
default:
return "Unknown"
}
}
var metricTypes = HashSet{}
// ValidMetircType 检测是不是合法的统计类型.
func ValidMetircType(t MetricType) bool {
return metricTypes.Contains(t)
}
// EmptyInstanceGauge instangeGauge的空实现.
type EmptyInstanceGauge struct{}
// GetNamespace 获取服务的命名空间
func (e EmptyInstanceGauge) GetNamespace() string {
return ""
}
// GetService 获取服务名
func (e EmptyInstanceGauge) GetService() string {
return ""
}
// GetHost 实例的节点信息
func (e EmptyInstanceGauge) GetHost() string {
return ""
}
// GetPort 实例的端口信息
func (e EmptyInstanceGauge) GetPort() int {
return -1
}
// GetRetStatus 实例的调用返回状态
func (e EmptyInstanceGauge) GetRetStatus() RetStatus {
return RetFail
}
// GetCircuitBreakerStatus 实例的熔断状态
func (e EmptyInstanceGauge) GetCircuitBreakerStatus() CircuitBreakerStatus {
return nil
}
// GetRetCodeValue 实例的返回码 ret code.
func (e EmptyInstanceGauge) GetRetCodeValue() int32 {
return 0
}
// GetDelay 调用时延 delay.
func (e EmptyInstanceGauge) GetDelay() *time.Duration {
return nil
}
// GetAPI api.
func (e EmptyInstanceGauge) GetAPI() ApiOperation {
return ApiOperationMax
}
// Validate 校验.
func (e EmptyInstanceGauge) Validate() error {
return nil
}
// GetCalledInstance 获取被调节点.
func (e EmptyInstanceGauge) GetCalledInstance() Instance {
return nil
}
// GetDelayRange 调用时延.
func (e EmptyInstanceGauge) GetDelayRange() ApiDelayRange {
return ApiDelayMax
}
// ApiOperation 命名类型标识具体的API类型.
type ApiOperation int
// String ToString方法.
func (a ApiOperation) String() string {
return apiOperationPresents[a]
}
// API标识.
const (
ApiGetOneInstance ApiOperation = iota
ApiGetInstances
ApiGetRouteRule
ApiRegister
ApiDeregister
ApiHeartbeat
ApiGetQuota
ApiGetAllInstances
ApiUpdateServiceCallResult
ApiServices
ApiInitCalleeServices
ApiProcessRouters
ApiProcessLoadBalance
// ApiOperationMax 这个必须在最下面
ApiOperationMax
)
// API标识到别名.
var (
apiOperationPresents = map[ApiOperation]string{
ApiGetOneInstance: "Consumer::GetOneInstance",
ApiGetInstances: "Consumer::GetInstances",
ApiGetRouteRule: "Consumer::GetRouteRule",
ApiGetAllInstances: "Consumer::GetAllInstances",
ApiRegister: "Provider::Register",
ApiDeregister: "Provider::Deregister",
ApiHeartbeat: "Provider::Heartbeat",
ApiGetQuota: "Limit::GetQuota",
ApiUpdateServiceCallResult: "Consumer::UpdateServiceCallResult",
ApiServices: "Consumer::GetServices",
ApiInitCalleeServices: "Consumer::InitCalleeServices",
ApiProcessRouters: "Router::ProcessRouters",
ApiProcessLoadBalance: "Router::ProcessLoadBalance",
}
)
// ApiDelayRange API延时范围.
type ApiDelayRange int
// API延时范围常量.
const (
ApiDelayBelow50 ApiDelayRange = iota
ApiDelayBelow100
ApiDelayBelow150
ApiDelayBelow200
ApiDelayOver200
ApiDelayMax
)
var apiDelayPresents = map[ApiDelayRange]string{
ApiDelayBelow50: "[0ms,50ms)",
ApiDelayBelow100: "[50ms,100ms)",
ApiDelayBelow150: "[100ms,150ms)",
ApiDelayBelow200: "[150ms,200ms)",
ApiDelayOver200: "[200ms,)",
}
// String ToString方法.
func (a ApiDelayRange) String() string {
return apiDelayPresents[a]
}
const (
timeRange = 50 * time.Millisecond
maxTimeRange = 200 * time.Millisecond
)
// GetApiDelayRange 获取api时延范围.
func GetApiDelayRange(delay time.Duration) ApiDelayRange {
if delay > maxTimeRange {
delay = maxTimeRange
}
diff := delay.Nanoseconds() / timeRange.Nanoseconds()
return ApiDelayRange(diff)
}
// init 初始化.
func init() {
metricTypes.Add(SDKAPIStat)
metricTypes.Add(ServiceStat)
metricTypes.Add(SDKCfgStat)
metricTypes.Add(InstanceStat)
metricTypes.Add(CircuitBreakStat)
metricTypes.Add(PluginAPIStat)
metricTypes.Add(LoadBalanceStat)
metricTypes.Add(RateLimitStat)
metricTypes.Add(RouteStat)
}