in Gems/AWSMetrics/Code/Source/MetricsManager.cpp [399:450]
void MetricsManager::SubmitLocalMetricsAsync()
{
AZ::Job* job{ nullptr };
job = AZ::CreateJobFunction([this]()
{
AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance();
if (!fileIO)
{
AZ_Error("AWSMetrics", false, "No FileIoBase Instance.");
return;
}
// Read metrics from the local metrics file.
AZStd::lock_guard<AZStd::mutex> file_lock(m_metricsFileMutex);
if (!fileIO->Exists(GetMetricsFilePath()))
{
// Local metrics file doesn't exist.
return;
}
MetricsQueue offlineRecords;
if (!offlineRecords.ReadFromJson(GetMetricsFilePath()))
{
AZ_Error("AWSMetrics", false, "Failed to read from the local metrics file %s", GetMetricsFilePath());
return;
}
// Submit the metrics read from the local metrics file.
int numOfflineRecords = offlineRecords.GetNumMetrics();
for (int index = 0; index < numOfflineRecords; ++index)
{
AZStd::lock_guard<AZStd::mutex> lock(m_metricsMutex);
m_metricsQueue.AddMetrics(offlineRecords[index]);
if (m_metricsQueue.GetSizeInBytes() >= static_cast<size_t>(m_clientConfiguration->GetMaxQueueSizeInBytes()))
{
// Flush the metrics queue when the accumulated metrics size hits the limit
m_waitEvent.release();
}
}
// Remove the local metrics file after reading all its content.
if (!fileIO->Remove(GetMetricsFilePath()))
{
AZ_Error("AWSMetrics", false, "Failed to remove the local metrics file %s", GetMetricsFilePath());
return;
}
}, true, m_jobContext.get());
job->Start();
}