Skip to content

Commit 96054ff

Browse files
committed
Add a new metrics etcd_server_request_duration_seconds to track e2e duration for each request
Signed-off-by: Benjamin Wang <[email protected]>
1 parent 6536395 commit 96054ff

File tree

3 files changed

+98
-2
lines changed

3 files changed

+98
-2
lines changed

server/etcdserver/metrics.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,19 @@ var (
107107
Name: "read_indexes_failed_total",
108108
Help: "The total number of failed read indexes seen.",
109109
})
110+
requestDurationSec = prometheus.NewHistogramVec(
111+
prometheus.HistogramOpts{
112+
Namespace: "etcd",
113+
Subsystem: "server",
114+
Name: "request_duration_seconds",
115+
Help: "Response latency distribution in seconds for each type.",
116+
117+
// lowest bucket start of upper bound 0.001 sec (1 ms) with factor 2
118+
// highest bucket start of 0.001 sec * 2^13 == 8.192 sec
119+
Buckets: prometheus.ExponentialBuckets(0.001, 2, 14),
120+
},
121+
[]string{"type", "success"},
122+
)
110123
leaseExpired = prometheus.NewCounter(prometheus.CounterOpts{
111124
Namespace: "etcd_debugging",
112125
Subsystem: "server",
@@ -173,6 +186,7 @@ func init() {
173186
prometheus.MustRegister(proposalsFailed)
174187
prometheus.MustRegister(slowReadIndex)
175188
prometheus.MustRegister(readIndexFailed)
189+
prometheus.MustRegister(requestDurationSec)
176190
prometheus.MustRegister(leaseExpired)
177191
prometheus.MustRegister(currentVersion)
178192
prometheus.MustRegister(currentGoVersion)

server/etcdserver/v3_server.go

Lines changed: 83 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ func (s *EtcdServer) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRe
131131
)
132132
}
133133
trace.LogIfLong(traceThreshold)
134+
success := err == nil
135+
requestDurationSec.WithLabelValues("Range", strconv.FormatBool(success)).Observe(time.Since(start).Seconds())
134136
}(time.Now())
135137

136138
if !r.Serializable {
@@ -218,6 +220,8 @@ func (s *EtcdServer) Txn(ctx context.Context, r *pb.TxnRequest) (*pb.TxnResponse
218220
defer func(start time.Time) {
219221
txn.WarnOfExpensiveReadOnlyTxnRequest(s.Logger(), s.Cfg.WarningApplyDuration, start, r, resp, err)
220222
trace.LogIfLong(traceThreshold)
223+
success := err == nil
224+
requestDurationSec.WithLabelValues("ReadonlyTxn", strconv.FormatBool(success)).Observe(time.Since(start).Seconds())
221225
}(time.Now())
222226

223227
get := func() {
@@ -837,7 +841,18 @@ func (s *EtcdServer) processInternalRaftRequestOnce(ctx context.Context, r pb.In
837841
}
838842
}
839843

840-
data, err := r.Marshal()
844+
var (
845+
data []byte
846+
err error
847+
start = time.Now()
848+
reqType = getRequestType(&r)
849+
)
850+
defer func() {
851+
success := err == nil
852+
requestDurationSec.WithLabelValues(reqType, strconv.FormatBool(success)).Observe(time.Since(start).Seconds())
853+
}()
854+
855+
data, err = r.Marshal()
841856
if err != nil {
842857
return nil, err
843858
}
@@ -855,7 +870,6 @@ func (s *EtcdServer) processInternalRaftRequestOnce(ctx context.Context, r pb.In
855870
cctx, cancel := context.WithTimeout(ctx, s.Cfg.ReqTimeout())
856871
defer cancel()
857872

858-
start := time.Now()
859873
span := trace.SpanFromContext(ctx)
860874
span.AddEvent("Send raft proposal")
861875
err = s.r.Propose(cctx, data)
@@ -880,6 +894,73 @@ func (s *EtcdServer) processInternalRaftRequestOnce(ctx context.Context, r pb.In
880894
}
881895
}
882896

897+
func getRequestType(r *pb.InternalRaftRequest) string {
898+
switch {
899+
case r.Range != nil:
900+
return "Range"
901+
case r.Put != nil:
902+
return "Put"
903+
case r.DeleteRange != nil:
904+
return "DeleteRange"
905+
case r.Txn != nil:
906+
return "Txn"
907+
case r.Compaction != nil:
908+
return "Compaction"
909+
case r.LeaseGrant != nil:
910+
return "LeaseGrant"
911+
case r.LeaseRevoke != nil:
912+
return "LeaseRevoke"
913+
case r.LeaseCheckpoint != nil:
914+
return "LeaseCheckpoint"
915+
case r.Alarm != nil:
916+
return "Alarm"
917+
case r.Authenticate != nil:
918+
return "Authenticate"
919+
case r.AuthEnable != nil:
920+
return "AuthEnable"
921+
case r.AuthDisable != nil:
922+
return "AuthDisable"
923+
case r.AuthStatus != nil:
924+
return "AuthStatus"
925+
case r.AuthUserAdd != nil:
926+
return "AuthUserAdd"
927+
case r.AuthUserDelete != nil:
928+
return "AuthUserDelete"
929+
case r.AuthUserChangePassword != nil:
930+
return "AuthUserChangePassword"
931+
case r.AuthUserGrantRole != nil:
932+
return "AuthUserGrantRole"
933+
case r.AuthUserGet != nil:
934+
return "AuthUserGet"
935+
case r.AuthUserRevokeRole != nil:
936+
return "AuthUserRevokeRole"
937+
case r.AuthRoleAdd != nil:
938+
return "AuthRoleAdd"
939+
case r.AuthRoleGrantPermission != nil:
940+
return "AuthRoleGrantPermission"
941+
case r.AuthRoleGet != nil:
942+
return "AuthRoleGet"
943+
case r.AuthRoleRevokePermission != nil:
944+
return "AuthRoleRevokePermission"
945+
case r.AuthRoleDelete != nil:
946+
return "AuthRoleDelete"
947+
case r.AuthUserList != nil:
948+
return "AuthUserList"
949+
case r.AuthRoleList != nil:
950+
return "AuthRoleList"
951+
case r.ClusterVersionSet != nil:
952+
return "ClusterVersionSet"
953+
case r.ClusterMemberAttrSet != nil:
954+
return "ClusterMemberAttrSet"
955+
case r.DowngradeInfoSet != nil:
956+
return "DowngradeInfoSet"
957+
case r.DowngradeVersionTest != nil:
958+
return "DowngradeVersionTest"
959+
default:
960+
return "Unknown"
961+
}
962+
}
963+
883964
// Watchable returns a watchable interface attached to the etcdserver.
884965
func (s *EtcdServer) Watchable() mvcc.WatchableKV { return s.KV() }
885966

tests/e2e/metrics_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ func TestNoMetricsMissing(t *testing.T) {
209209
"etcd_server_quota_backend_bytes",
210210
"etcd_server_range_duration_seconds",
211211
"etcd_server_read_indexes_failed_total",
212+
"etcd_server_request_duration_seconds",
212213
"etcd_server_slow_apply_total",
213214
"etcd_server_slow_read_indexes_total",
214215
"etcd_server_snapshot_apply_in_progress_total",

0 commit comments

Comments
 (0)