Datavision.pl — archiwum metryk i serii czasowych

MILA

Metric Indexed Long Archive

Długoterminowe archiwum metryk z indeksem na zapytania punktowe. Prometheus po 14 dniach pęka, Thanos to operacyjny koszmar, Splunk metrics droższy niż dane.

Pakuje serie czasowe w binarne bloki .mila z Gorilla compression, archiwizuje w S3 z WORM, zapytania PromQL-compatible przez hibernowalną warstwę query — bez stałego klastra 24/7.

PromQL compatible MiFID II DORA HIPAA GDPR Art. 17 Gorilla
GORILLA 10× compress .mila TIME-SERIES BLOCK S3
Wyzwanie

Czy to brzmi znajomo?

Każda organizacja generuje terabajty metryk dziennie. Każda chce je trzymać latami z powodu regulatora. Żadne istniejące rozwiązanie nie robi tego dobrze ekonomicznie — albo płacisz za 24/7 compute, albo masz dane bez indeksu.

⏱️

Prometheus po 14 dniach pęka

Świetne narzędzie do hot search, ale dla retencji 90+ dni potrzebujesz Thanos lub Cortex — czyli Cassandra, Bigtable lub object store + zespół 3-osobowy do utrzymania. Operational cost przewyższa wartość długiej retencji.

💸

Splunk Metrics droższy niż dane

Enterprise SaaS z sześciocyfrowym minimum rocznym, każda metryka idzie do liczników. Klient płaci za 24/7 compute za dane, których nikt nie czyta. Najgorszy ROI w kategorii observability.

🏗️

VictoriaMetrics — wciąż 24/7 compute

Świetna kompresja, świetne queries — ale dalej musisz utrzymać klaster ciągle, bo zapytanie wymaga gorącego indeksu w pamięci. Storage cheap, compute drogi. Dla retencji wieloletniej economics się nie zgadza.

🗄️

Surowy Parquet w S3 — bez indeksu

Najtańsze archiwum, ale punktowe zapytanie zajmuje godzinę. Bez indeksu po metric name i label set, każda query to pełny scan. Audytor pyta o jedną serię sprzed roku — czeka 60 minut na 4 punkty.

10–15×
Tańsze niż Splunk Metrics
3-letnie TCO, 100k samples/s
<3s
Query latency (cold)
Pojedyncza seria, 30 dni
5–10×
Compression ratio
Gorilla + dictionary encoding
0$
Stałego compute
Hibernowalna warstwa query
Rozwiązanie

Jak MILA rozwiązuje te problemy

Format binarny zoptymalizowany pod time-series, nocny D+1 compaction, hibernowalna warstwa zapytań kompatybilna z PromQL — wszystko w jednym S3-natywnym stacku, kompatybilnym z istniejącymi narzędziami Prometheus / Grafana.

🗜️

Gorilla compression dla wartości

Delta-of-delta na timestampach, XOR na float64 values. Średnio 16 bajtów raw → 1.37 bajta. Typowy 10× compression ratio dla regularnych metryk. Mniej miejsca w S3, szybsze query (mniej do zdekodowania).

10× compression
📚

Dictionary encoding dla labels

Per-block dictionary: unique label values mapowane na 2-bajtowy ID. Repeating labels (host, region, service) zajmują 2 bajty zamiast 50+. Wbudowane w format .mila, transparentne dla query layer.

3–5× labels savings
🌙

D+1 nightly compaction

Pojedynczy CronJob mergeuje staging z ostatnich 24h, promuje do WORM archive. Brak distributed coordination, brak race conditions, brak distributed locków. Wzorzec sprawdzony w ELSA, przeniesiony 1:1.

Zero coordination
💤

Hibernowalna warstwa zapytań

Query nodes scale-to-zero gdy idle 30 min. Cold start <10 s. Płacisz za storage, nie za stojący compute klaster. Audytor pyta raz w miesiącu — MILA stoi 720h × $0/h reszty czasu.

$0 idle compute
📊

PromQL kompatybilność

Subset PromQL pokrywający 90% dashboard queries: selektory, agregacje, rate, over_time, histogram_quantile. Grafana datasource plugin: zero zmian w istniejących dashboardach.

Grafana ready
🔒

Compliance-grade od fundamentów

S3 Object Lock COMPLIANCE per block, GDPR pseudonimizacja przy ingest dla PII w labelach (user_id, customer_id), audit trail z chain hash, legal hold per metric series. Wbudowane, nie doklejone.

MiFID II · HIPAA · GDPR
Unikalna właściwość ekonomiczna

PromQL bez stałego klastra

