annotationsSrv.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. define([
  2. 'angular',
  3. 'lodash',
  4. './editorCtrl'
  5. ], function (angular, _) {
  6. 'use strict';
  7. var module = angular.module('grafana.services');
  8. module.service('annotationsSrv', function(datasourceSrv, $q, alertSrv, $rootScope, $sanitize) {
  9. var promiseCached;
  10. var list = [];
  11. var self = this;
  12. this.init = function() {
  13. $rootScope.onAppEvent('refresh', this.clearCache);
  14. $rootScope.onAppEvent('setup-dashboard', this.clearCache);
  15. };
  16. this.clearCache = function() {
  17. promiseCached = null;
  18. list = [];
  19. };
  20. this.getAnnotations = function(rangeUnparsed, dashboard) {
  21. if (dashboard.annotations.list.length === 0) {
  22. return $q.when(null);
  23. }
  24. if (promiseCached) {
  25. return promiseCached;
  26. }
  27. self.dashboard = dashboard;
  28. var annotations = _.where(dashboard.annotations.list, {enable: true});
  29. var promises = _.map(annotations, function(annotation) {
  30. return datasourceSrv.get(annotation.datasource).then(function(datasource) {
  31. return datasource.annotationQuery(annotation, rangeUnparsed)
  32. .then(self.receiveAnnotationResults)
  33. .then(null, errorHandler);
  34. }, this);
  35. });
  36. promiseCached = $q.all(promises)
  37. .then(function() {
  38. return list;
  39. });
  40. return promiseCached;
  41. };
  42. this.receiveAnnotationResults = function(results) {
  43. for (var i = 0; i < results.length; i++) {
  44. self.addAnnotation(results[i]);
  45. }
  46. };
  47. this.addAnnotation = function(options) {
  48. var title = $sanitize(options.title);
  49. var time = '<i>' + self.dashboard.formatDate(options.time) + '</i>';
  50. var tooltip = '<div class="graph-tooltip small"><div class="graph-tooltip-time">'+ title + ' ' + time + '</div> ' ;
  51. if (options.tags) {
  52. var tags = $sanitize(options.tags);
  53. tooltip += '<span class="tag label label-tag">' + (tags || '') + '</span><br/>';
  54. }
  55. if (options.text) {
  56. var text = $sanitize(options.text);
  57. tooltip += text.replace(/\n/g, '<br/>');
  58. }
  59. tooltip += "</small>";
  60. list.push({
  61. annotation: options.annotation,
  62. min: options.time,
  63. max: options.time,
  64. eventType: options.annotation.name,
  65. title: null,
  66. description: tooltip,
  67. score: 1
  68. });
  69. };
  70. function errorHandler(err) {
  71. console.log('Annotation error: ', err);
  72. var message = err.message || "Annotation query failed";
  73. alertSrv.set('Annotations error', message,'error');
  74. }
  75. // Now init
  76. this.init();
  77. });
  78. });