blob: 4d5d3e6174c33bb373dd83d56d05b1833a1e0184 [file] [log] [blame]
// Copyright 2024 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 <fcntl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/component/outgoing/cpp/outgoing_directory.h>
#include <lib/debugdata/datasink.h>
#include <lib/syslog/cpp/macros.h>
#include "src/sys/instrumentation_data_processor/instrumentation_data_publisher.h"
using DataSinkCallback = fit::function<void(std::string)>;
int main(int argc, const char** argv) {
async::Loop loop(&kAsyncLoopConfigNeverAttachToThread);
FX_LOGS(INFO) << "Started instrumentation data processor";
async_dispatcher_t* dispatcher = loop.dispatcher();
component::OutgoingDirectory outgoing = component::OutgoingDirectory(dispatcher);
zx::result result = outgoing.ServeFromStartupInfo();
if (result.is_error()) {
FX_LOGS(ERROR) << "Failed to serve outgoing directory: " << result.status_string();
return -1;
}
constexpr char data_sink_dir[] = "/tmp";
fbl::unique_fd data_sink_dir_fd = fbl::unique_fd(open(data_sink_dir, O_RDWR | O_DIRECTORY));
if (!data_sink_dir_fd) {
FX_LOGS(ERROR) << "Could not open output directory: " << data_sink_dir;
return -1;
}
debugdata::DataSink debug_data_sink(data_sink_dir_fd);
debugdata::DataSinkCallback error_callback = [&](const std::string& error) {
FX_LOGS(ERROR) << "ProcessInstrumentationData: " << error;
};
debugdata::DataSinkCallback warning_callback = [&](const std::string& warning) {
FX_LOGS(WARNING) << "ProcessInstrumentationData: " << warning;
};
instrumentation_data::InstrumentationDataPublisher publisher(
dispatcher, [&](const std::string& data_sink, zx::vmo vmo) {
debug_data_sink.ProcessSingleDebugData(data_sink, std::move(vmo), {}, error_callback,
warning_callback);
debug_data_sink.FlushToDirectory(error_callback, warning_callback);
});
result = outgoing.AddUnmanagedProtocol<fuchsia_debugdata::Publisher>(
[&](fidl::ServerEnd<fuchsia_debugdata::Publisher> server_end) {
fidl::BindServer(dispatcher, std::move(server_end), &publisher);
});
publisher.DrainData();
loop.Run();
return 0;
}