本文主要研究一下dubbo-go的metricsFilter
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
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 }
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
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 }
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
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 }
dubbo-go-v1.4.2/filter/filter_impl/metrics_filter.go
func (p *metricsFilter) OnResponse(ctx context.Context, res protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result { return res }
metricsFilter的Invoke方法在invoker.Invoke(ctx, invocation)前后记录时间,最后算出duration,然异步遍历p.reporters,执行reporter.Report