| // Copyright 2020 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_DEVELOPER_FORENSICS_FEEDBACK_DATA_DATASTORE_H_ |
| #define SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_DATASTORE_H_ |
| |
| #include <lib/async/dispatcher.h> |
| #include <lib/fpromise/promise.h> |
| #include <lib/sys/cpp/service_directory.h> |
| #include <lib/zx/time.h> |
| |
| #include <memory> |
| |
| #include "src/developer/forensics/feedback/annotations/annotation_manager.h" |
| #include "src/developer/forensics/feedback/annotations/metrics.h" |
| #include "src/developer/forensics/feedback/annotations/types.h" |
| #include "src/developer/forensics/feedback/device_id_provider.h" |
| #include "src/developer/forensics/feedback_data/annotations/annotation_provider.h" |
| #include "src/developer/forensics/feedback_data/annotations/types.h" |
| #include "src/developer/forensics/feedback_data/attachments/system_log.h" |
| #include "src/developer/forensics/feedback_data/attachments/types.h" |
| #include "src/developer/forensics/feedback_data/inspect_data_budget.h" |
| #include "src/developer/forensics/utils/cobalt/logger.h" |
| #include "src/developer/forensics/utils/cobalt/metrics.h" |
| #include "src/developer/forensics/utils/fit/timeout.h" |
| #include "src/developer/forensics/utils/previous_boot_file.h" |
| #include "src/developer/forensics/utils/redact/redactor.h" |
| #include "src/lib/timekeeper/system_clock.h" |
| |
| namespace forensics { |
| namespace feedback_data { |
| |
| // Holds data useful to attach in feedback reports (crash, user feedback or bug reports). |
| // |
| // Data can be annotations or attachments. |
| // |
| // Some data are: |
| // * static and collected at startup, e.g., build version or hardware info. |
| // * dynamic and collected upon data request, e.g., uptime or logs. |
| // * collected synchronously, e.g., build version or uptime. |
| // * collected asynchronously, e.g., hardware info or logs. |
| // * pushed by other components, we called these "non-platform" to distinguish them from the |
| // "platform". |
| // |
| // Because of dynamic asynchronous data, the data requests can take some time and return a |
| // ::fpromise::promise. |
| class Datastore { |
| public: |
| Datastore(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services, |
| cobalt::Logger* cobalt, RedactorBase* redactor, |
| const AnnotationKeys& annotation_allowlist, const AttachmentKeys& attachment_allowlist, |
| feedback::AnnotationManager* annotation_manager, |
| feedback::DeviceIdProvider* device_id_provider, InspectDataBudget* inspect_data_budget); |
| |
| ::fpromise::promise<Annotations> GetAnnotations(zx::duration timeout); |
| ::fpromise::promise<Attachments> GetAttachments(zx::duration timeout); |
| |
| // Exposed for testing purposes. |
| Datastore(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services, |
| feedback::DeviceIdProvider* device_id_provider, const char* limit_data_flag_path); |
| |
| Annotations GetImmediatelyAvailableAnnotations() { |
| return annotation_manager_->ImmediatelyAvailable(); |
| } |
| const Attachments& GetStaticAttachments() const { return static_attachments_; } |
| |
| void DropStaticAttachment(const AttachmentKey& key, Error error); |
| |
| private: |
| ::fpromise::promise<Attachment> BuildAttachment(const AttachmentKey& key, zx::duration timeout); |
| ::fpromise::promise<AttachmentValue> BuildAttachmentValue(const AttachmentKey& key, |
| zx::duration timeout); |
| fit::Timeout MakeCobaltTimeout(cobalt::TimedOutData data, zx::duration timeout); |
| |
| async_dispatcher_t* dispatcher_; |
| const std::shared_ptr<sys::ServiceDirectory> services_; |
| cobalt::Logger* cobalt_; |
| RedactorBase* redactor_; |
| timekeeper::SystemClock clock_; |
| const AnnotationKeys annotation_allowlist_; |
| AttachmentKeys attachment_allowlist_; |
| |
| feedback::AnnotationMetrics annotation_metrics_; |
| feedback::AnnotationManager* annotation_manager_; |
| Attachments static_attachments_; |
| |
| SystemLog system_log_; |
| std::vector<std::unique_ptr<AnnotationProvider>> reusable_annotation_providers_; |
| |
| InspectDataBudget* inspect_data_budget_; |
| }; |
| |
| } // namespace feedback_data |
| } // namespace forensics |
| |
| #endif // SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_DATASTORE_H_ |