From 252bfc97524c48db08cc6d5def4ad732dc223b6b Mon Sep 17 00:00:00 2001 From: crazycs520 Date: Thu, 28 Sep 2023 12:02:10 +0800 Subject: [PATCH] *: add metrics for batch client Signed-off-by: crazycs520 --- internal/client/client_batch.go | 17 +++++++++++++++-- metrics/metrics.go | 22 +++++++++++++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/internal/client/client_batch.go b/internal/client/client_batch.go index b7159847b9..a8091094aa 100644 --- a/internal/client/client_batch.go +++ b/internal/client/client_batch.go @@ -70,6 +70,7 @@ type batchCommandsEntry struct { // canceled indicated the request is canceled or not. canceled int32 err error + start time.Time } func (b *batchCommandsEntry) isCanceled() bool { @@ -378,11 +379,14 @@ func (a *batchConn) getClientAndSend() { } defer cli.unlockForSend() + now := time.Now() + tiKVBatchWaitToSendDuration := metrics.TiKVBatchWaitDuration.WithLabelValues("wait-to-send", target) req, forwardingReqs := a.reqBuilder.build(func(id uint64, e *batchCommandsEntry) { cli.batched.Store(id, e) if trace.IsEnabled() { trace.Log(e.ctx, "rpc", "send") } + tiKVBatchWaitToSendDuration.Observe(float64(now.Sub(e.start))) }) if req != nil { cli.send("", req) @@ -507,6 +511,14 @@ func (c *batchCommandsClient) isStopped() bool { } func (c *batchCommandsClient) send(forwardedHost string, req *tikvpb.BatchCommandsRequest) { + start := time.Now() + defer func() { + if forwardedHost == "" { + metrics.TiKVBatchConnSendDuration.WithLabelValues(c.target).Observe(time.Since(start).Seconds()) + } else { + metrics.TiKVBatchConnSendDuration.WithLabelValues(forwardedHost).Observe(time.Since(start).Seconds()) + } + }() err := c.initBatchClient(forwardedHost) if err != nil { logutil.BgLogger().Warn( @@ -773,6 +785,7 @@ func sendBatchRequest( req *tikvpb.BatchCommandsRequest_Request, timeout time.Duration, ) (*tikvrpc.Response, error) { + start := time.Now() entry := &batchCommandsEntry{ ctx: ctx, req: req, @@ -780,11 +793,11 @@ func sendBatchRequest( forwardedHost: forwardedHost, canceled: 0, err: nil, + start: start, } timer := time.NewTimer(timeout) defer timer.Stop() - start := time.Now() select { case batchConn.batchCommandsCh <- entry: case <-ctx.Done(): @@ -795,7 +808,7 @@ func sendBatchRequest( return nil, errors.WithMessage(context.DeadlineExceeded, "wait sendLoop") } waitDuration := time.Since(start) - metrics.TiKVBatchWaitDuration.Observe(float64(waitDuration)) + metrics.TiKVBatchWaitDuration.WithLabelValues("wait-to-chan", addr).Observe(float64(waitDuration)) select { case res, ok := <-entry.res: diff --git a/metrics/metrics.go b/metrics/metrics.go index 5c72f05b28..78b1e88aa3 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -62,7 +62,8 @@ var ( TiKVLocalLatchWaitTimeHistogram prometheus.Histogram TiKVStatusDuration *prometheus.HistogramVec TiKVStatusCounter *prometheus.CounterVec - TiKVBatchWaitDuration prometheus.Histogram + TiKVBatchWaitDuration *prometheus.HistogramVec + TiKVBatchConnSendDuration *prometheus.HistogramVec TiKVBatchSendLatency prometheus.Histogram TiKVBatchWaitOverLoad prometheus.Counter TiKVBatchPendingRequests *prometheus.HistogramVec @@ -333,15 +334,25 @@ func initMetrics(namespace, subsystem string, constLabels prometheus.Labels) { ConstLabels: constLabels, }, []string{LblResult}) - TiKVBatchWaitDuration = prometheus.NewHistogram( + TiKVBatchWaitDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: namespace, Subsystem: subsystem, Name: "batch_wait_duration", - Buckets: prometheus.ExponentialBuckets(1, 2, 34), // 1ns ~ 8s - Help: "batch wait duration", + Buckets: prometheus.ExponentialBuckets(64, 2, 34), // 64ns ~ 549s + Help: "batch-cmd wait duration, unit is nanosecond", ConstLabels: constLabels, - }) + }, []string{LblType, LblStore}) + + TiKVBatchConnSendDuration = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_conn_send_seconds", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 22), // 0.5ms ~ 1048s + Help: "batch conn send duration", + ConstLabels: constLabels, + }, []string{LblStore}) TiKVBatchSendLatency = prometheus.NewHistogram( prometheus.HistogramOpts{ @@ -768,6 +779,7 @@ func RegisterMetrics() { prometheus.MustRegister(TiKVStatusDuration) prometheus.MustRegister(TiKVStatusCounter) prometheus.MustRegister(TiKVBatchWaitDuration) + prometheus.MustRegister(TiKVBatchConnSendDuration) prometheus.MustRegister(TiKVBatchSendLatency) prometheus.MustRegister(TiKVBatchRecvLatency) prometheus.MustRegister(TiKVBatchWaitOverLoad)