From 08a08527c9da45f2b8d2a4468e82d6361622109c Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Thu, 25 Jan 2024 13:35:41 +1300 Subject: [PATCH 01/10] opsgenie loader --- llama_hub/library.json | 7 ++++ llama_hub/opsgenie/README.md | 29 +++++++++++++++ llama_hub/opsgenie/__init__.py | 5 +++ llama_hub/opsgenie/base.py | 65 ++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 llama_hub/opsgenie/README.md create mode 100644 llama_hub/opsgenie/__init__.py create mode 100644 llama_hub/opsgenie/base.py diff --git a/llama_hub/library.json b/llama_hub/library.json index dea2df6c52..19ab2bbcbe 100644 --- a/llama_hub/library.json +++ b/llama_hub/library.json @@ -1219,5 +1219,12 @@ "TelegramReader": { "id": "telegram", "author": "diicell" + }, + "OpsgenieReader": { + "id": "opsgenie", + "author": "ns-gsa", + "keywords": [ + "opsgenie" + ] } } diff --git a/llama_hub/opsgenie/README.md b/llama_hub/opsgenie/README.md new file mode 100644 index 0000000000..cd65eede05 --- /dev/null +++ b/llama_hub/opsgenie/README.md @@ -0,0 +1,29 @@ +# Opsgenie Reader + +The Opsgenie loader returns all open alerts from Opsgenie. + +## Usage + +Here's an example of how to use it + +```python + +from llama_hub.opsgenie import OpsgenieReader + +reader = OpsgenieReader(api_key=api_key, api_url=api_url) +documents = reader.load_data() + +``` + +Alternately, you can also use download_loader from llama_index + +```python + +from llama_index import download_loader +OpsgenieReader = download_loader('OpsgenieReader') + +reader = OpsgenieReader(api_key=api_key, api_url=api_url) +documents = reader.load_data() + +``` + diff --git a/llama_hub/opsgenie/__init__.py b/llama_hub/opsgenie/__init__.py new file mode 100644 index 0000000000..dd0af2b560 --- /dev/null +++ b/llama_hub/opsgenie/__init__.py @@ -0,0 +1,5 @@ +from llama_hub.opsgenie.base import ( + OpsgenieReader +) + +__all__ = ["OpsgenieReader"] \ No newline at end of file diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py new file mode 100644 index 0000000000..240fbdc75b --- /dev/null +++ b/llama_hub/opsgenie/base.py @@ -0,0 +1,65 @@ +from typing import List, Optional + +import json +import requests +from llama_index.readers.base import BaseReader +from llama_index.schema import Document + +class OpsgenieReader(BaseReader): + """ + Opsgenie Reader. Get open alerts from Opsgenie. + """ + + def __init__(self, + api_key: Optional[str] = None, + api_url: Optional[str] = None + ) -> None: + self.api_key = api_key + self.api_url = api_url + self.headers = { + "Authorization": f"GenieKey {self.api_key}", + "Content-Type": "application/json", + } + self.params = { + 'query': 'status:open' + } + + def load_data(self) -> List[Document]: + """Load data from Opsgenie API. + + Args: + query: Query to be passed to Opsgenie API. + + Returns: + List of documents. + """ + alerts = [] + all_opsgenie_alerts = self.get_all_alerts() + if all_opsgenie_alerts: + for opsgenie_alert in all_opsgenie_alerts: + alert_id = opsgenie_alert["id"] + details = self.get_alert_details(alert_id) + alert = Document(text=json.dumps(details)) + alerts.append(alert) + + return alerts + + def get_all_alerts(self): + response = requests.get( + f"{self.api_url}/v2/alerts", headers=self.headers, params=self.params, timeout=30) + + if response.status_code == 200: + alerts = response.json().get("data", []) + return alerts + else: + raise ValueError("Problem getting list of alerts from Opsgenie. Check API key and URL.") + + def get_alert_details(self, alert_id): + response = requests.get( + f"{self.api_url}/v2/alerts/{alert_id}", headers=self.headers, timeout=30) + + if response.status_code == 200: + details = response.json().get("data", {}) + return details + else: + raise ValueError("Problem getting alert details for alert_id from Opsgenie. Check API key and URL.") From ca65b650a50ae1c5916b0a70e55760f3f058fb37 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Mon, 29 Jan 2024 09:53:49 +1300 Subject: [PATCH 02/10] update load_data to load max alerts --- llama_hub/opsgenie/base.py | 52 ++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 240fbdc75b..41e12d6cd3 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -7,12 +7,13 @@ class OpsgenieReader(BaseReader): """ - Opsgenie Reader. Get open alerts from Opsgenie. + Opsgenie Reader. Get alerts from Opsgenie. """ def __init__(self, - api_key: Optional[str] = None, - api_url: Optional[str] = None + api_key: str, + api_url: str, + max_alerts: Optional[int] = 3000, ) -> None: self.api_key = api_key self.api_url = api_url @@ -20,18 +21,13 @@ def __init__(self, "Authorization": f"GenieKey {self.api_key}", "Content-Type": "application/json", } - self.params = { - 'query': 'status:open' - } + self.max_alerts = max_alerts def load_data(self) -> List[Document]: - """Load data from Opsgenie API. - - Args: - query: Query to be passed to Opsgenie API. + """Load data by calling Opsgenie alerts API. Returns: - List of documents. + List of alerts. """ alerts = [] all_opsgenie_alerts = self.get_all_alerts() @@ -45,16 +41,34 @@ def load_data(self) -> List[Document]: return alerts def get_all_alerts(self): - response = requests.get( - f"{self.api_url}/v2/alerts", headers=self.headers, params=self.params, timeout=30) + """Get all alerts from Opsgenie.""" - if response.status_code == 200: - alerts = response.json().get("data", []) - return alerts - else: - raise ValueError("Problem getting list of alerts from Opsgenie. Check API key and URL.") + query_params = { + 'sort': 'createdAt', + 'order': 'desc' + } + + all_alerts = [] + list_alerts_url = f"{self.api_url}/v2/alerts" + + while list_alerts_url and len(all_alerts) < self.max_alerts: + response = requests.get(list_alerts_url, headers=self.headers, params={'query': json.dumps(query_params)}, timeout=30) + if response.status_code == 200: + alerts = response.json() + all_alerts.extend(alerts.get("data", [])) + paging = alerts['paging'] + try: + list_alerts_url = paging['next'] + except KeyError: + list_alerts_url = None + else: + raise ValueError(f"Problem getting list of alerts from Opsgenie.Error: {response.status_code}, {response.text}") + + return all_alerts def get_alert_details(self, alert_id): + """Get alert detail""" + response = requests.get( f"{self.api_url}/v2/alerts/{alert_id}", headers=self.headers, timeout=30) @@ -62,4 +76,4 @@ def get_alert_details(self, alert_id): details = response.json().get("data", {}) return details else: - raise ValueError("Problem getting alert details for alert_id from Opsgenie. Check API key and URL.") + raise ValueError(f"Problem getting alert details for {alert_id} from Opsgenie .Error: {response.status_code}, {response.text}") From 61591d46a7595921a41eb45f8ea2e327e56257c9 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Mon, 29 Jan 2024 09:57:27 +1300 Subject: [PATCH 03/10] Add print statement --- llama_hub/opsgenie/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 41e12d6cd3..1197ad5aba 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -56,6 +56,7 @@ def get_all_alerts(self): if response.status_code == 200: alerts = response.json() all_alerts.extend(alerts.get("data", [])) + print (f"Retrieved {len(alerts.get('data', []))} alerts. Total alerts: {len(all_alerts)}") paging = alerts['paging'] try: list_alerts_url = paging['next'] From 9ce00bae62572a35639517c257edf666d2c6b298 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Mon, 29 Jan 2024 10:10:30 +1300 Subject: [PATCH 04/10] fix condition --- llama_hub/opsgenie/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 1197ad5aba..bc25413f33 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -51,7 +51,7 @@ def get_all_alerts(self): all_alerts = [] list_alerts_url = f"{self.api_url}/v2/alerts" - while list_alerts_url and len(all_alerts) < self.max_alerts: + while list_alerts_url and len(all_alerts) <= self.max_alerts: response = requests.get(list_alerts_url, headers=self.headers, params={'query': json.dumps(query_params)}, timeout=30) if response.status_code == 200: alerts = response.json() From 191af588e741242287713daf9047484485c2b168 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Mon, 29 Jan 2024 10:19:23 +1300 Subject: [PATCH 05/10] Remove params --- llama_hub/opsgenie/base.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index bc25413f33..1d55dc938d 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -43,16 +43,11 @@ def load_data(self) -> List[Document]: def get_all_alerts(self): """Get all alerts from Opsgenie.""" - query_params = { - 'sort': 'createdAt', - 'order': 'desc' - } - all_alerts = [] list_alerts_url = f"{self.api_url}/v2/alerts" while list_alerts_url and len(all_alerts) <= self.max_alerts: - response = requests.get(list_alerts_url, headers=self.headers, params={'query': json.dumps(query_params)}, timeout=30) + response = requests.get(list_alerts_url, headers=self.headers, params={}, timeout=30) if response.status_code == 200: alerts = response.json() all_alerts.extend(alerts.get("data", [])) From ce4dcb5615d1c80eab5a7c939e3a291c7ecd4c72 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Mon, 29 Jan 2024 10:21:47 +1300 Subject: [PATCH 06/10] fix formatting --- llama_hub/opsgenie/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 1d55dc938d..b8fbcf35bf 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -13,7 +13,7 @@ class OpsgenieReader(BaseReader): def __init__(self, api_key: str, api_url: str, - max_alerts: Optional[int] = 3000, + max_alerts: Optional[int] = 3000 ) -> None: self.api_key = api_key self.api_url = api_url From 8dcd5c9f0c8a838106140a284087300adcbd8bf2 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Mon, 29 Jan 2024 10:47:25 +1300 Subject: [PATCH 07/10] format and lint --- llama_hub/opsgenie/__init__.py | 6 ++---- llama_hub/opsgenie/base.py | 32 ++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/llama_hub/opsgenie/__init__.py b/llama_hub/opsgenie/__init__.py index dd0af2b560..1e2efd5e62 100644 --- a/llama_hub/opsgenie/__init__.py +++ b/llama_hub/opsgenie/__init__.py @@ -1,5 +1,3 @@ -from llama_hub.opsgenie.base import ( - OpsgenieReader -) +from llama_hub.opsgenie.base import OpsgenieReader -__all__ = ["OpsgenieReader"] \ No newline at end of file +__all__ = ["OpsgenieReader"] diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index b8fbcf35bf..6dc5ed7148 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -5,15 +5,14 @@ from llama_index.readers.base import BaseReader from llama_index.schema import Document + class OpsgenieReader(BaseReader): """ Opsgenie Reader. Get alerts from Opsgenie. """ - def __init__(self, - api_key: str, - api_url: str, - max_alerts: Optional[int] = 3000 + def __init__( + self, api_key: str, api_url: str, max_alerts: Optional[int] = 3000 ) -> None: self.api_key = api_key self.api_url = api_url @@ -39,7 +38,7 @@ def load_data(self) -> List[Document]: alerts.append(alert) return alerts - + def get_all_alerts(self): """Get all alerts from Opsgenie.""" @@ -47,18 +46,24 @@ def get_all_alerts(self): list_alerts_url = f"{self.api_url}/v2/alerts" while list_alerts_url and len(all_alerts) <= self.max_alerts: - response = requests.get(list_alerts_url, headers=self.headers, params={}, timeout=30) + response = requests.get( + list_alerts_url, headers=self.headers, params={}, timeout=30 + ) if response.status_code == 200: alerts = response.json() all_alerts.extend(alerts.get("data", [])) - print (f"Retrieved {len(alerts.get('data', []))} alerts. Total alerts: {len(all_alerts)}") - paging = alerts['paging'] + print( + f"Retrieved {len(alerts.get('data', []))} alerts. Total alerts: {len(all_alerts)}" + ) + paging = alerts["paging"] try: - list_alerts_url = paging['next'] + list_alerts_url = paging["next"] except KeyError: list_alerts_url = None else: - raise ValueError(f"Problem getting list of alerts from Opsgenie.Error: {response.status_code}, {response.text}") + raise ValueError( + f"Problem getting list of alerts from Opsgenie.Error: {response.status_code}, {response.text}" + ) return all_alerts @@ -66,10 +71,13 @@ def get_alert_details(self, alert_id): """Get alert detail""" response = requests.get( - f"{self.api_url}/v2/alerts/{alert_id}", headers=self.headers, timeout=30) + f"{self.api_url}/v2/alerts/{alert_id}", headers=self.headers, timeout=30 + ) if response.status_code == 200: details = response.json().get("data", {}) return details else: - raise ValueError(f"Problem getting alert details for {alert_id} from Opsgenie .Error: {response.status_code}, {response.text}") + raise ValueError( + f"Problem getting alert details for {alert_id} from Opsgenie .Error: {response.status_code}, {response.text}" + ) From e3d5a70d992de7b90a1eb394f975dae356153a74 Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Fri, 2 Feb 2024 09:29:14 +1300 Subject: [PATCH 08/10] set max to 300 --- llama_hub/opsgenie/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 6dc5ed7148..0db4e2181a 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -12,7 +12,7 @@ class OpsgenieReader(BaseReader): """ def __init__( - self, api_key: str, api_url: str, max_alerts: Optional[int] = 3000 + self, api_key: str, api_url: str, max_alerts: Optional[int] = 300 ) -> None: self.api_key = api_key self.api_url = api_url @@ -65,6 +65,8 @@ def get_all_alerts(self): f"Problem getting list of alerts from Opsgenie.Error: {response.status_code}, {response.text}" ) + print(f"Total alerts retrieved: {len(all_alerts)}") + return all_alerts def get_alert_details(self, alert_id): From 7efc9465e1e404c4230d9462ce929b666a22923c Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Fri, 2 Feb 2024 09:35:25 +1300 Subject: [PATCH 09/10] add print statements --- llama_hub/opsgenie/base.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 0db4e2181a..1cf8d41bb2 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -44,17 +44,17 @@ def get_all_alerts(self): all_alerts = [] list_alerts_url = f"{self.api_url}/v2/alerts" + print(f"Max alerts {len(self.max_alerts)}") while list_alerts_url and len(all_alerts) <= self.max_alerts: + print(f"Alerts read so far {len(all_alerts)}") + print(f"Retrieving alerts from {list_alerts_url}") response = requests.get( list_alerts_url, headers=self.headers, params={}, timeout=30 ) if response.status_code == 200: alerts = response.json() all_alerts.extend(alerts.get("data", [])) - print( - f"Retrieved {len(alerts.get('data', []))} alerts. Total alerts: {len(all_alerts)}" - ) paging = alerts["paging"] try: list_alerts_url = paging["next"] @@ -65,7 +65,7 @@ def get_all_alerts(self): f"Problem getting list of alerts from Opsgenie.Error: {response.status_code}, {response.text}" ) - print(f"Total alerts retrieved: {len(all_alerts)}") + print(f"Final Total alerts retrieved: {len(all_alerts)}") return all_alerts From 5b7481bfecafd52a6c23e4613721c93696302efa Mon Sep 17 00:00:00 2001 From: ns-gsa Date: Fri, 2 Feb 2024 09:45:04 +1300 Subject: [PATCH 10/10] update print --- llama_hub/opsgenie/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llama_hub/opsgenie/base.py b/llama_hub/opsgenie/base.py index 1cf8d41bb2..ed281762aa 100644 --- a/llama_hub/opsgenie/base.py +++ b/llama_hub/opsgenie/base.py @@ -44,7 +44,8 @@ def get_all_alerts(self): all_alerts = [] list_alerts_url = f"{self.api_url}/v2/alerts" - print(f"Max alerts {len(self.max_alerts)}") + + print(f"max_alerts: {self.max_alerts}") while list_alerts_url and len(all_alerts) <= self.max_alerts: print(f"Alerts read so far {len(all_alerts)}")