1 """Support for sending data to Datadog."""
5 from datadog
import initialize, statsd
6 import voluptuous
as vol
21 _LOGGER = logging.getLogger(__name__)
24 DEFAULT_HOST =
"localhost"
26 DEFAULT_PREFIX =
"hass"
30 CONFIG_SCHEMA = vol.Schema(
34 vol.Required(CONF_HOST, default=DEFAULT_HOST): cv.string,
35 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
36 vol.Optional(CONF_PREFIX, default=DEFAULT_PREFIX): cv.string,
37 vol.Optional(CONF_RATE, default=DEFAULT_RATE): vol.All(
38 vol.Coerce(int), vol.Range(min=1)
43 extra=vol.ALLOW_EXTRA,
47 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
48 """Set up the Datadog component."""
51 host = conf[CONF_HOST]
52 port = conf[CONF_PORT]
53 sample_rate = conf[CONF_RATE]
54 prefix = conf[CONF_PREFIX]
56 initialize(statsd_host=host, statsd_port=port)
58 def logbook_entry_listener(event):
59 """Listen for logbook entries and send them as events."""
60 name = event.data.get(
"name")
61 message = event.data.get(
"message")
64 title=
"Home Assistant",
65 text=f
"%%% \n **{name}** {message} \n %%%",
67 f
"entity:{event.data.get('entity_id')}",
68 f
"domain:{event.data.get('domain')}",
72 _LOGGER.debug(
"Sent event %s", event.data.get(
"entity_id"))
74 def state_changed_listener(event):
75 """Listen for new messages on the bus and sends them to Datadog."""
76 state = event.data.get(
"new_state")
78 if state
is None or state.state == STATE_UNKNOWN:
81 states =
dict(state.attributes)
82 metric = f
"{prefix}.{state.domain}"
83 tags = [f
"entity:{state.entity_id}"]
85 for key, value
in states.items():
86 if isinstance(value, (float, int)):
87 attribute = f
"{metric}.{key.replace(' ', '_')}"
88 value =
int(value)
if isinstance(value, bool)
else value
89 statsd.gauge(attribute, value, sample_rate=sample_rate, tags=tags)
91 _LOGGER.debug(
"Sent metric %s: %s (tags: %s)", attribute, value, tags)
94 value = state_helper.state_as_number(state)
96 _LOGGER.debug(
"Error sending %s: %s (tags: %s)", metric, state.state, tags)
99 statsd.gauge(metric, value, sample_rate=sample_rate, tags=tags)
101 _LOGGER.debug(
"Sent metric %s: %s (tags: %s)", metric, value, tags)
103 hass.bus.listen(EVENT_LOGBOOK_ENTRY, logbook_entry_listener)
104 hass.bus.listen(EVENT_STATE_CHANGED, state_changed_listener)
bool setup(HomeAssistant hass, ConfigType config)