Skip to content

StatusPage.io Client

StatusPageClient

StatusPageClient Class

The StatusPageClient class provides methods for interacting with the Statuspage.io's APIs

Attributes:

Name Type Description
component_status_list List[str]

A list of valid component status codes for StatusPage.io

incident_status_list List[str]

A list of valid incident status codes for live incidents in StatusPage.io

scheduled_incident_status_list List[str]

A list of valid incident status codes for scheduledStatusPage.io

Source code in pi_monitor/statuspage_io_client.py
 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
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
class StatusPageClient:
    """StatusPageClient Class

    The StatusPageClient class provides methods for interacting with the
    [Statuspage.io's APIs](https://developer.statuspage.io/)

    Attributes:
        component_status_list: A list of valid component status codes for StatusPage.io
        incident_status_list: A list of valid incident status codes for live incidents
                                in StatusPage.io
        scheduled_incident_status_list: A list of valid incident status codes for
                                        scheduledStatusPage.io
    """

    AUTH_HEADER = "Authorization"
    STATUS_PAGE_BASE_URL = "https://api.statuspage.io/v1/pages"
    CLIENT_ERROR_MESSAGE = "Request failed exception:"

    component_status_list: List[str] = [
        "operational",
        "under_maintenance",
        "degraded_performance",
        "partial_outage",
        "major_outage",
    ]
    incident_status_list: List[str] = [
        "investigating",
        "identified",
        "monitoring",
        "resolved",
    ]
    scheduled_incident_status_list: List[str] = [
        "scheduled",
        "in_progress",
        "verifying",
        "complete",
    ]

    def __init__(self, api_key: str, page_id: str):
        self.api_key = api_key
        self.page_id = page_id

    def _get_headers(self) -> Dict[str, str]:
        """Retrieve headers for all requests

        This function adds the necessary `Authorization` and `Content-Type` headers
        for the API to operate using JSON.

        Returns:
            A Dictionary that represents the headers for request to Statuspage.io

        """
        return {
            f"{self.AUTH_HEADER}": f"OAuth {self.api_key}",
            "Content-Type": "application/json",
        }

    def get_component(self, component_id: str) -> object:
        """Retrieve Component Information

        Retrieve the current component information using the provided component_id.

        Args:
            component_id: The id of the component to retrieve.

        Returns:
            A SimpleNamespace object created from the JSON return.  Object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/getPagesPageIdComponentsComponentId).

        """
        component_url = (
            f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/components/{component_id}"
        )
        logger.debug("Retrieving component from StatusPage: %s", component_url)
        try:
            component = requests.get(component_url, headers=self._get_headers())
            logger.debug("Component Response: %s", component.text)

            if component.status_code == 404:
                logger.warning("Component %s not found", component_id)

            return component.json(object_hook=lambda d: SimpleNamespace(**d))
        except Exception as e:
            self._handle_exception(e)

    def update_component(self, component_id: str, payload: object) -> object:
        """Update Component Information

        Update the given component using the provided payload as the object body.  The
        payload object will be processed using `json.dumps()`.

        Args:
            component_id: The id of the component to update.
            payload: An object representing the JSON payload.  Valid object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/putPagesPageIdComponentsComponentId).

        Returns:
            A SimpleNamespace object created from the JSON return.  Object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/putPagesPageIdComponentsComponentId).

        """
        component_url = (
            f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/components/{component_id}"
        )
        logger.debug("Updating component %s: %s", component_id, payload)
        try:
            r = requests.put(
                component_url, headers=self._get_headers(), data=json.dumps(payload)
            )
            return r.json(object_hook=lambda d: SimpleNamespace(**d))
        except Exception as e:
            self._handle_exception(e)

    def get_unresolved_incidents(self) -> object:
        """Retrieve Unresolved Incidents

        Retrieve all the current unresolved incidents.

        Returns:
            A SimpleNamespace object created from the JSON return.  Object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/getPagesPageIdIncidentsUnresolved).

        """
        logger.info("Retrieving unresolved incidents")
        unresolved_incidents_url = (
            f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/incidents/unresolved"
        )
        try:
            unresolved_incidents_response = requests.get(
                unresolved_incidents_url, headers=self._get_headers()
            )
            result = unresolved_incidents_response.json(
                object_hook=lambda d: SimpleNamespace(**d)
            )
            return result
        except Exception as e:
            self._handle_exception(e)

    def create_incident(self, payload: object) -> object:
        """Create Incident

        Create a new incident using the provided payload as the object body.  The
        payload object will be processed using `json.dumps()`.

        Args:
            payload: An object representing the JSON payload.  Valid object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/postPagesPageIdIncidents).

        Returns:
            A SimpleNamespace object created from the JSON return.  Object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/postPagesPageIdIncidents).

        """
        incident_url = f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/incidents"
        logger.info("Creating incident: %s", incident_url)
        try:
            r = requests.post(
                incident_url, headers=self._get_headers(), data=json.dumps(payload)
            )
            result_object = r.json(object_hook=lambda d: SimpleNamespace(**d))
            logger.debug("Create Incident Response: %s", result_object)
            return result_object
        except Exception as e:
            self._handle_exception(e)

    def update_incident(self, incident_id: str, payload: object) -> object:
        """Update Incident Information

        Update the given incident using the provided payload as the object body.  The
        payload object will be processed using `json.dumps()`.

        Args:
            incident_id: The id of the incident to update.
            payload: An object representing the JSON payload.  Valid object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/patchPagesPageIdIncidentsIncidentId).

        Returns:
            A SimpleNamespace object created from the JSON return.  Object
                representation can be found in the
                [docs](https://developer.statuspage.io/#operation/patchPagesPageIdIncidentsIncidentId).

        """
        incident_url = (
            f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/incidents/{incident_id}"
        )
        logger.info("Updating incident %s: %s", incident_url, incident_id)
        try:
            r = requests.patch(
                incident_url, headers=self._get_headers(), data=json.dumps(payload)
            )
            result_object = r.json(object_hook=lambda d: SimpleNamespace(**d))
            logger.debug("Update Incident Response: %s", result_object)
            return result_object
        except Exception as e:
            self._handle_exception(e)

    def _handle_exception(self, e: Exception):
        logger.error("%s %s", self.CLIENT_ERROR_MESSAGE, e)

