Skip to content

Commit 3626252

Browse files
author
Sunil Thaha
authored
Merge pull request #2263 from sthaha/feat-redfish-impl
feat(redfish): add redfish support
2 parents 45824ae + 7d971ce commit 3626252

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+6989
-78
lines changed

cmd/kepler/main.go

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import (
1111
"syscall"
1212

1313
"github.com/alecthomas/kingpin/v2"
14+
1415
"github.com/sustainable-computing-io/kepler/config"
1516
"github.com/sustainable-computing-io/kepler/internal/device"
1617
"github.com/sustainable-computing-io/kepler/internal/exporter/prometheus"
1718
"github.com/sustainable-computing-io/kepler/internal/exporter/stdout"
1819
"github.com/sustainable-computing-io/kepler/internal/k8s/pod"
1920
"github.com/sustainable-computing-io/kepler/internal/logger"
2021
"github.com/sustainable-computing-io/kepler/internal/monitor"
22+
"github.com/sustainable-computing-io/kepler/internal/platform/redfish"
2123
"github.com/sustainable-computing-io/kepler/internal/resource"
2224
"github.com/sustainable-computing-io/kepler/internal/server"
2325
"github.com/sustainable-computing-io/kepler/internal/service"
@@ -157,6 +159,8 @@ func createServices(logger *slog.Logger, cfg *config.Config) ([]service.Service,
157159
monitor.WithMinTerminatedEnergyThreshold(monitor.Energy(cfg.Monitor.MinTerminatedEnergyThreshold)*monitor.Joule),
158160
)
159161

162+
// Create Redfish service if enabled (experimental feature)
163+
160164
apiServer := server.NewAPIServer(
161165
server.WithLogger(logger),
162166
server.WithListenAddress(cfg.Web.ListenAddresses),
@@ -170,43 +174,69 @@ func createServices(logger *slog.Logger, cfg *config.Config) ([]service.Service,
170174
pm,
171175
)
172176

177+
// Add Redfish service if enabled
178+
var redfishService *redfish.Service
179+
if cfg.IsFeatureEnabled(config.ExperimentalRedfishFeature) {
180+
rs, err := createRedfishService(logger, cfg)
181+
if err != nil {
182+
return nil, fmt.Errorf("failed to create Redfish service: %w", err)
183+
}
184+
services = append(services, rs)
185+
redfishService = rs
186+
}
187+
173188
// Add Prometheus exporter if enabled
174-
if *cfg.Exporter.Prometheus.Enabled {
175-
promExporter, err := createPrometheusExporter(logger, cfg, apiServer, pm)
189+
if cfg.IsFeatureEnabled(config.PrometheusFeature) {
190+
promExporter, err := createPrometheusExporter(logger, cfg, apiServer, pm, redfishService)
176191
if err != nil {
177192
return nil, fmt.Errorf("failed to create Prometheus exporter: %w", err)
178193
}
179194
services = append(services, promExporter)
180195
}
181196

182197
// Add pprof if enabled
183-
if *cfg.Debug.Pprof.Enabled {
198+
if cfg.IsFeatureEnabled(config.PprofFeature) {
184199
pprof := server.NewPprof(apiServer)
185200
services = append(services, pprof)
186201
}
187202

188203
// Add stdout exporter if enabled
189-
if *cfg.Exporter.Stdout.Enabled {
204+
if cfg.IsFeatureEnabled(config.StdoutFeature) {
190205
stdoutExporter := stdout.NewExporter(pm, stdout.WithLogger(logger))
191206
services = append(services, stdoutExporter)
192207
}
193208

194209
return services, nil
195210
}
196211

197-
func createPrometheusExporter(logger *slog.Logger, cfg *config.Config, apiServer *server.APIServer, pm *monitor.PowerMonitor) (*prometheus.Exporter, error) {
212+
func createRedfishService(logger *slog.Logger, cfg *config.Config) (*redfish.Service, error) {
213+
return redfish.NewService(cfg.Experimental.Platform.Redfish, logger, redfish.WithStaleness(cfg.Monitor.Staleness))
214+
}
215+
216+
func createPrometheusExporter(
217+
logger *slog.Logger, cfg *config.Config,
218+
apiServer *server.APIServer, pm *monitor.PowerMonitor,
219+
rs *redfish.Service,
220+
) (*prometheus.Exporter, error) {
198221
logger.Debug("Creating Prometheus exporter")
199222

200223
// Use metrics level from configuration (already parsed)
201224
metricsLevel := cfg.Exporter.Prometheus.MetricsLevel
202225

203-
collectors, err := prometheus.CreateCollectors(
204-
pm,
226+
var collectorOpts []prometheus.OptionFn
227+
collectorOpts = append(collectorOpts,
205228
prometheus.WithLogger(logger),
206229
prometheus.WithProcFSPath(cfg.Host.ProcFS),
207230
prometheus.WithNodeName(cfg.Kube.Node),
208231
prometheus.WithMetricsLevel(metricsLevel),
209232
)
233+
234+
// Add platform data provider if Redfish service is available
235+
if rs != nil {
236+
collectorOpts = append(collectorOpts, prometheus.WithPlatformDataProvider(rs))
237+
}
238+
239+
collectors, err := prometheus.CreateCollectors(pm, collectorOpts...)
210240
if err != nil {
211241
return nil, fmt.Errorf("failed to create Prometheus collectors: %w", err)
212242
}

compose/default/kepler/etc/kepler/config.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,13 @@ dev:
7070
fake-cpu-meter:
7171
enabled: false
7272
zones: [] # zones to be enabled, empty enables all default zones
73+
74+
# EXPERIMENTAL FEATURES - These features are experimental and may be unstable
75+
# and are disabled by default
76+
experimental:
77+
platform:
78+
redfish:
79+
enabled: false # Enable experimental Redfish BMC power monitoring
80+
configFile: /etc/kepler/redfish.yaml # Path to Redfish BMC configuration file
81+
nodeName: "" # Node name to use (overrides Kubernetes node name and hostname fallback)
82+
httpTimeout: 5s # HTTP client timeout for BMC requests (default: 5s)

compose/dev/kepler-dev/etc/kepler/config.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,13 @@ dev:
7070
fake-cpu-meter:
7171
enabled: false
7272
zones: [] # zones to be enabled, empty enables all default zones
73+
74+
# EXPERIMENTAL FEATURES - These features are experimental and may be unstable
75+
# and are disabled by default
76+
experimental:
77+
platform:
78+
redfish:
79+
enabled: false # Enable experimental Redfish BMC power monitoring
80+
configFile: /etc/kepler/redfish.yaml # Path to Redfish BMC configuration file
81+
nodeName: "" # Node name to use (overrides Kubernetes node name and hostname fallback)
82+
httpTimeout: 5s # HTTP client timeout for BMC requests (default: 5s)

0 commit comments

Comments
 (0)