聊聊dubbogo的metricsFilter

编程

本文主要研究一下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 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

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

以上是 聊聊dubbogo的metricsFilter 的全部内容, 来源链接: utcz.com/z/518569.html

回到顶部