Kluczowa właściwość MILA: warstwa zapytań nie musi działać ciągle. Ingestory zbierają metryki przez Prometheus remote_write. Nocny CronJob buduje bloki .mila. S3 przechowuje archiwum.

Redis metastore i pody query — są potrzebne tylko wtedy, gdy ktoś pyta. Audytor pyta raz w miesiącu, analityk pisze raport raz na kwartał, prokuratura raz w roku. Płacisz za storage, nie za klaster, który stoi.

Zawsze aktywne — minimalny footprint
  • Ingestory (HPA 1-N, niskie zużycie)
  • Nightly CronJob (raz na dobę, ~30 min)
  • S3 — jedyne źródło prawdy
On-demand — spin up gdy potrzeba
  • Redis metastore (rebuild z S3 w <5 min)
  • Query nodes (stateless Quarkus pody)
  • Tear down po zakończeniu zapytania
SCENARIUSZ: AUDYT MiFID II BEST EXECUTION
# Wtorek 14:32 — DPO requestuje rocznych metryk tick data
$ curl 'https://mila/api/v1/query_range?
    query=fix_execution{venue="MTF",sym="VOD.L"}
    &start=2025-05-21&end=2026-05-21&step=1h'
→ Query node warming up... (cold start)
→ Redis metastore rebuild (4m 17s, 2.3B series)
→ Query executing across 365 days...
✓ 8,760 points · 12 series · 47.2 MB · 6.4s
✓ Result delivered to Grafana dashboard
# 30 min później — brak nowych zapytań
→ Query nodes scale-to-zero
→ Redis dropped from cluster
✓ Cost: $0/h idle
# Koszt scenariusza:
# Storage (1y, 2B series, S3-IA): $185/mo
# Query compute (5m wake + 6s): $0.03
# vs Splunk Metrics (24/7): ~$8,400/mo
Zastosowania

Kto potrzebuje MILA?

Rzeczywiste scenariusze dla organizacji, które muszą archiwizować miliardy punktów metrycznych przez lata, z możliwością odpowiedzi na pytanie regulatora w minutach, nie godzinach.

🏦
Fintech i bankowość

Tick data i MiFID II best execution

Best execution reporting wymaga retencji tick data i metryk execution quality przez 5–7 lat. Surowy tick stream to miliony punktów na dzień na instrument. Splunk to enterprise zawał, raw Parquet to brak indeksu na pojedyncze pytanie audytora.

  • Retencja — 5–7 lat per MiFID II Art. 27, MAR, KNF
  • Wolumen — miliony punktów/dzień/instrument, miliardy serii
  • Continuous aggregates — tick → 1m → 1h → 1d, auto-routing query
  • Grafana plugin — istniejące dashboardy execution quality działają bez zmian
📡
Telekomunikacja

Quality-of-Service i raporty regulatora

Operatorzy raportują KPI usług (call drop rate, throughput, latency per komórka, per usługa) do regulatorów. Wolumen: miliony serii × granulacja minutowa × 3–5 lat retencji. Klasyczny TSDB jest nieekonomiczny, raw archive nie ma indeksu.

  • Retencja — 3–5 lat per NSI Polska, EU telco regs
  • Granulacja — cell-level + service-level minute-by-minute
  • Cardinality protection — million distinct cell_id × service × time
  • Continuous aggregates — minute → hour → day dla long retention
IoT i energetyka

Smart metering i sensor telemetry

Smart meters wysyłają pomiary co 15 minut. 1 mln urządzeń = ~100M punktów dziennie. Retencja 4–10 lat per energy regulator. To klasyczny spike use case dla long-term archiwum — wszyscy chcą trzymać dane, mało kto wie jak.

  • Retencja — 4–10 lat per URE Polska, EU electricity directive
  • Wolumen — ~100M punktów/dzień dla 1M urządzeń
  • Ingest — OTLP, custom HMAC z brzegu sieci
  • Cardinality — pseudonimizacja meter_id (PII) przy ingest
🏥
Służba zdrowia

Continuous patient monitoring

ICU monitors, wearables, medical devices generują continuous telemetry pacjenta. HIPAA wymaga 6+ lat retencji z audit trail dostępu. Klasyczny TSDB pęka pod wolumenem, klasyczny EHR nie ma indeksu na metryki.

  • Retencja — 6+ lat per HIPAA, medical device regs
  • PII — patient_id w labelach, pseudonimizacja przy ingest
  • Audit dostępu — integracja z AURA: kto zaglądał do telemetrii
  • Per-device — vitals × device × time, miliony serii
Zgodność regulacyjna

Compliance wbudowane, nie doklejone