_get_headers()

Retrieve headers for all requests

This function adds the necessary Authorization and Content-Type headers for the API to operate using JSON.

Returns:

Type Description
Dict[str, str]

A Dictionary that represents the headers for request to Statuspage.io

Source code in pi_monitor/statuspage_io_client.py
52
53
54
55
56
57
58
59
60
61
62
63
64
65
def _get_headers(self) -> Dict[str, str]:
    """Retrieve headers for all requests

    This function adds the necessary `Authorization` and `Content-Type` headers
    for the API to operate using JSON.

    Returns:
        A Dictionary that represents the headers for request to Statuspage.io

    """
    return {
        f"{self.AUTH_HEADER}": f"OAuth {self.api_key}",
        "Content-Type": "application/json",
    }

create_incident(payload)

Create Incident

Create a new incident using the provided payload as the object body. The payload object will be processed using json.dumps().

Parameters:

Name Type Description Default
payload object

An object representing the JSON payload. Valid object representation can be found in the docs.

required

Returns:

Type Description
object

A SimpleNamespace object created from the JSON return. Object representation can be found in the docs.

Source code in pi_monitor/statuspage_io_client.py
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
def create_incident(self, payload: object) -> object:
    """Create Incident

    Create a new incident using the provided payload as the object body.  The
    payload object will be processed using `json.dumps()`.

    Args:
        payload: An object representing the JSON payload.  Valid object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/postPagesPageIdIncidents).

    Returns:
        A SimpleNamespace object created from the JSON return.  Object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/postPagesPageIdIncidents).

    """
    incident_url = f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/incidents"
    logger.info("Creating incident: %s", incident_url)
    try:
        r = requests.post(
            incident_url, headers=self._get_headers(), data=json.dumps(payload)
        )
        result_object = r.json(object_hook=lambda d: SimpleNamespace(**d))
        logger.debug("Create Incident Response: %s", result_object)
        return result_object
    except Exception as e:
        self._handle_exception(e)

get_component(component_id)

Retrieve Component Information

Retrieve the current component information using the provided component_id.

Parameters:

Name Type Description Default
component_id str

The id of the component to retrieve.

required

Returns:

Type Description
object

A SimpleNamespace object created from the JSON return. Object representation can be found in the docs.

