This CL integrates the PowerFaultLogCollector into the tlbmc store.
This change includes:
- Adding PowerFaultLogCollector to the collector factory and store implementation.
- Including the PowerFaultLogCollector in the JSON outputs for debug and store.
- Exposing methods to retrieve power fault log entries and file content through the Store interface.
- Updating unit tests to mock and test the new PowerFaultLogCollector integration.
This allows the tlbmc to collect and expose power fault logs.
#tlbmc_power_fault_log
PiperOrigin-RevId: 847542851
Change-Id: I9b7c0f35262f07ac260e6f45f5c2ffe2623e94f7
diff --git a/tlbmc/store/factory.h b/tlbmc/store/factory.h
index 429a21f..a9453aa 100644
--- a/tlbmc/store/factory.h
+++ b/tlbmc/store/factory.h
@@ -14,6 +14,7 @@
#include "tlbmc/collector/fru_collector.h"
#include "tlbmc/collector/gpio_collector.h"
#include "tlbmc/collector/metric_collector.h"
+#include "tlbmc/collector/power_fault_log_collector.h"
#include "tlbmc/collector/sensor_collector.h"
#include "tlbmc/collector/thermal_collector.h"
#include "tlbmc/configs/entity_config.h"
@@ -42,6 +43,9 @@
SensorCollector* absl_nonnull sensor_collector) = 0;
virtual absl::StatusOr<std::shared_ptr<PowerControl>> CreatePowerControl(
const PowerControl::Params& params) = 0;
+ virtual absl::StatusOr<std::unique_ptr<PowerFaultLogCollector>>
+ CreatePowerFaultLogCollector(
+ const PowerFaultLogCollector::Params& params) = 0;
};
class CollectorFactoryImpl : public CollectorFactory {
@@ -76,6 +80,12 @@
const PowerControl::Params& params) override {
return PowerControl::Create(params);
}
+
+ absl::StatusOr<std::unique_ptr<PowerFaultLogCollector>>
+ CreatePowerFaultLogCollector(
+ const PowerFaultLogCollector::Params& params) override {
+ return PowerFaultLogCollector::Create(params);
+ }
};
// Factory to create a config reader.
diff --git a/tlbmc/store/store.h b/tlbmc/store/store.h
index 92119f5..8a4690a 100644
--- a/tlbmc/store/store.h
+++ b/tlbmc/store/store.h
@@ -23,6 +23,7 @@
#include "topology_config.pb.h"
#include "tlbmc/credentials/credential_manager.h"
#include "fru.pb.h"
+#include "power_fault_log_entry.pb.h"
#include "software_metrics.pb.h"
#include "tlbmc/sensors/sensor.h"
#include "tlbmc/thermal/fan_pid_controller.h"
@@ -183,6 +184,13 @@
absl::Duration delay) = 0;
// Get hotswap GPIO name for AC power cycle.
virtual absl::StatusOr<std::string> GetHotswapGpioName() = 0;
+
+ // Get power fault log entries.
+ virtual PowerFaultLogEntries GetPowerFaultLogEntries() const = 0;
+
+ // Get power fault log file content.
+ virtual absl::StatusOr<std::string> GetPowerFaultLogFileContent(
+ absl::string_view folder_name, absl::string_view file_name) const = 0;
};
} // namespace milotic_tlbmc
diff --git a/tlbmc/store/store_impl.cc b/tlbmc/store/store_impl.cc
index 1b34a7a..b79a42b 100644
--- a/tlbmc/store/store_impl.cc
+++ b/tlbmc/store/store_impl.cc
@@ -26,6 +26,7 @@
#include "tlbmc/collector/fru_collector.h"
#include "tlbmc/collector/gpio_collector.h"
#include "tlbmc/collector/metric_collector.h"
+#include "tlbmc/collector/power_fault_log_collector.h"
#include "tlbmc/collector/sensor_collector.h"
#include "tlbmc/collector/thermal_collector.h"
#include "ad_hoc_fru_config.pb.h"
@@ -287,6 +288,7 @@
json["Metric"] = all_collectors_.metric_collector->ToJson();
json["Gpio"] = all_collectors_.gpio_collector->ToJson();
json["Fan"] = all_collectors_.thermal_collector->ToJson();
+ json["PowerFaultLog"] = all_collectors_.power_fault_log_collector->ToJson();
json["EntityConfig"] = entity_config_->ToJson();
return json;
}
@@ -300,6 +302,8 @@
all_collectors_.metric_collector->GetSchedulerStats();
json["GpioCollector"] = all_collectors_.gpio_collector->GetSchedulerStats();
json["Fan"] = all_collectors_.thermal_collector->GetSchedulerStats();
+ json["PowerFaultLogCollector"] =
+ all_collectors_.power_fault_log_collector->GetSchedulerStats();
json["Store"] = task_scheduler_->ToJson();
return json;
}
@@ -431,6 +435,7 @@
.metric_collector = EmptyMetricCollector::Create(),
.gpio_collector = EmptyGpioCollector::Create(),
.thermal_collector = EmptyThermalCollector::Create(),
+ .power_fault_log_collector = EmptyPowerFaultLogCollector::Create(),
};
std::shared_ptr<EntityConfig> entity_config_shared =
EmptyEntityConfigImpl::Create();
@@ -652,6 +657,27 @@
}
}
+ if (GetTlbmcConfig().power_fault_log_collector_module().enabled()) {
+ // The PowerFaultLogCollector is responsible for loading its own config.
+ PowerFaultLogCollector::Params params;
+ params.config = options.proto_parser->GetPowerFaultLogConfig();
+ absl::StatusOr<std::unique_ptr<PowerFaultLogCollector>>
+ power_fault_log_collector =
+ options.collector_factory->CreatePowerFaultLogCollector(params);
+ if (!power_fault_log_collector.ok()) {
+ LOG(ERROR) << "Failed to create PowerFaultLogCollector: "
+ << power_fault_log_collector.status();
+ return power_fault_log_collector.status();
+ }
+ if (absl::Status status = (*power_fault_log_collector)->StartCollection();
+ !status.ok()) {
+ LOG(ERROR) << "Failed to start PowerFaultLogCollector: " << status;
+ return status;
+ }
+ all_collectors.power_fault_log_collector =
+ std::move(*power_fault_log_collector);
+ }
+
// Create the store
int periodic_dump_interval_ms =
options.override_store_snapshot_interval_ms.value_or(
@@ -740,4 +766,14 @@
}
}
+PowerFaultLogEntries StoreImpl::GetPowerFaultLogEntries() const {
+ return all_collectors_.power_fault_log_collector->GetCollectedEntries();
+}
+
+absl::StatusOr<std::string> StoreImpl::GetPowerFaultLogFileContent(
+ absl::string_view folder_name, absl::string_view file_name) const {
+ return all_collectors_.power_fault_log_collector->GetLogFileContent(
+ folder_name, file_name);
+}
+
} // namespace milotic_tlbmc
diff --git a/tlbmc/store/store_impl.h b/tlbmc/store/store_impl.h
index 17643e6..54d15a6 100644
--- a/tlbmc/store/store_impl.h
+++ b/tlbmc/store/store_impl.h
@@ -17,6 +17,7 @@
#include "tlbmc/collector/fru_collector.h"
#include "tlbmc/collector/gpio_collector.h"
#include "tlbmc/collector/metric_collector.h"
+#include "tlbmc/collector/power_fault_log_collector.h"
#include "tlbmc/collector/sensor_collector.h"
#include "tlbmc/collector/thermal_collector.h"
#include "ad_hoc_fru_config.pb.h"
@@ -56,6 +57,7 @@
std::unique_ptr<MetricCollector> metric_collector = nullptr;
std::unique_ptr<GpioCollector> gpio_collector = nullptr;
std::unique_ptr<ThermalCollector> thermal_collector = nullptr;
+ std::unique_ptr<PowerFaultLogCollector> power_fault_log_collector = nullptr;
};
// Implementation of the Store interface.
@@ -227,6 +229,12 @@
absl::StatusOr<std::string> GetHotswapGpioName() override;
+ PowerFaultLogEntries GetPowerFaultLogEntries() const override;
+
+ absl::StatusOr<std::string> GetPowerFaultLogFileContent(
+ absl::string_view folder_name,
+ absl::string_view file_name) const override;
+
protected:
StoreImpl() = default;
std::unique_ptr<CredentialManager> credential_manager_;