functions.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. // Copyright 2015 The Prometheus Authors
  2. // Licensed under the Apache License, Version 2.0 (the "License");
  3. // you may not use this file except in compliance with the License.
  4. // You may obtain a copy of the License at
  5. //
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. package promql
  14. import (
  15. "math"
  16. )
  17. // Function represents a function of the expression language and is
  18. // used by function nodes.
  19. type Function struct {
  20. Name string
  21. ArgTypes []ValueType
  22. Variadic int
  23. ReturnType ValueType
  24. }
  25. // Calculate the trend value at the given index i in raw data d.
  26. // This is somewhat analogous to the slope of the trend at the given index.
  27. // The argument "s" is the set of computed smoothed values.
  28. // The argument "b" is the set of computed trend factors.
  29. // The argument "d" is the set of raw input values.
  30. func calcTrendValue(i int, sf, tf, s0, s1, b float64) float64 {
  31. if i == 0 {
  32. return b
  33. }
  34. x := tf * (s1 - s0)
  35. y := (1 - tf) * b
  36. return x + y
  37. }
  38. // linearRegression performs a least-square linear regression analysis on the
  39. // provided SamplePairs. It returns the slope, and the intercept value at the
  40. // provided time.
  41. func linearRegression(samples []Point, interceptTime int64) (slope, intercept float64) {
  42. var (
  43. n float64
  44. sumX, sumY float64
  45. sumXY, sumX2 float64
  46. )
  47. for _, sample := range samples {
  48. x := float64(sample.T-interceptTime) / 1e3
  49. n += 1.0
  50. sumY += sample.V
  51. sumX += x
  52. sumXY += x * sample.V
  53. sumX2 += x * x
  54. }
  55. covXY := sumXY - sumX*sumY/n
  56. varX := sumX2 - sumX*sumX/n
  57. slope = covXY / varX
  58. intercept = sumY/n - slope*sumX/n
  59. return slope, intercept
  60. }
  61. var functions = map[string]*Function{
  62. "abs": {
  63. Name: "abs",
  64. ArgTypes: []ValueType{ValueTypeVector},
  65. ReturnType: ValueTypeVector,
  66. },
  67. "absent": {
  68. Name: "absent",
  69. ArgTypes: []ValueType{ValueTypeVector},
  70. ReturnType: ValueTypeVector,
  71. },
  72. "avg_over_time": {
  73. Name: "avg_over_time",
  74. ArgTypes: []ValueType{ValueTypeMatrix},
  75. ReturnType: ValueTypeVector,
  76. },
  77. "ceil": {
  78. Name: "ceil",
  79. ArgTypes: []ValueType{ValueTypeVector},
  80. ReturnType: ValueTypeVector,
  81. },
  82. "changes": {
  83. Name: "changes",
  84. ArgTypes: []ValueType{ValueTypeMatrix},
  85. ReturnType: ValueTypeVector,
  86. },
  87. "clamp_max": {
  88. Name: "clamp_max",
  89. ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar},
  90. ReturnType: ValueTypeVector,
  91. },
  92. "clamp_min": {
  93. Name: "clamp_min",
  94. ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar},
  95. ReturnType: ValueTypeVector,
  96. },
  97. "count_over_time": {
  98. Name: "count_over_time",
  99. ArgTypes: []ValueType{ValueTypeMatrix},
  100. ReturnType: ValueTypeVector,
  101. },
  102. "days_in_month": {
  103. Name: "days_in_month",
  104. ArgTypes: []ValueType{ValueTypeVector},
  105. Variadic: 1,
  106. ReturnType: ValueTypeVector,
  107. },
  108. "day_of_month": {
  109. Name: "day_of_month",
  110. ArgTypes: []ValueType{ValueTypeVector},
  111. Variadic: 1,
  112. ReturnType: ValueTypeVector,
  113. },
  114. "day_of_week": {
  115. Name: "day_of_week",
  116. ArgTypes: []ValueType{ValueTypeVector},
  117. Variadic: 1,
  118. ReturnType: ValueTypeVector,
  119. },
  120. "delta": {
  121. Name: "delta",
  122. ArgTypes: []ValueType{ValueTypeMatrix},
  123. ReturnType: ValueTypeVector,
  124. },
  125. "deriv": {
  126. Name: "deriv",
  127. ArgTypes: []ValueType{ValueTypeMatrix},
  128. ReturnType: ValueTypeVector,
  129. },
  130. "exp": {
  131. Name: "exp",
  132. ArgTypes: []ValueType{ValueTypeVector},
  133. ReturnType: ValueTypeVector,
  134. },
  135. "floor": {
  136. Name: "floor",
  137. ArgTypes: []ValueType{ValueTypeVector},
  138. ReturnType: ValueTypeVector,
  139. },
  140. "histogram_quantile": {
  141. Name: "histogram_quantile",
  142. ArgTypes: []ValueType{ValueTypeScalar, ValueTypeVector},
  143. ReturnType: ValueTypeVector,
  144. },
  145. "holt_winters": {
  146. Name: "holt_winters",
  147. ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar, ValueTypeScalar},
  148. ReturnType: ValueTypeVector,
  149. },
  150. "hour": {
  151. Name: "hour",
  152. ArgTypes: []ValueType{ValueTypeVector},
  153. Variadic: 1,
  154. ReturnType: ValueTypeVector,
  155. },
  156. "idelta": {
  157. Name: "idelta",
  158. ArgTypes: []ValueType{ValueTypeMatrix},
  159. ReturnType: ValueTypeVector,
  160. },
  161. "increase": {
  162. Name: "increase",
  163. ArgTypes: []ValueType{ValueTypeMatrix},
  164. ReturnType: ValueTypeVector,
  165. },
  166. "irate": {
  167. Name: "irate",
  168. ArgTypes: []ValueType{ValueTypeMatrix},
  169. ReturnType: ValueTypeVector,
  170. },
  171. "label_replace": {
  172. Name: "label_replace",
  173. ArgTypes: []ValueType{ValueTypeVector, ValueTypeString, ValueTypeString, ValueTypeString, ValueTypeString},
  174. ReturnType: ValueTypeVector,
  175. },
  176. "label_join": {
  177. Name: "label_join",
  178. ArgTypes: []ValueType{ValueTypeVector, ValueTypeString, ValueTypeString, ValueTypeString},
  179. Variadic: -1,
  180. ReturnType: ValueTypeVector,
  181. },
  182. "ln": {
  183. Name: "ln",
  184. ArgTypes: []ValueType{ValueTypeVector},
  185. ReturnType: ValueTypeVector,
  186. },
  187. "log10": {
  188. Name: "log10",
  189. ArgTypes: []ValueType{ValueTypeVector},
  190. ReturnType: ValueTypeVector,
  191. },
  192. "log2": {
  193. Name: "log2",
  194. ArgTypes: []ValueType{ValueTypeVector},
  195. ReturnType: ValueTypeVector,
  196. },
  197. "max_over_time": {
  198. Name: "max_over_time",
  199. ArgTypes: []ValueType{ValueTypeMatrix},
  200. ReturnType: ValueTypeVector,
  201. },
  202. "min_over_time": {
  203. Name: "min_over_time",
  204. ArgTypes: []ValueType{ValueTypeMatrix},
  205. ReturnType: ValueTypeVector,
  206. },
  207. "minute": {
  208. Name: "minute",
  209. ArgTypes: []ValueType{ValueTypeVector},
  210. Variadic: 1,
  211. ReturnType: ValueTypeVector,
  212. },
  213. "month": {
  214. Name: "month",
  215. ArgTypes: []ValueType{ValueTypeVector},
  216. Variadic: 1,
  217. ReturnType: ValueTypeVector,
  218. },
  219. "predict_linear": {
  220. Name: "predict_linear",
  221. ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar},
  222. ReturnType: ValueTypeVector,
  223. },
  224. "quantile_over_time": {
  225. Name: "quantile_over_time",
  226. ArgTypes: []ValueType{ValueTypeScalar, ValueTypeMatrix},
  227. ReturnType: ValueTypeVector,
  228. },
  229. "rate": {
  230. Name: "rate",
  231. ArgTypes: []ValueType{ValueTypeMatrix},
  232. ReturnType: ValueTypeVector,
  233. },
  234. "resets": {
  235. Name: "resets",
  236. ArgTypes: []ValueType{ValueTypeMatrix},
  237. ReturnType: ValueTypeVector,
  238. },
  239. "round": {
  240. Name: "round",
  241. ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar},
  242. Variadic: 1,
  243. ReturnType: ValueTypeVector,
  244. },
  245. "scalar": {
  246. Name: "scalar",
  247. ArgTypes: []ValueType{ValueTypeVector},
  248. ReturnType: ValueTypeScalar,
  249. },
  250. "sort": {
  251. Name: "sort",
  252. ArgTypes: []ValueType{ValueTypeVector},
  253. ReturnType: ValueTypeVector,
  254. },
  255. "sort_desc": {
  256. Name: "sort_desc",
  257. ArgTypes: []ValueType{ValueTypeVector},
  258. ReturnType: ValueTypeVector,
  259. },
  260. "sqrt": {
  261. Name: "sqrt",
  262. ArgTypes: []ValueType{ValueTypeVector},
  263. ReturnType: ValueTypeVector,
  264. },
  265. "stddev_over_time": {
  266. Name: "stddev_over_time",
  267. ArgTypes: []ValueType{ValueTypeMatrix},
  268. ReturnType: ValueTypeVector,
  269. },
  270. "stdvar_over_time": {
  271. Name: "stdvar_over_time",
  272. ArgTypes: []ValueType{ValueTypeMatrix},
  273. ReturnType: ValueTypeVector,
  274. },
  275. "sum_over_time": {
  276. Name: "sum_over_time",
  277. ArgTypes: []ValueType{ValueTypeMatrix},
  278. ReturnType: ValueTypeVector,
  279. },
  280. "time": {
  281. Name: "time",
  282. ArgTypes: []ValueType{},
  283. ReturnType: ValueTypeScalar,
  284. },
  285. "timestamp": {
  286. Name: "timestamp",
  287. ArgTypes: []ValueType{ValueTypeVector},
  288. ReturnType: ValueTypeVector,
  289. },
  290. "vector": {
  291. Name: "vector",
  292. ArgTypes: []ValueType{ValueTypeScalar},
  293. ReturnType: ValueTypeVector,
  294. },
  295. "year": {
  296. Name: "year",
  297. ArgTypes: []ValueType{ValueTypeVector},
  298. Variadic: 1,
  299. ReturnType: ValueTypeVector,
  300. },
  301. }
  302. // getFunction returns a predefined Function object for the given name.
  303. func getFunction(name string) (*Function, bool) {
  304. function, ok := functions[name]
  305. return function, ok
  306. }
  307. type vectorByValueHeap Vector
  308. func (s vectorByValueHeap) Len() int {
  309. return len(s)
  310. }
  311. func (s vectorByValueHeap) Less(i, j int) bool {
  312. if math.IsNaN(s[i].V) {
  313. return true
  314. }
  315. return s[i].V < s[j].V
  316. }
  317. func (s vectorByValueHeap) Swap(i, j int) {
  318. s[i], s[j] = s[j], s[i]
  319. }
  320. func (s *vectorByValueHeap) Push(x interface{}) {
  321. *s = append(*s, *(x.(*Sample)))
  322. }
  323. func (s *vectorByValueHeap) Pop() interface{} {
  324. old := *s
  325. n := len(old)
  326. el := old[n-1]
  327. *s = old[0 : n-1]
  328. return el
  329. }
  330. type vectorByReverseValueHeap Vector
  331. func (s vectorByReverseValueHeap) Len() int {
  332. return len(s)
  333. }
  334. func (s vectorByReverseValueHeap) Less(i, j int) bool {
  335. if math.IsNaN(s[i].V) {
  336. return true
  337. }
  338. return s[i].V > s[j].V
  339. }
  340. func (s vectorByReverseValueHeap) Swap(i, j int) {
  341. s[i], s[j] = s[j], s[i]
  342. }
  343. func (s *vectorByReverseValueHeap) Push(x interface{}) {
  344. *s = append(*s, *(x.(*Sample)))
  345. }
  346. func (s *vectorByReverseValueHeap) Pop() interface{} {
  347. old := *s
  348. n := len(old)
  349. el := old[n-1]
  350. *s = old[0 : n-1]
  351. return el
  352. }