annotations_srv.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. define([
  2. 'angular',
  3. 'lodash',
  4. './editor_ctrl',
  5. ], function (angular, _) {
  6. 'use strict';
  7. var module = angular.module('grafana.services');
  8. module.service('annotationsSrv', function($rootScope, $q, datasourceSrv, alertSrv, timeSrv) {
  9. var promiseCached;
  10. var list = [];
  11. var self = this;
  12. this.init = function() {
  13. $rootScope.onAppEvent('refresh', this.clearCache, $rootScope);
  14. $rootScope.onAppEvent('dashboard-loaded', this.clearCache, $rootScope);
  15. };
  16. this.clearCache = function() {
  17. promiseCached = null;
  18. list = [];
  19. };
  20. this.getAnnotations = function(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 range = timeSrv.timeRange();
  30. var rangeRaw = timeSrv.timeRange(false);
  31. var promises = _.map(annotations, function(annotation) {
  32. if (annotation.snapshotData) {
  33. self.receiveAnnotationResults(annotation.snapshotData);
  34. return;
  35. }
  36. return datasourceSrv.get(annotation.datasource).then(function(datasource) {
  37. var query = {range: range, rangeRaw: rangeRaw, annotation: annotation};
  38. return datasource.annotationQuery(query)
  39. .then(self.receiveAnnotationResults)
  40. .then(function(results) {
  41. if (dashboard.snapshot) {
  42. annotation.snapshotData = angular.copy(results);
  43. }
  44. })
  45. .then(null, errorHandler);
  46. }, this);
  47. });
  48. promiseCached = $q.all(promises).then(function() {
  49. return list;
  50. }).catch(function(err) {
  51. $rootScope.appEvent('alert-error', ['Annotations failed', (err.message || err)]);
  52. });
  53. return promiseCached;
  54. };
  55. this.receiveAnnotationResults = function(results) {
  56. for (var i = 0; i < results.length; i++) {
  57. self.addAnnotation(results[i]);
  58. }
  59. return results;
  60. };
  61. this.addAnnotation = function(options) {
  62. list.push({
  63. annotation: options.annotation,
  64. min: options.time,
  65. max: options.time,
  66. eventType: options.annotation.name,
  67. title: options.title,
  68. tags: options.tags,
  69. text: options.text,
  70. score: 1
  71. });
  72. };
  73. function errorHandler(err) {
  74. console.log('Annotation error: ', err);
  75. var message = err.message || "Annotation query failed";
  76. alertSrv.set('Annotations error', message,'error');
  77. }
  78. // Now init
  79. this.init();
  80. });
  81. });