AZ::Outcome MetricsManager::SendMetricsToFile()

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