2019-11-21 07:10:25 -05:00
// Copyright 2019 The Prometheus 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 tsdb
import (
"context"
"fmt"
"path/filepath"
2020-01-30 07:12:43 +00:00
2021-06-11 12:17:59 -04:00
"github.com/go-kit/log"
2020-10-22 11:00:08 +02:00
2020-10-12 09:04:20 -07:00
"github.com/prometheus/prometheus/storage"
2019-11-21 07:10:25 -05:00
)
2020-03-23 15:47:11 +01:00
var ErrInvalidTimes = fmt . Errorf ( "max time is lesser than min time" )
2019-11-21 07:10:25 -05:00
// CreateBlock creates a chunkrange block from the samples passed to it, and writes it to disk.
2020-10-12 09:04:20 -07:00
func CreateBlock ( series [ ] storage . Series , dir string , chunkRange int64 , logger log . Logger ) ( string , error ) {
2019-11-21 07:10:25 -05:00
if chunkRange == 0 {
chunkRange = DefaultBlockDuration
}
if chunkRange < 0 {
2020-03-23 15:47:11 +01:00
return "" , ErrInvalidTimes
2019-11-21 07:10:25 -05:00
}
2020-10-12 09:04:20 -07:00
w , err := NewBlockWriter ( logger , dir , chunkRange )
2019-11-21 07:10:25 -05:00
if err != nil {
return "" , err
}
2020-10-12 09:04:20 -07:00
defer func ( ) {
if err := w . Close ( ) ; err != nil {
logger . Log ( "err closing blockwriter" , err . Error ( ) )
}
} ( )
2019-11-21 07:10:25 -05:00
2022-06-17 06:56:19 +01:00
sampleCount := 0
const commitAfter = 10000
2020-10-12 09:04:20 -07:00
ctx := context . Background ( )
app := w . Appender ( ctx )
for _ , s := range series {
2021-11-06 12:10:04 +02:00
ref := storage . SeriesRef ( 0 )
2020-10-12 09:04:20 -07:00
it := s . Iterator ( )
2021-02-18 12:07:00 +00:00
lset := s . Labels ( )
2020-10-12 09:04:20 -07:00
for it . Next ( ) {
t , v := it . At ( )
2021-02-18 12:07:00 +00:00
ref , err = app . Append ( ref , lset , t , v )
2020-10-12 09:04:20 -07:00
if err != nil {
return "" , err
}
2022-06-17 06:56:19 +01:00
sampleCount ++
2020-10-12 09:04:20 -07:00
}
if it . Err ( ) != nil {
return "" , it . Err ( )
}
2022-06-17 06:56:19 +01:00
// Commit and make a new appender periodically, to avoid building up data in memory.
if sampleCount > commitAfter {
if err = app . Commit ( ) ; err != nil {
return "" , err
}
app = w . Appender ( ctx )
sampleCount = 0
}
2019-11-21 07:10:25 -05:00
}
2020-10-12 09:04:20 -07:00
if err = app . Commit ( ) ; err != nil {
2019-11-21 07:10:25 -05:00
return "" , err
}
2020-10-12 09:04:20 -07:00
ulid , err := w . Flush ( ctx )
2019-11-21 07:10:25 -05:00
if err != nil {
return "" , err
}
return filepath . Join ( dir , ulid . String ( ) ) , nil
}