text: // Copyright 2015 The etcd Authors
  //
  // 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 store
  
  import (
  	"encoding/json"
  	"sync/atomic"
  )
  
  const (
  	SetSuccess = iota
  	SetFail
  	DeleteSuccess
  	DeleteFail
  	CreateSuccess
  	CreateFail
  	UpdateSuccess
  	UpdateFail
  	CompareAndSwapSuccess
  	CompareAndSwapFail
  	GetSuccess
  	GetFail
  	ExpireCount
  	CompareAndDeleteSuccess
  	CompareAndDeleteFail
  )
  
  type Stats struct {
  
  	// Number of get requests
  
  	GetSuccess uint64 `json:"getsSuccess"`
  	GetFail    uint64 `json:"getsFail"`
  
  	// Number of sets requests
  
  	SetSuccess uint64 `json:"setsSuccess"`
  	SetFail    uint64 `json:"setsFail"`
  
  	// Number of delete requests
  
  	DeleteSuccess uint64 `json:"deleteSuccess"`
  	DeleteFail    uint64 `json:"deleteFail"`
  
  	// Number of update requests
  
  	UpdateSuccess uint64 `json:"updateSuccess"`
  	UpdateFail    uint64 `json:"updateFail"`
  
  	// Number of create requests
  
  	CreateSuccess uint64 `json:"createSuccess"`
  	CreateFail    uint64 `json:"createFail"`
  
  	// Number of testAndSet requests
  
  	CompareAndSwapSuccess uint64 `json:"compareAndSwapSuccess"`
  	CompareAndSwapFail    uint64 `json:"compareAndSwapFail"`
  
  	// Number of compareAndDelete requests
  
  	CompareAndDeleteSuccess uint64 `json:"compareAndDeleteSuccess"`
  	CompareAndDeleteFail    uint64 `json:"compareAndDeleteFail"`
  
  	ExpireCount uint64 `json:"expireCount"`
  
  	Watchers uint64 `json:"watchers"`
  }
  
  func newStats() *Stats {
  	s := new(Stats)
  	return s
  }
  
  func (s *Stats) clone() *Stats {
  	return &Stats{
  		GetSuccess:              s.GetSuccess,
  		GetFail:                 s.GetFail,
  		SetSuccess:              s.SetSuccess,
  		SetFail:                 s.SetFail,
  		DeleteSuccess:           s.DeleteSuccess,
  		DeleteFail:              s.DeleteFail,
  		UpdateSuccess:           s.UpdateSuccess,
  		UpdateFail:              s.UpdateFail,
  		CreateSuccess:           s.CreateSuccess,
  		CreateFail:              s.CreateFail,
  		CompareAndSwapSuccess:   s.CompareAndSwapSuccess,
  		CompareAndSwapFail:      s.CompareAndSwapFail,
  		CompareAndDeleteSuccess: s.CompareAndDeleteSuccess,
  		CompareAndDeleteFail:    s.CompareAndDeleteFail,
  		ExpireCount:             s.ExpireCount,
  		Watchers:                s.Watchers,
  	}
  }
  
  func (s *Stats) toJson() []byte {
  	b, _ := json.Marshal(s)
  	return b
  }
  
  func (s *Stats) Inc(field int) {
  	switch field {
  	case SetSuccess:
  		atomic.AddUint64(&s.SetSuccess, 1)
  	case SetFail:
  		atomic.AddUint64(&s.SetFail, 1)
  	case CreateSuccess:
  		atomic.AddUint64(&s.CreateSuccess, 1)
  	case CreateFail:
  		atomic.AddUint64(&s.CreateFail, 1)
  	case DeleteSuccess:
  		atomic.AddUint64(&s.DeleteSuccess, 1)
  	case DeleteFail:
  		atomic.AddUint64(&s.DeleteFail, 1)
  	case GetSuccess:
  		atomic.AddUint64(&s.GetSuccess, 1)
  	case GetFail:
  		atomic.AddUint64(&s.GetFail, 1)
  	case UpdateSuccess:
  		atomic.AddUint64(&s.UpdateSuccess, 1)
  	case UpdateFail:
  		atomic.AddUint64(&s.UpdateFail, 1)
  	case CompareAndSwapSuccess:
  		atomic.AddUint64(&s.CompareAndSwapSuccess, 1)
  	case CompareAndSwapFail:
  		atomic.AddUint64(&s.CompareAndSwapFail, 1)
  	case CompareAndDeleteSuccess:
  		atomic.AddUint64(&s.CompareAndDeleteSuccess, 1)
  	case CompareAndDeleteFail:
  		atomic.AddUint64(&s.CompareAndDeleteFail, 1)
  	case ExpireCount:
  		atomic.AddUint64(&s.ExpireCount, 1)
  	}
  }
  