Skip to content

Commit 3ab53d9

Browse files
authored
Merge pull request #1031 from Particular/cutom-checks-alerting
Healthcheck notifications
2 parents cec0c16 + 120154e commit 3ab53d9

File tree

10 files changed

+425
-8
lines changed

10 files changed

+425
-8
lines changed

src/ServicePulse.Host/app/css/particular.css

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,11 @@ p.endpoint-metadata {
870870
padding-top: 0;
871871
}
872872

873+
.endpoint-metadata button i {
874+
color: #00a3c4;
875+
margin-right: 4px;
876+
}
877+
873878

874879
.fa-stack-2x {
875880
font-size: 24px;
@@ -1252,6 +1257,10 @@ input#immediatelyRetry {
12521257
visibility: visible;
12531258
}
12541259

1260+
input#enableTLS {
1261+
visibility: visible;
1262+
}
1263+
12551264
.checkbox {
12561265
margin-top: 1px;
12571266
margin-left: 1px;
@@ -2755,6 +2764,7 @@ span.connection-test {
27552764
left: 10px;
27562765
text-transform: uppercase;
27572766
font-weight: bold;
2767+
color: black;
27582768
}
27592769

27602770
span.failed-validation {
@@ -3228,3 +3238,16 @@ button[ng-click="vm.toggleSort()"] div {
32283238
font-weight: bold;
32293239
margin: 20px 0 10px 15px;
32303240
}
3241+
3242+
.notifications .btn-sm {
3243+
padding: 0px;
3244+
}
3245+
3246+
.notifications .connection-test
3247+
{
3248+
top: 2px;
3249+
}
3250+
3251+
.screen-intro {
3252+
margin: 30px 0;
3253+
}

src/ServicePulse.Host/app/modules/configuration/js/configuration.module.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
require('./connections/connections.module');
1717

18+
require('./notifications/notifications.module');
19+
1820
angular.module('configuration', [
1921
'ui.bootstrap',
2022
'configuration.route',
@@ -23,6 +25,7 @@
2325
'configuration.redirect',
2426
'configuration.license',
2527
'configuration.connections',
28+
'configuration.notifications'
2629
]);
2730

2831
} (window, window.angular));

