Преминете към основното съдържание

Мониторинг — Data Pipeline

Data pipeline на Dictaro събира данни от ASR заявки (аудио записи и метаданни) и ги изпраща към Azure за дългосрочно съхранение и анализ. Реализиран е като data-collector sidecar контейнер, работещ на DGX Spark заедно с ASR сървъра.

Архитектура

Data Collector Sidecar

Технически детайли

ПараметърСтойност
RuntimePython 3.12-slim
FrameworkFastAPI + Uvicorn
Порт8767
Директорияserver/data-collector/
Dockerfileserver/data-collector/Dockerfile

Dependencies

ПакетВерсияОписание
fastapi>=0.115HTTP framework
uvicorn>=0.30ASGI server
azure-storage-blob[aio]>=12.20Azure Blob Storage client (async)
azure-monitor-ingestion[aio]>=1.0Azure Logs Ingestion API client (async)
azure-identity[aio]>=1.17Azure AD автентикация (async)
aiohttp>=3.9HTTP client

API Endpoints

EndpointМетодОписание
POST /collectPOSTПриема ASR данни и ги записва в Azure
GET /healthGETHealth 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}.wavaudio/wavСуров аудио запис от клиента
{uuid}.jsonapplication/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 трансформацията:

  1. Конвертира timestamp string към TimeGenerated datetime (задължително поле в Log Analytics)
  2. Премахва оригиналното timestamp поле

Таблица AsrRequests_CL

КолонаТипОписание
request_idstringУникален ID на заявката
TimeGenerateddatetimeВреме (от DCR transformation)
hoststringHostname на ASR сървъра
machine_idstringWindows Machine ID на клиента
client_ipstringIP адрес на клиента
language_requestedstringЗаявен език
language_detectedstringДетектиран език
taskstringtranscribe или translate
audio_duration_secrealПродължителност на аудиото (секунди)
audio_size_byteslongРазмер на аудио файла (bytes)
sample_rateintSample rate (Hz)
model_namestringASR модел (напр. canary-1b-v2)
asr_msrealASR processing time (ms)
postprocess_msrealLLM post-processing time (ms)
total_msrealОбщо processing time (ms)
statusstringСтатус (completed/error/disconnected)
transcriptionstringСуров ASR резултат
postprocessed_textstringТекст след LLM обработка
blob_urlstringURL към WAV файла в Blob Storage
postprocess_enabledbooleanДали е активиран post-processing
errorstringСъобщение за грешка (ако има)

Azure ресурси

РесурсТипLocation
Storage AccountAzure Blob Storagenortheurope
Containerasr-recordings
Log Analytics Workspaceworkspace-dictarorgcwdvnortheurope
DCEdictaro-dcenortheurope
DCRCustom-AsrRequests_CL rulenortheurope
Service PrincipalBlob Contributor + Monitoring Metrics Publisher

Конфигурация (Environment Variables)

VariableОписаниеЗадължително
AZURE_STORAGE_CONNECTION_STRINGAzure Blob Storage connection stringЗа Blob upload
AZURE_STORAGE_CONTAINERContainer name (default: asr-recordings)Не
LOG_ANALYTICS_DCE_ENDPOINTDCE endpoint URLЗа Log Analytics
LOG_ANALYTICS_DCR_RULE_IDDCR Rule ID (dcr-...)За Log Analytics
LOG_ANALYTICS_STREAM_NAMEStream name (default: Custom-AsrRequests_CL)Не
AZURE_CLIENT_IDService Principal client IDЗа Log Analytics
AZURE_CLIENT_SECRETService Principal secretЗа Log Analytics
AZURE_TENANT_IDAzure AD tenant IDЗа Log Analytics
COLLECTOR_HOST_LABELHost label за blob path (напр. gx10-804f)Да
SERVER_API_KEYAPI key за автентикация от ASR сървъраПрепоръчително
DATA_COLLECTOR_URLURL на 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 заявки.