Skip to content

Commit

Permalink
Add videowallVkm task and integrate it into sync metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
joao-vasconcelos committed Jan 30, 2025
1 parent 9e80a8c commit 6194524
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 8 deletions.
9 changes: 5 additions & 4 deletions apps/sync-metrics/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ import { demandMetricsByAgencyMonth } from '@/tasks/demand-metrics-by-agency-mon
import { demandMetricsByAgencyYear } from '@/tasks/demand-metrics-by-agency-year.js';
import { demandMetricsByLine } from '@/tasks/demand-metrics-by-line.js';
import { serviceMetrics } from '@/tasks/service-metrics.js';
import { videowallDelays } from '@/tasks/videowall-delays.js';
import { videowallEmptyRides } from '@/tasks/videowall-empty-rides.js';
import { videowallSla } from '@/tasks/videowall-sla.js';
import { videowallValidations } from '@/tasks/videowall-validations.js';

import { videowallDelays } from './tasks/videowall-delays.js';
import { videowallEmptyRides } from './tasks/videowall-empty-rides.js';
import { videowallSla } from './tasks/videowall-sla.js';
import { videowallVkm } from '@/tasks/videowall-vkm.js';

/* * */

Expand Down Expand Up @@ -44,6 +44,7 @@ const RUN_INTERVAL = 60000; // 1 minute
await videowallEmptyRides();
await videowallSla();
await videowallValidations();
await videowallVkm();

//
// Run on every 5th iteration (~ 5 minutes)
Expand Down
26 changes: 22 additions & 4 deletions apps/sync-metrics/src/tasks/videowall-sla.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,28 @@ export const videowallSla = async () => {

if (!rideData.seen_first_at) {
responseResult._cm_simple_three_events_fail_until_now++;
if (rideData.agency_id === '41') responseResult._41_simple_three_events_fail_until_now++;
if (rideData.agency_id === '42') responseResult._42_simple_three_events_fail_until_now++;
if (rideData.agency_id === '43') responseResult._43_simple_three_events_fail_until_now++;
if (rideData.agency_id === '44') responseResult._44_simple_three_events_fail_until_now++;
responseResult._cm_simple_one_validation_transaction_fail_until_now++;
responseResult._cm_simple_three_events_or_simple_one_validation_transaction_fail_until_now++;
if (rideData.agency_id === '41') {
responseResult._41_simple_three_events_fail_until_now++;
responseResult._41_simple_one_validation_transaction_fail_until_now++;
responseResult._41_simple_three_events_or_simple_one_validation_transaction_fail_until_now++;
}
if (rideData.agency_id === '42') {
responseResult._42_simple_three_events_fail_until_now++;
responseResult._42_simple_one_validation_transaction_fail_until_now++;
responseResult._42_simple_three_events_or_simple_one_validation_transaction_fail_until_now++;
}
if (rideData.agency_id === '43') {
responseResult._43_simple_three_events_fail_until_now++;
responseResult._43_simple_one_validation_transaction_fail_until_now++;
responseResult._43_simple_three_events_or_simple_one_validation_transaction_fail_until_now++;
}
if (rideData.agency_id === '44') {
responseResult._44_simple_three_events_fail_until_now++;
responseResult._44_simple_one_validation_transaction_fail_until_now++;
responseResult._44_simple_three_events_or_simple_one_validation_transaction_fail_until_now++;
}
continue;
}

Expand Down
146 changes: 146 additions & 0 deletions apps/sync-metrics/src/tasks/videowall-vkm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/* * */

import { SERVERDB } from '@carrismetropolitana/api-services/SERVERDB';
import { SERVERDB_KEYS } from '@carrismetropolitana/api-settings';
import { CachedResource } from '@carrismetropolitana/api-types/common';
import LOGGER from '@helperkits/logger';
import TIMETRACKER from '@helperkits/timer';
import { rides } from '@tmlmobilidade/services/interfaces';
import { getOperationalDate } from '@tmlmobilidade/services/utils';
import { DateTime } from 'luxon';

/* * */

export const videowallVkm = async () => {
//

LOGGER.title(`Videowall - VKM`);
const globalTimer = new TIMETRACKER();

//
// Setup timestamp boundaries

const operationalDate = getOperationalDate();

//
// Setup the response JSON object

const responseResult = {

// For Area 1
_41_scheduled_vkm_until_now: 0,
_41_simple_one_validation_transaction_vkm_until_now: 0,
_41_simple_three_events_or_simple_one_validation_transaction_vkm_until_now: 0,
_41_simple_three_events_vkm_until_now: 0,

// For Area 2
_42_scheduled_vkm_until_now: 0,
_42_simple_one_validation_transaction_vkm_until_now: 0,
_42_simple_three_events_or_simple_one_validation_transaction_vkm_until_now: 0,
_42_simple_three_events_vkm_until_now: 0,

// For Area 3
_43_scheduled_vkm_until_now: 0,
_43_simple_one_validation_transaction_vkm_until_now: 0,
_43_simple_three_events_or_simple_one_validation_transaction_vkm_until_now: 0,
_43_simple_three_events_vkm_until_now: 0,

// For Area 4
_44_scheduled_vkm_until_now: 0,
_44_simple_one_validation_transaction_vkm_until_now: 0,
_44_simple_three_events_or_simple_one_validation_transaction_vkm_until_now: 0,
_44_simple_three_events_vkm_until_now: 0,

// For the whole CM
_cm_scheduled_vkm_until_now: 0,
_cm_simple_one_validation_transaction_vkm_until_now: 0,
_cm_simple_three_events_or_simple_one_validation_transaction_vkm_until_now: 0,
_cm_simple_three_events_vkm_until_now: 0,

//
};

//
// Get all rides for today

const ridesCollection = await rides.getCollection();
const allRidesForTodayStream = ridesCollection.find({ operational_date: operationalDate, status: 'complete' }).stream();

//
// Iterate on all rides for today

for await (const rideData of allRidesForTodayStream) {
//

//
// Skip rides that should not have started yet (scheduled for the future)

const rideShouldHaveStarted = DateTime.fromJSDate(rideData.start_time_scheduled).diffNow('minutes').minutes < -5;

if (!rideShouldHaveStarted) continue;

//
// If a ride should have already started, but we still
// do not have any data about it, we should count it as FAIL.

responseResult._cm_scheduled_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '41') responseResult._41_scheduled_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '42') responseResult._42_scheduled_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '43') responseResult._43_scheduled_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '44') responseResult._44_scheduled_vkm_until_now += rideData.extension_scheduled;

