Мониторинг — Data Pipeline
Data pipeline на Dictaro събира данни от ASR заявки (аудио записи и метаданни) и ги изпраща към Azure за дългосрочно съхранение и анализ. Реализиран е като data-collector sidecar контейнер, работещ на DGX Spark заедно с ASR сървъра.
Архитектура
Data Collector Sidecar
Технически детайли
| Параметър | Стойност |
|---|---|
| Runtime | Python 3.12-slim |
| Framework | FastAPI + Uvicorn |
| Порт | 8767 |
| Директория | server/data-collector/ |
| Dockerfile | server/data-collector/Dockerfile |
Dependencies
| Пакет | Версия | Описание |
|---|---|---|
fastapi | >=0.115 | HTTP framework |
uvicorn | >=0.30 | ASGI server |
azure-storage-blob[aio] | >=12.20 | Azure Blob Storage client (async) |
azure-monitor-ingestion[aio] | >=1.0 | Azure Logs Ingestion API client (async) |
azure-identity[aio] | >=1.17 | Azure AD автентикация (async) |
aiohttp | >=3.9 | HTTP client |
API Endpoints
| Endpoint | Метод | Описание |
|---|---|---|
POST /collect | POST | Приема ASR данни и ги записва в Azure |
GET /health | GET | Health check (blob_enabled, log_analytics_enabled) |
Автентикация
/collect endpoint изисква Bearer token (SERVER_API_KEY) в Authorization header. ASR сървърът изпраща тази стойност автоматично.
Поток на данни
Azure Blob Storage
Организация на файловете
asr-recordings/ (container)
└── gx10-804f/ (host label)
└── 2026/ (година)
└── 03/ (месец)
└── 14/ (ден)
├── a1b2c3d4-....wav (аудио запис)
├── a1b2c3d4-....json (метаданни)
├── e5f6g7h8-....wav
└── e5f6g7h8-....json
| Файл | Content-Type | Описание |
|---|---|---|
{uuid}.wav | audio/wav | Суров аудио запис от клиента |
{uuid}.json | application/json | Метаданни + резултат от транскрипция |
Metadata JSON schema
{
"request_id": "a1b2c3d4-e5f6-...",
"timestamp": "2026-03-14T10:30:00+00:00",
"host": "gx10-804f",
"machine_id": "WIN-ABC123",
"client_ip": "192.168.1.100",
"language_requested": "bg",
"language_detected": "bg",
"task": "transcribe",
"audio_duration_sec": 5.2,
"audio_size_bytes": 166400,
"sample_rate": 16000,
"model_name": "canary-1b-v2",
"asr_ms": 450.2,
"postprocess_ms": 120.0,
"total_ms": 570.2,
"status": "completed",
"transcription": "Здравейте, как сте?",
"postprocessed_text": "Здравейте, как сте?",
"postprocess_enabled": true,
"blob_url": "https://..../a1b2c3d4.wav",
"error": null
}
Azure Log Analytics
Data Collection Rule (DCR)
Файл: server/data-collector/dcr-definition.json
DCR трансформацията:
- Конвертира
timestampstring къмTimeGenerateddatetime (задължително поле в Log Analytics) - Премахва оригиналното
timestampполе
Таблица AsrRequests_CL
| Колона | Тип | Описание |
|---|---|---|
request_id | string | Уникален ID на заявката |
TimeGenerated | datetime | Време (от DCR transformation) |
host | string | Hostname на ASR сървъра |
machine_id | string | Windows Machine ID на клиента |
client_ip | string | IP адрес на клиента |
language_requested | string | Заявен език |
language_detected | string | Детектиран език |
task | string | transcribe или translate |
audio_duration_sec | real | Продължителност на аудиото (секунди) |
audio_size_bytes | long | Размер на аудио файла (bytes) |
sample_rate | int | Sample rate (Hz) |
model_name | string | ASR модел (напр. canary-1b-v2) |
asr_ms | real | ASR processing time (ms) |
postprocess_ms | real | LLM post-processing time (ms) |
total_ms | real | Общо processing time (ms) |
status | string | Статус (completed/error/disconnected) |
transcription | string | Суров ASR резултат |
postprocessed_text | string | Текст след LLM обработка |
blob_url | string | URL към WAV файла в Blob Storage |
postprocess_enabled | boolean | Дали е активиран post-processing |
error | string | Съобщение за грешка (ако има) |
Azure ресурси
| Ресурс | Тип | Location |
|---|---|---|
| Storage Account | Azure Blob Storage | northeurope |
| Container | asr-recordings | — |
| Log Analytics Workspace | workspace-dictarorgcwdv | northeurope |
| DCE | dictaro-dce | northeurope |
| DCR | Custom-AsrRequests_CL rule | northeurope |
| Service Principal | Blob Contributor + Monitoring Metrics Publisher | — |
Конфигурация (Environment Variables)
| Variable | Описание | Задължително |
|---|---|---|
AZURE_STORAGE_CONNECTION_STRING | Azure Blob Storage connection string | За Blob upload |
AZURE_STORAGE_CONTAINER | Container name (default: asr-recordings) | Не |
LOG_ANALYTICS_DCE_ENDPOINT | DCE endpoint URL | За Log Analytics |
LOG_ANALYTICS_DCR_RULE_ID | DCR Rule ID (dcr-...) | За Log Analytics |
LOG_ANALYTICS_STREAM_NAME | Stream name (default: Custom-AsrRequests_CL) | Не |
AZURE_CLIENT_ID | Service Principal client ID | За Log Analytics |
AZURE_CLIENT_SECRET | Service Principal secret | За Log Analytics |
AZURE_TENANT_ID | Azure AD tenant ID | За Log Analytics |
COLLECTOR_HOST_LABEL | Host label за blob path (напр. gx10-804f) | Да |
SERVER_API_KEY | API key за автентикация от ASR сървъра | Препоръчително |
DATA_COLLECTOR_URL | URL на collector-а (set на ASR сървъра) | Да |
Graceful degradation
Data collector-ът поддържа частичен режим — може да работи само с Blob Storage, само с Log Analytics, или с двете:
При грешка в upload към Blob или Log Analytics, грешката се логва, но заявката продължава — fire-and-forget модел, за да не забавя ASR обработката.
Анализ на данните
KQL заявки (Log Analytics / Grafana)
// Средно processing time по ден
AsrRequests_CL
| summarize avg(asr_ms) by bin(TimeGenerated, 1d)
// Top 10 езика
AsrRequests_CL
| summarize count() by language_detected
| top 10 by count_
// Error rate
AsrRequests_CL
| summarize
total = count(),
errors = countif(status != "completed")
| extend error_rate = round(todouble(errors) / total * 100, 2)
Synapse Serverless SQL (over Blob metadata)
SELECT language_detected, COUNT(*) as cnt
FROM OPENROWSET(
BULK 'https://<storage>.blob.core.windows.net/asr-recordings/gx10-804f/2026/**/*.json',
FORMAT = 'CSV',
FIELDTERMINATOR = '0x0b',
FIELDQUOTE = '0x0b'
) WITH (doc NVARCHAR(MAX)) AS r
CROSS APPLY OPENJSON(doc) WITH (
language_detected NVARCHAR(10)
) AS j
GROUP BY language_detected
ORDER BY cnt DESC
Synapse Serverless предоставя pay-per-query анализ без idle cost, подходящ за исторически ad-hoc заявки.