file

package
v1.8.12 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 9, 2024 License: MIT Imports: 19 Imported by: 0

README

Буфер для хранения данных в файле.

Реализует интерфейс io.ReadWriteCloser и стратегию хранения данных в файле. Для хранения данных использует пакет file.

Объект конфигурации..
type Config struct {
	Directory                 string
	NamePattern               string
	NameForMetric             string
	RotationStrategy          string
	RotationSizeHumanReadable string
	RotationSize              uint64
	Compressor                string
	AutoDelete                bool
}

Описание полей:

Поле Описание Значение по умолчанию Доступные значения
Directory Путь до директории хранения файла, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.directory
- переменная окружения BUFFER_FILE_DIRECTORY
- значение в конфиг файле buffer.file.directory
<os_temp_dir>/app
NamePattern Паттерн наименования шардов файла, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.name_pattern
- переменная окружения BUFFER_FILE_NAME_PATTERN
- значение в конфиг файле buffer.file.name_pattern
data_${unix_time_nano}.bin все доступные значения паттерна, перечислены в пакете file.
NameForMetric Имя буфера в метриках, устанавливает в ручную, должно быть установлено на этапе конфигурирования приложения, до создание объекта буфера
RotationStrategy Стратегия ротации шардов файла, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.rotation.strategy
- переменная окружения BUFFER_FILE_ROTATION_STRATEGY
- значение в конфиг файле buffer.file.rotation.strategy
size - size - ротация шардов по размеру шарда;
- day - ротация шардов раз в день;
- hour - ротация шардов каждый час.
RotationSizeHumanReadable Размер файла при котором создается новый шард файла, в человека удобном формате, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.rotation.size
- переменная окружения BUFFER_FILE_ROTATION_SIZE
- значение в конфиг файле buffer.file.rotation.size
10MiB
RotationSize Размер файла при котором создается новый шард файла в байтах, парсится из поле RotationSizeHumanReadable либо устанавливается вручную, если установлено вручную, то значение в поле RotationSizeHumanReadable игнорируется, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.rotation.size
- переменная окружения BUFFER_FILE_ROTATION_SIZE
- значение в конфиг файле buffer.file.rotation.size
10485760
Compressor Тип алгоритма сжатия, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.compressor
- переменная окружения BUFFER_FILE_COMPRESSOR
- значение в конфиг файле buffer.file.compressor
none - none - не использовать сжатие;
- true - автоматический выбор алгоритма сжатия в зависимости от ОС;
- tar_gz - сжимает готовый шард в архив tar.gz;
- zip - сжимает готовый шард в архив zip;
- lz4 - сжимает входящий поток байтов алгоритмом lz4.
AutoDelete Если true, то после полного прочтения шарда, он будет автоматически удален, этот параметр может быть передан одним из 3-х методов:
- флаг командной строки --buffer.file.auto_delete
- переменная окружения BUFFER_FILE_AUTO_DELETE
- значение в конфиг файле buffer.file.auto_delete
false
Метрики

Метрики добавляются автоматически и не могут быть отключены.

buffer_file_count - счетчик кол. шардов. Доступные лейблы в метрике:

  • app - имя приложения;
  • name - имя буфера из поля конфига NameForMetric.

buffer_file_bytes - счетчик кол. записанных и прочитанных байтов. Доступные лейблы в метрике:

  • app - имя приложения;
  • name - имя буфера из поля конфига NameForMetric;
  • action - тип действия, запись - write, чтение - read;
  • compressor - тип выбранного алгоритма сжатия, если выбран алгоритм сжатия lz4 то метрика будет писаться дважды, на каждое действие записи/чтения, до сжатия и после сжатия.

Documentation

Index

Constants

