Files
macos-battery-exporter/main.go

129 lines
2.3 KiB
Go

//go:build darwin
package main
import (
"flag"
"fmt"
"log"
"log/slog"
"os"
"strings"
"github.com/jimeh/macos-battery-exporter/prombat"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/expfmt"
)
var (
version = "0.0.0-dev"
commit = "unknown"
outputFlag = flag.String(
"o", "", "Output file to write to in Prometheus format",
)
serverFlag = flag.Bool("s", false, "Run as a Prometheus metrics server")
bindFlag = flag.String(
"b", "127.0.0.1", "Bind address to run server on",
)
portFlag = flag.Int("p", 9108, "Port to run server on")
namespaceFlag = flag.String(
"n", prombat.DefaultNamespace, "Namespace for metrics",
)
logLevelFlag = flag.String("l", "info", "Log level")
versionFlag = flag.Bool("v", false, "Print version and exit")
)
func main() {
if err := mainE(); err != nil {
log.Fatal(err)
}
}
func mainE() error {
flag.Parse()
err := setupSLog(*logLevelFlag)
if err != nil {
return err
}
if *versionFlag {
fmt.Printf("macos-battery-exporter %s (%s)\n", version, commit)
return nil
}
if *serverFlag {
opts := prombat.ServerOptions{
Bind: *bindFlag,
Port: *portFlag,
}
return prombat.RunServer(
*namespaceFlag,
prometheus.DefaultRegisterer.(*prometheus.Registry),
opts,
)
}
registry := prometheus.NewRegistry()
err = registry.Register(prombat.NewCollector(*namespaceFlag))
if err != nil {
return err
}
gatherers := prometheus.Gatherers{registry}
metricFamilies, err := gatherers.Gather()
if err != nil {
return err
}
var sb strings.Builder
for _, mf := range metricFamilies {
_, err := expfmt.MetricFamilyToText(&sb, mf)
if err != nil {
return err
}
}
if *outputFlag != "" {
return writeToFile(sb.String(), *outputFlag)
}
fmt.Print(sb.String())
return nil
}
func setupSLog(levelStr string) error {
var level slog.Level
err := level.UnmarshalText([]byte(levelStr))
if err != nil {
return err
}
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: level,
})
logger := slog.New(handler)
slog.SetDefault(logger)
return nil
}
func writeToFile(data, outputFile string) error {
file, err := os.Create(outputFile)
if err != nil {
return err
}
defer file.Close()
_, err = file.WriteString(data)
if err != nil {
return err
}
return nil
}