blob: fddf0411671085db3a91e1bb7c61b3ed43877fc0 [file] [log] [blame]
// 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/fit/promise.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/zx/time.h>
#include <memory>
#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/inspect_data_budget.h"
#include "src/developer/forensics/feedback_data/attachments/types.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"
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
// ::fit::promise.
class Datastore {
public:
Datastore(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services,
cobalt::Logger* cobalt, const AnnotationKeys& annotation_allowlist,
const AttachmentKeys& attachment_allowlist, PreviousBootFile boot_id_file,
InspectDataBudget* inspect_data_budget);
::fit::promise<Annotations> GetAnnotations(zx::duration timeout);
::fit::promise<Attachments> GetAttachments(zx::duration timeout);
// Returns whether the non-platform annotations were actually set as there is a cap on the number
// of non-platform annotations.
bool TrySetNonPlatformAnnotations(const Annotations& non_platform_annotations);
// Exposed for testing purposes.
Datastore(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services,
const char* limit_data_flag_path);
const Annotations& GetStaticAnnotations() const { return static_annotations_; }
const Attachments& GetStaticAttachments() const { return static_attachments_; }
const Annotations& GetNonPlatformAnnotations() const { return non_platform_annotations_; }
bool IsMissingNonPlatformAnnotations() const { return is_missing_non_platform_annotations_; }
private:
::fit::promise<Attachment> BuildAttachment(const AttachmentKey& key, zx::duration timeout);
::fit::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_;
const AnnotationKeys annotation_allowlist_;
const AttachmentKeys attachment_allowlist_;
const Annotations static_annotations_;
const Attachments static_attachments_;
std::vector<std::unique_ptr<AnnotationProvider>> reusable_annotation_providers_;
bool is_missing_non_platform_annotations_ = false;
Annotations non_platform_annotations_;
InspectDataBudget* inspect_data_budget_;
};
} // namespace feedback_data
} // namespace forensics
#endif // SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_DATASTORE_H_