View Source
const (
	DirectoryFieldName                 = "buffer.file.directory"
	NamePatternFieldName               = "buffer.file.name_pattern"
	RotationStrategyFieldName          = "buffer.file.rotation.strategy"
	RotationSizeHumanReadableFieldName = "buffer.file.rotation.size"
	CompressorFieldName                = "buffer.file.compressor"
	AutoDeleteFieldName                = "buffer.file.auto_delete"

	DayRotationStrategy  = "day"
	HourRotationStrategy = "hour"
	SizeRotationStrategy = "size"

	CompressorNone  = "none"
	CompressorTrue  = "true"
	CompressorTarGZ = "tar_gz"
	CompressorZIP   = "zip"

	NamePatternDefault      = "data_" + namer.UnixTimeNanoPattern + ".bin"
	RotationStrategyDefault = SizeRotationStrategy
	RotationSizeDefault     = 10 * size.MiB
	CompressorDefault       = CompressorNone
	AutoDeleteDefault       = false
)

Variables

View Source
var (
	DirectoryDefault                 = filepath.Join(os.TempDir(), "go_app")
	RotationSizeHumanReadableDefault = size.FormatBinary(RotationSizeDefault)
)
View Source
var Component = &app.Component{
	Dependencies: app.Components{
		configurator.Component,
		metric.Component,
	},
	Constructor: app.Constructor(func(container container.Container) error {
		return container.Provides(
			NewConfig,
			NewWithConfigurator,
			func(buffer *file.File) Buffer { return buffer },
		)
	}),
	BindFlags: app.BindFlags(func(flagSet *pflag.FlagSet, container container.Container) error {
		return container.Invoke(func(config *Config) {
			flagSet.StringVar(&config.Directory, DirectoryFieldName, DirectoryDefault, "directory for storing data files")
			flagSet.StringVar(&config.NamePattern, NamePatternFieldName, NamePatternDefault, fmt.Sprintf(
				"file naming pattern to rotate them. Available preset values: : [%s]",
				strings.Join([]string{
					namer.YearPattern,
					namer.MonthPattern,
					namer.DayPattern,
					namer.HourPattern,
					namer.MinutePattern,
					namer.SecondPattern,
					namer.UnixTimePattern,
					namer.UnixTimeNanoPattern,
				}, ","),
			))
			flagSet.StringVar(&config.RotationStrategy, RotationStrategyFieldName, RotationStrategyDefault, fmt.Sprintf(
				"file rotation strategy. Available strategies: "+
					"%s - file rotation once a day; "+
					"%s - file rotation once per hour; "+
					"%s - rotates the file when it reaches a certain size.",
				DayRotationStrategy,
				HourRotationStrategy,
				SizeRotationStrategy,
			))
			flagSet.StringVar(&config.RotationSizeHumanReadable, RotationSizeHumanReadableFieldName, RotationSizeHumanReadableDefault, fmt.Sprintf(
				"file size to rotate if rotation strategy is selected - %s",
				SizeRotationStrategy,
			))
			flagSet.StringVar(&config.Compressor, CompressorFieldName, CompressorDefault, fmt.Sprintf(
				"data compression algorithm. Available algorithms: "+
					"%s - no compression; "+
					"%s - the algorithm is selected automatically, for unix-like systems tar.gz is selected, for windows - zip; "+
					"%s - compression of the finished file chunk using the tar and gz algorithms; "+
					"%s - compression of the finished file chunk by the zip algorithm.",
				CompressorNone,
				CompressorTrue,
				CompressorTarGZ,
				CompressorZIP,
			))
			flagSet.BoolVar(
				&config.AutoDelete,
				AutoDeleteFieldName,
				AutoDeleteDefault,
				"if true, adds a middleware that removes a file fragment after it has been read completely",
			)
		})
	}),
}

Functions

func New

func New(closer closer.Closer, config *Config, metrics *metric.Metric) (*file.File, error)

func NewWithConfigurator

func NewWithConfigurator(
	closer closer.Closer,
	config *Config,
	configurator configurator.Configurator,
	metric *metric.Metric,
) (*file.File, error)

Types

type Buffer added in v1.8.12

type Buffer io.ReadWriteCloser

type Config

type Config struct {
	Directory                 string
	NamePattern               string
	NameForMetric             string
	RotationStrategy          string
	RotationSizeHumanReadable string
	RotationSize              uint64
	Compressor                string
	AutoDelete                bool
}

func Configuration

func Configuration(config *Config, configurator configurator.Configurator) (*Config, error)

func NewConfig

func NewConfig() *Config

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL