func Open(path string, l log.Logger, r prometheus.Registerer, opts *Options) (*tsdb.DB, error) {
	if opts.MinBlockDuration > opts.MaxBlockDuration {
		opts.MaxBlockDuration = opts.MinBlockDuration
	}
	// Start with smallest block duration and create exponential buckets until the exceed the
	// configured maximum block duration.
	rngs := tsdb.ExponentialBlockRanges(int64(time.Duration(opts.MinBlockDuration).Seconds()*1000), 10, 3)

	for i, v := range rngs {
		if v > int64(time.Duration(opts.MaxBlockDuration).Seconds()*1000) {
			rngs = rngs[:i]
			break
		}
	}

	db, err := tsdb.Open(path, l, r, &tsdb.Options{
		WALSegmentSize:         int(opts.WALSegmentSize),
		RetentionDuration:      uint64(time.Duration(opts.RetentionDuration).Seconds() * 1000),
		MaxBytes:               int64(opts.MaxBytes),
		BlockRanges:            rngs,
		NoLockfile:             opts.NoLockfile,
		AllowOverlappingBlocks: opts.AllowOverlappingBlocks,
	})
	if err != nil {
		return nil, err
	}
	registerMetrics(db, r)

	return db, nil
}
func Open(path string, l log.Logger, r prometheus.Registerer, opts *Options) (*tsdb.DB, error) {
	if opts.MinBlockDuration > opts.MaxBlockDuration {
		opts.MaxBlockDuration = opts.MinBlockDuration
	}
	
	
	rngs := tsdb.ExponentialBlockRanges(int64(time.Duration(opts.MinBlockDuration).Seconds()*1000), 10, 3)

	for i, v := range rngs {
		if v > int64(time.Duration(opts.MaxBlockDuration).Seconds()*1000) {
			rngs = rngs[:i]
			break
		}
	}

	db, err := tsdb.Open(path, l, r, &tsdb.Options{
		WALSegmentSize:         int(opts.WALSegmentSize),
		RetentionDuration:      uint64(time.Duration(opts.RetentionDuration).Seconds() * 1000),
		MaxBytes:               int64(opts.MaxBytes),
		BlockRanges:            rngs,
		NoLockfile:             opts.NoLockfile,
		AllowOverlappingBlocks: opts.AllowOverlappingBlocks,
	})
	if err != nil {
		return nil, err
	}
	registerMetrics(db, r)

	return db, nil
}
func Open ( path string , l log . Logger , r prometheus . Registerer , opts * Options ) ( * tsdb . DB , error ) { if opts . MinBlockDuration > opts . MaxBlockDuration { opts . MaxBlockDuration = opts . MinBlockDuration } // Start with smallest block duration and create exponential buckets until the exceed the // configured maximum block duration. rngs := tsdb . ExponentialBlockRanges ( int64 ( time . Duration ( opts . MinBlockDuration ) . Seconds ( ) * 1000 ) , 10 , 3 ) for i , v := range rngs { if v > int64 ( time . Duration ( opts . MaxBlockDuration ) . Seconds ( ) * 1000 ) { rngs = rngs [ : i ] break } } db , err := tsdb . Open ( path , l , r , & tsdb . Options { WALSegmentSize : int ( opts . WALSegmentSize ) , RetentionDuration : uint64 ( time . Duration ( opts . RetentionDuration ) . Seconds ( ) * 1000 ) , MaxBytes : int64 ( opts . MaxBytes ) , BlockRanges : rngs , NoLockfile : opts . NoLockfile , AllowOverlappingBlocks : opts . AllowOverlappingBlocks , } ) if err != nil { return nil , err } registerMetrics ( db , r ) return db , nil }
// Open returns a new storage backed by a TSDB database that is configured for Prometheus.
Open returns a new storage backed by a TSDB database that is configured for Prometheus .