forked from mweinelt/ha-prometheus-sensor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
75 lines (55 loc) · 2.37 KB
/
__init__.py
File metadata and controls
75 lines (55 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from __future__ import annotations
from dataclasses import dataclass
import logging
from typing import TYPE_CHECKING, Final, Optional
from urllib.parse import urljoin
import aiohttp
from homeassistant.const import STATE_PROBLEM, STATE_UNKNOWN
from homeassistant.helpers.reload import async_setup_reload_service
if TYPE_CHECKING:
from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import ConfigType
from .const import DOMAIN, PLATFORMS
_LOGGER: Final = logging.getLogger(__name__)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the prometheus-sensor integration."""
await async_setup_reload_service(hass, DOMAIN, PLATFORMS)
return True
@dataclass(frozen=True)
class QueryResult:
value: Optional[float] = None
error: Optional[str] = None
class Prometheus:
"""Wrapper for Prometheus API Requests."""
def __init__(self, url: str, session: aiohttp.ClientSession) -> None:
"""Initialize the Prometheus API wrapper."""
self._session = session
self._url = urljoin(f"{url}/", "api/v1/query")
async def query(self, expr: str) -> QueryResult:
"""Query expression response."""
try:
response = await self._session.get(self._url, params={"query": expr})
except aiohttp.ClientError as error:
_LOGGER.error("Error querying %s: %s", self._url, error)
return QueryResult(error=STATE_PROBLEM)
if response.status != 200:
_LOGGER.error(
"Unexpected HTTP status code %s for expression '%s'",
response.status,
expr,
)
return QueryResult(error=STATE_UNKNOWN)
try:
result = (await response.json())["data"]["result"]
except (ValueError, KeyError) as error:
_LOGGER.error("Invalid query response: %s", error)
return QueryResult(error=STATE_UNKNOWN)
if not result:
_LOGGER.error("Expression '%s' yielded no result", expr)
return QueryResult(error=STATE_PROBLEM)
elif len(result) > 1:
_LOGGER.error("Expression '%s' yielded multiple metrics", expr)
return QueryResult(error=STATE_PROBLEM)
value = float(result[0]["value"][1])
_LOGGER.debug("Expression '%s' yields result %f", expr, value)
return QueryResult(value)