xref: /aosp_15_r20/external/federated-compute/fcp/client/phase_logger_impl.cc (revision 14675a029014e728ec732f129a32e299b2da0601)
1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*14675a02SAndroid Build Coastguard Worker  *
4*14675a02SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker  *
8*14675a02SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker  *
10*14675a02SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker  * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker  */
16*14675a02SAndroid Build Coastguard Worker #include "fcp/client/phase_logger_impl.h"
17*14675a02SAndroid Build Coastguard Worker 
18*14675a02SAndroid Build Coastguard Worker #include <string>
19*14675a02SAndroid Build Coastguard Worker 
20*14675a02SAndroid Build Coastguard Worker #include "absl/time/time.h"
21*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h"
22*14675a02SAndroid Build Coastguard Worker 
23*14675a02SAndroid Build Coastguard Worker namespace fcp {
24*14675a02SAndroid Build Coastguard Worker namespace client {
25*14675a02SAndroid Build Coastguard Worker namespace {
26*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kInitializationErrorPrefix =
27*14675a02SAndroid Build Coastguard Worker     "Error during initialization: ";
28*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kEligibilityCheckinErrorPrefix =
29*14675a02SAndroid Build Coastguard Worker     "Error during eligibility check-in: ";
30*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kEligibilityComputationErrorPrefix =
31*14675a02SAndroid Build Coastguard Worker     "Error during eligibility eval computation: ";
32*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kCheckinErrorPrefix = "Error during check-in: ";
33*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kComputationErrorPrefix =
34*14675a02SAndroid Build Coastguard Worker     "Error during computation: ";
35*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kResultUploadErrorPrefix =
36*14675a02SAndroid Build Coastguard Worker     "Error reporting results: ";
37*14675a02SAndroid Build Coastguard Worker constexpr absl::string_view kFailureUploadErrorPrefix =
38*14675a02SAndroid Build Coastguard Worker     "Error reporting computation failure: ";
39*14675a02SAndroid Build Coastguard Worker }  // anonymous namespace
40*14675a02SAndroid Build Coastguard Worker 
41*14675a02SAndroid Build Coastguard Worker using ::fcp::client::opstats::OperationalStats;
42*14675a02SAndroid Build Coastguard Worker using ::google::internal::federatedml::v2::RetryWindow;
43*14675a02SAndroid Build Coastguard Worker 
UpdateRetryWindowAndNetworkStats(const RetryWindow & retry_window,const NetworkStats & network_stats)44*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::UpdateRetryWindowAndNetworkStats(
45*14675a02SAndroid Build Coastguard Worker     const RetryWindow& retry_window, const NetworkStats& network_stats) {
46*14675a02SAndroid Build Coastguard Worker   opstats_logger_->SetRetryWindow(retry_window);
47*14675a02SAndroid Build Coastguard Worker 
48*14675a02SAndroid Build Coastguard Worker   // Update the network stats.
49*14675a02SAndroid Build Coastguard Worker   opstats_logger_->SetNetworkStats(network_stats);
50*14675a02SAndroid Build Coastguard Worker }
51*14675a02SAndroid Build Coastguard Worker 
SetModelIdentifier(absl::string_view model_identifier)52*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::SetModelIdentifier(absl::string_view model_identifier) {
53*14675a02SAndroid Build Coastguard Worker   event_publisher_->SetModelIdentifier(std::string(model_identifier));
54*14675a02SAndroid Build Coastguard Worker   log_manager_->SetModelIdentifier(std::string(model_identifier));
55*14675a02SAndroid Build Coastguard Worker }
56*14675a02SAndroid Build Coastguard Worker 
LogTaskNotStarted(absl::string_view error_message)57*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogTaskNotStarted(absl::string_view error_message) {
58*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishTaskNotStarted(error_message);
59*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
60*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_TRAIN_NOT_STARTED,
61*14675a02SAndroid Build Coastguard Worker       std::string(error_message));
62*14675a02SAndroid Build Coastguard Worker }
63*14675a02SAndroid Build Coastguard Worker 
LogNonfatalInitializationError(absl::Status error_status)64*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogNonfatalInitializationError(
65*14675a02SAndroid Build Coastguard Worker     absl::Status error_status) {
66*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(
67*14675a02SAndroid Build Coastguard Worker       error_status, kInitializationErrorPrefix, /* keep_error_message= */ true);
68*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishNonfatalInitializationError(error_message);
69*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
70*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_INITIALIZATION_ERROR_FATAL,
71*14675a02SAndroid Build Coastguard Worker       error_message);
72*14675a02SAndroid Build Coastguard Worker }
73*14675a02SAndroid Build Coastguard Worker 
LogFatalInitializationError(absl::Status error_status)74*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogFatalInitializationError(absl::Status error_status) {
75*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(
76*14675a02SAndroid Build Coastguard Worker       error_status, kInitializationErrorPrefix, /* keep_error_message= */ true);
77*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishFatalInitializationError(error_message);
78*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
79*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_INITIALIZATION_ERROR_NONFATAL,
80*14675a02SAndroid Build Coastguard Worker       error_message);
81*14675a02SAndroid Build Coastguard Worker }
82*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinStarted()83*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinStarted() {
84*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalCheckin();
85*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
86*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_CHECKIN_STARTED);
87*14675a02SAndroid Build Coastguard Worker }
88*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinIOError(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_checkin)89*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinIOError(
90*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
91*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin) {
92*14675a02SAndroid Build Coastguard Worker   std::string error_message =
93*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityCheckinErrorPrefix,
94*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
95*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalCheckinIoError(
96*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
97*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
98*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_CHECKIN_ERROR_IO,
99*14675a02SAndroid Build Coastguard Worker       error_message);
100*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
101*14675a02SAndroid Build Coastguard Worker }
102*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinClientInterrupted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_checkin)103*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinClientInterrupted(
104*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
105*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin) {
106*14675a02SAndroid Build Coastguard Worker   std::string error_message =
107*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityCheckinErrorPrefix,
108*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
109*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalCheckinClientInterrupted(
110*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
111*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
112*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::
113*14675a02SAndroid Build Coastguard Worker           EVENT_KIND_ELIGIBILITY_CHECKIN_CLIENT_INTERRUPTED,
114*14675a02SAndroid Build Coastguard Worker       error_message);
115*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
116*14675a02SAndroid Build Coastguard Worker }
117*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinServerAborted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_checkin)118*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinServerAborted(
119*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
120*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin) {
121*14675a02SAndroid Build Coastguard Worker   std::string error_message =
122*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityCheckinErrorPrefix,
123*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
124*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalCheckinServerAborted(
125*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
126*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
127*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_CHECKIN_SERVER_ABORTED,
128*14675a02SAndroid Build Coastguard Worker       error_message);
129*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
130*14675a02SAndroid Build Coastguard Worker }
131*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalNotConfigured(const NetworkStats & network_stats,absl::Time time_before_checkin)132*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalNotConfigured(
133*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time time_before_checkin) {
134*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalNotConfigured(
135*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - time_before_checkin);
136*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
137*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_DISABLED);
138*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
139*14675a02SAndroid Build Coastguard Worker }
140*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinTurnedAway(const NetworkStats & network_stats,absl::Time time_before_checkin)141*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinTurnedAway(
142*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time time_before_checkin) {
143*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalRejected(
144*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - time_before_checkin);
145*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
146*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_REJECTED);
147*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
148*14675a02SAndroid Build Coastguard Worker }
149*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinInvalidPayloadError(absl::string_view error_message,const NetworkStats & network_stats,absl::Time time_before_checkin)150*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinInvalidPayloadError(
151*14675a02SAndroid Build Coastguard Worker     absl::string_view error_message, const NetworkStats& network_stats,
152*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin) {
153*14675a02SAndroid Build Coastguard Worker   log_manager_->LogDiag(
154*14675a02SAndroid Build Coastguard Worker       ProdDiagCode::
155*14675a02SAndroid Build Coastguard Worker           BACKGROUND_TRAINING_ELIGIBILITY_EVAL_FAILED_CANNOT_PARSE_PLAN);
156*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalCheckinErrorInvalidPayload(
157*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
158*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
159*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::
160*14675a02SAndroid Build Coastguard Worker           EVENT_KIND_ELIGIBILITY_CHECKIN_ERROR_INVALID_PAYLOAD,
161*14675a02SAndroid Build Coastguard Worker       std::string(error_message));
162*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
163*14675a02SAndroid Build Coastguard Worker }
164*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinPlanUriReceived(const NetworkStats & network_stats,absl::Time time_before_checkin)165*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinPlanUriReceived(
166*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time time_before_checkin) {
167*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
168*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_PLAN_URI_RECEIVED);
169*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalPlanUriReceived(
170*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - time_before_checkin);
171*14675a02SAndroid Build Coastguard Worker }
172*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinCompleted(const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time time_before_plan_download)173*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinCompleted(
174*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time time_before_checkin,
175*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_plan_download) {
176*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
177*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_ENABLED);
178*14675a02SAndroid Build Coastguard Worker   absl::Time before_time = time_before_plan_download;
179*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalPlanReceived(
180*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - before_time);
181*14675a02SAndroid Build Coastguard Worker 
182*14675a02SAndroid Build Coastguard Worker   // The 'EligibilityEvalCheckinLatency' should cover the whole period from
183*14675a02SAndroid Build Coastguard Worker   // eligibility eval checkin to completion (and not just the period from EET
184*14675a02SAndroid Build Coastguard Worker   // plan URIs being received to completion).
185*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalCheckinLatency(time_before_checkin);
186*14675a02SAndroid Build Coastguard Worker }
187*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationStarted()188*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationStarted() {
189*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalComputationStarted();
190*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
191*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_COMPUTATION_STARTED);
192*14675a02SAndroid Build Coastguard Worker }
193*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationInvalidArgument(absl::Status error_status,const ExampleStats & example_stats,absl::Time run_plan_start_time)194*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationInvalidArgument(
195*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
196*14675a02SAndroid Build Coastguard Worker     absl::Time run_plan_start_time) {
197*14675a02SAndroid Build Coastguard Worker   std::string error_message =
198*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityComputationErrorPrefix,
199*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
200*14675a02SAndroid Build Coastguard Worker   log_manager_->LogDiag(
201*14675a02SAndroid Build Coastguard Worker       ProdDiagCode::BACKGROUND_TRAINING_FAILED_PLAN_FAILS_SANITY_CHECK);
202*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalComputationInvalidArgument(
203*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, absl::Now() - run_plan_start_time);
204*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
205*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::
206*14675a02SAndroid Build Coastguard Worker           EVENT_KIND_ELIGIBILITY_COMPUTATION_ERROR_INVALID_ARGUMENT,
207*14675a02SAndroid Build Coastguard Worker       error_message);
208*14675a02SAndroid Build Coastguard Worker }
209*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationExampleIteratorError(absl::Status error_status,const ExampleStats & example_stats,absl::Time run_plan_start_time)210*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationExampleIteratorError(
211*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
212*14675a02SAndroid Build Coastguard Worker     absl::Time run_plan_start_time) {
213*14675a02SAndroid Build Coastguard Worker   std::string error_message =
214*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityComputationErrorPrefix,
215*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
216*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalComputationExampleIteratorError(
217*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, absl::Now() - run_plan_start_time);
218*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
219*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::
220*14675a02SAndroid Build Coastguard Worker           EVENT_KIND_ELIGIBILITY_COMPUTATION_ERROR_EXAMPLE_ITERATOR,
221*14675a02SAndroid Build Coastguard Worker       error_message);
222*14675a02SAndroid Build Coastguard Worker }
223*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationTensorflowError(absl::Status error_status,const ExampleStats & example_stats,absl::Time run_plan_start_time,absl::Time reference_time)224*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationTensorflowError(
225*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
226*14675a02SAndroid Build Coastguard Worker     absl::Time run_plan_start_time, absl::Time reference_time) {
227*14675a02SAndroid Build Coastguard Worker   std::string error_message =
228*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityComputationErrorPrefix,
229*14675a02SAndroid Build Coastguard Worker                       log_tensorflow_error_messages_);
230*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalComputationTensorflowError(
231*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, absl::Now() - run_plan_start_time);
232*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
233*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::
234*14675a02SAndroid Build Coastguard Worker           EVENT_KIND_ELIGIBILITY_COMPUTATION_ERROR_TENSORFLOW,
235*14675a02SAndroid Build Coastguard Worker       error_message);
236*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalComputationLatency(run_plan_start_time, reference_time);
237*14675a02SAndroid Build Coastguard Worker }
238*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationInterrupted(absl::Status error_status,const ExampleStats & example_stats,absl::Time run_plan_start_time,absl::Time reference_time)239*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationInterrupted(
240*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
241*14675a02SAndroid Build Coastguard Worker     absl::Time run_plan_start_time, absl::Time reference_time) {
242*14675a02SAndroid Build Coastguard Worker   std::string error_message =
243*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kEligibilityComputationErrorPrefix,
244*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
245*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalComputationInterrupted(
246*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, absl::Now() - run_plan_start_time);
247*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
248*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::
249*14675a02SAndroid Build Coastguard Worker           EVENT_KIND_ELIGIBILITY_COMPUTATION_CLIENT_INTERRUPTED,
250*14675a02SAndroid Build Coastguard Worker       error_message);
251*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalComputationLatency(run_plan_start_time, reference_time);
252*14675a02SAndroid Build Coastguard Worker }
253*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationCompleted(const ExampleStats & example_stats,absl::Time run_plan_start_time,absl::Time reference_time)254*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationCompleted(
255*14675a02SAndroid Build Coastguard Worker     const ExampleStats& example_stats, absl::Time run_plan_start_time,
256*14675a02SAndroid Build Coastguard Worker     absl::Time reference_time) {
257*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishEligibilityEvalComputationCompleted(
258*14675a02SAndroid Build Coastguard Worker       example_stats, absl::Now() - run_plan_start_time);
259*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
260*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_ELIGIBILITY_COMPUTATION_FINISHED);
261*14675a02SAndroid Build Coastguard Worker   log_manager_->LogToLongHistogram(
262*14675a02SAndroid Build Coastguard Worker       HistogramCounters::TRAINING_OVERALL_EXAMPLE_SIZE,
263*14675a02SAndroid Build Coastguard Worker       example_stats.example_size_bytes);
264*14675a02SAndroid Build Coastguard Worker   log_manager_->LogToLongHistogram(
265*14675a02SAndroid Build Coastguard Worker       HistogramCounters::TRAINING_OVERALL_EXAMPLE_COUNT,
266*14675a02SAndroid Build Coastguard Worker       example_stats.example_count);
267*14675a02SAndroid Build Coastguard Worker   LogEligibilityEvalComputationLatency(run_plan_start_time, reference_time);
268*14675a02SAndroid Build Coastguard Worker }
269*14675a02SAndroid Build Coastguard Worker 
LogCheckinStarted()270*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinStarted() {
271*14675a02SAndroid Build Coastguard Worker   // Log that we are about to check in with the server.
272*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckin();
273*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
274*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_STARTED);
275*14675a02SAndroid Build Coastguard Worker }
276*14675a02SAndroid Build Coastguard Worker 
LogCheckinIOError(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time reference_time)277*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinIOError(absl::Status error_status,
278*14675a02SAndroid Build Coastguard Worker                                         const NetworkStats& network_stats,
279*14675a02SAndroid Build Coastguard Worker                                         absl::Time time_before_checkin,
280*14675a02SAndroid Build Coastguard Worker                                         absl::Time reference_time) {
281*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(error_status, kCheckinErrorPrefix,
282*14675a02SAndroid Build Coastguard Worker                                               /* keep_error_message= */ true);
283*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckinIoError(error_message, network_stats,
284*14675a02SAndroid Build Coastguard Worker                                           absl::Now() - time_before_checkin);
285*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
286*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_ERROR_IO, error_message);
287*14675a02SAndroid Build Coastguard Worker   LogCheckinLatency(time_before_checkin, reference_time);
288*14675a02SAndroid Build Coastguard Worker }
289*14675a02SAndroid Build Coastguard Worker 
LogCheckinClientInterrupted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time reference_time)290*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinClientInterrupted(
291*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
292*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin, absl::Time reference_time) {
293*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(error_status, kCheckinErrorPrefix,
294*14675a02SAndroid Build Coastguard Worker                                               /* keep_error_message= */ true);
295*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckinClientInterrupted(
296*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
297*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
298*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_CLIENT_INTERRUPTED,
299*14675a02SAndroid Build Coastguard Worker       error_message);
300*14675a02SAndroid Build Coastguard Worker   LogCheckinLatency(time_before_checkin, reference_time);
301*14675a02SAndroid Build Coastguard Worker }
302*14675a02SAndroid Build Coastguard Worker 
LogCheckinServerAborted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time reference_time)303*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinServerAborted(absl::Status error_status,
304*14675a02SAndroid Build Coastguard Worker                                               const NetworkStats& network_stats,
305*14675a02SAndroid Build Coastguard Worker                                               absl::Time time_before_checkin,
306*14675a02SAndroid Build Coastguard Worker                                               absl::Time reference_time) {
307*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(error_status, kCheckinErrorPrefix,
308*14675a02SAndroid Build Coastguard Worker                                               /* keep_error_message= */ true);
309*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckinServerAborted(
310*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
311*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
312*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_SERVER_ABORTED,
313*14675a02SAndroid Build Coastguard Worker       error_message);
314*14675a02SAndroid Build Coastguard Worker   LogCheckinLatency(time_before_checkin, reference_time);
315*14675a02SAndroid Build Coastguard Worker }
316*14675a02SAndroid Build Coastguard Worker 
LogCheckinTurnedAway(const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time reference_time)317*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinTurnedAway(const NetworkStats& network_stats,
318*14675a02SAndroid Build Coastguard Worker                                            absl::Time time_before_checkin,
319*14675a02SAndroid Build Coastguard Worker                                            absl::Time reference_time) {
320*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishRejected(network_stats,
321*14675a02SAndroid Build Coastguard Worker                                     absl::Now() - time_before_checkin);
322*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
323*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_REJECTED);
324*14675a02SAndroid Build Coastguard Worker   LogCheckinLatency(time_before_checkin, reference_time);
325*14675a02SAndroid Build Coastguard Worker }
326*14675a02SAndroid Build Coastguard Worker 
LogCheckinInvalidPayload(absl::string_view error_message,const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time reference_time)327*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinInvalidPayload(
328*14675a02SAndroid Build Coastguard Worker     absl::string_view error_message, const NetworkStats& network_stats,
329*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin, absl::Time reference_time) {
330*14675a02SAndroid Build Coastguard Worker   log_manager_->LogDiag(
331*14675a02SAndroid Build Coastguard Worker       ProdDiagCode::BACKGROUND_TRAINING_FAILED_CANNOT_PARSE_PLAN);
332*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckinInvalidPayload(
333*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_checkin);
334*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
335*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_ERROR_INVALID_PAYLOAD,
336*14675a02SAndroid Build Coastguard Worker       std::string(error_message));
337*14675a02SAndroid Build Coastguard Worker   LogCheckinLatency(time_before_checkin, reference_time);
338*14675a02SAndroid Build Coastguard Worker }
339*14675a02SAndroid Build Coastguard Worker 
LogCheckinPlanUriReceived(absl::string_view task_name,const NetworkStats & network_stats,absl::Time time_before_checkin)340*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinPlanUriReceived(
341*14675a02SAndroid Build Coastguard Worker     absl::string_view task_name, const NetworkStats& network_stats,
342*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin) {
343*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckinPlanUriReceived(
344*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - time_before_checkin);
345*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventAndSetTaskName(
346*14675a02SAndroid Build Coastguard Worker       std::string(task_name),
347*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_PLAN_URI_RECEIVED);
348*14675a02SAndroid Build Coastguard Worker }
349*14675a02SAndroid Build Coastguard Worker 
LogCheckinCompleted(absl::string_view task_name,const NetworkStats & network_stats,absl::Time time_before_checkin,absl::Time time_before_plan_download,absl::Time reference_time)350*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinCompleted(absl::string_view task_name,
351*14675a02SAndroid Build Coastguard Worker                                           const NetworkStats& network_stats,
352*14675a02SAndroid Build Coastguard Worker                                           absl::Time time_before_checkin,
353*14675a02SAndroid Build Coastguard Worker                                           absl::Time time_before_plan_download,
354*14675a02SAndroid Build Coastguard Worker                                           absl::Time reference_time) {
355*14675a02SAndroid Build Coastguard Worker   absl::Duration duration = absl::Now() - time_before_plan_download;
356*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishCheckinFinishedV2(network_stats, duration);
357*14675a02SAndroid Build Coastguard Worker   // We already have set the task name when LogCheckinPlanUriReceived was
358*14675a02SAndroid Build Coastguard Worker   // called, so we only have to add the event.
359*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
360*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_CHECKIN_ACCEPTED);
361*14675a02SAndroid Build Coastguard Worker   // The 'EligibilityEvalCheckinLatency' should cover the whole period from
362*14675a02SAndroid Build Coastguard Worker   // eligibility eval checkin to completion (and not just the period from EET
363*14675a02SAndroid Build Coastguard Worker   // plan URIs being received to completion).
364*14675a02SAndroid Build Coastguard Worker   LogCheckinLatency(time_before_checkin, reference_time);
365*14675a02SAndroid Build Coastguard Worker }
366*14675a02SAndroid Build Coastguard Worker 
LogComputationStarted()367*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationStarted() {
368*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationStarted();
369*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
370*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_STARTED);
371*14675a02SAndroid Build Coastguard Worker }
372*14675a02SAndroid Build Coastguard Worker 
LogComputationInvalidArgument(absl::Status error_status,const ExampleStats & example_stats,const NetworkStats & network_stats,absl::Time run_plan_start_time)373*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationInvalidArgument(
374*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
375*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time run_plan_start_time) {
376*14675a02SAndroid Build Coastguard Worker   std::string error_message =
377*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kComputationErrorPrefix,
378*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
379*14675a02SAndroid Build Coastguard Worker   log_manager_->LogDiag(
380*14675a02SAndroid Build Coastguard Worker       ProdDiagCode::BACKGROUND_TRAINING_FAILED_PLAN_FAILS_SANITY_CHECK);
381*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationInvalidArgument(
382*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, network_stats,
383*14675a02SAndroid Build Coastguard Worker       absl::Now() - run_plan_start_time);
384*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
385*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_ERROR_INVALID_ARGUMENT,
386*14675a02SAndroid Build Coastguard Worker       error_message);
387*14675a02SAndroid Build Coastguard Worker }
388*14675a02SAndroid Build Coastguard Worker 
LogComputationIOError(absl::Status error_status,const ExampleStats & example_stats,const NetworkStats & network_stats,absl::Time run_plan_start_time)389*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationIOError(absl::Status error_status,
390*14675a02SAndroid Build Coastguard Worker                                             const ExampleStats& example_stats,
391*14675a02SAndroid Build Coastguard Worker                                             const NetworkStats& network_stats,
392*14675a02SAndroid Build Coastguard Worker                                             absl::Time run_plan_start_time) {
393*14675a02SAndroid Build Coastguard Worker   std::string error_message =
394*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kComputationErrorPrefix,
395*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
396*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationIOError(
397*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, network_stats,
398*14675a02SAndroid Build Coastguard Worker       absl::Now() - run_plan_start_time);
399*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
400*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_ERROR_IO, error_message);
401*14675a02SAndroid Build Coastguard Worker }
402*14675a02SAndroid Build Coastguard Worker 
LogComputationExampleIteratorError(absl::Status error_status,const ExampleStats & example_stats,const NetworkStats & network_stats,absl::Time run_plan_start_time)403*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationExampleIteratorError(
404*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
405*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time run_plan_start_time) {
406*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(
407*14675a02SAndroid Build Coastguard Worker       error_status, kComputationErrorPrefix, /* keep_error_message= */ true);
408*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationExampleIteratorError(
409*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, network_stats,
410*14675a02SAndroid Build Coastguard Worker       absl::Now() - run_plan_start_time);
411*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
412*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_ERROR_EXAMPLE_ITERATOR,
413*14675a02SAndroid Build Coastguard Worker       error_message);
414*14675a02SAndroid Build Coastguard Worker }
415*14675a02SAndroid Build Coastguard Worker 
LogComputationTensorflowError(absl::Status error_status,const ExampleStats & example_stats,const NetworkStats & network_stats,absl::Time run_plan_start_time,absl::Time reference_time)416*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationTensorflowError(
417*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
418*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time run_plan_start_time,
419*14675a02SAndroid Build Coastguard Worker     absl::Time reference_time) {
420*14675a02SAndroid Build Coastguard Worker   std::string error_message = GetErrorMessage(
421*14675a02SAndroid Build Coastguard Worker       error_status, kComputationErrorPrefix, log_tensorflow_error_messages_);
422*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationTensorflowError(
423*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, network_stats,
424*14675a02SAndroid Build Coastguard Worker       absl::Now() - run_plan_start_time);
425*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
426*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_ERROR_TENSORFLOW,
427*14675a02SAndroid Build Coastguard Worker       error_message);
428*14675a02SAndroid Build Coastguard Worker   LogComputationLatency(run_plan_start_time, reference_time);
429*14675a02SAndroid Build Coastguard Worker }
430*14675a02SAndroid Build Coastguard Worker 
LogComputationInterrupted(absl::Status error_status,const ExampleStats & example_stats,const NetworkStats & network_stats,absl::Time run_plan_start_time,absl::Time reference_time)431*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationInterrupted(
432*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const ExampleStats& example_stats,
433*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time run_plan_start_time,
434*14675a02SAndroid Build Coastguard Worker     absl::Time reference_time) {
435*14675a02SAndroid Build Coastguard Worker   std::string error_message =
436*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kComputationErrorPrefix,
437*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
438*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationInterrupted(
439*14675a02SAndroid Build Coastguard Worker       error_message, example_stats, network_stats,
440*14675a02SAndroid Build Coastguard Worker       absl::Now() - run_plan_start_time);
441*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
442*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_CLIENT_INTERRUPTED,
443*14675a02SAndroid Build Coastguard Worker       error_message);
444*14675a02SAndroid Build Coastguard Worker   LogComputationLatency(run_plan_start_time, reference_time);
445*14675a02SAndroid Build Coastguard Worker }
446*14675a02SAndroid Build Coastguard Worker 
LogComputationCompleted(const ExampleStats & example_stats,const NetworkStats & network_stats,absl::Time run_plan_start_time,absl::Time reference_time)447*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationCompleted(const ExampleStats& example_stats,
448*14675a02SAndroid Build Coastguard Worker                                               const NetworkStats& network_stats,
449*14675a02SAndroid Build Coastguard Worker                                               absl::Time run_plan_start_time,
450*14675a02SAndroid Build Coastguard Worker                                               absl::Time reference_time) {
451*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishComputationCompleted(
452*14675a02SAndroid Build Coastguard Worker       example_stats, network_stats, absl::Now() - run_plan_start_time);
453*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
454*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_COMPUTATION_FINISHED);
455*14675a02SAndroid Build Coastguard Worker   log_manager_->LogToLongHistogram(
456*14675a02SAndroid Build Coastguard Worker       HistogramCounters::TRAINING_OVERALL_EXAMPLE_SIZE,
457*14675a02SAndroid Build Coastguard Worker       example_stats.example_size_bytes);
458*14675a02SAndroid Build Coastguard Worker   log_manager_->LogToLongHistogram(
459*14675a02SAndroid Build Coastguard Worker       HistogramCounters::TRAINING_OVERALL_EXAMPLE_COUNT,
460*14675a02SAndroid Build Coastguard Worker       example_stats.example_count);
461*14675a02SAndroid Build Coastguard Worker   LogComputationLatency(run_plan_start_time, reference_time);
462*14675a02SAndroid Build Coastguard Worker }
463*14675a02SAndroid Build Coastguard Worker 
LogResultUploadStarted()464*14675a02SAndroid Build Coastguard Worker absl::Status PhaseLoggerImpl::LogResultUploadStarted() {
465*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
466*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_RESULT_UPLOAD_STARTED);
467*14675a02SAndroid Build Coastguard Worker   // Commit the run data accumulated thus far to Opstats and fail if
468*14675a02SAndroid Build Coastguard Worker   // something goes wrong.
469*14675a02SAndroid Build Coastguard Worker   FCP_RETURN_IF_ERROR(opstats_logger_->CommitToStorage());
470*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishResultUploadStarted();
471*14675a02SAndroid Build Coastguard Worker   return absl::OkStatus();
472*14675a02SAndroid Build Coastguard Worker }
473*14675a02SAndroid Build Coastguard Worker 
LogResultUploadIOError(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_result_upload,absl::Time reference_time)474*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogResultUploadIOError(
475*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
476*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_result_upload, absl::Time reference_time) {
477*14675a02SAndroid Build Coastguard Worker   std::string error_message =
478*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kResultUploadErrorPrefix,
479*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
480*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishResultUploadIOError(
481*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_result_upload);
482*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
483*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_RESULT_UPLOAD_ERROR_IO,
484*14675a02SAndroid Build Coastguard Worker       error_message);
485*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_result_upload, reference_time);
486*14675a02SAndroid Build Coastguard Worker }
487*14675a02SAndroid Build Coastguard Worker 
LogResultUploadClientInterrupted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_result_upload,absl::Time reference_time)488*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogResultUploadClientInterrupted(
489*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
490*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_result_upload, absl::Time reference_time) {
491*14675a02SAndroid Build Coastguard Worker   std::string error_message =
492*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kResultUploadErrorPrefix,
493*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
494*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishResultUploadClientInterrupted(
495*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_result_upload);
496*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
497*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_RESULT_UPLOAD_CLIENT_INTERRUPTED,
498*14675a02SAndroid Build Coastguard Worker       error_message);
499*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_result_upload, reference_time);
500*14675a02SAndroid Build Coastguard Worker }
501*14675a02SAndroid Build Coastguard Worker 
LogResultUploadServerAborted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_result_upload,absl::Time reference_time)502*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogResultUploadServerAborted(
503*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
504*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_result_upload, absl::Time reference_time) {
505*14675a02SAndroid Build Coastguard Worker   std::string error_message =
506*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kResultUploadErrorPrefix,
507*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
508*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishResultUploadServerAborted(
509*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_result_upload);
510*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
511*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_RESULT_UPLOAD_SERVER_ABORTED,
512*14675a02SAndroid Build Coastguard Worker       error_message);
513*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_result_upload, reference_time);
514*14675a02SAndroid Build Coastguard Worker }
515*14675a02SAndroid Build Coastguard Worker 
LogResultUploadCompleted(const NetworkStats & network_stats,absl::Time time_before_result_upload,absl::Time reference_time)516*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogResultUploadCompleted(
517*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time time_before_result_upload,
518*14675a02SAndroid Build Coastguard Worker     absl::Time reference_time) {
519*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishResultUploadCompleted(
520*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - time_before_result_upload);
521*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
522*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_RESULT_UPLOAD_FINISHED);
523*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_result_upload, reference_time);
524*14675a02SAndroid Build Coastguard Worker }
525*14675a02SAndroid Build Coastguard Worker 
LogFailureUploadStarted()526*14675a02SAndroid Build Coastguard Worker absl::Status PhaseLoggerImpl::LogFailureUploadStarted() {
527*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
528*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_FAILURE_UPLOAD_STARTED);
529*14675a02SAndroid Build Coastguard Worker   // Commit the run data accumulated thus far to Opstats and fail if
530*14675a02SAndroid Build Coastguard Worker   // something goes wrong.
531*14675a02SAndroid Build Coastguard Worker   FCP_RETURN_IF_ERROR(opstats_logger_->CommitToStorage());
532*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishFailureUploadStarted();
533*14675a02SAndroid Build Coastguard Worker   return absl::OkStatus();
534*14675a02SAndroid Build Coastguard Worker }
535*14675a02SAndroid Build Coastguard Worker 
LogFailureUploadIOError(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_failure_upload,absl::Time reference_time)536*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogFailureUploadIOError(
537*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
538*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_failure_upload, absl::Time reference_time) {
539*14675a02SAndroid Build Coastguard Worker   std::string error_message =
540*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kFailureUploadErrorPrefix,
541*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
542*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishFailureUploadIOError(
543*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_failure_upload);
544*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
545*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_FAILURE_UPLOAD_ERROR_IO,
546*14675a02SAndroid Build Coastguard Worker       error_message);
547*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_failure_upload, reference_time);
548*14675a02SAndroid Build Coastguard Worker }
549*14675a02SAndroid Build Coastguard Worker 
LogFailureUploadClientInterrupted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_failure_upload,absl::Time reference_time)550*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogFailureUploadClientInterrupted(
551*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
552*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_failure_upload, absl::Time reference_time) {
553*14675a02SAndroid Build Coastguard Worker   std::string error_message =
554*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kFailureUploadErrorPrefix,
555*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
556*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishFailureUploadClientInterrupted(
557*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_failure_upload);
558*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
559*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_FAILURE_UPLOAD_CLIENT_INTERRUPTED,
560*14675a02SAndroid Build Coastguard Worker       error_message);
561*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_failure_upload, reference_time);
562*14675a02SAndroid Build Coastguard Worker }
563*14675a02SAndroid Build Coastguard Worker 
LogFailureUploadServerAborted(absl::Status error_status,const NetworkStats & network_stats,absl::Time time_before_failure_upload,absl::Time reference_time)564*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogFailureUploadServerAborted(
565*14675a02SAndroid Build Coastguard Worker     absl::Status error_status, const NetworkStats& network_stats,
566*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_failure_upload, absl::Time reference_time) {
567*14675a02SAndroid Build Coastguard Worker   std::string error_message =
568*14675a02SAndroid Build Coastguard Worker       GetErrorMessage(error_status, kFailureUploadErrorPrefix,
569*14675a02SAndroid Build Coastguard Worker                       /* keep_error_message= */ true);
570*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishFailureUploadServerAborted(
571*14675a02SAndroid Build Coastguard Worker       error_message, network_stats, absl::Now() - time_before_failure_upload);
572*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEventWithErrorMessage(
573*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_FAILURE_UPLOAD_SERVER_ABORTED,
574*14675a02SAndroid Build Coastguard Worker       error_message);
575*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_failure_upload, reference_time);
576*14675a02SAndroid Build Coastguard Worker }
577*14675a02SAndroid Build Coastguard Worker 
LogFailureUploadCompleted(const NetworkStats & network_stats,absl::Time time_before_failure_upload,absl::Time reference_time)578*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogFailureUploadCompleted(
579*14675a02SAndroid Build Coastguard Worker     const NetworkStats& network_stats, absl::Time time_before_failure_upload,
580*14675a02SAndroid Build Coastguard Worker     absl::Time reference_time) {
581*14675a02SAndroid Build Coastguard Worker   event_publisher_->PublishFailureUploadCompleted(
582*14675a02SAndroid Build Coastguard Worker       network_stats, absl::Now() - time_before_failure_upload);
583*14675a02SAndroid Build Coastguard Worker   opstats_logger_->AddEvent(
584*14675a02SAndroid Build Coastguard Worker       OperationalStats::Event::EVENT_KIND_FAILURE_UPLOAD_FINISHED);
585*14675a02SAndroid Build Coastguard Worker   LogReportLatency(time_before_failure_upload, reference_time);
586*14675a02SAndroid Build Coastguard Worker }
587*14675a02SAndroid Build Coastguard Worker 
LogTimeSince(HistogramCounters histogram_counter,absl::Time reference_time)588*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogTimeSince(HistogramCounters histogram_counter,
589*14675a02SAndroid Build Coastguard Worker                                    absl::Time reference_time) {
590*14675a02SAndroid Build Coastguard Worker   absl::Duration duration = absl::Now() - reference_time;
591*14675a02SAndroid Build Coastguard Worker   log_manager_->LogToLongHistogram(histogram_counter,
592*14675a02SAndroid Build Coastguard Worker                                    absl::ToInt64Milliseconds(duration));
593*14675a02SAndroid Build Coastguard Worker }
594*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalCheckinLatency(absl::Time time_before_checkin)595*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalCheckinLatency(
596*14675a02SAndroid Build Coastguard Worker     absl::Time time_before_checkin) {
597*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_FL_ELIGIBILITY_EVAL_CHECKIN_LATENCY,
598*14675a02SAndroid Build Coastguard Worker                time_before_checkin);
599*14675a02SAndroid Build Coastguard Worker }
600*14675a02SAndroid Build Coastguard Worker 
LogEligibilityEvalComputationLatency(absl::Time run_plan_start_time,absl::Time reference_time)601*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogEligibilityEvalComputationLatency(
602*14675a02SAndroid Build Coastguard Worker     absl::Time run_plan_start_time, absl::Time reference_time) {
603*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_RUN_PHASE_LATENCY,
604*14675a02SAndroid Build Coastguard Worker                run_plan_start_time);
605*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_RUN_PHASE_END_TIME, reference_time);
606*14675a02SAndroid Build Coastguard Worker }
607*14675a02SAndroid Build Coastguard Worker 
LogCheckinLatency(absl::Time time_before_checkin,absl::Time reference_time)608*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogCheckinLatency(absl::Time time_before_checkin,
609*14675a02SAndroid Build Coastguard Worker                                         absl::Time reference_time) {
610*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_FL_CHECKIN_LATENCY,
611*14675a02SAndroid Build Coastguard Worker                time_before_checkin);
612*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_FL_CHECKIN_END_TIME, reference_time);
613*14675a02SAndroid Build Coastguard Worker }
614*14675a02SAndroid Build Coastguard Worker 
LogComputationLatency(absl::Time run_plan_start_time,absl::Time reference_time)615*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogComputationLatency(absl::Time run_plan_start_time,
616*14675a02SAndroid Build Coastguard Worker                                             absl::Time reference_time) {
617*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_RUN_PHASE_LATENCY,
618*14675a02SAndroid Build Coastguard Worker                run_plan_start_time);
619*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_RUN_PHASE_END_TIME, reference_time);
620*14675a02SAndroid Build Coastguard Worker }
621*14675a02SAndroid Build Coastguard Worker 
LogReportLatency(absl::Time time_before_report,absl::Time reference_time)622*14675a02SAndroid Build Coastguard Worker void PhaseLoggerImpl::LogReportLatency(absl::Time time_before_report,
623*14675a02SAndroid Build Coastguard Worker                                        absl::Time reference_time) {
624*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_FL_REPORT_RESULTS_LATENCY,
625*14675a02SAndroid Build Coastguard Worker                time_before_report);
626*14675a02SAndroid Build Coastguard Worker   LogTimeSince(HistogramCounters::TRAINING_FL_REPORT_RESULTS_END_TIME,
627*14675a02SAndroid Build Coastguard Worker                reference_time);
628*14675a02SAndroid Build Coastguard Worker }
629*14675a02SAndroid Build Coastguard Worker 
GetErrorMessage(absl::Status error_status,absl::string_view error_prefix,bool keep_error_message)630*14675a02SAndroid Build Coastguard Worker std::string PhaseLoggerImpl::GetErrorMessage(absl::Status error_status,
631*14675a02SAndroid Build Coastguard Worker                                              absl::string_view error_prefix,
632*14675a02SAndroid Build Coastguard Worker                                              bool keep_error_message) {
633*14675a02SAndroid Build Coastguard Worker   return absl::StrCat(error_prefix, "code: ", error_status.code(), ", error: ",
634*14675a02SAndroid Build Coastguard Worker                       keep_error_message ? error_status.message() : "");
635*14675a02SAndroid Build Coastguard Worker }
636*14675a02SAndroid Build Coastguard Worker 
637*14675a02SAndroid Build Coastguard Worker }  // namespace client
638*14675a02SAndroid Build Coastguard Worker }  // namespace fcp
639