Source code in pi_monitor/statuspage_io_client.py
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
def get_component(self, component_id: str) -> object:
    """Retrieve Component Information

    Retrieve the current component information using the provided component_id.

    Args:
        component_id: The id of the component to retrieve.

    Returns:
        A SimpleNamespace object created from the JSON return.  Object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/getPagesPageIdComponentsComponentId).

    """
    component_url = (
        f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/components/{component_id}"
    )
    logger.debug("Retrieving component from StatusPage: %s", component_url)
    try:
        component = requests.get(component_url, headers=self._get_headers())
        logger.debug("Component Response: %s", component.text)

        if component.status_code == 404:
            logger.warning("Component %s not found", component_id)

        return component.json(object_hook=lambda d: SimpleNamespace(**d))
    except Exception as e:
        self._handle_exception(e)

get_unresolved_incidents()

Retrieve Unresolved Incidents

Retrieve all the current unresolved incidents.

Returns:

Type Description
object

A SimpleNamespace object created from the JSON return. Object representation can be found in the docs.

Source code in pi_monitor/statuspage_io_client.py
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
def get_unresolved_incidents(self) -> object:
    """Retrieve Unresolved Incidents

    Retrieve all the current unresolved incidents.

    Returns:
        A SimpleNamespace object created from the JSON return.  Object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/getPagesPageIdIncidentsUnresolved).

    """
    logger.info("Retrieving unresolved incidents")
    unresolved_incidents_url = (
        f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/incidents/unresolved"
    )
    try:
        unresolved_incidents_response = requests.get(
            unresolved_incidents_url, headers=self._get_headers()
        )
        result = unresolved_incidents_response.json(
            object_hook=lambda d: SimpleNamespace(**d)
        )
        return result
    except Exception as e:
        self._handle_exception(e)

update_component(component_id, payload)

Update Component Information

Update the given component using the provided payload as the object body. The payload object will be processed using json.dumps().

Parameters:

Name Type Description Default
component_id str

The id of the component to update.

required
payload object

An object representing the JSON payload. Valid object representation can be found in the docs.

required

Returns:

Type Description
object

A SimpleNamespace object created from the JSON return. Object representation can be found in the docs.

Source code in pi_monitor/statuspage_io_client.py
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
def update_component(self, component_id: str, payload: object) -> object:
    """Update Component Information

    Update the given component using the provided payload as the object body.  The
    payload object will be processed using `json.dumps()`.

    Args:
        component_id: The id of the component to update.
        payload: An object representing the JSON payload.  Valid object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/putPagesPageIdComponentsComponentId).

    Returns:
        A SimpleNamespace object created from the JSON return.  Object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/putPagesPageIdComponentsComponentId).

    """
    component_url = (
        f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/components/{component_id}"
    )
    logger.debug("Updating component %s: %s", component_id, payload)
    try:
        r = requests.put(
            component_url, headers=self._get_headers(), data=json.dumps(payload)
        )
        return r.json(object_hook=lambda d: SimpleNamespace(**d))
    except Exception as e:
        self._handle_exception(e)

update_incident(incident_id, payload)

Update Incident Information

Update the given incident using the provided payload as the object body. The payload object will be processed using json.dumps().

Parameters:

Name Type Description Default
incident_id str

The id of the incident to update.

required
payload object

An object representing the JSON payload. Valid object representation can be found in the docs.

required

Returns:

Type Description
object

A SimpleNamespace object created from the JSON return. Object representation can be found in the docs.

Source code in pi_monitor/statuspage_io_client.py
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
def update_incident(self, incident_id: str, payload: object) -> object:
    """Update Incident Information

    Update the given incident using the provided payload as the object body.  The
    payload object will be processed using `json.dumps()`.

    Args:
        incident_id: The id of the incident to update.
        payload: An object representing the JSON payload.  Valid object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/patchPagesPageIdIncidentsIncidentId).

    Returns:
        A SimpleNamespace object created from the JSON return.  Object
            representation can be found in the
            [docs](https://developer.statuspage.io/#operation/patchPagesPageIdIncidentsIncidentId).

    """
    incident_url = (
        f"{self.STATUS_PAGE_BASE_URL}/{self.page_id}/incidents/{incident_id}"
    )
    logger.info("Updating incident %s: %s", incident_url, incident_id)
    try:
        r = requests.patch(
            incident_url, headers=self._get_headers(), data=json.dumps(payload)
        )
        result_object = r.json(object_hook=lambda d: SimpleNamespace(**d))
        logger.debug("Update Incident Response: %s", result_object)
        return result_object
    except Exception as e:
        self._handle_exception(e)