blog

dubbo-goのmetricsFilterについて話す。

この記事では、dubbo-go の -go- に焦点を当てます。...

Dec 26, 2020 · 2 min. read

シーケンス

この記事ではdubo-goのmetricsFilterを取り上げます。

メトリクスフィルタ

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は、レポーター属性を定義します。

新メトリクスフィルタ

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 を取得し、レポーターと metricsFilter を作成します。

Invoke

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
}

OnResponse

func (p *metricsFilter) OnResponse(ctx context.Context, res protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
	return res
}
  • OnResponse メソッドは現在、結果を直接返します。

概要

Read next

ECMAScript2015の体系的な学習()

クロージャは、グローバル・スコープの影響を取り除くための関数スコープです。 ES2015 では、ブロックレベルのスコープを使用して、グローバル・スコープの影響を回避することができます。 forには2つのレベルのスコープがあります。 const と let の違い const は読み取り専用のプロパティを宣言します。 const 宣言には値を代入する必要があります。 constは変更を許可しません。

Dec 26, 2020 · 10 min read