序
本文主要研究一下dubbo-go的metricsFilter
metricsFilter
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
代码语言:javascript复制const (
metricFilterName = "metrics"
)
var (
metricFilterInstance filter.Filter
)
// must initialized before using the filter and after loading configuration
func init() {
extension.SetFilter(metricFilterName, newMetricsFilter)
}
// metricFilter will calculate the invocation's duration and the report to the reporters
// If you want to use this filter to collect the metrics,
// Adding this into your configuration file, like:
// filter: "metrics"
// metrics:
// reporter:
// - "your reporter" # here you should specify the reporter, for example 'prometheus'
// more info please take a look at dubbo-samples projects
type metricsFilter struct {
reporters []metrics.Reporter
}
- metricsFilter定义了reporters属性
newMetricsFilter
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
代码语言:javascript复制func newMetricsFilter() filter.Filter {
if metricFilterInstance == nil {
reporterNames := config.GetMetricConfig().Reporters
reporters := make([]metrics.Reporter, 0, len(reporterNames))
for _, name := range reporterNames {
reporters = append(reporters, extension.GetMetricReporter(name))
}
metricFilterInstance = &metricsFilter{
reporters: reporters,
}
}
return metricFilterInstance
}
- newMetricsFilter方法在metricFilterInstance为null的时候会获取config.GetMetricConfig().Reporters,然后创建reporters及metricsFilter
Invoke
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
代码语言:javascript复制func (p *metricsFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
start := time.Now()
res := invoker.Invoke(ctx, invocation)
end := time.Now()
duration := end.Sub(start)
go func() {
for _, reporter := range p.reporters {
reporter.Report(ctx, invoker, invocation, duration, res)
}
}()
return res
}
- Invoke方法在invoker.Invoke(ctx, invocation)前后记录时间,最后算出duration,然异步遍历p.reporters,执行reporter.Report
OnResponse
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
代码语言:javascript复制func (p *metricsFilter) OnResponse(ctx context.Context, res protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
return res
}
- OnResponse方法目前直接返回result
小结
metricsFilter的Invoke方法在invoker.Invoke(ctx, invocation)前后记录时间,最后算出duration,然异步遍历p.reporters,执行reporter.Report
doc
- metrics_filter