if (!rideData.seen_first_at) continue;

//
// If a ride should have already started and has already ended,
// and failed the SIMPLE_THREE_VEHICLE_EVENTS test, then we should count it as FAIL.

const rideHasAlreadyEnded = rideData.seen_last_at && DateTime.fromJSDate(rideData.seen_last_at).diffNow('minutes').minutes < -2;
const simpleThreeVehicleEvents = rideData.analysis.find(item => item._id === 'SIMPLE_THREE_VEHICLE_EVENTS');
const simpleOneValidationTransaction = rideData.analysis.find(item => item._id === 'SIMPLE_ONE_VALIDATION_TRANSACTION');

// Skip if ride has not yet ended

if (!rideHasAlreadyEnded) continue;

if (simpleThreeVehicleEvents.grade === 'pass') {
responseResult._cm_simple_three_events_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '41') responseResult._41_simple_three_events_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '42') responseResult._42_simple_three_events_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '43') responseResult._43_simple_three_events_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '44') responseResult._44_simple_three_events_vkm_until_now += rideData.extension_scheduled;
}

if (simpleOneValidationTransaction.grade === 'pass') {
responseResult._cm_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '41') responseResult._41_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
if (rideData.agency_id === '42') responseResult._42_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
if (rideData.agency_id === '43') responseResult._43_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
if (rideData.agency_id === '44') responseResult._44_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
}

if (simpleThreeVehicleEvents.grade === 'pass' || simpleOneValidationTransaction.grade === 'pass') {
responseResult._cm_simple_three_events_or_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled;
if (rideData.agency_id === '41') responseResult._41_simple_three_events_or_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
if (rideData.agency_id === '42') responseResult._42_simple_three_events_or_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
if (rideData.agency_id === '43') responseResult._43_simple_three_events_or_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
if (rideData.agency_id === '44') responseResult._44_simple_three_events_or_simple_one_validation_transaction_vkm_until_now += rideData.extension_scheduled; ;
}

//
}

//
// Save items to the database

const chacheableResource: CachedResource<typeof responseResult> = {
data: responseResult,
timestamp_resource: DateTime.now().toMillis(),
};

await SERVERDB.set(SERVERDB_KEYS.METRICS.VIDEOWALL.VKM, JSON.stringify(chacheableResource));

LOGGER.success(`Done updating items to ${SERVERDB_KEYS.METRICS.VIDEOWALL.VKM} (${globalTimer.get()}).`);

//
};
1 change: 1 addition & 0 deletions packages/settings/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export const SERVERDB_KEYS = Object.freeze({
EMPTY_RIDES: 'metrics:videowall:empty_rides',
SLA: 'metrics:videowall:sla',
VALIDATIONS: 'metrics:videowall:validations',
VKM: 'metrics:videowall:vkm',
},
},
NETWORK: {
Expand Down

0 comments on commit 6194524

Please sign in to comment.