feat: observe wal write at one time
Signed-off-by: Qiuyu Wu <qiuyu.wu@shopee.com>
This commit is contained in:
parent
3191002c6d
commit
97efc2ade4
@ -20,6 +20,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"go.etcd.io/etcd/pkg/v3/crc"
|
"go.etcd.io/etcd/pkg/v3/crc"
|
||||||
"go.etcd.io/etcd/pkg/v3/ioutil"
|
"go.etcd.io/etcd/pkg/v3/ioutil"
|
||||||
@ -84,17 +85,9 @@ func (e *encoder) encode(rec *walpb.Record) error {
|
|||||||
data = e.buf[:n]
|
data = e.buf[:n]
|
||||||
}
|
}
|
||||||
|
|
||||||
lenField, padBytes := encodeFrameSize(len(data))
|
data, lenField := prepareDataWithPadding(data)
|
||||||
if err = writeUint64(e.bw, lenField, e.uint64buf); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if padBytes != 0 {
|
return write(e.bw, e.uint64buf, data, lenField)
|
||||||
data = append(data, make([]byte, padBytes)...)
|
|
||||||
}
|
|
||||||
n, err = e.bw.Write(data)
|
|
||||||
walWriteBytes.Add(float64(n))
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func encodeFrameSize(dataBytes int) (lenField uint64, padBytes int) {
|
func encodeFrameSize(dataBytes int) (lenField uint64, padBytes int) {
|
||||||
@ -113,10 +106,28 @@ func (e *encoder) flush() error {
|
|||||||
return e.bw.Flush()
|
return e.bw.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeUint64(w io.Writer, n uint64, buf []byte) error {
|
func prepareDataWithPadding(data []byte) ([]byte, uint64) {
|
||||||
// http://golang.org/src/encoding/binary/binary.go
|
lenField, padBytes := encodeFrameSize(len(data))
|
||||||
binary.LittleEndian.PutUint64(buf, n)
|
if padBytes != 0 {
|
||||||
nv, err := w.Write(buf)
|
data = append(data, make([]byte, padBytes)...)
|
||||||
|
}
|
||||||
|
return data, lenField
|
||||||
|
}
|
||||||
|
|
||||||
|
func write(w io.Writer, uint64buf, data []byte, lenField uint64) error {
|
||||||
|
// write padding info
|
||||||
|
binary.LittleEndian.PutUint64(uint64buf, lenField)
|
||||||
|
|
||||||
|
start := time.Now()
|
||||||
|
nv, err := w.Write(uint64buf)
|
||||||
walWriteBytes.Add(float64(nv))
|
walWriteBytes.Add(float64(nv))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the record with padding
|
||||||
|
n, err := w.Write(data)
|
||||||
|
walWriteSec.Observe(time.Since(start).Seconds())
|
||||||
|
walWriteBytes.Add(float64(n))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,15 @@ var (
|
|||||||
Buckets: prometheus.ExponentialBuckets(0.001, 2, 14),
|
Buckets: prometheus.ExponentialBuckets(0.001, 2, 14),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
walWriteSec = prometheus.NewHistogram(prometheus.HistogramOpts{
|
||||||
|
Namespace: "etcd",
|
||||||
|
Subsystem: "disk",
|
||||||
|
Name: "wal_write_duration_seconds",
|
||||||
|
Help: "The latency distributions of write called by WAL.",
|
||||||
|
|
||||||
|
Buckets: prometheus.ExponentialBuckets(0.001, 2, 14),
|
||||||
|
})
|
||||||
|
|
||||||
walWriteBytes = prometheus.NewGauge(prometheus.GaugeOpts{
|
walWriteBytes = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||||
Namespace: "etcd",
|
Namespace: "etcd",
|
||||||
Subsystem: "disk",
|
Subsystem: "disk",
|
||||||
|
Loading…
Reference in New Issue
Block a user