This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new b27ec53b7 Use summary type to observe p99 (#1875)
b27ec53b7 is described below

commit b27ec53b7babdbb94933e017885083035ce70829
Author: Alkaid <[email protected]>
AuthorDate: Sun May 8 18:53:16 2022 +0800

    Use summary type to observe p99 (#1875)
    
    * use summary to observe p99
    
    Signed-off-by: jyz0309 <[email protected]>
    
    * fix var name
    
    Signed-off-by: jyz0309 <[email protected]>
    
    * format code
    
    Signed-off-by: jyz0309 <[email protected]>
    
    * change-metric-type
    
    Signed-off-by: jyz0309 <[email protected]>
    
    * format code
    
    Signed-off-by: jyz0309 <[email protected]>
    
    * rollback import change
    
    Signed-off-by: jyz0309 <[email protected]>
---
 config/metric_config.go        |  2 ++
 metrics/prometheus/reporter.go | 28 +++++++++++++++-------------
 metrics/reporter.go            |  4 ++++
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/config/metric_config.go b/config/metric_config.go
index 291e4c7bc..8b8a04415 100644
--- a/config/metric_config.go
+++ b/config/metric_config.go
@@ -36,6 +36,7 @@ type MetricConfig struct {
        Port               string `default:"9090" yaml:"port" 
json:"port,omitempty" property:"port"`
        Path               string `default:"/metrics" yaml:"path" 
json:"path,omitempty" property:"path"`
        PushGatewayAddress string `default:"" yaml:"push-gateway-address" 
json:"push-gateway-address,omitempty" property:"push-gateway-address"`
+       SummaryMaxAge      int64  `default:"600000000000" 
yaml:"summary-max-age" json:"summary-max-age,omitempty" 
property:"summary-max-age"`
 }
 
 func (mc *MetricConfig) ToReporterConfig() *metrics.ReporterConfig {
@@ -51,6 +52,7 @@ func (mc *MetricConfig) ToReporterConfig() 
*metrics.ReporterConfig {
        defaultMetricsReportConfig.Port = mc.Port
        defaultMetricsReportConfig.Path = mc.Path
        defaultMetricsReportConfig.PushGatewayAddress = mc.PushGatewayAddress
+       defaultMetricsReportConfig.SummaryMaxAge = mc.SummaryMaxAge
        return defaultMetricsReportConfig
 }
 
diff --git a/metrics/prometheus/reporter.go b/metrics/prometheus/reporter.go
index 845f6a8fc..cee640ebd 100644
--- a/metrics/prometheus/reporter.go
+++ b/metrics/prometheus/reporter.go
@@ -77,10 +77,11 @@ func init() {
 // if you want to use this feature, you need to initialize your prometheus.
 // https://prometheus.io/docs/guides/go-application/
 type PrometheusReporter struct {
+       reporterConfig *metrics.ReporterConfig
        // report the consumer-side's rt gauge data
-       consumerRTGaugeVec *prometheus.GaugeVec
+       consumerRTSummaryVec *prometheus.SummaryVec
        // report the provider-side's rt gauge data
-       providerRTGaugeVec *prometheus.GaugeVec
+       providerRTSummaryVec *prometheus.SummaryVec
        // todo tps support
        // report the consumer-side's tps gauge data
        consumerTPSGaugeVec *prometheus.GaugeVec
@@ -102,11 +103,11 @@ type PrometheusReporter struct {
 // 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 rtVec *prometheus.GaugeVec
+       var rtVec *prometheus.SummaryVec
        if isProvider(url) {
-               rtVec = reporter.providerRTGaugeVec
+               rtVec = reporter.providerRTSummaryVec
        } else if isConsumer(url) {
-               rtVec = reporter.consumerRTGaugeVec
+               rtVec = reporter.consumerRTSummaryVec
        } else {
                logger.Warnf("The url belongs neither the consumer nor the 
provider, "+
                        "so the invocation will be ignored. url: %s", 
url.String())
@@ -121,7 +122,7 @@ func (reporter *PrometheusReporter) Report(ctx 
context.Context, invoker protocol
                timeoutKey: url.GetParam(timeoutKey, ""),
        }
        costMs := cost.Nanoseconds()
-       rtVec.With(labels).Set(float64(costMs))
+       rtVec.With(labels).Observe(float64(costMs))
 }
 
 func newHistogramVec(name, namespace string, labels []string) 
*prometheus.HistogramVec {
@@ -176,7 +177,7 @@ func newSummary(name, namespace string) prometheus.Summary {
 
 // newSummaryVec create SummaryVec, the Namespace is dubbo
 // the objectives is from my experience.
-func newSummaryVec(name, namespace string, labels []string) 
*prometheus.SummaryVec {
+func newSummaryVec(name, namespace string, labels []string, maxAge int64) 
*prometheus.SummaryVec {
        return prometheus.NewSummaryVec(
                prometheus.SummaryOpts{
                        Namespace: namespace,
@@ -189,6 +190,7 @@ func newSummaryVec(name, namespace string, labels []string) 
*prometheus.SummaryV
                                0.99:  0.001,
                                0.999: 0.0001,
                        },
+                       MaxAge: time.Duration(maxAge),
                },
                labels,
        )
@@ -212,12 +214,12 @@ func newPrometheusReporter(reporterConfig 
*metrics.ReporterConfig) metrics.Repor
        if reporterInstance == nil {
                reporterInitOnce.Do(func() {
                        reporterInstance = &PrometheusReporter{
-                               namespace:          reporterConfig.Namespace,
-                               consumerRTGaugeVec: 
newGaugeVec(consumerPrefix+serviceKey+rtSuffix, reporterConfig.Namespace, 
labelNames),
-                               providerRTGaugeVec: 
newGaugeVec(providerPrefix+serviceKey+rtSuffix, reporterConfig.Namespace, 
labelNames),
+                               reporterConfig:       reporterConfig,
+                               namespace:            reporterConfig.Namespace,
+                               consumerRTSummaryVec: 
newSummaryVec(consumerPrefix+serviceKey+rtSuffix, reporterConfig.Namespace, 
labelNames, reporterConfig.SummaryMaxAge),
+                               providerRTSummaryVec: 
newSummaryVec(providerPrefix+serviceKey+rtSuffix, reporterConfig.Namespace, 
labelNames, reporterConfig.SummaryMaxAge),
                        }
-
-                       
prom.DefaultRegisterer.MustRegister(reporterInstance.consumerRTGaugeVec, 
reporterInstance.providerRTGaugeVec)
+                       
prom.DefaultRegisterer.MustRegister(reporterInstance.consumerRTSummaryVec, 
reporterInstance.providerRTSummaryVec)
                        metricsExporter, err := 
ocprom.NewExporter(ocprom.Options{
                                Registry: 
prom.DefaultRegisterer.(*prom.Registry),
                        })
@@ -328,7 +330,7 @@ func (reporter *PrometheusReporter) incSummary(summaryName 
string, toSetValue fl
                for k, _ := range labelMap {
                        keyList = append(keyList, k)
                }
-               newSummaryVec := newSummaryVec(summaryName, reporter.namespace, 
keyList)
+               newSummaryVec := newSummaryVec(summaryName, reporter.namespace, 
keyList, reporter.reporterConfig.SummaryMaxAge)
                _ = prom.DefaultRegisterer.Register(newSummaryVec)
                reporter.userSummaryVec.Store(summaryName, newSummaryVec)
                newSummaryVec.With(labelMap).Observe(toSetValue)
diff --git a/metrics/reporter.go b/metrics/reporter.go
index 277cc82bf..b0e661743 100644
--- a/metrics/reporter.go
+++ b/metrics/reporter.go
@@ -26,6 +26,8 @@ import (
        "dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+const DefMaxAge = 600000000000
+
 type ReporterConfig struct {
        Enable             bool
        Namespace          string
@@ -33,6 +35,7 @@ type ReporterConfig struct {
        Port               string
        Path               string
        PushGatewayAddress string
+       SummaryMaxAge      int64
 }
 
 type ReportMode string
@@ -50,6 +53,7 @@ func NewReporterConfig() *ReporterConfig {
                Path:               "/metrics",
                Mode:               ReportModePull,
                PushGatewayAddress: "",
+               SummaryMaxAge:      DefMaxAge,
        }
 }
 

Reply via email to