Skip to main content

Envelope: Ingest Servisi

Topic: qapu.ingest
DLQ: qapu.dlq.ingest
Producer: ingest-service

Ingest servisi, cihazlardan gelen CPS (Çok Punkt Sistem) uyumlu paketleri alır, doğrular ve dört tipte event üretir:

  • Başarılı kabul: ingest.accepted.v1
  • İşlemle başarısız: ingest.failed.v1
  • Duplicate tespiti: ingest.duplicate_detected.v1
  • Stuck cihaz (tekrar paket): ingest.stuck_detected.v1

Event Envanteri

EventNe zaman üretilir?ConsumerAmaç
ingest.accepted.v1Paket başarıyla doğrulanıp kabul edildiğindeStream ServisiPipeline'ı tetiklemek
ingest.failed.v1Parse, schema, auth veya storage hatası olduğundaObserver, Replay WorkerHata görünürlüğü ve replay
ingest.duplicate_detected.v1Aynı paket eşik üzerinde tekrar geldiğindeObserver, OpsDuplicate uyarısı
ingest.stuck_detected.v1Cihaz uzun süre aynı paket gönderdiğindeObserver, OpsStuck cihaz uyarısı

ingest.accepted.v1

Özet

BaşlıkDeğer
Topicqapu.ingest
Produceringest-service
ConsumerStream Servisi
TetikleyiciHTTP ile gelen CPS paketi başarıyla doğrulanıp raw DB'ye yazıldığında
KritiklikYüksek — downstream pipeline'ının başlangıcı

Payload

{
"event": "ingest.accepted.v1",
"meta": {
"trace_id": "01a2b3c4d5e6f7g8h9i0",
"producer_service": "ingest-service",
"produced_at": "2026-04-15T10:00:00.100Z",
"process_ms": 9
},
"context": {
"device_id": "400000011D081B70",
"raw_id": 12345,
"stream_id": null,
"device_time": "2026-03-11T15:22:06Z",
"stream_time": "2026-03-11T15:22:00.100Z",
"iccid": "8990000111111111111",
"imei": "357042111111111",
"firmware": "2.3.0"
},
"data": {
"current_stage": "accepted",
"state_version": 1,
"packet_size_bytes": 312,
"message_type": "timed",
"field_count": 24
},
"error": null
}

Alan Açıklamaları

AlanTipZorunluAçıklama
context.device_idstringEvetCihazın DS28C kimliği
context.raw_idintegerEvetraw_packets tablosuna yazılan paket kimliği
context.stream_idintegerHayırHenüz stream oluşmadığı için null
context.device_timedatetimeEvetCihazın paket üretim zamanı
context.stream_timedatetimeEvetIngest servisinde paket alındığı zaman
context.iccidstringHayırSIM ICCID'si (paket içinde varsa)
context.imeistringHayırModem IMEI'si (paket içinde varsa)
context.firmwarestringHayırCihaz firmware versiyonu (paket içinde varsa)
data.current_stagestringEvetSabit: accepted
data.state_versionintegerEvetdevice_buffer Redis state sürümü; idempotency amaçlı
data.packet_size_bytesintegerHayırGelen CPS paketinin bayt boyutu
data.message_typestringEvetCPS mesaj tipi: timed | event | alert | diagnostic | config
data.field_countintegerHayırPaket içindeki alan sayısı

ingest.failed.v1

Özet

BaşlıkDeğer
Topicqapu.ingest
Produceringest-service
ConsumerObserver, Replay Worker
TetikleyiciParse, schema, auth (device_id doğrulama) veya storage hatası
KritiklikYüksek — istek reddedildi; HTTP 4xx/5xx döndü

Payload

{
"event": "ingest.failed.v1",
"meta": {
"trace_id": "01a2b3c4d5e6f7g8h9i1",
"producer_service": "ingest-service",
"produced_at": "2026-04-15T10:00:05.200Z",
"process_ms": 2
},
"context": {
"device_id": "400000011D081B70",
"raw_id": null,
"stream_id": null,
"device_time": null,
"stream_time": "2026-04-15T10:00:05.200Z",
"iccid": null,
"imei": null,
"firmware": null
},
"data": {
"http_status": 422,
"request_size_bytes": 512
},
"error": {
"code": "SCHEMA_VALIDATION_ERROR",
"message": "Required field 'device_time' missing in payload",
"stage": "schema_validation",
"retryable": false
}
}