MILA spełnia wymagania regulacyjne architekturą, nie konfiguracją na koniec projektu. Niezmienność, audit trail i pseudonimizacja PII w labelach są pierwotnymi pojęciami systemu.

MiFID II
DORA
HIPAA
NIS2
GDPR
ISO 27001

S3 Object Lock — WORM na poziomie infrastruktury

Bloki .mila blokowane natychmiast po promotion ze staging. COMPLIANCE mode default (nieusuwalne), GOVERNANCE z MFA dla wybranych use cases. Retencja konfigurowalna per tenant per metric pattern.

GDPR Art. 17 + WORM — rozwiązany konflikt

Pseudonimizacja przy ingest (default) — labels z PII (user_id, customer_id, email_hash) hashowane HMAC-SHA256 z per-tenant secret. Tombstone fallback (opt-in) dla retroactive removal istniejących danych.

Dual approach

Retention policies per regulation

Config-driven YAML per metric pattern + regulation. MiFID II metrics 5–7 lat, HIPAA monitoring 6+ lat, internal metrics 1 rok. Audytowalne osobno — własny Object Lock dla policy changes.

Audit trail z chain hash

Każda operacja (COMPACTION, READ, EXPORT, RETAIN, LEGAL_HOLD) logowana z kryptograficznym powiązaniem z poprzednim wpisem. Embedded AuditTrailWriter, brak circular dependencies. Wykrycie tampered audit log jest deterministyczne.

Legal hold per metric series

Entity-scoped hold: blokada usunięcia dla konkretnych serii (np. wszystkie metryki klienta X). System automatycznie identyfikuje dotknięte bloki, nakłada S3 Object Lock legal hold flag. Release z four-eyes i MFA.

Cardinality protection

Per-metric per-tenant cardinality budget z alertem na overflow. Sampled mode fallback chroni przed metric explosion (misconfigured klient zalewający milionami unikalnych label setów). Audytor widzi nie tylko co przechowujemy, ale też dlaczego.

Pod maską

Architektura zaprojektowana na lata

Cztery warstwy bez wspólnego stanu — ingest, format, compaction i query działają niezależnie, skalują się osobno, i odtwarzają z S3 jeśli któraś się zgubi.

Warstwa ingestion

Multi-protocol

Prometheus remote_write v2.0, OTLP HTTP, custom HMAC POST. Per-tenant rate limiting, cardinality protection, autentykacja. Staging area lokalnie + S3 backup co 5 min.

Format binary

Block .mila

Gorilla compression na float64 (delta-of-delta + XOR), dictionary encoding labels, sparse index po czasie, bloom filter (ELBF v1, shared z ELSA). Range-GET friendly.

D+1 compaction

Nightly CronJob

Singleton (zero coordination overhead). K-way merge sortowany po (series_id, timestamp). Atomic upload z S3 conditional PUT. Redis metastore rebuild via Lua scripts.

Query layer

PromQL + hibernate

Quarkus pody. Subset PromQL: selectors, aggregations, rate, over_time. Scale-to-zero przy idle 30 min. Cold start <10 s. Auto-routing do continuous aggregates.

Komponent Technologia Uzasadnienie
RuntimeJava 21 + QuarkusNative image, non-blocking I/O, reactive
Object storageS3-compatibleAWS S3, MinIO, Ceph/RGW — identyczne jak DES/ELSA
Format bloku.mila append-only[HEADER][BLOCKS][INDEX][FOOTER] — optimized for time-series
Kompresja wartościGorilla (DoD + XOR)5–10× ratio · 16B raw → 1.37B per point średnio
Kompresja labelsDictionary + SnappyRepeating labels 2 bytes vs 50+ bytes raw
Metastore cacheRedisSorted sets per (tenant, metric); rebuild <5 min z S3
Bloom filterELBF v1Shared z ELSA · niezależny od Guava version
WORMS3 Object LockCOMPLIANCE mode + Extended Retention Management
AuthenticationPrometheus basic / OTLP bearer / HMACWieloprotokolowy entry · per-tenant RBAC
CompactionK8s CronJob (singleton)Brak distributed locków · idempotent restart safe
QueryPromQL subset + Grafana pluginZero migration dashboards z Prometheus
ObservabilityPrometheus + GrafanaExternal Prometheus dla self-monitoring (no recursion)
Datavision.pl

Zacznij archiwizować metryki
z gwarancją odnalezienia ich w przyszłości

Skontaktuj się z nami, aby omówić wdrożenie MILA w Twojej organizacji — migrację z Prometheus / Thanos / VictoriaMetrics, integrację z Grafana, lub plan kompresji TCO dla wieloletniej retencji metryk regulacyjnych.