diff --git a/app/vmagent/remotewrite/pendingseries.go b/app/vmagent/remotewrite/pendingseries.go index bcab93fb17..23dc72a8ad 100644 --- a/app/vmagent/remotewrite/pendingseries.go +++ b/app/vmagent/remotewrite/pendingseries.go @@ -27,6 +27,9 @@ var ( // the maximum number of rows to send per each block. const maxRowsPerBlock = 10000 +// the maximum number of labels to send per each block. +const maxLabelsPerBlock = 40000 + type pendingSeries struct { mu sync.Mutex wr writeRequest @@ -153,7 +156,7 @@ func (wr *writeRequest) push(src []prompbmarshal.TimeSeries) { for i := range src { tssDst = append(tssDst, prompbmarshal.TimeSeries{}) wr.copyTimeSeries(&tssDst[len(tssDst)-1], &src[i]) - if len(wr.samples) >= maxRowsPerBlock { + if len(wr.samples) >= maxRowsPerBlock || len(wr.labels) >= maxLabelsPerBlock { wr.tss = tssDst wr.flush() tssDst = wr.tss diff --git a/app/vmagent/remotewrite/remotewrite.go b/app/vmagent/remotewrite/remotewrite.go index 3a551ed0e8..6c1c13b7ca 100644 --- a/app/vmagent/remotewrite/remotewrite.go +++ b/app/vmagent/remotewrite/remotewrite.go @@ -151,11 +151,13 @@ func Push(wr *prompbmarshal.WriteRequest) { for len(tss) > 0 { // Process big tss in smaller blocks in order to reduce the maximum memory usage samplesCount := 0 + labelsCount := 0 i := 0 for i < len(tss) { samplesCount += len(tss[i].Samples) + labelsCount += len(tss[i].Labels) i++ - if samplesCount > maxRowsPerBlock { + if samplesCount >= maxRowsPerBlock || labelsCount >= maxLabelsPerBlock { break } }