demo_performance_counter

package
v0.0.0-...-184aab5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 30, 2022 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Aggregator

type Aggregator struct{}

Aggregator 是一个工具类,目前只有一个方法,几十行左右的代码量,负责各种统计数据的计算。 当需要扩展新的统计功能时,要修改 aggregate() 方法的代码,并且一旦越来越多的统计功能添加进来之后, 这个函数的代码量会持续增加,可读性、可维护性就变差了。 这个类的设计存在职责不够单一、不易扩展等问题,需要在之后的版本中,对其结构做优化。

func NewAggregator

func NewAggregator() *Aggregator

func (*Aggregator) Aggregate

func (a *Aggregator) Aggregate(requestInfos []RequestInfo, duration time.Duration) *RequestStat

Aggregate 根据原始数据,计算得到统计数据

type App

type App struct{}

func (App) Run

func (a App) Run()

type ConsoleReporter

type ConsoleReporter struct {
	// contains filtered or unexported fields
}

ConsoleReporter 和 EmailReporter 中存在代码重复问题。 在这两个类中,从数据库中取数据、做统计的逻辑都是相同的,可以抽取出来复用,否则就违反了 DRY 原则。 而且整个类负责的事情比较多,职责不是太单一。特别是显示部分的代码,可能会比较复杂(比如 Email 的展示方式), 最好是将显示部分的代码逻辑拆分成独立的类。除此之外,因为代码中涉及线程操作, 并且调用了 Aggregator 的方法,所以代码的可测试性不好。

func NewConsoleReporter

func NewConsoleReporter(metricsStorage MetricsStorage, aggregator *Aggregator) *ConsoleReporter

func (*ConsoleReporter) StartRepeatedReport

func (r *ConsoleReporter) StartRepeatedReport(period, duration time.Duration)

type EmailReporter

type EmailReporter struct {
	// contains filtered or unexported fields
}

func NewEmailReporter

func NewEmailReporter(metricsStorage MetricsStorage, aggregator *Aggregator) *EmailReporter

func (*EmailReporter) AddToAddress

func (r *EmailReporter) AddToAddress(addr ...string)

func (*EmailReporter) StartDailyReport

func (r *EmailReporter) StartDailyReport()

type EmailSender

type EmailSender struct {
	// contains filtered or unexported fields
}

func NewEmailSender

func NewEmailSender(smtpAddr string) *EmailSender

func (*EmailSender) AddReceiver

func (s *EmailSender) AddReceiver(receiver ...string)

func (*EmailSender) SendMail

func (s *EmailSender) SendMail(msg []byte) error

type Metric

type Metric interface {
	RecordResponseTime(apiName string, responseTime time.Duration)
	RecordTimestamp(apiName string, timestamp int64)
	StartRepeatedReport(period time.Duration) error
}

type Metrics

type Metrics struct {
	// contains filtered or unexported fields
}

func (*Metrics) RecordResponseTime

func (m *Metrics) RecordResponseTime(apiName string, responseTime time.Duration)

RecordResponseTime 记录接口请求的响应时间

func (*Metrics) RecordTimestamp

func (m *Metrics) RecordTimestamp(apiName string, timestamp int64)

RecordTimestamp 记录接口请求的访问时间

func (*Metrics) StartRepeatedReport

func (m *Metrics) StartRepeatedReport(period time.Duration) error

type MetricsCollector

type MetricsCollector struct {
	// contains filtered or unexported fields
}

MetricsCollector 负责采集和存储数据,职责相对来说比较单一。 它基于接口而非实现编程,通过依赖注入的方式来传递 MetricsStorage 对象, 可以在不需要修改代码的情况下,灵活地替换不同的存储方式,满足开闭原则。

func NewMetricsCollector

func NewMetricsCollector(metricsStorage MetricsStorage) *MetricsCollector

NewMetricsCollector 依赖注入的方式新建 collector

func (*MetricsCollector) RecordRequest

func (c *MetricsCollector) RecordRequest(info *RequestInfo)

RecordRequest 用一个方法替代 MVP 中的两个方法

type MetricsStorage

type MetricsStorage interface {
	SaveRequestInfo(info *RequestInfo)

	GetRequestInfo(apiName string, startTime, endTime time.Time) []RequestInfo
	GetRequestInfos(startTime, endTime time.Time) map[string][]RequestInfo
}

MetricsStorage 和 RedisMetricsStorage 的设计比较简单。 需要实现新的存储方式的时候,只需要实现 MetricsStorage 接口即可。 因为所有用到 MetricsStorage 和 RedisMetricsStorage 的地方, 都是基于相同的接口函数来编程的,所以, 除了在组装类的地方有所改动(从 RedisMetricsStorage 改为新的存储实现类), 其他接口函数调用的地方都不需要改动,满足开闭原则。

type RedisMetricsStorage

type RedisMetricsStorage struct{}

func NewRedisMetricsStorage

func NewRedisMetricsStorage() *RedisMetricsStorage

func (*RedisMetricsStorage) GetRequestInfo

func (r *RedisMetricsStorage) GetRequestInfo(apiName string, startTime, endTime time.Time) []RequestInfo

func (*RedisMetricsStorage) GetRequestInfos

func (r *RedisMetricsStorage) GetRequestInfos(startTime, endTime time.Time) map[string][]RequestInfo

func (*RedisMetricsStorage) SaveRequestInfo

func (r *RedisMetricsStorage) SaveRequestInfo(info *RequestInfo)

type RequestInfo

type RequestInfo struct {
	// contains filtered or unexported fields
}

func NewRequestInfo

func NewRequestInfo(apiName string, responseTime time.Duration, timestamp int64) *RequestInfo

func (*RequestInfo) ApiName

func (r *RequestInfo) ApiName() string

func (*RequestInfo) ResponseTime

func (r *RequestInfo) ResponseTime() time.Duration

func (*RequestInfo) SetApiName

func (r *RequestInfo) SetApiName(apiName string)

func (*RequestInfo) SetResponseTime

func (r *RequestInfo) SetResponseTime(responseTime time.Duration)

func (*RequestInfo) SetTimestamp

func (r *RequestInfo) SetTimestamp(timestamp int64)

func (*RequestInfo) Timestamp

func (r *RequestInfo) Timestamp() int64

type RequestStat

type RequestStat struct {
	MaxResponseTime  time.Duration
	MinResponseTime  time.Duration
	AvgResponseTime  time.Duration
	P999ResponseTime time.Duration
	P99ResponseTime  time.Duration
	Count            int64
	Tps              int64
}

type UserController

type UserController struct {
	Metric
}

func NewUserController

func NewUserController(metric Metric) *UserController

func (*UserController) Login

func (c *UserController) Login(telephone, password string)

func (*UserController) Register

func (c *UserController) Register(user UserVO)

type UserVO

type UserVO struct{}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL