blog

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

Sequence この記事ではダボゴーの-go-を取り上げます。...

Jul 16, 2020 · 5 min. read
シェア

序文

本記事では、dubbo-goのPrometheusReporterについて紹介します。

プロメテウス記者

dubbo-go-v1.4.2/metrics/prometheus/reporter.go

const (
	reporterName = "prometheus"
	serviceKey = constant.SERVICE_KEY
	groupKey = constant.GROUP_KEY
	versionKey = constant.VERSION_KEY
	methodKey = constant.METHOD_KEY
	timeoutKey = constant.TIMEOUT_KEY
	providerKey = "provider"
	consumerKey = "consumer"
	// to identify the metric's type
	histogramSuffix = "_histogram"
	// to identify the metric's type
	summarySuffix = "_summary"
)
var (
	labelNames = []string{serviceKey, groupKey, versionKey, methodKey, timeoutKey}
	namespace = config.GetApplicationConfig().Name
	reporterInstance *PrometheusReporter
	reporterInitOnce sync.Once
)
// should initialize after loading configuration
func init() {
	extension.SetMetricReporter(reporterName, newPrometheusReporter)
}
// PrometheusReporter
// it will collect the data for Prometheus
// if you want to use this, you should initialize your prometheus.
// https://.///-on/
type PrometheusReporter struct {
	// report the consumer-side's summary data
	consumerSummaryVec *prometheus.SummaryVec
	// report the provider-side's summary data
	providerSummaryVec *prometheus.SummaryVec
	// report the provider-side's histogram data
	providerHistogramVec *prometheus.HistogramVec
	// report the consumer-side's histogram data
	consumerHistogramVec *prometheus.HistogramVec
}
  • PrometheusReporterconsumerSummaryVec, providerSummaryVec, providerHistogramVec を定義します、consumerHistogramVec

ニュープロメテウスレポーター

dubbo-go-v1.4.2/metrics/prometheus/reporter.go

// newPrometheusReporter create new prometheusReporter
// it will register the metrics into prometheus
func newPrometheusReporter() metrics.Reporter {
	if reporterInstance == nil {
		reporterInitOnce.Do(func() {
			reporterInstance = &PrometheusReporter{
				consumerSummaryVec: newSummaryVec(consumerKey),
				providerSummaryVec: newSummaryVec(providerKey),
				consumerHistogramVec: newHistogramVec(consumerKey),
				providerHistogramVec: newHistogramVec(providerKey),
			}
			prometheus.MustRegister(reporterInstance.consumerSummaryVec, reporterInstance.providerSummaryVec,
				reporterInstance.consumerHistogramVec, reporterInstance.providerHistogramVec)
		})
	}
	return reporterInstance
}
  • newPrometheusReporter メソッドは PrometheusReporter をインスタンス化します。

newSummaryVec

dubbo-go-v1.4.2/metrics/prometheus/reporter.go

// newSummaryVec create SummaryVec, the Namespace is dubbo
// the objectives is from my experience.
func newSummaryVec(side string) *prometheus.SummaryVec {
	return prometheus.NewSummaryVec(
		prometheus.SummaryOpts{
			Namespace: namespace,
			Help: "This is the dubbo's summary metrics",
			Subsystem: side,
			Name: serviceKey + summarySuffix,
			Objectives: map[float64]float: 0.: 0.: 0.: 0.: 0.9: 0.0001,
			},
		},
		labelNames,
	)
}
  • newHistogramVecメソッドの実行prometheus.NewHistogramVec

newHistogramVec

dubbo-go-v1.4.2/metrics/prometheus/reporter.go

func newHistogramVec(side string) *prometheus.HistogramVec {
	mc := config.GetMetricConfig()
	return prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Namespace: namespace,
			Subsystem: side,
			Name: serviceKey + histogramSuffix,
			Help: "This is the dubbo's histogram metrics",
			Buckets: mc.GetHistogramBucket(),
		},
		labelNames)
}
  • newHistogramVecメソッドの実行prometheus.NewHistogramVec

レポート

dubbo-go-v1.4.2/metrics/prometheus/reporter.go

// Report report the duration to Prometheus
// the role in url must be consumer or provider
// or it will be ignored
func (reporter *PrometheusReporter) Report(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation, cost time.Duration, res protocol.Result) {
	url := invoker.GetUrl()
	var sumVec *prometheus.SummaryVec
	var hisVec *prometheus.HistogramVec
	if isProvider(url) {
		sumVec = reporter.providerSummaryVec
		hisVec = reporter.providerHistogramVec
	} else if isConsumer(url) {
		sumVec = reporter.consumerSummaryVec
		hisVec = reporter.consumerHistogramVec
	} else {
		logger.Warnf("The url is not the consumer's or provider's, "+
			"so the invocation will be ignored. url: %s", url.String())
		return
	}
	labels := prometheus.Labels{
		serviceKey: url.Service(),
		groupKey: url.GetParam(groupKey, ""),
		versionKey: url.GetParam(versionKey, ""),
		methodKey: invocation.MethodName(),
		timeoutKey: url.GetParam(timeoutKey, ""),
	}
	costMs := float64(cost.Nanoseconds() / constant.MsToNanoRate)
	sumVec.With(labels).Observe(costMs)
	hisVec.With(labels).Observe(costMs)
}
// whether this url represents the application received the request as server
func isProvider(url common.URL) bool {
	role := url.GetParam(constant.ROLE_KEY, "")
	return strings.EqualFold(role, strconv.Itoa(common.PROVIDER))
}
// whether this url represents the application sent then request as client
func isConsumer(url common.URL) bool {
	role := url.GetParam(constant.ROLE_KEY, "")
	return strings.EqualFold(role, strconv.Itoa(common.CONSUMER))
}
  • プロバイダであれば、reporter.providerSummaryVec, reporter.providerHistogramVecを取得し、コンシューマであれば、reporter.consumerSummaryVec, reporter.consumerHistogramVecを取得します。その後、ラベルを設定し、sumVec.With(labels).Observe(costMs) と hisVec.With(labels).Observe(costMs)

短い

PrometheusReporterは、consumerSummaryVec、providerSummaryVec、providerHistogramVec、consumerHistogramVecを定義しています。もしプロバイダであれば、reporter.providerSummaryVec、reporter.providerHistogramVecを取得し、もしコンシューマであれば、reporter.consumerSummaryVec、reporter.その後、ラベルを設定し、sumVec.With(labels).Observe(costMs) と hisVec.With(labels).Observe(costMs) を実行します。

ドック

Read next

vue foundation 02 - 親子コンポーネント間の通信

1.親コンポーネントが子コンポーネントに値を渡す: propsを介した通信 親コンポーネントに実装されたプロパティを受け取るために、子コンポーネントでpropsを宣言します。 親コンポーネントにカスタムプロパティをバインドするために、サブコンポーネントのテンプレートでこれらのいずれかを使用できます。

Jul 15, 2020 · 3 min read

HTTPプロトコルの歴史

Jul 15, 2020 · 4 min read

Js実行コンテキスト

Jul 14, 2020 · 2 min read

HTTP共通ヘッダ

Jul 14, 2020 · 4 min read

コンパレータのラムダ累積

Jul 13, 2020 · 1 min read