void MetricsManager::SubmitLocalMetricsAsync()

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();
    }