From 437edeed4e7974096ffa23702723f322d717edef 2016-10-07 14:15:49 From: Marcin Lulek Date: 2016-10-07 14:15:49 Subject: [PATCH] components: whole settings panel componentized --- diff --git a/backend/src/appenlight/static/js/appenlight.js b/backend/src/appenlight/static/js/appenlight.js index a67aaf1..c9ab9da 100644 --- a/backend/src/appenlight/static/js/appenlight.js +++ b/backend/src/appenlight/static/js/appenlight.js @@ -2547,7 +2547,7 @@ function decodeEncodedJSON (input){ delete doc; return val; }catch(exc){ - console.error('decodeEncodedJSON:' + exc + ' input:' + input); + delete doc; } } @@ -2600,16 +2600,16 @@ function timeSpanToStartDate(timeSpan){ /* Sets server validation messages on form using angular machinery + * custom key holding actual error messages */ function setServerValidation(form, errors){ - console.log('form', form); + if (typeof form.ae_validation === 'undefined'){ form.ae_validation = {}; - console.log('create ae_validation key'); + } for (var key in form.ae_validation){ form.ae_validation[key] = []; - console.log('clear key:', key); + } - console.log('errors:',errors); + for (var key in form){ if (key[0] !== '$' && key !== 'ae_validation'){ @@ -2688,6 +2688,18 @@ angular.module('appenlight.components', [ 'appenlight.components.userAuthTokensView', 'appenlight.components.userAlertChannelsListView', 'appenlight.components.userAlertChannelsEmailNewView', + 'appenlight.components.applicationsListView', + 'appenlight.components.applicationsPurgeLogsView', + 'appenlight.components.applicationsUpdateView', + 'appenlight.components.integrationsListView', + 'appenlight.components.bitbucketIntegrationConfigView', + 'appenlight.components.campfireIntegrationConfigView', + 'appenlight.components.flowdockIntegrationConfigView', + 'appenlight.components.githubIntegrationConfigView', + 'appenlight.components.hipchatIntegrationConfigView', + 'appenlight.components.jiraIntegrationConfigView', + 'appenlight.components.slackIntegrationConfigView', + 'appenlight.components.webhooksIntegrationConfigView', 'appenlight.components.settingsView' ]); angular.module('appenlight.directives', [ @@ -2720,7 +2732,7 @@ var pluginsToLoad = _.map(decodeEncodedJSON(window.AE.plugins), function(item){ return item.config.angular_module }); -console.log(pluginsToLoad); + angular.module('appenlight.plugins', pluginsToLoad); var app = angular.module('appenlight', [ @@ -2816,7 +2828,7 @@ function kickstartAE(initialUserData) { AeConfig.urls.otherRoutes.lostPassword, AeConfig.urls.otherRoutes.lostPasswordGenerate ]; - console.log('$transitions.onBefore', path, $transition$.to().name, $state); + _.each(openViews, function (url) { var url = '/' + url.split('/').slice(3).join('/'); if (url === path) { @@ -2825,7 +2837,7 @@ function kickstartAE(initialUserData) { }); if (stateHolder.AeUser.id === null && !isGuestState && !isOpenView) { if (window.location.toString().indexOf(AeConfig.urls.otherRoutes.register) === -1) { - console.log('redirect to register'); + var newLocation = AeConfig.urls.otherRoutes.register + '?came_from=' + encodeURIComponent(window.location); // fix infinite digest here $rootScope.$on('$locationChangeStart', @@ -2973,3206 +2985,3183 @@ function kickstartAE(initialUserData) { ); - $templateCache.put('components/views/event-browser/event-browser.html', - "
\n" + - "
\n" + + $templateCache.put('components/views/applications-integrations-view/applications-integrations-view.html', + "\n" + "\n" + - "

Event history

\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "

For {{ event.resource_name }}

\n" + + " \n" + + " \n" + + " Bitbucket\n" + "\n" + - "

{{ event.text }}

\n" + - " created:\n" + - " \n" + - " \n" + - " | closed:\n" + - " \n" + - " \n" + - "
\n" + + "

Send issues and reports to Bitbucket

\n" + + " \n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + + " \n" + + " \n" + + " Campfire\n" + "\n" + - "
\n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('components/views/index-dashboard/index-dashboard.html', - "\n" + + " \n" + + " \n" + + " Flowdock\n" + "\n" + - "
\n" + - "
\n" + - " \n" + + "

Send issues and reports to Github

\n" + + "
\n" + "\n" + - "
\n" + + " \n" + + " \n" + + " HipChat\n" + "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + + "

Receive reports and alerts in your Hipchat chanels

\n" + + "
\n" + "\n" + - " \n" + + " \n" + + " \n" + + " Jira\n" + "\n" + + "

Send issues and reports to Jira

\n" + + "
\n" + "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + + " \n" + + " \n" + + " Slack\n" + "\n" + - "

\n" + - " \n" + - "

\n" + + "

Receive reports and alerts in your Slack chanels

\n" + + "
\n" + "\n" + - " \n" + + "
\n" + + "\n" + ); + + + $templateCache.put('components/views/applications-list-view/applications-list-view.html', + "\n" + "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + + "

You have to create a new application first.

\n" + "\n" + - "

\n" + - " Average requests per second from all servers\n" + - "

\n" + + "
\n" + "\n" + - "

\n" + - " Average response time from all servers\n" + - "

\n" + + " 0\">\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
Resource NameDomainsOptions
{{application.resource_name}}{{application.domains}}\n" + + " Update\n" + + " Integrations\n" + + "
\n" + "\n" + - "

\n" + - " Aggregated average time spent per request - broken to layers\n" + - "

\n" + + "
\n" + ); + + + $templateCache.put('components/views/applications-purge-logs-view/applications-purge-logs-view.html', + "\n" + "\n" + - "

\n" + - " Aggregated reports sent by your application\n" + - "

\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - "

\n" + - " Aggregated slow reports sent by your application\n" + - "

\n" + - "
\n" + - "
\n" + + "
\n" + + "
\n" + + " \n" + + "\n" + + "
\n" + + " \n" + "
\n" + "
\n" + "\n" + + "
\n" + + " \n" + "\n" + - "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + "\n" + - "
\n" + + "
\n" + + " \n" + "\n" + - "
\n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + "\n" + - " \n" + - " Exceptions\n" + - "
\n" + - " {{ $ctrl.exceptions|numberToThousands}}\n" + - " \n" + - "
\n" + - " Frustrating req.\n" + - "
\n" + - " {{$ctrl.frustratingRequests|numberToThousands}}\n" + - " \n" + - "
\n" + - " Tolerated req.\n" + - "
\n" + - " {{$ctrl.toleratedRequests|numberToThousands}}\n" + - " \n" + - "
\n" + - " Satisfying req.\n" + - "
\n" + - " {{$ctrl.satisfyingRequests|numberToThousands}}\n" + - "
\n" + - " Uptime\n" + - "
\n" + - " {{$ctrl.uptimeStats}}%\n" + - " \n" + - "
\n" + + "
\n" + + "
\n" + "\n" + - "
\n" + - "
\n" + + " \n" + + " \n" + + " \n" + + " API keys\n" + + " \n" + "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
ServerApdex\n" + - " \n" + - " rpmavg. response
\n" + - " {{ server.name }}\n" + - " \n" + - " {{ server.apdex }} %\n" + - " \n" + - " {{ server.rpm }}rpm\n" + - " \n" + - " {{ server.avg_response_time }}s\n" + - "
\n" + + "

PRIVATE API KEY:

\n" + + "

\n" + + "

{{ $ctrl.resource.api_key }}
\n" + + "

\n" + + "

PUBLIC API KEY (for javascript clients):

\n" + + "

\n" + + "

{{ $ctrl.resource.public_key }}
\n" + + "

\n" + + "

Your key will be used to identify to which application your data\n" + + " belongs to please keep them private at all times.

\n" + "\n" + - "
\n" + - "
\n" + + " \n" + "\n" + + " \n" + + " \n" + + " Regenerate API keys\n" + + " \n" + + "

Are you sure you want to regenerate API KEY for this application?

\n" + + "

All client application keys will need to be updated.

\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + "
\n" + + "
\n" + + "

How to connect your application?

\n" + + "

Visit our developer documentation for step-by-step integration instructions.

\n" + + "
\n" + + "

\n" + + " \"Django\n" + + " \"Pyramid\n" + + " \"Flask\n" + "\n" + + " \"Javascript\n" + + " \"Node.js\"\n" + + " \"Ruby\n" + + " \"PHP\n" + + " \n" + "\n" + + "

\n" + + "
\n" + "
\n" + "\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "

Newest errors (real-time)\n" + - "

\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + + "
\n" + "\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + "\n" + + "
\n" + + " \n" + "
\n" + - "
\n" + "\n" + - "

No new reports

\n" + "\n" + - "
\n" + - "
\n" + "
\n" + - "
\n" + - "\n" + - "
\n" + "\n" + - "
\n" + - "
\n" + - "

Request breakdown over {{ $ctrl.timeSpan.label }}

\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "

Required for Javascript error tracking (one line one domain, skip http:// part)

\n" + "
\n" + - "
\n" + - "

\n" + - " \n" + - "

\n" + - "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " {{view.view_name}}\n" + - " {{view.view_name}}\n" + - "\n" + - "
\n" + - " \n" + - " avg. response {{view.avg_response}}s in\n" + - " {{view.requests|numberToThousands}} requests\n" + - "\n" + - " \n" + - "    Latest reports:\n" + - " {{$index+1}}\n" + - " \n" + - " \n" + - "
\n" + - "\n" + - "
\n" + "\n" + - "
\n" + - "
\n" + "\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + "\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "

Application requires to send at least this amount of error reports per minute to open alert

\n" + "
\n" + "
\n" + + "
\n" + + " \n" + + " \n" + "\n" + - "
\n" + - "\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "

\n" + - " Report groups trending over {{ $ctrl.timeSpan.label }}\n" + - "

\n" + + "
\n" + + " \n" + + "

Application requires to send at least this amount of slow reports per minute to open alert

\n" + "
\n" + - "
\n" + - "

\n" + - " \n" + - "

\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "

Allow permanent storage of logs in separate DB partitions (only administrator can enable this feature)

\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + "\n" + - "
\n" + + "
\n" + + " \n" + "
\n" + "
\n" + + " \n" + + "
\n" + + "
\n" + "\n" + - "
\n" + - "\n" + - "
\n" + + "
\n" + + "
\n" + + "

Plugins

\n" + + "
\n" + + "
\n" + "\n" + + " \n" + + " \n" + "\n" + - "
\n" + - "
\n" + - "

\n" + - " Most common slow calls over {{ $ctrl.timeSpan.label }}\n" + - "

\n" + - "
\n" + - "
\n" + + "
\n" + + "
\n" + "\n" + - "
\n" + - " \n" + - "
\n" + + "
\n" + + "
\n" + + "

API Testing

\n" + + "
\n" + + "
\n" + + "

Please be sure to add at least one email alert channel for your account.

\n" + + "

This will enable AppEnlight to send you notification emails about errors inside your $ctrl.

\n" + + "

After this is done you can use this CURL commands to test APIs:

\n" + + "

(Please note that the data like execution times is semi randomly generated)

\n" + + " \n" + + " \n" + + " \n" + + " Log API\n" + + " \n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
\n" + - " {{call.occurences|numberToThousands}}\n" + - " \n" + - " {{call.statement}}\n" + - "
\n" + - " {{call.statement_type}}\n" + - " {{call.statement_subtype}}\n" + - " {{call.total_duration/call.occurences|round:2}}s\n" + - " \n" + - " Latest reports:\n" + - " {{$index+1}} \n" + - " \n" + - "
\n" + + "
\n" + + "
\n" +
+    "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/logs?protocol_version=0.5\\&api_key={{$ctrl.resource.api_key}} -d '\n" +
+    "    [\n" +
+    "      {\n" +
+    "      \"log_level\": \"WARNING\",\n" +
+    "      \"message\": \"OMG ValueError happened\",\n" +
+    "      \"namespace\": \"some.namespace.indicator\",\n" +
+    "      \"request_id\": \"SOME_UUID\",\n" +
+    "      \"permanent\": false,\n" +
+    "      \"primary_key\": \"random_key\",\n" +
+    "      \"server\": \"some.server.hostname\",\n" +
+    "      \"date\": \"{{$ctrl.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
+    "      \"tags\": [[\"tag1\",\"value\"], [\"tag2\", 5]]\n" +
+    "      },\n" +
+    "      {\n" +
+    "      \"log_level\": \"ERROR\",\n" +
+    "      \"message\": \"OMG ValueError happened2\",\n" +
+    "      \"namespace\": \"some.namespace.indicator\",\n" +
+    "      \"request_id\": \"SOME_UUID\",\n" +
+    "      \"permanent\": false,\n" +
+    "      \"server\": \"some.server.hostname\",\n" +
+    "      \"date\": \"{{$ctrl.momentJs.utc().milliseconds(0).toISOString()}}\"\n" +
+    "      }\n" +
+    "    ]'\n" +
+    "                    
\n" + + "
\n" + "\n" + + "
\n" + "\n" + - "
\n" + + " \n" + + " \n" + + " Report API\n" + + " \n" + + "\n" + + "
\n" + + "
\n" +
+    "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/reports?protocol_version=0.5\\&api_key={{$ctrl.resource.api_key}} -d '\n" +
+    "    [{\n" +
+    "    \"client\": \"your-client-name-python\",\n" +
+    "    \"language\": \"python\",\n" +
+    "    \"view_name\": \"views/foo:bar\",\n" +
+    "    \"server\": \"SERVERNAME/INSTANCENAME\",\n" +
+    "    \"priority\": 5,\n" +
+    "    \"error\": \"OMG ValueError happened\",\n" +
+    "    \"occurences\":1,\n" +
+    "    \"http_status\": 500,\n" +
+    "    \"tags\": [[\"tag1\",\"value\"], [\"tag2\", 5]],\n" +
+    "    \"username\": \"USER\",\n" +
+    "    \"url\": \"HTTP://SOMEURL\",\n" +
+    "    \"ip\": \"127.0.0.1\",\n" +
+    "    \"start_time\": \"{{$ctrl.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
+    "    \"end_time\": \"{{$ctrl.momentJs.utc().milliseconds(0).add(2, 'seconds').toISOString()}}\",\n" +
+    "    \"user_agent\": \"BROWSER_AGENT\",\n" +
+    "    \"extra\": [[\"message\",\"CUSTOM MESSAGE\"], [\"custom_value\", \"some payload\"]],\n" +
+    "    \"request_id\": \"SOME_UUID\",\n" +
+    "    \"request\": {\"REQUEST_METHOD\": \"GET\",\n" +
+    "             \"PATH_INFO\": \"/FOO/BAR\",\n" +
+    "             \"POST\": {\"FOO\":\"BAZ\",\"XXX\":\"YYY\"}\n" +
+    "             },\n" +
+    "    \"slow_calls\":[{\n" +
+    "                   \"start\": \"{{$ctrl.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
+    "                   \"end\": \"{{$ctrl.momentJs.utc().milliseconds(0).add(1, 'seconds').toISOString()}}\",\n" +
+    "                   \"type\": \"sql\",\n" +
+    "                   \"subtype\": \"postgresql\",\n" +
+    "                   \"parameters\": [\"QPARAM1\",\"QPARAM2\",\"QPARAMX\"],\n" +
+    "                   \"statement\": \"QUERY\"\n" +
+    "                   }],\n" +
+    "    \"request_stats\": {\n" +
+    "                    \"main\": 2.50779,\n" +
+    "                    \"nosql\": 0.01008,\n" +
+    "                    \"nosql_calls\": 17.0,\n" +
+    "                    \"remote\": 0.0,\n" +
+    "                    \"remote_calls\": 0.0,\n" +
+    "                    \"sql\": 1,\n" +
+    "                    \"sql_calls\": 1.0,\n" +
+    "                    \"tmpl\": 0.0,\n" +
+    "                    \"tmpl_calls\": 0.0,\n" +
+    "                    \"custom\": 0.0,\n" +
+    "                    \"custom_calls\": 0.0\n" +
+    "                },\n" +
+    "    \"traceback\": [\n" +
+    "                {\"cline\": \"return foo_bar_baz(1,2,3)\",\n" +
+    "                \"file\": \"somedir/somefile.py\",\n" +
+    "                \"fn\": \"somefunction\",\n" +
+    "                \"line\": 454,\n" +
+    "                \"vars\": [[\"a_list\",\n" +
+    "                         [\"1\",2,\"4\",\"5\",6]],\n" +
+    "                         [\"b\", {\"1\": \"2\", \"ccc\": \"ddd\", \"1\": \"a\"}],\n" +
+    "                         [\"obj\", \"object object at 0x7f0030853dc0\"]]\n" +
+    "                        },\n" +
+    "                        {\"cline\": \"OMG ValueError happened\",\n" +
+    "                        \"file\": \"\",\n" +
+    "                        \"fn\": \"\",\n" +
+    "                        \"line\": \"\",\n" +
+    "                        \"vars\": []}\n" +
+    "                        ]\n" +
+    "                        }]'\n" +
+    "                    
\n" + "
\n" + "\n" + + "
\n" + "\n" + - "
\n" + + " \n" + "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('components/views/logs-browser/logs-browser.html', - "\n" + + " \n" + + " Metrics API\n" + + " \n" + "\n" + - "
\n" + + "
\n" + + "
\n" +
+    "curl -H \"Content-Type: application/json\" -k {{AeConfig.urls.baseUrl}}api/general_metrics?protocol_version=0.5\\&api_key={{$ctrl.resource.api_key}} -d '\n" +
+    "        [{\n" +
+    "        \"namespace\": \"some.monitor\",\n" +
+    "        \"timestamp\": \"{{$ctrl.momentJs.utc().milliseconds(0).toISOString()}}\",\n" +
+    "        \"server_name\": \"server.name\",\n" +
+    "        \"tags\": [[\"value1\", 15.7], [\"value2\", 26]]}]'\n" +
+    "                    
\n" + + "
\n" + "\n" + - "

\n" + - " Search params:\n" + - " \n" + - " {{tag.type}}\n" + - " {{ tag.type == 'resource' ? $ctrl.applications[tag.value].resource_name : tag.value }}\n" + + " \n" + "\n" + - " \n" + - " \n" + - "

\n" + + " \n" + "\n" + - "

\n" + + " \n" + + " Request Stats API\n" + + " \n" + "\n" + - " \n" + + " \n" + "\n" + - "

\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + + " \n" + "\n" + - "
\n" + - " \n" + + "
\n" + "
\n" + "\n" + - "

\n" + - "\n" + - "
\n" + + " \n" + "\n" + + "
\n" + + "
\n" + + "

Postprocessing

\n" + + "
\n" + "
\n" + - " \n" + - " \n" + + "

This section allows you influence the rating of report groups - if rule is matched once its not executed anymore

\n" + + "\n" + + "

\n" + + " Add rule\n" + + "

\n" + + "\n" + + " \n" + "
\n" + "
\n" + "\n" + + "
\n" + + "
\n" + + "

Administration

\n" + + "
\n" + + "
\n" + + "

Transfer ownership

\n" + + "

Please note that by transfering ownership you WILL lose access to the application data and new owner needs to give you access permission

\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - "
\n" + - " \n" + - "
\n" + + "
\n" + "\n" + - "
\n" + + "

Remove application

\n" + + "

This operation will wipe out all data from database - there is no undo.

\n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n" + - " \n" + - "
Logs
ApplicationMessageWhen
\n" + - " \n" + - " {{log.resource_name}}\n" + - " \n" + - " \n" + - " level: {{log.log_level}}\n" + - " \n" + - " namespace: {{log.namespace}}\n" + - " \n" + - " {{tag}}: {{value}}\n" + - "
{{log.message}}
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "\n" + - "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + "
\n" + - "\n" + "
\n" ); - $templateCache.put('components/views/settings-view/settings-view.html', - "
\n" + - "
\n" + - "
\n" + - "
Applications
\n" + - " \n" + - "
\n" + - "\n" + + $templateCache.put('components/views/event-browser/event-browser.html', + "
\n" + + "
\n" + "\n" + - "
\n" + - "
Settings
\n" + - " \n" + - "
\n" + + "

Event history

\n" + "\n" + - "
\n" + - "
Notifications
\n" + - " \n" + - "
\n" + - "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "

For {{ event.resource_name }}

\n" + "\n" + - "
\n" + - "\n" - ); - - - $templateCache.put('components/views/user-alert-channel-email-new-view/user-alert-channel-email-new-view.html', - "\n" + + "

{{ event.text }}

\n" + + " created:\n" + + " \n" + + " \n" + + " | closed:\n" + + " \n" + + " \n" + + "
\n" + "\n" + - "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + "\n" + - "
\n" + - "
\n" + - "
\n" + - "

Adding email alert channel - after you authorize your email in the system we can send alerts directly to this mailbox.

\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + + "
\n" + "
\n" + "
\n" ); - $templateCache.put('components/views/user-alert-channels-list-view/user-alert-channels-list-view.html', - "\n" + + $templateCache.put('components/views/index-dashboard/index-dashboard.html', + "\n" + "\n" + - "
\n" + - "
\n" + - "
\n" + - "

Report alert rules

\n" + - "

\n" + - " Add top-level rule\n" + - "

\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - " \n" + + "
\n" + "\n" + "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - "

Alert channels

\n" + "\n" + - "

Here you can configure your alert channels.

\n" + + "
\n" + "\n" + - "

An alert channel serves as means of delivery of notifications about important events that happen in your applications.

\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + "\n" + - "
You can add more integrations that support different alert channels via application management panel.
\n" + + " \n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
{{ channel.channel_visible_value }}\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " Alerts\n" + - " \n" + - " \n" + - " Daily digests\n" + - " \n" + "\n" + - " \n" + - " Remove\n" + - "
    \n" + - "
  • No
  • \n" + - "
  • Yes
  • \n" + - "
\n" + - "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + "
\n" + "\n" + - "
\n" + + "

\n" + + " \n" + + "

\n" + "\n" + - "
\n" + - "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + "\n" + - "
\n" - ); - - - $templateCache.put('components/views/user-auth-tokens-view/user-auth-tokens-view.html', - "\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + "\n" + - "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + "\n" + - "
\n" + - "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + "\n" + - "
\n" + + "

\n" + + " Average requests per second from all servers\n" + + "

\n" + "\n" + - "
You can use those tokens to authenticate yourself when performing various API calls
\n" + + "

\n" + + " Average response time from all servers\n" + + "

\n" + "\n" + - "
\n" + + "

\n" + + " Aggregated average time spent per request - broken to layers\n" + + "

\n" + "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " \n" + + "

\n" + + " Aggregated reports sent by your application\n" + + "

\n" + + "\n" + + "

\n" + + " Aggregated slow reports sent by your application\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n" + "
\n" + - " \n" + "\n" + - "
\n" + "\n" + + "
\n" + "\n" + - "
\n" + + "
\n" + "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + + "
\n" + "\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
Your current tokens
DescriptionCreatedExpires

{{token.description}}

\n" + - "
{{token.token| limitTo:token.limit}}...
\n" + - "
{{token.creation_date | isoToRelativeTime}}{{token.expires | isoToRelativeTime}}\n" + - " Never\n" + - " \n" + - " \n" + - "
    \n" + - "
  • No
  • \n" + - "
  • Yes
  • \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + + " \n" + + " Exceptions\n" + + "
\n" + + " {{ $ctrl.exceptions|numberToThousands}}\n" + + " \n" + + "
\n" + + " Frustrating req.\n" + + "
\n" + + " {{$ctrl.frustratingRequests|numberToThousands}}\n" + + " \n" + + "
\n" + + " Tolerated req.\n" + + "
\n" + + " {{$ctrl.toleratedRequests|numberToThousands}}\n" + + " \n" + + "
\n" + + " Satisfying req.\n" + + "
\n" + + " {{$ctrl.satisfyingRequests|numberToThousands}}\n" + + "
\n" + + " Uptime\n" + + "
\n" + + " {{$ctrl.uptimeStats}}%\n" + + " \n" + + "
\n" + "\n" + - "
\n" + - "

No external providers linked yet

\n" + - "
    \n" + - "
  • \n" + - "
    \n" + - " \n" + - " \n" + - "
      \n" + - "
    • No
    • \n" + - "
    • Yes
    • \n" + - "
    \n" + - "
    \n" + + "
    \n" + "
    \n" + - " @{{ provider.provider }}: {{ provider.id }}\n" + - "
  • \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('components/views/user-password-view/user-password-view.html', - "\n" + - "\n" + - "
\n" + "\n" + - "
\n" + - "
\n" + - "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
ServerApdex\n" + + " \n" + + " rpmavg. response
\n" + + " {{ server.name }}\n" + + " \n" + + " {{ server.apdex }} %\n" + + " \n" + + " {{ server.rpm }}rpm\n" + + " \n" + + " {{ server.avg_response_time }}s\n" + + "
\n" + "\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + + "
\n" + "
\n" + + "\n" + "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + "\n" + - "
\n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('components/views/user-profile-view/user-profile-view.html', - "\n" + "\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + + "
\n" + "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "

Newest errors (real-time)\n" + + "

\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + "\n" + + "

No new reports

\n" + + "\n" + + "
\n" + + "
\n" + "
\n" + "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + + "\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "

Request breakdown over {{ $ctrl.timeSpan.label }}

\n" + + "
\n" + + "
\n" + + "

\n" + + " \n" + + "

\n" + + "\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " {{view.view_name}}\n" + + " {{view.view_name}}\n" + + "\n" + + "
\n" + + " \n" + + " avg. response {{view.avg_response}}s in\n" + + " {{view.requests|numberToThousands}} requests\n" + + "\n" + + " \n" + + "    Latest reports:\n" + + " {{$index+1}}\n" + + " \n" + + " \n" + + "
\n" + + "\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "\n" + + "\n" + + "
\n" + "
\n" + + "\n" + "
\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - " \n" + + "\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "

\n" + + " Report groups trending over {{ $ctrl.timeSpan.label }}\n" + + "

\n" + + "
\n" + + "
\n" + + "

\n" + + " \n" + + "

\n" + + "\n" + + "

\n" + + " No reports found\n" + + "

\n" + + "\n" + + "
\n" + + "
\n" + "
\n" + + "\n" + "
\n" + - "
\n" + - " \n" + - "
\n" + - " \n" + + "\n" + + "
\n" + + "\n" + + "\n" + + "
\n" + + "
\n" + + "

\n" + + " Most common slow calls over {{ $ctrl.timeSpan.label }}\n" + + "

\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + " \n" + + "
\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " {{call.occurences|numberToThousands}}\n" + + " \n" + + " {{call.statement}}\n" + + "
\n" + + " {{call.statement_type}}\n" + + " {{call.statement_subtype}}\n" + + " {{call.total_duration/call.occurences|round:2}}s\n" + + " \n" + + " Latest reports:\n" + + " {{$index+1}} \n" + + " \n" + + "
\n" + + "\n" + + "\n" + + "
\n" + "
\n" + + "\n" + + "\n" + "
\n" + - " \n" + + "\n" + + "
\n" + "
\n" + "
\n" + "
\n" ); - $templateCache.put('directives/permissions/permissions.html', - "
\n" + - "
\n" + - "

Permissions

\n" + - "
\n" + + $templateCache.put('components/views/integrations/bitbucket-integration-config-view/bitbucket-integration-config-view.html', + "\n" + + "\n" + + "
\n" + + "
\n" + "
\n" + - "

Here you can set permissions for others to access your app data.

\n" + "\n" + - "

For example you can let other staff member view or alter error reports.

\n" + + "

Bitbucket Integration

\n" + "\n" + - "
0\">\n" + - "

Group permissions

\n" + + "
\n" + + "
\n" + "\n" + - "
    \n" + - "
  • \n" + - " {{ perm.self.group_name }}\n" + - "
    \n" + - " Resource owner\n" + - " \n" + - " {{ perm_name }}\n" + - "
      \n" + - "
    • No
    • \n" + - "
    • Yes
    • \n" + - "
    \n" + - "
    \n" + + " \n" + + "\n" + + "
    \n" + + "\n" + + " \n" + + " \n" + + "\n" + + "
    \n" + + "
    https://bitbucket.org/
    \n" + + " \n" + + "
    /
    \n" + + " \n" + "
    \n" + - "
  • \n" + - "
\n" + "\n" + - " \n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " {{ permission }}\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + "
\n" + - " \n" + + "
\n" + + "
\n" + "\n" + - "
\n" + + " \n" + "\n" + - "

User permissions

\n" + - "
\n" + - "
    \n" + - "
  • \n" + - " {{ perm.self.user_name }}\n" + - "
    \n" + - " Resource owner\n" + - " \n" + - " {{ perm_name }}\n" + + "
    \n" + + " \n" + + " \n" + + " Remove Integration\n" + "
      \n" + "
    • No
    • \n" + - "
    • Yes
    • \n" + + "
    • Yes
    • \n" + "
    \n" + "
    \n" + - "
    \n" + - "
  • \n" + - "
\n" + - "
\n" + - "
\n" + - "

First enter username or full email of person you want to give access to (the person needs to be already registered in AppEnlight)

\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " {{ permission }}\n" + - " \n" + - "
\n" + - "
\n" + - " \n" + "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('directives/plugin_config/plugin_config.html', - "
\n" + - "
Plugin: {{tmpl.name}}
\n" + - " \n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('directives/postprocess_action/postprocess_action.html', - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
    \n" + - "
  • No
  • \n" + - "
  • Yes
  • \n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - " \n" + + "
\n" + + " \n" + "\n" + - "
\n" + - " \n" + - "
\n" + + "

Remember you first need to\n" + + " \n" + + " authorize your user account\n" + + " with Bitbucket before we can send issues on your behalf.

\n" + "\n" + - "  Save changes\n" + + "

Every user will have to authorize AppEnlight to access Bitbucket to be able to post issues.

\n" + "\n" + - "
\n" + - "
\n" + - "

Meeting following criteria:

\n" + - " \n" + - " {{ctrl.rule}}\n" + - " \n" + "
\n" + "
\n" ); - $templateCache.put('directives/report_alert_action/report_alert_action.html', - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - "
    \n" + - "
  • No
  • \n" + - "
  • Yes
  • \n" + - "
\n" + - "
\n" + - "
\n" + + $templateCache.put('components/views/integrations/campfire-integration-config-view/campfire-integration-config-view.html', + "\n" + "\n" + - "
\n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - " \n" + - " \n" + + "
\n" + + "
\n" + + "
\n" + + "

Campfire Integration

\n" + "\n" + - "  Save changes\n" + + "
\n" + "\n" + - "
\n" + - "
\n" + - "

Channels:

\n" + - "
    \n" + - "
  • \n" + - " {{channel.channel_visible_value}}\n" + - "
    \n" + - " \n" + - " \n" + - "
      \n" + - "
    • No
    • \n" + - "
    • Yes
    • \n" + - "
    \n" + - "
    \n" + + "
    \n" + + "\n" + + " \n" + + "
    \n" + + " \n" + + "\n" + + "
    \n" + + "
    http://
    \n" + + " \n" + + "
    .campfirenow.com
    \n" + "
    \n" + - "
  • \n" + - "
\n" + - "
\n" + - " \n" + - " Add Channel\n" + - "
\n" + - "
\n" + - " You need to create an alert channel before you can assign it to your rule.\n" + + "
\n" + "
\n" + "\n" + - "
\n" + - "
\n" + - "

Meeting following criteria:

\n" + - " \n" + - " \n" + - "
\n" + - "
\n" - ); - - - $templateCache.put('directives/rule_read_only/rule_read_only.html', - "
\n" + - "\n" + - " \n" + - " {{rule_ctrlr.readOnlyPossibleFields[rule_ctrlr.rule.field]}}\n" + - " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + "
\n" + "\n" + - " \n" + - " is {{rule_ctrlr.ruleDefinitions.allOps[rule_ctrlr.rule.op]}} {{rule_ctrlr.rule.value}}\n" + - " \n" + + "
\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + "

\n" + + " Room ID list separated by comma\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + "\n" + - " \n" + - "

Subrules

\n" + - "
\n" + + " \n" + + " Remove Integration\n" + + "
    \n" + + "
  • No
  • \n" + + "
  • Yes
  • \n" + + "
\n" + + "
\n" + "\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + + "
\n" + + " \n" + + " \n" + "
\n" + + "\n" + "
\n" + - "
\n" + "\n" + - " \n" + + " \n" + + "\n" + + "
\n" + "
\n" ); - $templateCache.put('directives/rule/rule.html', - "
\n" + + $templateCache.put('components/views/integrations/flowdock-integration-config-view/flowdock-integration-config-view.html', + "\n" + "\n" + - "
\n" + - " \n" + - "
\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - "
\n" + + "

Flowdock Integration

\n" + "\n" + - " \n" + + "
\n" + "\n" + - " \n" + + "
\n" + "\n" + - "
\n" + + " \n" + "\n" + - " \n" + - "

Subrules

\n" + - "
\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + + "
\n" + + " \n" + + " \n" + "
\n" + + "\n" + + "\n" + "
\n" + - "
\n" + "\n" + - " Add rule\n" + + "
\n" + + "\n" + + " \n" + + "\n" + + "
\n" + + "\n" + + " \n" + + "\n" + + " \n" + + " Remove Integration\n" + + "
    \n" + + "
  • No
  • \n" + + "
  • Yes
  • \n" + + "
\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "\n" + + " \n" + "\n" + - " \n" + - "
\n" + - " \n" + - " \n" + - "
    \n" + - "
  • No
  • \n" + - "
  • Yes
  • \n" + - "
\n" + - "
\n" + "
\n" + "
\n" ); - $templateCache.put('templates/admin/applications/applications_list.html', - "\n" + + $templateCache.put('components/views/integrations/github-integration-config-view/github-integration-config-view.html', + "\n" + "\n" + - "
\n" + - "
\n" + + "
\n" + + "
\n" + + "
\n" + "\n" + - " Currently active applications: {{applications.applications.length}}\n" + + "

Github Integration

\n" + "\n" + - "
\n" + + "
\n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
Application nameOwner UserOwner Group
{{resource.resource_name}}{{resource.owner_user_name}}{{resource.owner_group_name}}\n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + + "
\n" + + "\n" + + " \n" + + "\n" + + "
\n" + + "\n" + + " \n" + + " \n" + + "\n" + + "
\n" + + "
https://api.github.com/
\n" + + " \n" + + "
/
\n" + + " \n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + "\n" + + " \n" + + "\n" + + " \n" + + "\n" + + " \n" + + " Remove Integration\n" + + "
    \n" + + "
  • No
  • \n" + + "
  • Yes
  • \n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + "\n" + + "

Remember you first need to\n" + + " \n" + + " authorize your user account\n" + + " with Github before we can send issues on your behalf.

\n" + + "\n" + + "

Every user will have to authorize AppEnlight to access Github to be able to post issues.

\n" + + "\n" + + "
\n" + + "
Private repository access
\n" + + "
\n" + + "

If you need access to private repositories profile page allows you to require token including private repository permissions.

\n" + + "\n" + + "

Registration page OAuth does NOT give you token with private repository access permissions.

\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + "
\n" ); - $templateCache.put('templates/admin/configs/edit.html', - "\n" + + $templateCache.put('components/views/integrations/hipchat-integration-config-view/hipchat-integration-config-view.html', + "\n" + "\n" + - "
\n" + - "
\n" + - "

Basic Configuration

\n" + - "
\n" + + "
\n" + + "
\n" + "
\n" + - "

Visual

\n" + - "
\n" + + "\n" + + "

Hipchat Integration

\n" + + "\n" + + " \n" + + "\n" + "
\n" + - " \n" + + " \n" + + "\n" + "
\n" + - " \n" + + " \n" + + " \n" + "
\n" + "
\n" + - "
\n" + "\n" + - "

Functional

\n" + + "
\n" + + "\n" + + " \n" + + "\n" + + "
\n" + + " \n" + + " \n" + + "\n" + + "

\n" + + " Room ID list separated by comma\n" + + "

\n" + + "
\n" + + "\n" + + "
\n" + "\n" + - "
\n" + "
\n" + - " \n" + + " \n" + "
\n" + - " \n" + + " \n" + + " \n" + + " Remove Integration\n" + + "
    \n" + + "
  • No
  • \n" + + "
  • Yes
  • \n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + " \n" + + " \n" + + "
\n" + + "\n" + "
\n" + "
\n" + + "\n" + "
\n" + "\n" + - "

Global Rate Limiting

\n" + + "
\n" + + "
\n" + ); + + + $templateCache.put('components/views/integrations/jira-integration-config-view/jira-integration-config-view.html', + "\n" + "\n" + - "
\n" + - "
\n" + - "