class_docstr: Uses datadog API to send metrics of practically anything measurable.
  
  It's possible to track # of db records inserted/deleted, records read
  from file and many other useful metrics.
  
  Depends on the datadog API, which has to be deployed on the same server where
  Airflow runs.
  
  :param datadog_conn_id: The connection to datadog, containing metadata for api keys.
class_docstr_tok: ["Uses","datadog","API","to","send","metrics","of","practically","anything","measurable",".","It","'s","possible","to","track","#","of","db","records","inserted\/deleted",",","records","read","from","file","and","many","other","useful","metrics",".","Depends","on","the","datadog","API",",","which","has","to","be","deployed","on","the","same","server","where","Airflow","runs",".",":","param","datadog_conn_id",":","The","connection","to","datadog",",","containing","metadata","for","api","keys","."]
docstr: Validate Datadog response.
docstr_tok: ["Validate","Datadog","response","."]
code: def validate_response(self, response: dict[str, Any]) -> None:
      """Validate Datadog response."""
      if response["status"] != "ok":
          self.log.error("Datadog returned: %s", response)
          raise AirflowException("Error status received from Datadog")
  
file_path: airflow/airflow/providers/datadog/hooks/datadog.py
imports: from __future__ import annotations
  import time
  from typing import Any
  from datadog import api, initialize
  from airflow.exceptions import AirflowException
  from airflow.hooks.base import BaseHook
  from airflow.utils.log.logging_mixin import LoggingMixin
label_desc: Use image node_id 2 for calling the DatadogHook obj's underlying member method code with example usage: obj.validate_response(response) without return types