Alan Açıklamaları

AlanTipZorunluAçıklama
context.device_idstringHayırÇıkarılabilmişse cihaz kimliği; parse hatası ise null
context.device_timedatetimeHayırPayload'da varsa cihaz zamanı; yoksa null
data.http_statusintegerEvetHTTP yanıt kodu: 400, 413, 422, 500 vb.
data.request_size_bytesintegerHayırGelen istek boyutu
error.codestringEvetPARSE_ERROR | SCHEMA_VALIDATION_ERROR | AUTHENTICATION_ERROR | RAW_STORAGE_ERROR | REDIS_ERROR | PAYLOAD_SIZE_ERROR
error.retryablebooleanEvetStorage hatası ise true; schema/parse hatası ise false

ingest.duplicate_detected.v1

Özet

BaşlıkDeğer
Topicqapu.ingest
Produceringest-service
ConsumerObserver, Ops
TetikleyiciAynı paket (device_id + device_time + hash) belirtilen eşik üzerinde tekrar geldiğinde
KritiklikOrta — uyarı; pipeline bloke olmaz

Payload

{
"event": "ingest.duplicate_detected.v1",
"meta": {
"trace_id": "01a2b3c4d5e6f7g8h9i2",
"producer_service": "ingest-service",
"produced_at": "2026-04-15T10:00:15.000Z",
"process_ms": 3
},
"context": {
"device_id": "400000011D081B70",
"raw_id": null,
"stream_id": null,
"device_time": null,
"stream_time": "2026-04-15T10:00:15.000Z",
"iccid": null,
"imei": null,
"firmware": null
},
"data": {
"duplicate_count": 11,
"first_occurrence": "2026-04-15T10:00:00.100Z",
"consecutive_count": 11,
"payload_hash": "sha256:ab12ef34cd56ef78gh90ijkl..."
},
"error": null
}

Alan Açıklamaları

AlanTipZorunluAçıklama
data.duplicate_countintegerEvetTespit edilen toplam tekrar sayısı
data.first_occurrencedatetimeEvetİlk paket alındığı zaman
data.consecutive_countintegerEvetSon duplicate event'ten beri ardışık tekrar sayısı
data.payload_hashstringHayırTekrar eden paketin SHA256 hash özeti

ingest.stuck_detected.v1

Özet

BaşlıkDeğer
Topicqapu.ingest
Produceringest-service
ConsumerObserver, Ops
TetikleyiciCihaz belirtilen zaman periyodu boyunca sadece aynı paket gönderdiğinde
KritiklikOrta — cihaz durma uyarısı; pipeline bloke olmaz

Payload

{
"event": "ingest.stuck_detected.v1",
"meta": {
"trace_id": "01a2b3c4d5e6f7g8h9i3",
"producer_service": "ingest-service",
"produced_at": "2026-04-15T10:15:00.000Z",
"process_ms": 2
},
"context": {
"device_id": "400000011D081B70",
"raw_id": null,
"stream_id": null,
"device_time": null,
"stream_time": "2026-04-15T10:15:00.000Z",
"iccid": null,
"imei": null,
"firmware": null
},
"data": {
"stuck_duration_minutes": 15,
"repeated_count": 45,
"payload_hash": "sha256:ab12ef34cd56ef78gh90ijkl...",
"device_time_last": "2026-04-15T09:50:33Z"
},
"error": null
}

Alan Açıklamaları

AlanTipZorunluAçıklama
data.stuck_duration_minutesintegerEvetCihazın stuck olduğu toplam dakika
data.repeated_countintegerEvetBu periyotta tekrar gelen paket sayısı
data.payload_hashstringHayırTekrar eden paketin SHA256 hash özeti
data.device_time_lastdatetimeEvetCihazın son rapor ettiği device_time (değişmiyorsa stuck)