in Gems/AWSMetrics/Code/Source/MetricsManager.cpp [303:344]
AZ::Outcome<void, AZStd::string> MetricsManager::SendMetricsToFile(AZStd::shared_ptr<MetricsQueue> metricsQueue)
{
AZStd::lock_guard<AZStd::mutex> lock(m_metricsFileMutex);
AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance();
if (!fileIO)
{
return AZ::Failure(AZStd::string{ "No FileIoBase Instance." });
}
const char* metricsFileFullPath = m_clientConfiguration->GetMetricsFileFullPath();
const char* metricsFileDir = m_clientConfiguration->GetMetricsFileDir();
MetricsQueue existingMetricsEvents;
if (!metricsFileFullPath || !metricsFileDir)
{
return AZ::Failure(AZStd::string{ "Failed to get the metrics file directory or path." });
}
if (fileIO->Exists(metricsFileFullPath) && !existingMetricsEvents.ReadFromJson(metricsFileFullPath))
{
return AZ::Failure(AZStd::string{ "Failed to read the existing metrics on disk" });
}
else if (!fileIO->Exists(metricsFileDir) && !fileIO->CreatePath(metricsFileDir))
{
return AZ::Failure(AZStd::string{ "Failed to create metrics directory" });
}
// Append a copy of the metrics queue in the request to the existing metrics events and keep the original submission order.
// Do not modify the metrics queue in the request directly for identifying the metrics events for retry on failure.
MetricsQueue metricsEventsInRequest = *metricsQueue;
existingMetricsEvents.AppendMetrics(metricsEventsInRequest);
AZStd::string serializedMetrics = existingMetricsEvents.SerializeToJson();
AZ::IO::HandleType fileHandle;
if (!fileIO->Open(metricsFileFullPath, AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText, fileHandle))
{
return AZ::Failure(AZStd::string{ "Failed to open metrics file" });
}
fileIO->Write(fileHandle, serializedMetrics.c_str(), serializedMetrics.size());
fileIO->Close(fileHandle);
return AZ::Success();
}