docs: clarify analytics runtime scope
This commit is contained in:
@@ -9,7 +9,7 @@ This runbook covers the split GB32960 ingest, history, and analytics runtimes. K
|
|||||||
| GB32960 ingest | `:gb32960-ingest-app` | Accept GB32960 TCP connections, decode/authenticate frames, produce raw and normalized records to Kafka, and send protocol ACKs after required Kafka production succeeds. | TCP `32960`, HTTP `20100` |
|
| GB32960 ingest | `:gb32960-ingest-app` | Accept GB32960 TCP connections, decode/authenticate frames, produce raw and normalized records to Kafka, and send protocol ACKs after required Kafka production succeeds. | TCP `32960`, HTTP `20100` |
|
||||||
| JT808 ingest | `:jt808-ingest-app` | Accept JT/T 808 TCP connections on the production receive port, parse raw frames, archive frame bytes, and produce raw/event envelopes to Kafka. | TCP `808`, HTTP `20482` |
|
| JT808 ingest | `:jt808-ingest-app` | Accept JT/T 808 TCP connections on the production receive port, parse raw frames, archive frame bytes, and produce raw/event envelopes to Kafka. | TCP `808`, HTTP `20482` |
|
||||||
| Vehicle history | `:vehicle-history-app` | Consume GB32960/JT808 raw/event Kafka records, store compact history rows plus TDengine `raw_frames` `parsedJson`/`metadataJson`/`rawUri`, and expose TDengine-backed history APIs. | HTTP `20200` |
|
| Vehicle history | `:vehicle-history-app` | Consume GB32960/JT808 raw/event Kafka records, store compact history rows plus TDengine `raw_frames` `parsedJson`/`metadataJson`/`rawUri`, and expose TDengine-backed history APIs. | HTTP `20200` |
|
||||||
| Vehicle analytics | `:vehicle-analytics-app` | Consume GB32960 event Kafka records and update analytics outputs such as daily vehicle statistics. Vehicle state can also be enabled from this runtime. | HTTP `20300` |
|
| Vehicle analytics | `:vehicle-analytics-app` | Consume JT808 event Kafka records, calculate daily mileage from reported GPS total mileage, and write metrics to `vehicle_stat_metric`. | HTTP `20300` |
|
||||||
|
|
||||||
## Kafka Contract
|
## Kafka Contract
|
||||||
|
|
||||||
@@ -25,7 +25,6 @@ This runbook covers the split GB32960 ingest, history, and analytics runtimes. K
|
|||||||
Default local consumer groups:
|
Default local consumer groups:
|
||||||
|
|
||||||
- History: `vehicle-history`
|
- History: `vehicle-history`
|
||||||
- Analytics state: `vehicle-state` when `VEHICLE_STATE_ENABLED=true`
|
|
||||||
- Analytics statistics: `vehicle-stat`
|
- Analytics statistics: `vehicle-stat`
|
||||||
|
|
||||||
## ACK Semantics
|
## ACK Semantics
|
||||||
@@ -132,7 +131,7 @@ java --sun-misc-unsafe-memory-access=allow \
|
|||||||
-jar modules/apps/vehicle-analytics-app/target/vehicle-analytics-app.jar
|
-jar modules/apps/vehicle-analytics-app/target/vehicle-analytics-app.jar
|
||||||
```
|
```
|
||||||
|
|
||||||
To enable the latest-state API in analytics, also set `VEHICLE_STATE_ENABLED=true` and configure the state repository requirements used by `vehicle-state-service`.
|
`vehicle-analytics-app` is intentionally a metric runtime only. Latest-state APIs belong to `vehicle-state-service` and should be deployed as a separate consumer if that surface is needed.
|
||||||
|
|
||||||
## Health Verification
|
## Health Verification
|
||||||
|
|
||||||
@@ -189,7 +188,7 @@ Expected E2E result when Kafka and all services are running:
|
|||||||
- `vehicle.raw.gb32960.v1` receives a raw archive reference envelope.
|
- `vehicle.raw.gb32960.v1` receives a raw archive reference envelope.
|
||||||
- `vehicle.event.gb32960.v1` receives one or more normalized records.
|
- `vehicle.event.gb32960.v1` receives one or more normalized records.
|
||||||
- `target/split-event-store` receives event-store files after the history service flushes consumed Kafka records, including raw archive reference records.
|
- `target/split-event-store` receives event-store files after the history service flushes consumed Kafka records, including raw archive reference records.
|
||||||
- `target/split-vehicle-stat` receives stat output after analytics consumes applicable event records.
|
- JT808 analytics writes daily mileage rows to MySQL `vehicle_stat_metric` after consuming applicable `vehicle.event.jt808.v1` records.
|
||||||
|
|
||||||
Do not expect `vehicle-history-app` to create raw `.bin` archive files from Kafka raw records in the current implementation. `RawArchiveEventSink` can write archive files only when it receives `VehicleEvent.RawArchive.rawBytes()` inside the same JVM; the Kafka envelope carries only `RawArchiveRef` metadata.
|
Do not expect `vehicle-history-app` to create raw `.bin` archive files from Kafka raw records in the current implementation. `RawArchiveEventSink` can write archive files only when it receives `VehicleEvent.RawArchive.rawBytes()` inside the same JVM; the Kafka envelope carries only `RawArchiveRef` metadata.
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,20 @@ class PortainerComposeResourceLimitsTest {
|
|||||||
.doesNotContain("shared volume mounted to all three services");
|
.doesNotContain("shared volume mounted to all three services");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void splitRunbookKeepsAnalyticsAsJt808MetricRuntimeOnly() throws IOException {
|
||||||
|
String splitRunbook = Files.readString(repositoryRoot()
|
||||||
|
.resolve("docs/operations/gb32960-service-split-runbook.md"));
|
||||||
|
|
||||||
|
assertThat(splitRunbook)
|
||||||
|
.contains("Consume JT808 event Kafka records")
|
||||||
|
.contains("vehicle_stat_metric")
|
||||||
|
.doesNotContain("Analytics state:")
|
||||||
|
.doesNotContain("VEHICLE_STATE_ENABLED")
|
||||||
|
.doesNotContain("latest-state API in analytics")
|
||||||
|
.doesNotContain("Vehicle state can also be enabled from this runtime");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void vehicleAnalyticsComposeOnlyExposesStatConsumerEnvironment() throws IOException {
|
void vehicleAnalyticsComposeOnlyExposesStatConsumerEnvironment() throws IOException {
|
||||||
String compose = Files.readString(repositoryRoot().resolve("deploy/portainer/docker-compose.yml"));
|
String compose = Files.readString(repositoryRoot().resolve("deploy/portainer/docker-compose.yml"));
|
||||||
|
|||||||
Reference in New Issue
Block a user