core/config/entity.go (183 lines of code) (raw):
// Copyright 1999-2020 Alibaba Group Holding Ltd.
//
// 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 config
import (
"encoding/json"
"fmt"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/alibaba/sentinel-golang/logging"
"github.com/pkg/errors"
)
type Entity struct {
// Version represents the format version of the entity.
Version string
Sentinel SentinelConfig
}
// SentinelConfig represent the general configuration of Sentinel.
type SentinelConfig struct {
App struct {
// Name represents the name of current running service.
Name string
// Type indicates the classification of the service (e.g. web service, API gateway).
Type int32
}
// Exporter represents configuration items related to exporter, like metric exporter.
Exporter ExporterConfig
// Log represents configuration items related to logging.
Log LogConfig
// Stat represents configuration items related to statistics.
Stat StatConfig
// UseCacheTime indicates whether to cache time(ms)
UseCacheTime bool `yaml:"useCacheTime"`
}
// ExporterConfig represents configuration items related to exporter, like metric exporter.
type ExporterConfig struct {
Metric MetricExporterConfig
}
// MetricExporterConfig represents configuration of metric exporter.
type MetricExporterConfig struct {
// HttpAddr is the http server listen address, like ":8080".
HttpAddr string `yaml:"http_addr"`
// HttpPath is the http request path of access metrics, like "/metrics".
HttpPath string `yaml:"http_path"`
}
// LogConfig represent the configuration of logging in Sentinel.
type LogConfig struct {
// Logger indicates that using logger to replace default logging.
Logger logging.Logger
// Dir represents the log directory path.
Dir string
// UsePid indicates whether the filename ends with the process ID (PID).
UsePid bool `yaml:"usePid"`
// Metric represents the configuration items of the metric log.
Metric MetricLogConfig
}
// MetricLogConfig represents the configuration items of the metric log.
type MetricLogConfig struct {
SingleFileMaxSize uint64 `yaml:"singleFileMaxSize"`
MaxFileCount uint32 `yaml:"maxFileCount"`
FlushIntervalSec uint32 `yaml:"flushIntervalSec"`
}
// StatConfig represents the configuration items of statistics.
type StatConfig struct {
// GlobalStatisticSampleCountTotal and GlobalStatisticIntervalMsTotal is the per resource's global default statistic sliding window config
GlobalStatisticSampleCountTotal uint32 `yaml:"globalStatisticSampleCountTotal"`
GlobalStatisticIntervalMsTotal uint32 `yaml:"globalStatisticIntervalMsTotal"`
// MetricStatisticSampleCount and MetricStatisticIntervalMs is the per resource's default readonly metric statistic
// This default readonly metric statistic must be reusable based on global statistic.
MetricStatisticSampleCount uint32 `yaml:"metricStatisticSampleCount"`
MetricStatisticIntervalMs uint32 `yaml:"metricStatisticIntervalMs"`
System SystemStatConfig `yaml:"system"`
}
// SystemStatConfig represents the configuration items of system statistics.
type SystemStatConfig struct {
// CollectIntervalMs represents the collecting interval of the system metrics collector.
CollectIntervalMs uint32 `yaml:"collectIntervalMs"`
// CollectLoadIntervalMs represents the collecting interval of the system load collector.
CollectLoadIntervalMs uint32 `yaml:"collectLoadIntervalMs"`
// CollectCpuIntervalMs represents the collecting interval of the system cpu usage collector.
CollectCpuIntervalMs uint32 `yaml:"collectCpuIntervalMs"`
// CollectMemoryIntervalMs represents the collecting interval of the system memory usage collector.
CollectMemoryIntervalMs uint32 `yaml:"collectMemoryIntervalMs"`
}
// NewDefaultConfig creates a new default config entity.
func NewDefaultConfig() *Entity {
return &Entity{
Version: "v1",
Sentinel: SentinelConfig{
App: struct {
Name string
Type int32
}{
Name: UnknownProjectName,
Type: DefaultAppType,
},
Log: LogConfig{
Logger: nil,
Dir: GetDefaultLogDir(),
UsePid: false,
Metric: MetricLogConfig{
SingleFileMaxSize: DefaultMetricLogSingleFileMaxSize,
MaxFileCount: DefaultMetricLogMaxFileAmount,
FlushIntervalSec: DefaultMetricLogFlushIntervalSec,
},
},
Stat: StatConfig{
GlobalStatisticSampleCountTotal: base.DefaultSampleCountTotal,
GlobalStatisticIntervalMsTotal: base.DefaultIntervalMsTotal,
MetricStatisticSampleCount: base.DefaultSampleCount,
MetricStatisticIntervalMs: base.DefaultIntervalMs,
System: SystemStatConfig{
CollectIntervalMs: DefaultSystemStatCollectIntervalMs,
CollectLoadIntervalMs: DefaultLoadStatCollectIntervalMs,
CollectCpuIntervalMs: DefaultCpuStatCollectIntervalMs,
CollectMemoryIntervalMs: DefaultMemoryStatCollectIntervalMs,
},
},
UseCacheTime: false,
},
}
}
func CheckValid(entity *Entity) error {
if entity == nil {
return errors.New("Nil entity")
}
if len(entity.Version) == 0 {
return errors.New("Empty version")
}
return checkConfValid(&entity.Sentinel)
}
func checkConfValid(conf *SentinelConfig) error {
if conf == nil {
return errors.New("Nil globalCfg")
}
if conf.App.Name == "" {
return errors.New("App.Name is empty")
}
mc := conf.Log.Metric
if mc.MaxFileCount <= 0 {
return errors.New("Illegal metric log globalCfg: maxFileCount <= 0")
}
if mc.SingleFileMaxSize <= 0 {
return errors.New("Illegal metric log globalCfg: singleFileMaxSize <= 0")
}
if err := base.CheckValidityForReuseStatistic(conf.Stat.MetricStatisticSampleCount, conf.Stat.MetricStatisticIntervalMs,
conf.Stat.GlobalStatisticSampleCountTotal, conf.Stat.GlobalStatisticIntervalMsTotal); err != nil {
return err
}
return nil
}
func (entity *Entity) String() string {
e, err := json.Marshal(entity)
if err != nil {
return fmt.Sprintf("%+v", *entity)
}
return string(e)
}
func (entity *Entity) AppName() string {
return entity.Sentinel.App.Name
}
func (entity *Entity) AppType() int32 {
return entity.Sentinel.App.Type
}
func (entity *Entity) LogBaseDir() string {
return entity.Sentinel.Log.Dir
}
func (entity *Entity) Logger() logging.Logger {
return entity.Sentinel.Log.Logger
}
// LogUsePid returns whether the log file name contains the PID suffix.
func (entity *Entity) LogUsePid() bool {
return entity.Sentinel.Log.UsePid
}
func (entity *Entity) MetricExportHTTPAddr() string {
return entity.Sentinel.Exporter.Metric.HttpAddr
}
func (entity *Entity) MetricExportHTTPPath() string {
return entity.Sentinel.Exporter.Metric.HttpPath
}
func (entity *Entity) MetricLogFlushIntervalSec() uint32 {
return entity.Sentinel.Log.Metric.FlushIntervalSec
}
func (entity *Entity) MetricLogSingleFileMaxSize() uint64 {
return entity.Sentinel.Log.Metric.SingleFileMaxSize
}
func (entity *Entity) MetricLogMaxFileAmount() uint32 {
return entity.Sentinel.Log.Metric.MaxFileCount
}
func (entity *Entity) SystemStatCollectIntervalMs() uint32 {
return entity.Sentinel.Stat.System.CollectIntervalMs
}
func (entity *Entity) LoadStatCollectIntervalMs() uint32 {
return entity.Sentinel.Stat.System.CollectLoadIntervalMs
}
func (entity *Entity) CpuStatCollectIntervalMs() uint32 {
return entity.Sentinel.Stat.System.CollectCpuIntervalMs
}
func (entity *Entity) MemoryStatCollectIntervalMs() uint32 {
return entity.Sentinel.Stat.System.CollectMemoryIntervalMs
}
func (entity *Entity) UseCacheTime() bool {
return entity.Sentinel.UseCacheTime
}
func (entity *Entity) GlobalStatisticIntervalMsTotal() uint32 {
return entity.Sentinel.Stat.GlobalStatisticIntervalMsTotal
}
func (entity *Entity) GlobalStatisticSampleCountTotal() uint32 {
return entity.Sentinel.Stat.GlobalStatisticSampleCountTotal
}
func (entity *Entity) MetricStatisticIntervalMs() uint32 {
return entity.Sentinel.Stat.MetricStatisticIntervalMs
}
func (entity *Entity) MetricStatisticSampleCount() uint32 {
return entity.Sentinel.Stat.MetricStatisticSampleCount
}