From f647fb695d730f78f925eaed312ca4d849cb1da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Wed, 11 Dec 2024 20:42:51 +0100 Subject: [PATCH] Don't drop partially unsupported GTFS-RT messages (#159) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't drop only partially supported GTFS-RT messages Previously all messages containing unsupported fields like (alert or vehicle) were ignored, even if they contained an understandable trip_update. Now all possible warnings are emitted, not just the first fatal one. This commit also changes the debug output to show the names of the relevant fields to make it easier to debug GTFS-RT feeds without looking at the MOTIS source code. * refactor --------- Co-authored-by: Felix Gündling --- src/rt/gtfsrt_update.cc | 63 +++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/rt/gtfsrt_update.cc b/src/rt/gtfsrt_update.cc index d01cf125..e5b83402 100644 --- a/src/rt/gtfsrt_update.cc +++ b/src/rt/gtfsrt_update.cc @@ -268,43 +268,52 @@ statistics gtfsrt_update_msg(timetable const& tt, span->SetAttribute("nigiri.gtfsrt.total_entities", msg.entity_size()); for (auto const& entity : msg.entity()) { - if (entity.has_is_deleted() && entity.is_deleted()) { - log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported deleted (tag={}, id={})", tag, entity.id()); - ++stats.unsupported_deleted_; - continue; - } else if (entity.has_alert()) { - log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported alert (tag={}, id={})", tag, entity.id()); - ++stats.unsupported_alert_; - continue; - } else if (entity.has_vehicle()) { - log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported vehicle (tag={}, id={})", tag, entity.id()); - ++stats.unsupported_vehicle_; - continue; - } else if (!entity.has_trip_update()) { + auto const unsupported = [&](bool const is_set, char const* field, + int& stat) { + if (is_set) { + log(log_lvl::error, "rt.gtfs.unsupported", + R"(ignoring unsupported "{}" field (tag={}, id={}))", field, tag, + entity.id()); + ++stat; + } + }; + + unsupported(entity.has_vehicle(), "vehicle", stats.unsupported_vehicle_); + unsupported(entity.has_alert(), "alert", stats.unsupported_alert_); + unsupported(entity.has_is_deleted() && entity.is_deleted(), "deleted", + stats.unsupported_deleted_); + + if (!entity.has_trip_update()) { log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported no trip update (tag={}, id={})", tag, entity.id()); + R"(unsupported: no "trip_update" field (tag={}, id={}), skipping message)", + tag, entity.id()); ++stats.no_trip_update_; continue; - } else if (!entity.trip_update().has_trip()) { + } + + if (!entity.trip_update().has_trip()) { log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported no trip in trip update (tag={}, id={})", tag, - entity.id()); + R"(unsupported: no "trip" field in "trip_update" field (tag={}, id={}), skipping message)", + tag, entity.id()); ++stats.trip_update_without_trip_; continue; - } else if (!entity.trip_update().trip().has_trip_id()) { + } + + if (!entity.trip_update().trip().has_trip_id()) { log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported trip without trip_id (tag={}, id={})", tag, entity.id()); + R"(unsupported: no "trip_id" field in "trip_update.trip" (tag={}, id={}), skipping message)", + tag, entity.id()); ++stats.unsupported_no_trip_id_; continue; - } else if (entity.trip_update().trip().schedule_relationship() != - gtfsrt::TripDescriptor_ScheduleRelationship_SCHEDULED && - entity.trip_update().trip().schedule_relationship() != - gtfsrt::TripDescriptor_ScheduleRelationship_CANCELED) { + } + + if (entity.trip_update().trip().schedule_relationship() != + gtfsrt::TripDescriptor_ScheduleRelationship_SCHEDULED && + entity.trip_update().trip().schedule_relationship() != + gtfsrt::TripDescriptor_ScheduleRelationship_CANCELED) { log(log_lvl::error, "rt.gtfs.unsupported", - "unsupported schedule relationship {} (tag={}, id={})", + "unsupported schedule relationship {} (tag={}, id={}), skipping " + "message", TripDescriptor_ScheduleRelationship_Name( entity.trip_update().trip().schedule_relationship()), tag, entity.id());