本文次要钻研一下dubbo-go的metricsFilter

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 configurationfunc 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 projectstype metricsFilter struct {    reporters []metrics.Reporter}
  • metricsFilter定义了reporters属性

newMetricsFilter

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}
  • newMetricsFilter办法在metricFilterInstance为null的时候会获取config.GetMetricConfig().Reporters,而后创立reporters及metricsFilter

Invoke

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}
  • Invoke办法在invoker.Invoke(ctx, invocation)前后记录时间,最初算出duration,然异步遍历p.reporters,执行reporter.Report

OnResponse

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}
  • OnResponse办法目前间接返回result

小结

metricsFilter的Invoke办法在invoker.Invoke(ctx, invocation)前后记录时间,最初算出duration,然异步遍历p.reporters,执行reporter.Report

doc

  • metrics_filter