Advertisement
Guest User

Untitled

a guest
Oct 21st, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.75 KB | None | 0 0
  1. root@noc:/opt/noc/pm/apps/render # diff -y data.py /root/data.py
  2. # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  3. # #---------------------------------------------------------- # #----------------------------------------------------------
  4. ## Carbon-compatible data hooks ## Carbon-compatible data hooks
  5. ##----------------------------------------------------------- ##-----------------------------------------------------------
  6. ## Copyright (C) 2007-2014 The NOC Project ## Copyright (C) 2007-2014 The NOC Project
  7. ## See LICENSE for details ## See LICENSE for details
  8. ##----------------------------------------------------------- ##-----------------------------------------------------------
  9.  
  10. ## Python modules ## Python modules
  11. import time import time
  12. import calendar <
  13. ## Third-party modules <
  14. import pytz <
  15. ## NOC modules ## NOC modules
  16. from noc.pm.db.base import tsdb from noc.pm.db.base import tsdb
  17.  
  18.  
  19. class TimeSeries(list): class TimeSeries(list):
  20. def __init__(self, name, start, end, step, values, consol | def __init__(self, name, start, end, step, values,
  21. > consolidate="average"):
  22. list.__init__(self, values) list.__init__(self, values)
  23. self.name = name self.name = name
  24. self.start = start self.start = start
  25. self.end = end self.end = end
  26. self.step = step self.step = step
  27. self.consolidationFunc = consolidate self.consolidationFunc = consolidate
  28. self.valuesPerPoint = 1 self.valuesPerPoint = 1
  29. self.options = {} self.options = {}
  30.  
  31. def __iter__(self): def __iter__(self):
  32. if self.valuesPerPoint > 1: if self.valuesPerPoint > 1:
  33. return self.__consolidatingGenerator(list.__iter_ return self.__consolidatingGenerator(list.__iter_
  34. else: else:
  35. return list.__iter__(self) return list.__iter__(self)
  36.  
  37. def consolidate(self, valuesPerPoint): def consolidate(self, valuesPerPoint):
  38. self.valuesPerPoint = int(valuesPerPoint) self.valuesPerPoint = int(valuesPerPoint)
  39.  
  40. def __consolidatingGenerator(self, gen): def __consolidatingGenerator(self, gen):
  41. buf = [] buf = []
  42. for x in gen: for x in gen:
  43. buf.append(x) buf.append(x)
  44. if len(buf) == self.valuesPerPoint: if len(buf) == self.valuesPerPoint:
  45. while None in buf: while None in buf:
  46. buf.remove(None) buf.remove(None)
  47. if buf: if buf:
  48. yield self.__consolidate(buf) yield self.__consolidate(buf)
  49. buf = [] buf = []
  50. else: else:
  51. yield None yield None
  52. while None in buf: while None in buf:
  53. buf.remove(None) buf.remove(None)
  54. if buf: if buf:
  55. yield self.__consolidate(buf) yield self.__consolidate(buf)
  56. else: else:
  57. yield None yield None
  58. raise StopIteration raise StopIteration
  59.  
  60. def __consolidate(self, values): def __consolidate(self, values):
  61. usable = [v for v in values if v is not None] usable = [v for v in values if v is not None]
  62. if not usable: if not usable:
  63. return None return None
  64. if self.consolidationFunc == 'sum': | if self.consolidationFunc == "sum":
  65. return sum(usable) return sum(usable)
  66. if self.consolidationFunc == 'average': | if self.consolidationFunc == "average":
  67. return float(sum(usable)) / len(usable) return float(sum(usable)) / len(usable)
  68. if self.consolidationFunc == 'max': | if self.consolidationFunc == "max":
  69. return max(usable) return max(usable)
  70. if self.consolidationFunc == 'min': | if self.consolidationFunc == "min":
  71. return min(usable) return min(usable)
  72. raise Exception("Invalid consolidation function!") raise Exception("Invalid consolidation function!")
  73.  
  74. def __repr__(self): def __repr__(self):
  75. return 'TimeSeries(name=%s, start=%s, end=%s, step=%s | return "TimeSeries(name=%s, start=%s, end=%s, step=%s
  76. self.name, self.start, self.end, self.step) | self.name, self.start, self.end, self.step)
  77.  
  78. | def getInfo(self):
  79. def epoch(dt): | """Pickle-friendly representation of the series"""
  80. """ | return {
  81. Returns the epoch timestamp of a timezone-aware datetime | "name": self.name,
  82. """ | "start": self.start,
  83. return calendar.timegm(dt.astimezone(pytz.utc).timetuple( | "end": self.end,
  84. > "step": self.step,
  85. > "values": list(self),
  86. > }
  87.  
  88.  
  89. > # Graphite data retrieval API
  90. def fetchData(ctx, path): def fetchData(ctx, path):
  91. """ <
  92. Graphite-compatible data-retrieval API <
  93. """ <
  94. series = [] series = []
  95. start = int(epoch(ctx["startTime"])) | start = int(time.mktime(ctx["startTime"].timetuple()))
  96. end = int(epoch(ctx["endTime"])) | end = int(time.mktime(ctx["endTime"].timetuple()))
  97. step = 1 step = 1
  98. for metric in tsdb.find(path): for metric in tsdb.find(path):
  99. values = tsdb.fetch(metric, start, end) values = tsdb.fetch(metric, start, end)
  100. ts = TimeSeries(metric, start, end, step, values) ts = TimeSeries(metric, start, end, step, values)
  101. ts.pathExpression = metric ts.pathExpression = metric
  102. series += [ts] series += [ts]
  103. return series return series
  104. root@noc:/opt/noc/pm/apps/render #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement