mirror of
https://github.com/ipnet-mesh/meshcore-hub.git
synced 2026-03-28 17:42:56 +01:00
Add /metrics endpoint with Prometheus gauges for nodes, messages, advertisements, telemetry, trace paths, events, and members. Include per-node last_seen timestamps for alerting. Add Alertmanager service to Docker Compose metrics profile with default blackhole receiver. Add NodeNotSeen alert rule (48h threshold). Add 1h time window to all windowed metrics alongside existing 24h/7d/30d windows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
173 lines
3.7 KiB
TOML
173 lines
3.7 KiB
TOML
[build-system]
|
|
requires = ["setuptools>=68.0", "wheel"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "meshcore-hub"
|
|
version = "0.0.0"
|
|
description = "Python monorepo for managing and orchestrating MeshCore mesh networks"
|
|
readme = "README.md"
|
|
license = {text = "GPL-3.0-or-later"}
|
|
requires-python = ">=3.13"
|
|
authors = [
|
|
{name = "MeshCore Hub Contributors"}
|
|
]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Intended Audience :: Developers",
|
|
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Topic :: Communications",
|
|
"Topic :: System :: Networking",
|
|
]
|
|
keywords = ["meshcore", "mesh", "network", "mqtt", "lora"]
|
|
dependencies = [
|
|
"click>=8.1.0",
|
|
"pydantic>=2.0.0",
|
|
"pydantic-settings>=2.0.0",
|
|
"python-dotenv>=1.0.0",
|
|
"sqlalchemy>=2.0.0",
|
|
"alembic>=1.12.0",
|
|
"fastapi>=0.100.0",
|
|
"uvicorn[standard]>=0.23.0",
|
|
"paho-mqtt>=2.0.0",
|
|
"jinja2>=3.1.0",
|
|
"python-multipart>=0.0.6",
|
|
"httpx>=0.25.0",
|
|
"aiosqlite>=0.19.0",
|
|
"meshcore>=2.2.0",
|
|
"pyyaml>=6.0.0",
|
|
"python-frontmatter>=1.0.0",
|
|
"markdown>=3.5.0",
|
|
"prometheus-client>=0.20.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest>=7.4.0",
|
|
"pytest-asyncio>=0.21.0",
|
|
"pytest-cov>=4.1.0",
|
|
"black>=23.0.0",
|
|
"flake8>=6.1.0",
|
|
"mypy>=1.5.0",
|
|
"pre-commit>=3.4.0",
|
|
"beautifulsoup4>=4.12.0",
|
|
"types-paho-mqtt>=1.6.0",
|
|
"types-PyYAML>=6.0.0",
|
|
]
|
|
postgres = [
|
|
"asyncpg>=0.28.0",
|
|
"psycopg2-binary>=2.9.0",
|
|
]
|
|
|
|
[project.scripts]
|
|
meshcore-hub = "meshcore_hub.__main__:main"
|
|
|
|
[project.urls]
|
|
Homepage = "https://github.com/ipnet-mesh/meshcore-hub"
|
|
Documentation = "https://github.com/ipnet-mesh/meshcore-hub#readme"
|
|
Repository = "https://github.com/ipnet-mesh/meshcore-hub"
|
|
Issues = "https://github.com/ipnet-mesh/meshcore-hub/issues"
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["src"]
|
|
|
|
[tool.setuptools.package-data]
|
|
meshcore_hub = ["py.typed"]
|
|
"meshcore_hub.web" = ["templates/**/*", "static/**/*"]
|
|
"meshcore_hub.api" = ["templates/**/*"]
|
|
|
|
[tool.black]
|
|
line-length = 88
|
|
target-version = ["py312"]
|
|
include = '\.pyi?$'
|
|
extend-exclude = '''
|
|
/(
|
|
\.eggs
|
|
| \.git
|
|
| \.hg
|
|
| \.mypy_cache
|
|
| \.tox
|
|
| \.venv
|
|
| _build
|
|
| buck-out
|
|
| build
|
|
| dist
|
|
| alembic/versions
|
|
)/
|
|
'''
|
|
|
|
[tool.mypy]
|
|
python_version = "3.13"
|
|
warn_return_any = true
|
|
warn_unused_ignores = true
|
|
disallow_untyped_defs = true
|
|
disallow_incomplete_defs = true
|
|
check_untyped_defs = true
|
|
strict_optional = true
|
|
plugins = ["pydantic.mypy"]
|
|
|
|
[[tool.mypy.overrides]]
|
|
module = [
|
|
"paho.*",
|
|
"uvicorn.*",
|
|
"alembic.*",
|
|
"meshcore.*",
|
|
"frontmatter.*",
|
|
"markdown.*",
|
|
"prometheus_client.*",
|
|
]
|
|
ignore_missing_imports = true
|
|
|
|
[[tool.mypy.overrides]]
|
|
module = [
|
|
"tests.*",
|
|
"conftest",
|
|
]
|
|
disallow_untyped_defs = false
|
|
disallow_incomplete_defs = false
|
|
|
|
[[tool.mypy.overrides]]
|
|
module = [
|
|
"alembic.env",
|
|
"alembic.versions.*",
|
|
]
|
|
ignore_errors = true
|
|
|
|
[tool.pytest.ini_options]
|
|
minversion = "7.0"
|
|
asyncio_mode = "auto"
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|
|
addopts = [
|
|
"-ra",
|
|
"-q",
|
|
"--strict-markers",
|
|
"--cov=meshcore_hub",
|
|
"--cov-report=term-missing",
|
|
]
|
|
filterwarnings = [
|
|
"ignore::DeprecationWarning",
|
|
]
|
|
|
|
[tool.coverage.run]
|
|
source = ["src/meshcore_hub"]
|
|
branch = true
|
|
omit = [
|
|
"*/tests/*",
|
|
"*/__pycache__/*",
|
|
]
|
|
|
|
[tool.coverage.report]
|
|
exclude_lines = [
|
|
"pragma: no cover",
|
|
"def __repr__",
|
|
"raise NotImplementedError",
|
|
"if TYPE_CHECKING:",
|
|
"if __name__ == .__main__.:",
|
|
]
|