blob: 39aa59d64e511cf4c09d06bd0bc7d934d32b780b [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/feedback/annotation_providers.h"
#include <memory>
#include "src/developer/forensics/feedback/annotations/constants.h"
#include "src/developer/forensics/feedback/constants.h"
#include "src/lib/backoff/exponential_backoff.h"
#include "src/lib/timekeeper/system_clock.h"
namespace forensics::feedback {
AnnotationProviders::AnnotationProviders(
async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services,
std::set<std::string> allowlist, Annotations static_annotations,
std::unique_ptr<CachedAsyncAnnotationProvider> device_id_provider)
: dispatcher_(dispatcher),
data_register_(kMaxNumNonPlatformAnnotations, kReservedAnnotationNamespaces,
kDataRegisterPath),
time_provider_(dispatcher, zx::unowned_clock(zx_utc_reference_get()),
std::make_unique<timekeeper::SystemClock>()),
board_info_provider_(dispatcher_, services, AnnotationProviderBackoff()),
product_info_provider_(dispatcher_, services, AnnotationProviderBackoff()),
current_channel_provider_(dispatcher_, services, AnnotationProviderBackoff()),
timezone_provider_(dispatcher_, services, AnnotationProviderBackoff()),
device_id_provider_(std::move(device_id_provider)),
target_channel_provider_(dispatcher_, services, AnnotationProviderBackoff()),
annotation_manager_(
dispatcher_, allowlist, static_annotations, &data_register_, {&time_provider_},
{&board_info_provider_, &product_info_provider_, &current_channel_provider_},
{&timezone_provider_, device_id_provider_.get()}, {&target_channel_provider_}) {
FX_CHECK(allowlist.size() <= kMaxNumPlatformAnnotations)
<< "Requesting " << allowlist.size() << " annotations when " << kMaxNumPlatformAnnotations
<< " are alloted for the platform";
if (allowlist.empty()) {
FX_LOGS(WARNING) << "Annotation allowlist is empty, no platform annotations will be collected";
}
}
void AnnotationProviders::Handle(
::fidl::InterfaceRequest<fuchsia::feedback::ComponentDataRegister> request,
::fit::function<void(zx_status_t)> error_handler) {
data_register_connections_.AddBinding(&data_register_, std::move(request), dispatcher_,
std::move(error_handler));
}
std::unique_ptr<backoff::Backoff> AnnotationProviders::AnnotationProviderBackoff() {
return std::unique_ptr<backoff::Backoff>(
new backoff::ExponentialBackoff(zx::min(1), 2u, zx::hour(1)));
}
} // namespace forensics::feedback