alerta-contrib/integrations/opsweekly/alerta.php
2023-03-21 00:15:34 +01:00

98 lines
3.7 KiB
PHP

<?php
/**
* Alerta on call provider
*/
/** Plugin specific variables required
* Global Config:
* - base_url: The path to your Alerta API, e.g. https://api.alerta.io
* - apikey: An API key created for Opsweekly in the Alerta console
*
* Team Config:
* - alerta_search: The search filter that narrows down the results to the team.
* Variables: #logged_in_username# = The username of the person currently using opsweekly
*/
/**
* getOnCallNotifications - Returns the notifications for a given time period and parameters
*
* Parameters:
* $on_call_name - The username of the user compiling this report
* $provider_global_config - All options from config.php in $oncall_providers - That is, global options.
* $provider_team_config - All options from config.php in $teams - That is, specific team configuration options
* $start - The unix timestamp of when to start looking for notifications
* $end - The unix timestamp of when to stop looking for notifications
*
* Returns 0 or more notifications as array()
* - Each notification should have the following keys:
* - time: alert 'createTime' attribute
* - hostname: alert 'environment' and 'resource' attributes
* - service: alert 'event' attribute
* - output: alert 'service' and 'text' attributes
* - state: alert 'severity' attribute eg. 'critical', 'major', 'minor', 'warning', 'normal'
*/
function getOnCallNotifications($on_call_name, $provider_global_config, $provider_team_config, $start, $end) {
$base_url = $provider_global_config['base_url'];
$apikey = $provider_global_config['apikey'];
$search_filter = $provider_team_config['alerta_search'];
// Variable replacement in the search filter, see config.php for the full list.
$search_filter = str_replace("#logged_in_username#", "$on_call_name", $search_filter);
$search = $search_filter;
parse_str($search, $parameters);
$parameters['from-date'] = str_replace("+00:00", ".000Z", date('c', $start));
$parameters['to-date'] = str_replace("+00:00", ".000Z", date('c', $end));
$notifications = array();
$results = doAlertaAPICall('/alerts', $parameters, $base_url, $apikey);
if ($results['success'] === false) {
return 'Failed to retrieve on call data from Alerta, error: ' . $results['error'];
} else {
foreach($results['data'] as $notification) {
$notifications[] = array("output" => implode(",", $notification->service) . " - " . $notification->text, "time" => $notification->createTime, "contact" => $on_call_name,
"state" => $notification->severity, "hostname" => $notification->environment . ":" . $notification->resource, "service" => $notification->event);
}
}
if (count($notifications) == 0 ) {
return array();
} else {
return $notifications;
}
}
function doAlertaAPICall($path, $parameters, $alerta_baseurl, $alerta_apikey) {
if (isset($alerta_apikey)) {
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Key $alerta_apikey"
)
));
}
$params = null;
foreach ($parameters as $key => $value) {
if (isset($params)) {
$params .= '&';
} else {
$params = '?';
}
$params .= sprintf('%s=%s', $key, str_replace(" ", "%20", $value));
}
$response = file_get_contents($alerta_baseurl . $path . $params, false, $context);
if (!$json = json_decode($response)) {
return array("success" => false, "error" => "JSON decode failed!");
} else if ($json->status === "error") {
return array("success" => false, "error" => $json->message);
} else {
return array("success" => true, "data" => $json->alerts);
}
}
?>