Skip to content
Merged

Dev #29

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 .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
LISTEN_ADDRESS="0.0.0.0:9876"
METRICS_PATH="/metrics"
BLACKLIST_FILE_PATH="blacklist.example.yaml"
32 changes: 29 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ jobs:
name: coverage-report
path: coverage.out

build:
name: Build
build-linux:
name: Build Linux
needs: [test]
runs-on: ubuntu-latest
steps:
Expand All @@ -46,4 +46,30 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: pg-bash-exporter-static-linux-amd64
path: pg-bash-exporter
path: pg-bash-exporter

build-windows:
name: Build Windows
needs: [test]
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.21'

- name: Build Windows application
run: go build -v -o pg-bash-exporter.exe ./cmd/exporter
env:
GOOS: windows
GOARCH: amd64
CGO_ENABLED: 0

- name: Upload Windows binary
uses: actions/upload-artifact@v4
with:
name: pg-bash-exporter-windows-amd64
path: pg-bash-exporter.exe
54 changes: 26 additions & 28 deletions LIMITATIONS_RU.md
Original file line number Diff line number Diff line change
@@ -1,45 +1,43 @@
### Ограничения и важные особенности

Этот экспортер — гибкий инструмент, но у него есть свои правила и ограничения. Этот документ поможет понять, чего стоит и чего не стоит ожидать от программы.
### Ограничения

#### I. Обработка значений

* **Весь вывод команды читается в память.**
Экспортер не обрабатывает данные потоково. Он сначала полностью выполняет команду, читает **весь её вывод** в оперативную память и только потом начинает его обрабатывать. Если ваша команда может вернуть очень большой объем текста (сотни мегабайт или гигабайты), это может привести к огромному потреблению памяти и падению экспортера. Старайтесь, чтобы ваши команды были "немногословными".
* **Полное чтение вывода команды в память:**
Экспортер не обрабатывает данные потоково. Вывод команды полностью считывается в оперативную память перед обработкой. Команды, генерирующие большой объем данных, могут привести к высокому потреблению памяти.

* **Экспортер понимает только числа.**
Он не умеет преобразовывать текстовые статусы вроде `"active"` или `"running"` в числовые значения (например, 1 или 0). Ваша команда должна сама возвращать готовое число.
* **Парсинг только числовых значений:**
Экспортер не преобразует нечисловые статусы (например, `"active"`) в числовые значения. Команда должна возвращать готовое число.

* **Пустой вывод от команды игнорируется.**
Если ваша команда ничего не вывела в `stdout`, экспортер не создаст метрику и не запишет ошибку в лог. Он не может отличить команду, которая штатно вернула "ничего", от команды, которая "тихо" не сработала.
* **Игнорирование пустого вывода:**
Если команда не возвращает вывод в `stdout`, метрика не создается, и ошибка не логируется.

* **Предполагается, что вывод в кодировке UTF-8.**
Экспортер не умеет работать с бинарными данными или текстом в экзотических кодировках. Весь вывод от команд должен быть в формате UTF-8.
* **Кодировка вывода:**
Вывод команд должен быть в кодировке UTF-8. Бинарные данные и другие кодировки не поддерживаются.

#### II. Выполнение команд

* **Ошибка выполнения важнее результата.**
Если команда завершилась с ненулевым кодом выхода (т.е. с ошибкой), экспортер проигнорирует все, что она вывела в `stdout`, даже если там было валидное число. Ошибка всегда имеет приоритет.
* **Приоритет ошибок выполнения:**
Если команда завершается с ненулевым кодом выхода, ее вывод в `stdout` игнорируется, даже если он содержит валидное число.

* **Черный список не проверяет содержимое скриптов.**
Проверка на опасные команды — поверхностная. Она смотрит только на *первое слово* в строке `command` в вашем конфиге. Например, если в конфиге написано `command: ./my_script.sh`, экспортер проверит, не заблокирована ли команда `./my_script.sh`, но он **не будет** заглядывать внутрь самого файла `my_script.sh`. Если в этом скрипте будет `rm -rf /`, экспортер этого не заметит и выполнит команду. Поэтому, если вы используете shell-скрипты, вся ответственность за их содержимое лежит на вас.
* **Поверхностная проверка черного списка:**
Проверка на запрещенные команды анализирует только первое слово в строке `command`. Содержимое внешних скриптов, вызываемых из `command`, не проверяется.

* **Интерактивные команды "повесят" метрику.**
Не используйте в конфиге команды, которые требуют интерактивного ввода (например, `read password`). Такая команда будет вечно ждать ввода, который никогда не поступит, и "зависнет", пока не отработает по таймауту.
* **Отсутствие поддержки интерактивных команд:**
Команды, требующие интерактивного ввода (например, `read password`), приведут к зависанию сбора метрики до истечения таймаута.

* **Флаг `ignore_blacklist` — это опасно.**
Этот флаг полностью отключает проверку на опасные команды для конкретной метрики. Используйте его, только если на 100% уверены в том, что делаете.
* **Использование флага `ignore_blacklist`:**
Этот флаг отключает проверку черного списка для конкретной метрики. Его следует использовать с осторожностью.

#### III. Что экспортер не умеет (и почему)
#### III. Функциональные ограничения

* **Соблюдать логику `counter`'ов.**
Если вы указали тип метрики `counter`, экспортер не будет проверять, что ее значение только растет. Он просто передаст Prometheus то число, которое вернула ваша команда. Если значение уменьшится, Prometheus посчитает это сбросом счетчика, что может "сломать" ваши графики с `rate()`. Следить за этим — ваша задача.
* **Логика `counter`:**
Экспортер не проверяет, что значение метрики типа `counter` только возрастает. Уменьшение значения будет интерпретировано Prometheus как сброс счетчика.

* **Поддерживать `Histogram` и `Summary`.**
Поддерживаются только два основных типа метрик: `gauge` (измеритель) и `counter` (счетчик).
* **Поддерживаемые типы метрик:**
Поддерживаются только типы `gauge` и `counter`.

* **Работать по HTTPS.**
Экспортер отдает метрики только по обычному HTTP. Шифрование трафика (TLS) не поддерживается.
* **Отсутствие поддержки HTTPS:**
Экспортер предоставляет метрики только по протоколу HTTP.

* **Автоматически находить скрипты.**
Все метрики должны быть явно описаны в одном конфигурационном файле. Экспортер не умеет автоматически подхватывать и запускать скрипты из какой-либо директории.
* **Отсутствие автоматического обнаружения скриптов:**
Все метрики должны быть явно описаны в конфигурационном файле. Автоматический запуск скриптов из директорий не поддерживается.
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.PHONY: build-linux build-windows

build-linux:
@echo "Bilding for linux"
@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o pg-bash-exporter-linux-amd64 ./cmd/exporter

build-windows:
@echo "Building for windows"
@CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -v -o pg-bash-exporter-windows-amd64.exe ./cmd/exporter

Loading