src/ServicePulse.Host/app/modules/configuration/js/directives/ui.particular.configurationTabs.tpl.html

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
<div class="row">
22
<div class="col-sm-12">
33
<div class="tabs">
4-
<h5
5-
ng-class="{ active: isActive('/configuration/license'), disabled: (!connectionsStatus.isSCConnected && !connectionsStatus.scConnectedAtLeastOnce) }">
4+
<h5 ng-class="{ active: isActive('/configuration/license'), disabled: (!connectionsStatus.isSCConnected && !connectionsStatus.scConnectedAtLeastOnce) }">
65
<a href="#/configuration/license">License</a>
76
<exclamation type="{{licensewarning}}" />
87
</h5>
8+
<h5 ng-class="{ active: isActive('/configuration/notifications'), disabled: (!connectionsStatus.isSCConnected && !connectionsStatus.scConnectedAtLeastOnce) }"
9+
ng-show="!isExpired">
10+
<a href="#/configuration/notifications">Health check Notifications</a>
11+
</h5>
912
<h5 ng-class="{ active: isActive('/configuration/redirects'), disabled: (!connectionsStatus.isSCConnected && !connectionsStatus.scConnectedAtLeastOnce) }"
10-
ng-show="!isExpired"><a href="#/configuration/redirects">Retry redirects
11-
({{counters.redirects | number}})</a></h5>
12-
<h5 ng-class="{ active: isActive('/configuration/connections') }" ng-show="!isExpired"><a
13-
href="#/configuration/connections">Connections
14-
<span ng-show="unableToConnectToServiceControl || unableToConnectToMonitoring"> <i
15-
class="fa fa-exclamation-triangle"></i></span></a>
13+
ng-show="!isExpired">
14+
<a href="#/configuration/redirects">
15+
Retry redirects
16+
({{counters.redirects | number}})
17+
</a>
18+
</h5>
19+
<h5 ng-class="{ active: isActive('/configuration/connections') }" ng-show="!isExpired">
20+
<a href="#/configuration/connections">
21+
Connections
22+
<span ng-show="unableToConnectToServiceControl || unableToConnectToMonitoring">
23+
<i class="fa fa-exclamation-triangle"></i>
24+
</span>
25+
</a>
1626
</h5>
1727
</div>
1828
</div>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
(function (window, angular) {
2+
'use strict';
3+
4+
function controller(
5+
$scope,
6+
$uibModalInstance,
7+
notificationsService,
8+
toastService
9+
) {
10+
function refreshData() {
11+
notificationsService.getSettings().then((notifications) => {
12+
$scope.settings = notifications;
13+
});
14+
}
15+
16+
$scope.save = (notificationsForm) => {
17+
if (notificationsForm.$valid) {
18+
notificationsService.updateSettings($scope.settings).then(
19+
() => {
20+
toastService.showInfo('Email settings updated.');
21+
$uibModalInstance.dismiss('saved');
22+
},
23+
() => toastService.showError('Failed to update the email settings.'));
24+
}
25+
};
26+
27+
$scope.cancel = function() {
28+
$uibModalInstance.dismiss('cancel');
29+
};
30+
31+
refreshData();
32+
}
33+
34+
controller.$inject = [
35+
'$scope',
36+
'$uibModalInstance',
37+
'notificationsService',
38+
'toastService',
39+
'notifyService'
40+
];
41+
42+
angular.module('configuration.notifications')
43+
.controller('editEmailController', controller);
44+
45+
})(window, window.angular);
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
(function (window, angular) {
2+
'use strict';
3+
4+
function controller(
5+
$scope,
6+
notificationsService,
7+
notifyService,
8+
toastService,
9+
$uibModal) {
10+
11+
var vm = this;
12+
var notifier = notifyService();
13+
14+
vm.notifications = {};
15+
16+
notifier.subscribe($scope, (event, response) => {
17+
vm.notifications = response.notifications;
18+
}, 'NotificationsConfigurationUpdated');
19+
20+
function refreshData() {
21+
notificationsService.getSettings().then((notifications) => {
22+
vm.notifications = notifications;
23+
});
24+
}
25+
26+
vm.toogleEmailNotifications = () => {
27+
var emailNotificationsOn = !vm.notifications.enabled;
28+
29+
notificationsService.toogleEmailNotifications(emailNotificationsOn).then(
30+
() => vm.notifications.enabled = emailNotificationsOn,
31+
() => toastService.showError('Failed to update settings.')
32+
);
33+
};
34+
35+
vm.editEmailNotifications = () => {
36+
const template = require('../../views/notificationsemailmodal.html');
37+
38+
$uibModal.open({
39+
template: template,
40+
controller: 'editEmailController',
41+
resolve: {
42+
data: () => {
43+
return {};
44+
}
45+
}
46+
});
47+
};
48+
49+
vm.testEmailNotifications = () => {
50+
vm.emailTestInProgress = true;
51+
vm.emailTestSuccessful = false;
52+
vm.emailTestFailure = false;
53+
54+
notificationsService.testEmailNotifications().then(
55+
() => {
56+
vm.emailTestInProgress = false;
57+
vm.emailTestSuccessful = true;
58+
},
59+
(error) => {
60+
toastService.showError(error.data);
61+
vm.emailTestInProgress = false;
62+
vm.emailTestFailure = true;
63+
}
64+
);
65+
};
66+
67+
refreshData();
68+
}
69+
70+
controller.$inject = [
71+
'$scope',
72+
'notificationsService',
73+
'notifyService',
74+
'toastService',
75+
'$uibModal'
76+
];
77+
78+
angular.module('configuration.notifications')
79+
.controller('notificationsController', controller);
80+
81+
})(window, window.angular);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
(function (window, angular) {
2+
'use strict';
3+
4+
angular.module('configuration.notifications', []);
5+
6+
require('./notifications.route');
7+
require('./notifications.controller');
8+
require('./notifications.service');
9+
require('./emailnotifications.controller');
10+
11+
}(window, window.angular));
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
(function (window, angular) {
2+
'use strict';
3+
4+
function routeProvider($routeProvider) {
5+
const template = require('../../views/notifications.html');
6+
7+
$routeProvider.when('/notifications', {
8+
redirectTo: "/configuration/notifications"
9+
}).when('/configuration/notifications', {
10+
data: {
11+
pageTitle: 'Health check Notifications - Configuration'
12+
},
13+
template: template,
14+
controller: 'notificationsController',
15+
controllerAs: 'vm'
16+
});
17+
}
18+
19+
routeProvider.$inject = [
20+
'$routeProvider'
21+
];
22+
23+
angular.module('configuration.notifications', [])
24+
.config(routeProvider);
25+
26+
}(window, window.angular));
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
(function (window, angular) {
2+
'use strict';
3+
4+
function service($http, $timeout, $q, $rootScope, $interval, moment, connectionsManager, uri, notifications, notifyService) {
5+
var notifier = notifyService();
6+
var scu = connectionsManager.getServiceControlUrl();
7+
8+
var notifications = {};
9+
10+
function getData() {
11+
var url = uri.join(scu, 'notifications/email');
12+
return $http.get(url).then(function (response) {
13+
notifications = response.data;
14+
15+
notifier.notify('NotificationsConfigurationUpdated', { notifications });
16+
});
17+
}
18+
19+
function sendPromise(url, method, data, success, error) {
20+
21+
var defer = $q.defer();
22+
23+
success = success || 'success';
24+
error = error || 'error';
25+
26+
$http({
27+
url: url,
28+
data: data,
29+
method: method
30+
})
31+
.then(function(response) {
32+
defer.resolve({ message: success, status: response.status });
33+
}, function(response) {
34+
defer.reject({ message: error + ':' + response.statusText, status: response.status, statusText: response.statusText, data: response.data });
35+
}
36+
);
37+
38+
return defer.promise;
39+
}
40+
41+
getData();
42+
43+
return {
44+
updateSettings: function(settings, success, error) {
45+
var url = uri.join(scu, 'notifications/email');
46+
var promise = sendPromise(url, 'POST', settings,
47+
() => {notifications = settings},
48+
error);
49+
50+
return promise;
51+
},
52+
testEmailNotifications: function(success, error) {
53+
var url = uri.join(scu, 'notifications/email/test');
54+
var promise = sendPromise(url, 'POST', {}, success, error);
55+
56+
return promise;
57+
},
58+
toogleEmailNotifications: function(enabled, success, error) {
59+
var url = uri.join(scu, 'notifications/email/toggle');
60+
61+
var promise = sendPromise(url, 'POST', {'enabled': enabled}, success, error);
62+
63+
return promise;
64+
},
65+
getSettings: function() {
66+
return $q.when(notifications);
67+
}
68+
};
69+
}
70+
71+
service.$inject = ['$http', '$timeout', '$q', '$rootScope', '$interval', 'moment', 'connectionsManager', 'uri', 'notifications', 'notifyService'];
72+
73+
angular.module('configuration.notifications')
74+
.service('notificationsService', service);
75+
76+
})(window, window.angular);

0 commit comments

Comments
 (0)