raw_data
raw_data, sisteme gelen paketin ilk ve en ham journal kaydıdır. Bu tablonun görevi accepted veri üretmek değil, giriş izini kaybetmemektir.
Bu tablo kabul zincirinin başlangıç noktasıdır. Ingest servisi paketi aldığı anda, doğrulama/parse/duplicate kontrolünden önce tüm paketleri bu tabloya yazar. Böylece parse başarısız veya duplicate olan paketler de kaybolmadan geriye dönük incelenebilir. Firmware ve operasyon ekipleri cihazın gerçekten ne gönderdiğini bu kayıt üzerinden görür.
streams yalnız accepted olayları taşırken raw_data acceptance öncesi journal görevini üstlenir. Bu nedenle accepted olmayan paketler de burada görünür olmalıdır. Kısaca: giriş izi, debug verisi ve kabul öncesi ham payload geçmişi bu tabloda tutulur.
Bu tablo canonical measurement kolonlarını, state özetini, ledger sonucunu veya rule engine state'ini tutmaz. Kısaca: accepted zincirin işlenmiş çıktıları burada değildir.
FK Davranis Notlari
| Bu tabloyu referanslayan FK | ON DELETE | ON UPDATE | Not |
|---|---|---|---|
streams.raw_id -> raw_data.id | SET NULL | CASCADE | Raw kaydi temizlense de accepted stream tarihcesi korunur. |
Retention Uyumu
raw_dataretention politikasistreamsile birlikte ele alinir.- Varsayilan operasyonel kural: raw verisi, accepted zincir dogrulama ve adli inceleme ihtiyacini karsilayacak sure boyunca saklanir; bu sure
streamstablosundaki 24 aylik retention penceresiyle uyumlu planlanir. - Retention degisiklikleri tek tarafli yapilmaz;
raw_datavestreamsicin birlikte migration/operasyon notu acilir.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Raw journal kaydının birincil anahtarı |
stream_id | int | evet | Bu raw kayıttan accepted stream üretildiyse ilgili stream ilişkisi |
device_time | timestamp | evet | Payload içinden çözümlenebilen cihaz zamanı |
device_id | varchar(21) | evet | Payload içinden çözümlenebilen cihaz kimliği |
client_ip | varchar(45) | evet | Paketin geldiği IP bilgisi |
raw_pack | text | evet | Cihazdan geldiği haliyle wire payload |
canonical_payload_hash | varchar(64) | evet | Canonical payload hash'i; duplicate identity kararında kullanılır |
pack_size | int | evet | HTTP body boyutu |
valid_pack | boolean | hayır | Parse + schema açısından accepted aday olup olmadığı (DEFAULT: false) |
validation_code | raw_validation_code | hayır | Paket doğrulama sonucu için enum kodu |
stream_time | timestamp | hayır | Sistemin paketi aldığı/işlediği zaman |
validation_code Enum Sözleşmesi
validation_code, serbest metin yerine doğrudan enum değeri taşır. Bu yaklaşım dashboard filtrelerini, hata oranı ölçümlerini ve ingest davranışını tek sözleşmede toplar.
Önerilen kural:
valid_pack = trueisevalidation_code = 'ACCEPTED'valid_pack = falseisevalidation_codehata enumlarından biri olurvalidation_codeher zaman doludur (NULL kullanılmaz)
Enum kümesi, raw_validation_code tipinde aşağıdaki sabit değerlerden oluşur.
Enum değerleri:
| Kod | Ne zaman yazılır? |
|---|---|
ACCEPTED | Paket parse + schema + duplicate kontrollerini geçip accepted adayıysa |
INVALID_JSON | Payload JSON parse edilemediğinde |
EMPTY_PAYLOAD | Body boş veya anlamlı içerik yoksa |
PACK_SIZE_EXCEEDED | Paket boyutu kabul edilen sınırı aştığında |
MISSING_REQUIRED_FIELD | Zorunlu alanlardan biri yoksa |
INVALID_TIMESTAMP | device_time parse edilemiyor veya format dışıysa |
TIMESTAMP_OUT_OF_RANGE | Zaman çok geçmişte/gelecekte olup iş kuralını bozuyorsa |
DEVICE_ID_MISSING | device_id çıkarılamadıysa |
DEVICE_ID_FORMAT_INVALID | device_id formatı (uzunluk/charset) geçersizse |
UNSUPPORTED_COMMAND | command alanı tanınmayan bir değerse |
SCHEMA_VALIDATION_FAILED | CPS schema doğrulaması genel olarak başarısızsa |
DUPLICATE_PACKET | Paket duplicate identity kontrolünde elenirse |
Not: Üretim ortamında yeni hata durumu eklenecekse önce enum migrate edilmeli, sonra ingest kodu güncellenmelidir.
Örnek Kayıtlar
- Accepted Timed Paket
- Accepted Interrupt Paket
- Rejected Paket
- E2E-001 Accepted Paket
{
"id": 1,
"stream_id": 1,
"device_time": "2026-04-03T10:29:50Z",
"device_id": "46000000C47CA670",
"client_ip": "10.10.1.25",
"raw_pack": "{\"command\":\"timed\",\"device_id\":\"46000000C47CA670\",\"Payload\":{\"VRMS\":[229.4,228.9,230.1],\"IFUND\":[42.3,41.8,42.6]}}",
"canonical_payload_hash": "a1f4d497e3154d2a45c4e23d0bb7f7d798a6b9f4d915cb3dcb9a6ea16f1020ce",
"pack_size": 512,
"valid_pack": true,
"validation_code": "ACCEPTED",
"stream_time": "2026-04-03T10:30:00Z"
}
Özet: Timed telemetry paketi parse/validation sonrası accepted olmuş, stream_id ile accepted zincire bağlanmış.
{
"id": 2,
"stream_id": 2,
"device_time": "2026-04-03T10:24:55Z",
"device_id": "46000000C47CA671",
"client_ip": "10.10.1.26",
"raw_pack": "{\"command\":\"interrupt\",\"device_id\":\"46000000C47CA671\",\"Payload\":{\"TEMP\":24.7,\"HUM\":48.2}}",
"canonical_payload_hash": "7dcac6fcb5b3e3ef622a6dbf3086318ec08f2b1f850d5ea2f10b8ad4e7116f33",
"valid_pack": true,
"validation_code": "ACCEPTED",
"stream_time": "2026-04-03T10:25:00Z"
}
Özet: Interrupt tipi paket accepted olmuş; farklı cihazdan gelen daha küçük payload için de journal + stream ilişki modeli korunuyor.
{
"id": 3,
"stream_id": null,
"device_time": null,
"device_id": null,
"client_ip": "10.10.1.99",
"raw_pack": "{\"command\":\"timed\",\"Payload\":{\"VRMS\":[0,0,0]}}",
"canonical_payload_hash": "5b4cf8943b4d86f03834c2f2e9b9dc0640ddf8f2f3a633ac1f1f6776ca603b84",
"pack_size": 128,
"valid_pack": false,
"validation_code": "DEVICE_ID_MISSING",
"stream_time": "2026-04-03T10:31:00Z"
}
Özet: Paket ingress jurnale yazılmış fakat device kimliği çözümlenemediği için accepted zincire alınmamış (stream_id: null).
{
"id": 101,
"stream_id": 101,
"device_time": "2026-04-09T10:29:50Z",
"device_id": "46000000C47CA670",
"client_ip": "10.10.1.25",
"canonical_payload_hash": "e2e001c7f6a18d91a1d0d09c5dbf5f81235df04fd7f20d522f4a2f6e4c1c101",
"pack_size": 534,
"valid_pack": true,
"validation_code": "ACCEPTED",
"stream_time": "2026-04-09T10:30:00Z"
}
Özet: E2E-001 senaryosunun giriş journal kaydı. Bu satır streams.id=101 ile zinciri başlatır.