mirror of
https://github.com/jimeh/macos-battery-exporter.git
synced 2026-02-19 09:26:40 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1d4f70d98 | ||
|
7b2e98e150
|
|||
|
3c272d6d3d
|
|||
|
dc62db2ace
|
2
.github/.release-please-manifest.json
vendored
2
.github/.release-please-manifest.json
vendored
@@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "0.0.5"
|
||||
".": "0.0.6"
|
||||
}
|
||||
|
||||
@@ -44,6 +44,6 @@ brews:
|
||||
system "#{bin}/macos-battery-exporter -v"
|
||||
repository:
|
||||
owner: jimeh
|
||||
name: homebrew-macos-battery-exporter
|
||||
name: homebrew-tap
|
||||
branch: main
|
||||
token: "{{ .Env.BREW_TAP_TOKEN }}"
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## [0.0.6](https://github.com/jimeh/macos-battery-exporter/compare/v0.0.5...v0.0.6) (2023-12-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **output:** write log output to stderr by default instead of stdout ([7b2e98e](https://github.com/jimeh/macos-battery-exporter/commit/7b2e98e150f9ee6d630023879395df0912047667))
|
||||
|
||||
## [0.0.5](https://github.com/jimeh/macos-battery-exporter/compare/v0.0.4...v0.0.5) (2023-12-16)
|
||||
|
||||
|
||||
|
||||
15
README.md
15
README.md
@@ -16,9 +16,9 @@
|
||||
<a href="https://github.com/jimeh/macos-battery-exporter/blob/main/LICENSE"><img src="https://img.shields.io/github/license/jimeh/macos-battery-exporter.svg?style=flat" alt="License Status"></a>
|
||||
</p>
|
||||
|
||||
A Prometheus exporter for macOS which exposes most useful details available from
|
||||
`ioreg`. Includes a lot more details than what `node_exporter` supports via it's
|
||||
`node_power_supply_*` metrics.
|
||||
A Prometheus exporter for macOS battery information, exposing wide range of
|
||||
details available from `ioreg` about batteries. Includes a lot more details than
|
||||
what `node_exporter` supports via its `node_power_supply_*` metrics.
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -29,12 +29,11 @@ Binary releases are available on the
|
||||
|
||||
### Homebrew
|
||||
|
||||
You can install it from the
|
||||
[`jimeh/macos-battery-exporter`](https://github.com/jimeh/homebrew-macos-battery-exporter)
|
||||
You can install it from the [`jimeh/tap`](https://github.com/jimeh/homebrew-tap)
|
||||
Tap:
|
||||
|
||||
```bash
|
||||
brew install jimeh/macos-battery-exporter/macos-battery-exporter
|
||||
brew install jimeh/tap/macos-battery-exporter
|
||||
```
|
||||
|
||||
#### Service
|
||||
@@ -159,3 +158,7 @@ macos-battery-exporter -s
|
||||
```bash
|
||||
curl http://localhost:9108/metrics
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
[MIT](https://github.com/jimeh/macos-battery-exporter/blob/main/LICENSE)
|
||||
|
||||
144
main.go
144
main.go
@@ -5,7 +5,7 @@ package main
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"io"
|
||||
"log/slog"
|
||||
"os"
|
||||
"strings"
|
||||
@@ -16,93 +16,159 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
name = "macos-battery-exporter"
|
||||
version = "0.0.0-dev"
|
||||
commit = "unknown"
|
||||
)
|
||||
|
||||
outputFlag = flag.String(
|
||||
type configuration struct {
|
||||
Output string
|
||||
Server bool
|
||||
Bind string
|
||||
Port int
|
||||
Namespace string
|
||||
LogLevel string
|
||||
LogDevice string
|
||||
PrintVersion bool
|
||||
}
|
||||
|
||||
func configure() (*configuration, *flag.FlagSet, error) {
|
||||
fs := flag.NewFlagSet(name, flag.ExitOnError)
|
||||
fs.Usage = func() {
|
||||
fmt.Fprintf(fs.Output(),
|
||||
"usage: %s [<options>]\n\n", fs.Name(),
|
||||
)
|
||||
fs.PrintDefaults()
|
||||
}
|
||||
|
||||
config := &configuration{}
|
||||
|
||||
fs.StringVar(&config.Output,
|
||||
"o", "", "Output file to write to in Prometheus format",
|
||||
)
|
||||
serverFlag = flag.Bool("s", false, "Run as a Prometheus metrics server")
|
||||
bindFlag = flag.String(
|
||||
fs.BoolVar(&config.Server,
|
||||
"s", false, "Run as a Prometheus metrics server",
|
||||
)
|
||||
fs.StringVar(&config.Bind,
|
||||
"b", "127.0.0.1", "Bind address to run server on",
|
||||
)
|
||||
portFlag = flag.Int("p", 9108, "Port to run server on")
|
||||
namespaceFlag = flag.String(
|
||||
fs.IntVar(&config.Port, "p", 9108, "Port to run server on")
|
||||
fs.StringVar(&config.Namespace,
|
||||
"n", prombat.DefaultNamespace, "Namespace for metrics",
|
||||
)
|
||||
logLevelFlag = flag.String("l", "info", "Log level")
|
||||
versionFlag = flag.Bool("v", false, "Print version and exit")
|
||||
)
|
||||
fs.StringVar(&config.LogLevel,
|
||||
"l", "info", "Log level",
|
||||
)
|
||||
fs.StringVar(&config.LogDevice,
|
||||
"d", "stderr", "Log output device (stderr or stdout)",
|
||||
)
|
||||
fs.BoolVar(&config.PrintVersion,
|
||||
"v", false, "Print version and exit",
|
||||
)
|
||||
|
||||
err := fs.Parse(os.Args[1:])
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return config, fs, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
if err := mainE(); err != nil {
|
||||
log.Fatal(err)
|
||||
slog.Error(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func mainE() error {
|
||||
flag.Parse()
|
||||
|
||||
err := setupSLog(*logLevelFlag)
|
||||
config, _, err := configure()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if *versionFlag {
|
||||
fmt.Printf("macos-battery-exporter %s (%s)\n", version, commit)
|
||||
err = setupSLog(config.LogDevice, config.LogLevel)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if config.PrintVersion {
|
||||
fmt.Printf("%s %s (%s)\n", name, version, commit)
|
||||
return nil
|
||||
}
|
||||
|
||||
if *serverFlag {
|
||||
opts := prombat.ServerOptions{
|
||||
Bind: *bindFlag,
|
||||
Port: *portFlag,
|
||||
}
|
||||
|
||||
return prombat.RunServer(
|
||||
*namespaceFlag,
|
||||
prometheus.DefaultRegisterer.(*prometheus.Registry),
|
||||
opts,
|
||||
)
|
||||
if config.Server {
|
||||
return runServer(config)
|
||||
}
|
||||
|
||||
registry := prometheus.NewRegistry()
|
||||
err = registry.Register(prombat.NewCollector(*namespaceFlag))
|
||||
metrics, err := renderMetrics(config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if config.Output != "" {
|
||||
return writeToFile(metrics, config.Output)
|
||||
}
|
||||
|
||||
fmt.Print(metrics)
|
||||
return nil
|
||||
}
|
||||
|
||||
func runServer(config *configuration) error {
|
||||
opts := prombat.ServerOptions{
|
||||
Bind: config.Bind,
|
||||
Port: config.Port,
|
||||
}
|
||||
|
||||
return prombat.RunServer(
|
||||
config.Namespace,
|
||||
prometheus.DefaultRegisterer.(*prometheus.Registry),
|
||||
opts,
|
||||
)
|
||||
}
|
||||
|
||||
func renderMetrics(config *configuration) (string, error) {
|
||||
registry := prometheus.NewRegistry()
|
||||
err := registry.Register(prombat.NewCollector(config.Namespace))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
gatherers := prometheus.Gatherers{registry}
|
||||
metricFamilies, err := gatherers.Gather()
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
|
||||
var sb strings.Builder
|
||||
for _, mf := range metricFamilies {
|
||||
_, err := expfmt.MetricFamilyToText(&sb, mf)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
if *outputFlag != "" {
|
||||
return writeToFile(sb.String(), *outputFlag)
|
||||
}
|
||||
|
||||
fmt.Print(sb.String())
|
||||
|
||||
return nil
|
||||
return sb.String(), nil
|
||||
}
|
||||
|
||||
func setupSLog(levelStr string) error {
|
||||
func setupSLog(device string, levelStr string) error {
|
||||
var w io.Writer
|
||||
switch device {
|
||||
case "stderr":
|
||||
w = os.Stderr
|
||||
case "stdout":
|
||||
w = os.Stdout
|
||||
default:
|
||||
return fmt.Errorf("invalid log device: %s", device)
|
||||
}
|
||||
|
||||
var level slog.Level
|
||||
err := level.UnmarshalText([]byte(levelStr))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
|
||||
handler := slog.NewTextHandler(w, &slog.HandlerOptions{
|
||||
Level: level,
|
||||
})
|
||||
logger := slog.New(handler)
|
||||
|
||||
Reference in New Issue
Block a user