This commit is contained in:
2026-06-14 23:12:03 +03:00
parent 181031a753
commit b32279deaf
35 changed files with 1395 additions and 1062 deletions

View File

@@ -149,26 +149,32 @@ func (s *Connection) DeleteMetric(metricID uint32) (err error) {
return s.mustSuccess(s.src)
}
func (s *Connection) AppendMeasure(req proto.AppendMeasureReq) (err error) {
arr := []byte{
proto.TypeAppendMeasure,
0, 0, 0, 0, // metricID
0, 0, 0, 0, // timestamp
0, 0, 0, 0, 0, 0, 0, 0, // value
}
bin.PutUint32(arr[1:], req.MetricID)
bin.PutUint32(arr[5:], req.Timestamp)
bin.PutFloat64(arr[9:], req.Value)
// req
if _, err = s.conn.Write(arr); err != nil {
return
}
return s.mustSuccess(s.src)
// func (s *Connection) AppendMeasure(req proto.AppendMeasureReq) (err error) {
// arr := []byte{
// proto.TypeAppendMeasure,
// 0, 0, 0, 0, // metricID
// 0, 0, 0, 0, // timestamp
// 0, 0, 0, 0, 0, 0, 0, 0, // value
// }
// bin.PutUint32(arr[1:], req.MetricID)
// bin.PutUint32(arr[5:], req.Timestamp)
// bin.PutFloat64(arr[9:], req.Value)
// // req
// if _, err = s.conn.Write(arr); err != nil {
// return
// }
// return s.mustSuccess(s.src)
// }
type AppendMeasuresResult struct {
WrittenCount int
ErrorCode byte
}
func (s *Connection) AppendMeasures(req proto.AppendMeasuresReq) (err error) {
func (s *Connection) AppendMeasures(req proto.AppendMeasuresReq) (result AppendMeasuresResult, err error) {
if len(req.Measures) > 65535 {
return fmt.Errorf("wrong measures qty: %d", len(req.Measures))
err = fmt.Errorf("wrong measures qty: %d", len(req.Measures))
return
}
var (
prefixSize = 7
@@ -188,37 +194,6 @@ func (s *Connection) AppendMeasures(req proto.AppendMeasuresReq) (err error) {
if _, err = s.conn.Write(arr); err != nil {
return
}
return s.mustSuccess(s.src)
}
// type AppendMeasurePerMetricReq struct {
// MetricID uint32
// Measures []Measure
// }
func (s *Connection) AppendMeasurePerMetric(list []proto.MetricMeasure) (_ []proto.AppendError, err error) {
if len(list) > 65535 {
return nil, fmt.Errorf("wrong measures qty: %d", len(list))
}
var (
// 3 bytes: 1b message type + 2b records qty
fixedSize = 3
recordSize = 16
arr = make([]byte, fixedSize+len(list)*recordSize)
)
arr[0] = proto.TypeAppendMeasures
bin.PutUint16(arr[1:], uint16(len(list)))
pos := fixedSize
for _, item := range list {
bin.PutUint32(arr[pos:], item.MetricID)
bin.PutUint32(arr[pos+4:], item.Timestamp)
bin.PutFloat64(arr[pos+8:], item.Value)
pos += recordSize
}
// req
if _, err = s.conn.Write(arr); err != nil {
return
}
// answer
code, err := s.src.ReadByte()
if err != nil {
@@ -226,32 +201,82 @@ func (s *Connection) AppendMeasurePerMetric(list []proto.MetricMeasure) (_ []pro
}
switch code {
case proto.RespValue:
var (
count int
appendErrors []proto.AppendError
)
count, err = bin.ReadUint16AsInt(s.src)
result.WrittenCount, err = bin.ReadUint16AsInt(s.src)
if err != nil {
return
}
for range count {
var ae proto.AppendError
ae.MetricID, err = bin.ReadUint32(s.src)
if err != nil {
return
}
ae.ErrorCode, err = bin.ReadUint16(s.src)
if err != nil {
return
}
appendErrors = append(appendErrors, ae)
result.ErrorCode, err = bin.ReadByte(s.src)
if err != nil {
return
}
return appendErrors, nil
default:
return nil, fmt.Errorf("unknown reponse code %d", code)
err = fmt.Errorf("unknown reponse code %d", code)
return
}
return
}
// type AppendMeasurePerMetricReq struct {
// MetricID uint32
// Measures []Measure
// }
// func (s *Connection) AppendMeasurePerMetric(list []proto.MetricMeasure) (_ []proto.AppendError, err error) {
// if len(list) > 65535 {
// return nil, fmt.Errorf("wrong measures qty: %d", len(list))
// }
// var (
// // 3 bytes: 1b message type + 2b records qty
// fixedSize = 3
// recordSize = 16
// arr = make([]byte, fixedSize+len(list)*recordSize)
// )
// arr[0] = proto.TypeAppendMeasures
// bin.PutUint16(arr[1:], uint16(len(list)))
// pos := fixedSize
// for _, item := range list {
// bin.PutUint32(arr[pos:], item.MetricID)
// bin.PutUint32(arr[pos+4:], item.Timestamp)
// bin.PutFloat64(arr[pos+8:], item.Value)
// pos += recordSize
// }
// // req
// if _, err = s.conn.Write(arr); err != nil {
// return
// }
// // answer
// code, err := s.src.ReadByte()
// if err != nil {
// return
// }
// switch code {
// case proto.RespValue:
// var (
// count int
// appendErrors []proto.AppendError
// )
// count, err = bin.ReadUint16AsInt(s.src)
// if err != nil {
// return
// }
// for range count {
// var ae proto.AppendError
// ae.MetricID, err = bin.ReadUint32(s.src)
// if err != nil {
// return
// }
// ae.ErrorCode, err = bin.ReadUint16(s.src)
// if err != nil {
// return
// }
// appendErrors = append(appendErrors, ae)
// }
// return appendErrors, nil
// default:
// return nil, fmt.Errorf("unknown reponse code %d", code)
// }
// }
func (s *Connection) ListAllInstantMeasures(metricID uint32) (_ []proto.InstantMeasure, err error) {
arr := []byte{
proto.TypeListAllInstantMeasures,
@@ -361,8 +386,10 @@ func (s *Connection) readCumulativeMeasures() (_ []proto.CumulativeMeasure, err
if err != nil {
return nil, fmt.Errorf("read response code: %s", err)
}
fmt.Println("code", code)
switch code {
case proto.RespPartOfValue:
fmt.Println("RespPartOfValue")
var count int
count, err = bin.ReadUint32AsInt(s.src)
if err != nil {
@@ -385,8 +412,10 @@ func (s *Connection) readCumulativeMeasures() (_ []proto.CumulativeMeasure, err
result = append(result, measure)
}
case proto.RespEndOfValue:
fmt.Println("RespEndOfValue")
return result, nil
case proto.RespError:
fmt.Println("RespError")
return nil, s.onError()
default:
return nil, fmt.Errorf("unknown reponse code %d", code)