From f5916254704127300db857e6c77d684c2d3dc96c Mon Sep 17 00:00:00 2001 From: Alex Lopez Date: Tue, 30 May 2023 15:35:19 +0200 Subject: [PATCH] Return JSON instead of Python objects from `get_diagnoses()` --- .../datadog_checks/base/checks/base.py | 6 +-- .../tests/base/utils/test_diagnose.py | 54 +++++++++++++------ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/datadog_checks_base/datadog_checks/base/checks/base.py b/datadog_checks_base/datadog_checks/base/checks/base.py index b99c93b528fba..960438d6f069a 100644 --- a/datadog_checks_base/datadog_checks/base/checks/base.py +++ b/datadog_checks_base/datadog_checks/base/checks/base.py @@ -1023,14 +1023,14 @@ def get_warnings(self): return warnings def get_diagnoses(self): - # type: () -> List[Diagnosis.Result] + # type: () -> str """ - Return the list of diagnosis. + Return the list of diagnosis as a JSON encoded string. The agent calls this method to retrieve diagnostics from integrations. This method runs explicit diagnostics if available. """ - return self.diagnosis.diagnoses + self.diagnosis.run_explicit() + return json.dumps([d._asdict() for d in (self.diagnosis.diagnoses + self.diagnosis.run_explicit())]) def _get_requests_proxy(self): # type: () -> ProxySettings diff --git a/datadog_checks_base/tests/base/utils/test_diagnose.py b/datadog_checks_base/tests/base/utils/test_diagnose.py index f18c44f0baf1a..337052a69c54c 100644 --- a/datadog_checks_base/tests/base/utils/test_diagnose.py +++ b/datadog_checks_base/tests/base/utils/test_diagnose.py @@ -2,6 +2,8 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) +import json + from datadog_checks.base import AgentCheck from datadog_checks.base.utils.diagnose import Diagnosis @@ -60,22 +62,22 @@ def explicit_diagnostic(self): check = Foo("foo", {}, [{}]) # When the check hasn't yet run once, we should only see the explicit diagnostic results - assert check.get_diagnoses() == [ - Diagnosis.Result(Diagnosis.DIAGNOSIS_FAIL, "foo check", "explicit diagnosis", None, None, None, None), + assert get_diagnoses(check) == [ + diagnose_dict(Diagnosis.DIAGNOSIS_FAIL, "foo check", "explicit diagnosis"), ] check.run() - assert check.get_diagnoses() == [ - Diagnosis.Result(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "in-check diagnosis", None, None, None, None), - Diagnosis.Result(Diagnosis.DIAGNOSIS_FAIL, "foo check", "explicit diagnosis", None, None, None, None), + assert get_diagnoses(check) == [ + diagnose_dict(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "in-check diagnosis", None, None, None, None), + diagnose_dict(Diagnosis.DIAGNOSIS_FAIL, "foo check", "explicit diagnosis", None, None, None, None), ] # A second run should give us the same results, meaning we get a fresh set of diagnoses # from the check run. check.run() - assert check.get_diagnoses() == [ - Diagnosis.Result(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "in-check diagnosis", None, None, None, None), - Diagnosis.Result(Diagnosis.DIAGNOSIS_FAIL, "foo check", "explicit diagnosis", None, None, None, None), + assert get_diagnoses(check) == [ + diagnose_dict(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "in-check diagnosis", None, None, None, None), + diagnose_dict(Diagnosis.DIAGNOSIS_FAIL, "foo check", "explicit diagnosis", None, None, None, None), ] @@ -98,10 +100,10 @@ def good_diagnostic(self): check = Foo("foo", {}, [{}]) check.run() - assert check.get_diagnoses() == [ - Diagnosis.Result(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "in-check diagnosis", None, None, None, None), - Diagnosis.Result(Diagnosis.DIAGNOSIS_UNEXPECTED_ERROR, "", "", None, None, None, "something went wrong"), - Diagnosis.Result(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "explicit diagnosis", None, None, None, None), + assert get_diagnoses(check) == [ + diagnose_dict(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "in-check diagnosis", None, None, None, None), + diagnose_dict(Diagnosis.DIAGNOSIS_UNEXPECTED_ERROR, "", "", None, None, None, "something went wrong"), + diagnose_dict(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "explicit diagnosis", None, None, None, None), ] @@ -136,11 +138,29 @@ def bad_diagnostic(self): "raw_error": None, } - assert check.get_diagnoses() == [ - Diagnosis.Result(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "ok", **expected_fields), - Diagnosis.Result(Diagnosis.DIAGNOSIS_FAIL, "foo check", "fail", **expected_fields), - Diagnosis.Result(Diagnosis.DIAGNOSIS_WARNING, "foo check", "warn", **expected_fields), - Diagnosis.Result( + assert get_diagnoses(check) == [ + diagnose_dict(Diagnosis.DIAGNOSIS_SUCCESS, "foo check", "ok", **expected_fields), + diagnose_dict(Diagnosis.DIAGNOSIS_FAIL, "foo check", "fail", **expected_fields), + diagnose_dict(Diagnosis.DIAGNOSIS_WARNING, "foo check", "warn", **expected_fields), + diagnose_dict( Diagnosis.DIAGNOSIS_UNEXPECTED_ERROR, "", "", None, None, None, "something went wrong with ********" ), ] + + +def get_diagnoses(check): + """Get diagnoses from a check as a list of dictionaries.""" + return json.loads(check.get_diagnoses()) + + +def diagnose_dict(result, name, diagnosis, category=None, description=None, remediation=None, raw_error=None): + """Helper function to create diagnosis result dictionaries with defaults.""" + return { + "result": result, + "name": name, + "diagnosis": diagnosis, + "category": category, + "description": description, + "remediation": remediation, + "raw_error": raw_error, + }