feat: observe wal write at one time

Signed-off-by: Qiuyu Wu <qiuyu.wu@shopee.com>
This commit is contained in:
Qiuyu Wu 2024-03-20 15:38:01 +08:00
parent 3191002c6d
commit 97efc2ade4
2 changed files with 34 additions and 14 deletions

View File

@ -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
} }

View File

@ -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",