Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ port: http listen port, default:8000
interval: Metrics gathering interval, default:10000ms
config_file: Metrics configuration file in CSV format, default: ./default-counters.csv

Collect runtime diagnostics before starting the exporter:

```
$ python3 tools/collect_runtime_env.py --pretty
```

## Deployment

## Deploy with kubernetes
Expand Down
76 changes: 76 additions & 0 deletions tools/collect_runtime_env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#!/usr/bin/env python3
"""Collect mx-exporter runtime diagnostics as JSON."""

from __future__ import annotations

import argparse
import ctypes.util
import json
import os
import platform
import sys
from importlib.metadata import PackageNotFoundError, version
from pathlib import Path


def package_version(name: str) -> dict[str, str | bool]:
try:
return {"installed": True, "version": version(name)}
except PackageNotFoundError:
return {"installed": False}


def path_exists(path: str | None) -> bool:
return bool(path and Path(path).exists())


def collect() -> dict:
maca_path = os.environ.get("MACA_PATH")
return {
"platform": {
"system": platform.system(),
"release": platform.release(),
"machine": platform.machine(),
"python": sys.version,
"executable": sys.executable,
},
"environment": {
"MACA_PATH": maca_path,
"LD_LIBRARY_PATH": os.environ.get("LD_LIBRARY_PATH"),
"PATH": os.environ.get("PATH"),
},
"paths": {
"maca_path_exists": path_exists(maca_path),
"dev_dri_exists": Path("/dev/dri").exists(),
"default_counters_exists": Path(__file__).resolve().parents[1]
.joinpath("mx_exporter", "default-counters.csv")
.exists(),
},
"libraries": {
"mxsml": ctypes.util.find_library("mxsml"),
},
"python_packages": {
"prometheus_client": package_version("prometheus_client"),
"grpcio": package_version("grpcio"),
"protobuf": package_version("protobuf"),
},
}


def main() -> int:
parser = argparse.ArgumentParser(description="Collect mx-exporter runtime diagnostics.")
parser.add_argument("--output", type=Path, help="Optional JSON output path.")
parser.add_argument("--pretty", action="store_true")
args = parser.parse_args()

text = json.dumps(collect(), indent=2 if args.pretty else None, sort_keys=True)
if args.output:
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(text + "\n", encoding="utf-8")
else:
print(text)
return 0


if __name__ == "__main__":
raise SystemExit(main())