Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Инкремент №23 #21

Merged
merged 8 commits into from
Nov 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

# Output of the go coverage tool, specifically when used with LiteIDE
*.out
*.out.tmp

# Binaries
cmd/agent/main
Expand All @@ -25,3 +26,5 @@ vendor/
.vscode

.DS_Store

*.prof
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ SERVER_VERSION ?= 0.1.0
BUILD_DATE ?= $(shell date +%F\ %H:%M:%S)
BUILD_COMMIT ?= $(shell git rev-parse --short HEAD)

help: ## display this help screen
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY: help

build: agent server staticlint
.PHONY: build

Expand Down
155 changes: 140 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,157 @@
# go-musthave-metrics-tpl
# Metflix

Шаблон репозитория для трека «Сервер сбора метрик и алертинга».
Учебный проект в рамках курса GO-advanced Яндекс.Практикума. Состоит из:
- сервиса сбора метрик (агент)
- сервиса хранения метрик (сервер)
- утилита статического анализа кода (`multichecker`)

## Начало работы
## Разработка и тестирование
Для получения полного списка доступных команд выполните:
```bash
make help
```

## Миграции
Сервер автоматически применит новые миграции при запуске.

Для работы с миграциями вручную можно установить утилиту [golang-migrate](https://github.com/golang-migrate/migrate):
```bash
go install -tags "postgres" github.com/golang-migrate/migrate/v4/cmd/migrate@latest

# добавление новой миграции:
migrate create -ext sql -dir ./db/migrate -seq имя_миграции

1. Склонируйте репозиторий в любую подходящую директорию на вашем компьютере.
2. В корне репозитория выполните команду `go mod init <name>` (где `<name>` — адрес вашего репозитория на GitHub без префикса `https://`) для создания модуля.
# применить миграции:
migrate -database ${DATABASE_DSN} -path ./db/migrate up

# откатить миграции:
migrate -database ${DATABASE_DSN} -path ./db/migrate down -all
```

## Обновление шаблона

Чтобы иметь возможность получать обновления автотестов и других частей шаблона, выполните команду:
## Документация
Для генерации документации в формате OpenAPI (Swagger) необходимо установить `swag`:
```bash
go install github.com/swaggo/swag/cmd/swag@latest

make build # документация будет доступна на /swagger/index.html после запуска сервера
```
git remote add -m main template https://github.com/Yandex-Practicum/go-musthave-metrics-tpl.git

Также доступна документация в формате godoc:
```bash
$ make godoc
# Project documentation is available at:
# http://127.0.0.1:3000/pkg/github.com/ex0rcist/metflix/pkg/
```

Для обновления кода автотестов выполните команду:
## Запуск сервера

Сервер отвечает за аггрегирование и хранение метрик. Для запуска выполните:
```bash
./cmd/server/server
```

### Опции командной строки
Имеют приоритет перед конфигурационным файлом. Для вывода списка доступных опций и их значений по умолчанию выполните команду:
```bash
./cmd/server/server --help

-a, --address string address:port for HTTP API requests (default "0.0.0.0:8080")
-c, --config string path to configuration file in JSON format
--crypto-key string path to public key to encrypt agent -> server communications
-d, --database string PostgreSQL database DSN
-r, --restore whether to restore state on startup (default true)
-k, --secret string a key to sign outgoing data
-f, --store-file string path to file to store metrics
-i, --store-interval int interval (s) for dumping metrics to the disk
```

### Переменные окружения сервера
Имеют приоритет перед опциями командной строки.

```bash
# Адрес и порт для http-api:
export ADDRESS=0.0.0.0:8080

# Интервал времени в секундах для сохранения метрик на диск
# (значение 0 — делает запись синхронной):
export STORE_INTERVAL=300

# Имя файла, где хранятся значения метрик.
# Пустое значение — отключает функцию записи на диск:
export FILE_STORAGE_PATH="/tmp/devops-metrics-db.json"

# Восстанавливать ли сохраненные значения метрик из файла при старте сервера:
export RESTORE=true

# Секретный ключ для генерации подписи (по умолчанию не задан):
export KEY=

# Путь к приватному RSA ключу (в PEM формате) для расшифровки запросов агент -> сервер
# (по умолчанию не задан):
export CRYPTO_KEY=

# DSN для подключения к базе данных (postgres-only):
export DATABASE_DSN=

# Адрес и порт, по которым доступен инструмент pprof:
export PROFILER_ADDRESS=0.0.0.0:8081

# Путь к конфигурационному файлу в JSON формате:
# Пример конфигурационного файла: ./config/server.example.json
export CONFIG=
```
git fetch template && git checkout template/main .github

## Запуск агента
Агент отвечает за сбор и отправку метрик на сервер. Для запуска выполните:
```bash
./cmd/agent/agent
```

Затем добавьте полученные изменения в свой репозиторий.
### Опции командной строки
Имеют приоритет перед конфигурационным файлом. Посмотреть доступные оции:
```bash
./cmd/agent/agent --help

## Запуск автотестов
-a, --address string address:port for HTTP API requests (default "0.0.0.0:8080")
-c, --config string path to configuration file in JSON format
--crypto-key string path to public key to encrypt agent -> server communications
-p, --poll-interval int interval (s) for polling stats (default 2)
-l, --rate-limit int number of max simultaneous requests to server (default -1)
-r, --report-interval int interval (s) for polling stats (default 10)
-k, --secret string a key to sign outgoing data
```

Для успешного запуска автотестов называйте ветки `iter<number>`, где `<number>` — порядковый номер инкремента. Например, в ветке с названием `iter4` запустятся автотесты для инкрементов с первого по четвёртый.
### Переменные окружения агента
Имеют приоритет перед опциями командной строки.

```bash
# Адрес и порт сервера, агрегирующего метрики:
export ADDRESS=0.0.0.0:8080

# Интервал опроса метрик (в секундах):
export POLL_INTERVAL=2

# Интервал отправки метрик (в секундах):
export REPORT_INTERVAL=10

# Секретный ключ для генерации подписи (по умолчанию не задан):
export KEY=

# Путь к публичному RSA ключу (в PEM формате) для шифрования запросов агент -> сервер
export CRYPTO_KEY=

# Путь к конфигурационному файлу в JSON формате (по умолчанию не задан):
# Пример конфигурационного файла: ./config/agent.example.json
export CONFIG=
```

При мёрже ветки с инкрементом в основную ветку `main` будут запускаться все автотесты.
## Запуск `multichecker`
```bash
./cmd/staticlint/staticlint <packages>
# или
./cmd/staticlint/staticlint ./...

Подробнее про локальный и автоматический запуск читайте в [README автотестов](https://github.com/Yandex-Practicum/go-autotests).
# дополнительная настройка:
./cmd/staticlint/staticlint -help
```
5 changes: 4 additions & 1 deletion cmd/agent/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,8 @@ func main() {
logging.LogFatal(err)
}

agnt.Run()
err = agnt.Run()
if err != nil {
logging.LogFatal(err)
}
}
6 changes: 6 additions & 0 deletions config/agent.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"address": "localhost:8080",
"report_interval": 33,
"poll_interval": 22,
"crypto_key": "./example_key.pub.pem"
}
8 changes: 8 additions & 0 deletions config/server.example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"address": "localhost:8080",
"restore": true,
"store_interval": 1,
"store_file": "./metflix.db",

"crypto_key": "./example_key.pem"
}
Loading
Loading