blob: d99c2effa862634cb805d1e7b723241292e07cd6 [file] [log] [blame]
// Copyright 2017 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.
#ifndef SRC_COBALT_BIN_APP_COBALT_APP_H_
#define SRC_COBALT_BIN_APP_COBALT_APP_H_
#include <fuchsia/cobalt/cpp/fidl.h>
#include <fuchsia/metrics/cpp/fidl.h>
#include <fuchsia/process/lifecycle/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/cpp/task.h>
#include <lib/inspect/cpp/inspect.h>
#include <stdlib.h>
#include <chrono>
#include <fstream>
#include <memory>
#include <string>
#include "lib/fidl/cpp/binding_set.h"
#include "lib/fidl/cpp/interface_request.h"
#include "lib/sys/cpp/component_context.h"
#include "src/cobalt/bin/app/aggregate_and_upload_impl.h"
#include "src/cobalt/bin/app/cobalt_controller_impl.h"
#include "src/cobalt/bin/app/configuration_data.h"
#include "src/cobalt/bin/app/diagnostics_impl.h"
#include "src/cobalt/bin/app/process_lifecycle_impl.h"
#include "src/cobalt/bin/app/system_data_updater_impl.h"
#include "src/cobalt/bin/app/user_consent_watcher.h"
#include "src/cobalt/bin/utils/clock.h"
#include "src/cobalt/bin/utils/fuchsia_http_client.h"
#include "src/public/lib/statusor/statusor.h"
#include "third_party/cobalt/src/public/cobalt_config.h"
#include "third_party/cobalt/src/public/cobalt_service_interface.h"
namespace cobalt {
// Main app, which manages all of Cobalt's functionality.
//
// To test run:
// fx set --with-base //bundles:tools,//src/cobalt/bin:cobalt_tests;
// fx test cobalt_testapp_no_network
class CobaltApp {
public:
// |dispatcher| The async_t to be used for all asynchronous operations.
//
// |lifecycle_handle| A zx::channel to this process's Lifecycle endpoint. May be invalid.
//
// |shutdown| Callback to shut down the async::Loop. Called by ProcessLifecycleImpl.
//
// |upload_schedule_cfg| Defines when the shipping_manager should upload
// observations.
//
// |event_aggregator_backfill_days| The number of past days, in addition to the previous day,
// for which local aggregation generates observations. If a
// device is unable to generate observations for more than this
// number of days, we may lose older aggregated data.
//
// |start_event_aggregator_worker| If true, starts the EventAggregatorManager's worker thread
// after constructing the EventAggregatorManager.
//
// |test_dont_backfill_empty_reports| If true, reports that have never had any events will be
// skipped in the observation generation backfill. Only enable
// this in tests.
//
// |use_memory_observation_store| If this is true, the observation stores will be in-memory
// only, otherwise they will be file-system backed.
//
// |max_bytes_per_observation_store| The maximum number of bytes to store for each of the
// observation_stores.
//
// |storage_quotas| The storage quotas used by Cobalt 1.1 local aggregation.
//
// |product_name| A product name included in the SystemProfile that is implicitly part of every
// Cobalt metric.
//
// Example: products/core.gni
//
// |board_name| A board name that may be included in the SystemProfile that is implicitly part
// of every Cobalt metric.
//
// Examples: astro, vim2, qemu
//
// |version| The version of the running system included in the SystemProfile that is implicitly
// part of every Cobalt metric.
//
// Example: 20190220_01_RC00
static lib::statusor::StatusOr<std::unique_ptr<CobaltApp>> CreateCobaltApp(
std::unique_ptr<sys::ComponentContext> context, async_dispatcher_t* dispatcher,
fidl::InterfaceRequest<fuchsia::process::lifecycle::Lifecycle> lifecycle_handle,
fit::callback<void()> shutdown, inspect::Node inspect_node,
UploadScheduleConfig upload_schedule_cfg, size_t event_aggregator_backfill_days,
bool start_event_aggregator_worker, bool test_dont_backfill_empty_reports,
bool use_memory_observation_store, size_t max_bytes_per_observation_store,
StorageQuotas storage_quotas, const std::string& product_name, const std::string& board_name,
const std::string& version);
private:
friend class CobaltAppTest;
friend class CreateCobaltConfigTest;
static CobaltConfig CreateCobaltConfig(
async_dispatcher_t* dispatcher, const std::string& global_metrics_registry_path,
const FuchsiaConfigurationData& configuration_data,
FuchsiaSystemClockInterface* validated_clock,
utils::FuchsiaHTTPClient::LoaderFactory http_loader_factory,
UploadScheduleConfig upload_schedule_cfg, size_t event_aggregator_backfill_days,
bool test_dont_backfill_empty_reports, bool use_memory_observation_store,
size_t max_bytes_per_observation_store, StorageQuotas storage_quotas,
const std::string& product_name, const std::string& board_name, const std::string& version,
std::unique_ptr<DiagnosticsImpl> diagnostics);
CobaltApp(std::unique_ptr<sys::ComponentContext> context, async_dispatcher_t* dispatcher,
fidl::InterfaceRequest<fuchsia::process::lifecycle::Lifecycle> lifecycle_handle,
fit::callback<void()> shutdown, inspect::Node inspect_node,
inspect::Node inspect_config_node,
std::unique_ptr<CobaltServiceInterface> cobalt_service,
std::unique_ptr<FuchsiaSystemClockInterface> validated_clock,
bool start_event_aggregator_worker, bool test_dont_backfill_empty_reports,
bool watch_for_user_consent);
static encoder::ClientSecret getClientSecret();
std::unique_ptr<sys::ComponentContext> context_;
inspect::Node inspect_node_;
inspect::Node inspect_config_node_;
std::unique_ptr<CobaltServiceInterface> cobalt_service_;
std::unique_ptr<FuchsiaSystemClockInterface> validated_clock_;
std::unique_ptr<CobaltControllerImpl> controller_impl_;
fidl::BindingSet<fuchsia::cobalt::Controller> controller_bindings_;
std::unique_ptr<MetricEventLoggerFactoryImpl> metric_event_logger_factory_impl_;
fidl::BindingSet<fuchsia::metrics::MetricEventLoggerFactory>
metric_event_logger_factory_bindings_;
std::unique_ptr<fuchsia::cobalt::SystemDataUpdater> system_data_updater_impl_;
fidl::BindingSet<fuchsia::cobalt::SystemDataUpdater> system_data_updater_bindings_;
std::unique_ptr<AggregateAndUploadImpl> aggregate_and_upload_impl_;
fidl::BindingSet<fuchsia::cobalt::AggregateAndUpload> aggregate_and_upload_bindings_;
std::unique_ptr<cobalt::ProcessLifecycle> process_lifecycle_impl_;
std::unique_ptr<UserConsentWatcher> user_consent_watcher_;
CobaltApp(const CobaltApp&) = delete;
CobaltApp& operator=(const CobaltApp&) = delete;
CobaltApp(CobaltApp&&) = delete;
CobaltApp& operator=(CobaltApp&&) = delete;
};
std::string ReadGlobalMetricsRegistryBytes(const std::string& global_metrics_registry_path);
} // namespace cobalt
#endif // SRC_COBALT_BIN_APP_COBALT_APP_H_