FEAT-2. Удалил английское описание и добавил сиквенс
This commit is contained in:
93
README.md
93
README.md
@@ -193,6 +193,51 @@ classDiagram
|
|||||||
ControlChannelBridge ..> ControlChannel : on_start, on_stop, on_status
|
ControlChannelBridge ..> ControlChannel : on_start, on_stop, on_status
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Диаграмма последовательности (запуск и работа)
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
autonumber
|
||||||
|
participant User
|
||||||
|
participant ConfigManagerV2
|
||||||
|
participant ControlChannel as ControlChannel(s)
|
||||||
|
participant WorkerLoop
|
||||||
|
participant ConfigLoader
|
||||||
|
participant Client as HTTP Client
|
||||||
|
|
||||||
|
User->>ConfigManagerV2: start()
|
||||||
|
ConfigManagerV2->>ConfigManagerV2: _start_control_channels()
|
||||||
|
ConfigManagerV2->>ControlChannel: start(on_start, on_stop, on_status)
|
||||||
|
ControlChannel-->>ConfigManagerV2: started
|
||||||
|
|
||||||
|
par Циклы работы
|
||||||
|
ConfigManagerV2->>WorkerLoop: run()
|
||||||
|
loop Периодически
|
||||||
|
WorkerLoop->>ConfigManagerV2: execute()
|
||||||
|
ConfigManagerV2-->>WorkerLoop: success/error
|
||||||
|
end
|
||||||
|
and
|
||||||
|
loop Периодически
|
||||||
|
ConfigManagerV2->>ConfigLoader: load_if_changed()
|
||||||
|
ConfigLoader-->>ConfigManagerV2: config / unchanged
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Note over Client,ControlChannel: Запросы по HTTP API (если HttpControlChannel)
|
||||||
|
|
||||||
|
Client->>ControlChannel: GET /health
|
||||||
|
ControlChannel->>ConfigManagerV2: health_provider.collect()
|
||||||
|
ConfigManagerV2-->>ControlChannel: HealthPayload
|
||||||
|
ControlChannel-->>Client: 200 OK
|
||||||
|
|
||||||
|
Client->>ControlChannel: POST /actions/stop
|
||||||
|
ControlChannel->>ConfigManagerV2: on_stop() (bridge)
|
||||||
|
ConfigManagerV2->>ConfigManagerV2: set halt
|
||||||
|
ConfigManagerV2->>WorkerLoop: halt_event.set()
|
||||||
|
ConfigManagerV2->>ControlChannel: stop()
|
||||||
|
ControlChannel-->>Client: 200 OK
|
||||||
|
```
|
||||||
|
|
||||||
## Логирование
|
## Логирование
|
||||||
Логирование настраивается из конфигурационного файла только если в нём есть секция **`log`** в формате [dictConfig](https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig). Если секции `log` нет, менеджер пишет предупреждение в лог, а уровень Python по умолчанию (WARNING) сохраняется — сообщения INFO/DEBUG могут не отображаться.
|
Логирование настраивается из конфигурационного файла только если в нём есть секция **`log`** в формате [dictConfig](https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig). Если секции `log` нет, менеджер пишет предупреждение в лог, а уровень Python по умолчанию (WARNING) сохраняется — сообщения INFO/DEBUG могут не отображаться.
|
||||||
|
|
||||||
@@ -208,51 +253,3 @@ classDiagram
|
|||||||
- **e-mail**: lesha.spb@gmail.com
|
- **e-mail**: lesha.spb@gmail.com
|
||||||
- **telegram**: https://t.me/lesha_spb
|
- **telegram**: https://t.me/lesha_spb
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Description (English)
|
|
||||||
|
|
||||||
**Config Manager** is a Python package for running applications with periodic execution logic, config reload, and control via HTTP API (and optionally Telegram).
|
|
||||||
|
|
||||||
**Contract:** Your application subclasses **ConfigManagerV2** and overrides **execute()** (periodic work). Control (start/stop, health) is done via channels that are created externally and passed into the constructor as **control_channels** (e.g. **HttpControlChannel** for REST API).
|
|
||||||
|
|
||||||
### Architecture and components
|
|
||||||
|
|
||||||
**ConfigManager** (class **ConfigManagerV2**) is the application entry point. It inherits internal logic from **_RuntimeController** (worker and config-update loops, starting/stopping control channels).
|
|
||||||
|
|
||||||
**Core:**
|
|
||||||
- **ConfigLoader** — reads config from file (YAML/JSON), computes hash and returns config only when changed; on parse error returns last valid config.
|
|
||||||
- **WorkerLoop** — in a separate thread, repeatedly calls your **execute()** with a pause; reacts to stop event and success/error callbacks.
|
|
||||||
- **LogManager** — applies the **log** section from config to logging (dictConfig).
|
|
||||||
- **HealthAggregator** — aggregates state: lifecycle (idle/starting/running/…), last successful **execute()** time and health timeout; produces a single health response (ok/unhealthy).
|
|
||||||
- **ControlChannelBridge** — single bridge for all channels: on_start/on_stop/on_status handlers (halt flag and status text).
|
|
||||||
|
|
||||||
**Control channels:**
|
|
||||||
- **ControlChannel** — abstract contract: **start(on_start, on_stop, on_status)**, **stop()**.
|
|
||||||
- **HttpControlChannel** — HTTP API (**/health**, **/actions/start**, **/actions/stop**, **/actions/status**); uses **UvicornServerRunner**; **/health** calls **HealthAggregator.collect()**, actions use handlers from **ControlChannelBridge**.
|
|
||||||
- **TelegramControlChannel** — implementation via Telegram long polling; commands **/start**, **/stop**, **/status** invoke the same handlers.
|
|
||||||
|
|
||||||
**Flow:** On **start()** the manager starts all channels from **control_channels**, then runs two loops: **WorkerLoop** and periodic config refresh via **ConfigLoader**. API control: **/health**, **/actions/start**, **/actions/stop** when **HttpControlChannel** is in **control_channels**. Halt stops both loops; then all channels are stopped.
|
|
||||||
|
|
||||||
### Running with ConfigManagerV2 and HttpControlChannel
|
|
||||||
|
|
||||||
1. Subclass **ConfigManagerV2** and implement **execute()** (your periodic logic). Optionally override **get_health_status()** for custom **/health** response.
|
|
||||||
2. Create channels externally and pass them to the constructor. For HTTP API create **HttpControlChannel**; for health the manager’s callback is needed — pass **control_channels** as a factory (lambda that receives the manager).
|
|
||||||
3. Start from an async context: **await app.start()** or **asyncio.create_task(app.start())** for background. Stop: **await app.stop()** or HTTP **/actions/stop**.
|
|
||||||
|
|
||||||
See the minimal example in the Russian section above; a full example is in **tests/test_app.py**.
|
|
||||||
|
|
||||||
### Logging
|
|
||||||
|
|
||||||
Logging is configured from the config file only if it contains a **log** section in [dictConfig](https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig) format. If **log** is missing, the manager logs a warning and the default Python level (WARNING) remains.
|
|
||||||
|
|
||||||
### Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install git+https://git.lesha.spb.ru/alex/config_manager.git
|
|
||||||
```
|
|
||||||
|
|
||||||
### Contacts
|
|
||||||
|
|
||||||
- **e-mail**: lesha.spb@gmail.com
|
|
||||||
- **telegram**: https://t.me/lesha_spb
|
|
||||||
|
|||||||
Reference in New Issue
Block a user