From 95bba154d65bdbfe02e879b38ac3ee50b686b7e9 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Sun, 15 Feb 2015 11:36:23 -0800 Subject: [PATCH] etcdserver: add propose summary --- etcdserver/metrics.go | 41 +++++++++++++++++++++++++++++++++++++++++ etcdserver/server.go | 10 ++++++++++ 2 files changed, 51 insertions(+) create mode 100644 etcdserver/metrics.go diff --git a/etcdserver/metrics.go b/etcdserver/metrics.go new file mode 100644 index 000000000..7077eca87 --- /dev/null +++ b/etcdserver/metrics.go @@ -0,0 +1,41 @@ +// Copyright 2015 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package etcdserver + +import "github.com/coreos/etcd/Godeps/_workspace/src/github.com/prometheus/client_golang/prometheus" + +var ( + // TODO: with label in v3? + proposeDurations = prometheus.NewSummary(prometheus.SummaryOpts{ + Name: "etcdserver_proposal_durations_milliseconds", + Help: "The latency distributions of committing proposal.", + }) + proposePending = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "etcdserver_pending_proposal_total", + Help: "The total number of pending proposals.", + }) + // This is number of proposal failed in client's view. + // The proposal might be later got committed in raft. + proposeFailed = prometheus.NewCounter(prometheus.CounterOpts{ + Name: "etcdserver_proposal_failed_total", + Help: "The total number of failed proposals.", + }) +) + +func init() { + prometheus.MustRegister(proposeDurations) + prometheus.MustRegister(proposePending) + prometheus.MustRegister(proposeFailed) +} diff --git a/etcdserver/server.go b/etcdserver/server.go index fb773bce2..bcb4151c7 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -487,12 +487,22 @@ func (s *EtcdServer) Do(ctx context.Context, r pb.Request) (Response, error) { return Response{}, err } ch := s.w.Register(r.ID) + + // TODO: benchmark the cost of time.Now() + // might be sampling? + start := time.Now() s.r.Propose(ctx, data) + + proposePending.Inc() + defer proposePending.Dec() + select { case x := <-ch: + proposeDurations.Observe(float64(time.Since(start).Nanoseconds() / int64(time.Millisecond))) resp := x.(Response) return resp, resp.err case <-ctx.Done(): + proposeFailed.Inc() s.w.Trigger(r.ID, nil) // GC wait return Response{}, parseCtxErr(ctx.Err()) case <-s.done: