mirror of
https://github.com/jimeh/macos-battery-exporter.git
synced 2026-02-19 01:16:40 +00:00
The `*_amps` and `*_watts` metrics now use Ah and Wh values, instead of mAh and mWh as they were before.
129 lines
2.3 KiB
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/prom"
|
|
"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", prom.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 := prom.ServerOptions{
|
|
Bind: *bindFlag,
|
|
Port: *portFlag,
|
|
}
|
|
|
|
return prom.RunServer(
|
|
*namespaceFlag,
|
|
prometheus.DefaultRegisterer.(*prometheus.Registry),
|
|
opts,
|
|
)
|
|
}
|
|
|
|
registry := prometheus.NewRegistry()
|
|
err = registry.Register(prom.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)
|
|
} else {
|
|
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
|
|
}
|