前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊dubbo-go的metricsFilter

聊聊dubbo-go的metricsFilter

原创
作者头像
code4it
修改2020-07-22 09:54:26
5530
修改2020-07-22 09:54:26
举报
文章被收录于专栏:码匠的流水账

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • metricsFilter
  • newMetricsFilter
  • Invoke
  • OnResponse
  • 小结
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档