queries.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. import EventView from 'sentry/utils/discover/eventView';
  2. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  3. import {datetimeToClickhouseFilterTimestamps} from 'sentry/views/starfish/utils/dates';
  4. export const getHostListQuery = ({datetime}) => {
  5. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  6. return `SELECT
  7. domain,
  8. toStartOfInterval(start_timestamp, INTERVAL 12 HOUR) as interval,
  9. quantile(0.99)(exclusive_time) as p99,
  10. count() as count,
  11. countIf(greaterOrEquals(status, 400) AND lessOrEquals(status, 599)) as failure_count,
  12. failure_count / count as failure_rate
  13. FROM spans_experimental_starfish
  14. WHERE module = 'http'
  15. AND domain != ''
  16. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  17. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  18. GROUP BY domain, interval
  19. ORDER BY domain, interval asc
  20. `;
  21. };
  22. export const getHostListEventView = ({datetime}) => {
  23. return EventView.fromSavedQuery({
  24. name: '',
  25. fields: ['domain'],
  26. yAxis: ['p99(span.self_time)', 'count()'],
  27. query: 'module:http',
  28. topEvents: '10',
  29. start: datetime.start,
  30. end: datetime.end,
  31. range: datetime.period,
  32. dataset: DiscoverDatasets.SPANS_INDEXED,
  33. projects: [1],
  34. version: 2,
  35. });
  36. };
  37. export const getEndpointListQuery = ({domain, action, datetime, transaction}) => {
  38. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  39. return `SELECT
  40. description,
  41. group_id,
  42. domain,
  43. action,
  44. quantile(0.5)(exclusive_time) AS "p50(span.self_time)",
  45. quantile(0.95)(exclusive_time) AS "p95(span.self_time)",
  46. sum(exclusive_time) AS "sum(span.self_time)",
  47. uniq(user) AS "count_unique(user)", uniq(transaction) AS "count_unique(transaction)",
  48. count() AS count,
  49. countIf(greaterOrEquals(status, 400) AND lessOrEquals(status, 599)) AS failure_count,
  50. failure_count / count AS failure_rate
  51. FROM spans_experimental_starfish
  52. WHERE module = 'http'
  53. ${domain ? `AND domain = '${domain}'` : ''}
  54. ${action ? `AND action = '${action}'` : ''}
  55. ${transaction ? `AND transaction = '${transaction}'` : ''}
  56. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  57. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  58. GROUP BY description, domain, action, group_id
  59. ORDER BY count DESC
  60. LIMIT 10
  61. `;
  62. };
  63. export const getEndpointListEventView = ({domain, action, datetime, transaction}) => {
  64. return EventView.fromSavedQuery({
  65. name: '',
  66. fields: [
  67. 'description',
  68. 'group_id',
  69. 'domain',
  70. 'action',
  71. 'p50(span.self_time)',
  72. 'p95(span.self_time)',
  73. 'sum(span.self_time)',
  74. 'count()',
  75. 'count_unique(user)',
  76. 'count_unique(transaction)',
  77. ],
  78. orderby: '-count',
  79. query: `module:http ${domain ? `domain:${domain}` : ''} ${
  80. action ? `action:${action}` : ''
  81. } ${transaction ? `transaction:${transaction}` : ''}`,
  82. start: datetime.start,
  83. end: datetime.end,
  84. range: datetime.period,
  85. dataset: DiscoverDatasets.SPANS_INDEXED,
  86. projects: [1],
  87. version: 2,
  88. });
  89. };
  90. export const getEndpointDomainsQuery = ({datetime}) => {
  91. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  92. return `SELECT domain, count(),
  93. sum(exclusive_time) as "sum(span.self_time)",
  94. max(exclusive_time) as "p100(span.self_time)",
  95. quantile(0.99)(exclusive_time) as "p99(span.self_time)",
  96. quantile(0.95)(exclusive_time) as "p95(span.self_time)",
  97. quantile(0.50)(exclusive_time) as "p50(span.self_time)"
  98. FROM spans_experimental_starfish
  99. WHERE module = 'http'
  100. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  101. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  102. GROUP BY domain
  103. ORDER BY count() DESC
  104. `;
  105. };
  106. export const getEndpointDomainsEventView = ({datetime}) => {
  107. return EventView.fromSavedQuery({
  108. name: '',
  109. fields: [
  110. 'domain',
  111. 'count()',
  112. 'sum(span.self_time)',
  113. 'p100(span.self_time)',
  114. 'p99(span.self_time)',
  115. 'p95(span.self_time)',
  116. 'p50(span.self_time)',
  117. ],
  118. orderby: '-count',
  119. query: 'module:http',
  120. start: datetime.start,
  121. end: datetime.end,
  122. range: datetime.period,
  123. dataset: DiscoverDatasets.SPANS_INDEXED,
  124. projects: [1],
  125. version: 2,
  126. });
  127. };
  128. export const getEndpointGraphQuery = ({datetime}) => {
  129. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  130. return `SELECT
  131. toStartOfInterval(start_timestamp, INTERVAL 12 HOUR) as interval,
  132. quantile(0.5)(exclusive_time) as "p50(span.self_time)",
  133. quantile(0.75)(exclusive_time) as "p75(span.self_time)",
  134. quantile(0.95)(exclusive_time) as "p95(span.self_time)",
  135. quantile(0.99)(exclusive_time) as "p99(span.self_time)",
  136. count() as "count()",
  137. countIf(greaterOrEquals(status, 400) AND lessOrEquals(status, 599)) as "failure_count()",
  138. "failure_count()" / "count()" as "failure_rate()"
  139. FROM spans_experimental_starfish
  140. WHERE module = 'http'
  141. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  142. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  143. GROUP BY interval
  144. ORDER BY interval asc
  145. `;
  146. };
  147. export const getEndpointGraphEventView = ({datetime}) => {
  148. return EventView.fromSavedQuery({
  149. name: '',
  150. fields: [
  151. 'count()',
  152. 'p50(span.self_time)',
  153. 'p75(span.self_time)',
  154. 'p95(span.self_time)',
  155. 'p99(span.self_time)',
  156. ],
  157. yAxis: [
  158. 'count()',
  159. 'p50(span.self_time)',
  160. 'p75(span.self_time)',
  161. 'p95(span.self_time)',
  162. 'p99(span.self_time)',
  163. ],
  164. query: 'module:http',
  165. start: datetime.start,
  166. end: datetime.end,
  167. range: datetime.period,
  168. dataset: DiscoverDatasets.SPANS_INDEXED,
  169. projects: [1],
  170. version: 2,
  171. });
  172. };
  173. export const getEndpointDetailSeriesQuery = ({
  174. description,
  175. transactionName,
  176. datetime,
  177. groupId,
  178. }) => {
  179. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  180. return `SELECT
  181. toStartOfInterval(start_timestamp, INTERVAL 12 HOUR) as interval,
  182. quantile(0.5)(exclusive_time) as p50,
  183. quantile(0.95)(exclusive_time) as p95,
  184. count() as count,
  185. countIf(greaterOrEquals(status, 400) AND lessOrEquals(status, 599)) as failure_count,
  186. failure_count / count as failure_rate
  187. FROM spans_experimental_starfish
  188. WHERE module = 'http'
  189. ${description ? `AND description = '${description}'` : ''}
  190. ${groupId ? `AND group_id = '${groupId}'` : ''}
  191. ${transactionName ? `AND transaction = '${transactionName}'` : ''}
  192. ${
  193. start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''
  194. }
  195. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  196. GROUP BY interval
  197. ORDER BY interval asc
  198. `;
  199. };
  200. export const getEndpointDetailTableQuery = ({
  201. description,
  202. transactionName,
  203. datetime,
  204. groupId,
  205. }) => {
  206. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  207. return `
  208. SELECT transaction,
  209. count(),
  210. quantile(0.5)(exclusive_time) as "p50(span.self_time)",
  211. quantile(0.95)(exclusive_time) as "p95(span.self_time)",
  212. countIf(greaterOrEquals(status, 400) AND lessOrEquals(status, 599)) as failure_count,
  213. failure_count / count() as failure_rate,
  214. sum(exclusive_time) as "sum(span.self_time)",
  215. count(DISTINCT transaction_id) as "count_unique(transaction)"
  216. FROM spans_experimental_starfish
  217. WHERE module = 'http'
  218. ${description ? `AND description = '${description}'` : ''}
  219. ${groupId ? `AND group_id = '${groupId}'` : ''}
  220. ${transactionName ? `AND transaction = '${transactionName}'` : ''}
  221. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  222. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  223. GROUP BY transaction
  224. ORDER BY count() DESC
  225. LIMIT 5
  226. `;
  227. };
  228. export const getEndpointDetailTableEventView = ({
  229. description,
  230. transactionName,
  231. datetime,
  232. groupId,
  233. }) => {
  234. return EventView.fromSavedQuery({
  235. name: '',
  236. fields: [
  237. 'transaction',
  238. 'count()',
  239. 'p50(span.self_time)',
  240. 'p95(span.self_time)',
  241. 'sum(span.self_time)',
  242. 'count_unique(transaction)',
  243. ],
  244. orderby: '-count',
  245. query: `module:http ${description ? `description:${description}` : ''} ${
  246. transactionName ? `transaction:${transactionName}` : ''
  247. } ${groupId ? `group_id:${groupId}` : ''}`,
  248. start: datetime.start,
  249. end: datetime.end,
  250. range: datetime.period,
  251. dataset: DiscoverDatasets.SPANS_INDEXED,
  252. projects: [1],
  253. version: 2,
  254. });
  255. };
  256. export const getSpanInTransactionQuery = ({groupId, datetime}) => {
  257. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  258. // TODO - add back `module = <moudle> to filter data
  259. return `
  260. SELECT count() AS count, quantile(0.5)(exclusive_time) as p50, span_operation
  261. FROM spans_experimental_starfish
  262. WHERE group_id = '${groupId}'
  263. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  264. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  265. GROUP BY span_operation
  266. `;
  267. };
  268. export const getSpanFacetBreakdownQuery = ({groupId, datetime}) => {
  269. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  270. // TODO - add back `module = <moudle> to filter data
  271. return `
  272. SELECT transaction, user, domain
  273. FROM spans_experimental_starfish
  274. WHERE group_id = '${groupId}'
  275. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  276. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  277. `;
  278. };
  279. export const getHostStatusBreakdownQuery = ({domain, datetime}) => {
  280. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  281. return `
  282. SELECT count() as count, status
  283. FROM spans_experimental_starfish
  284. WHERE module = 'http'
  285. AND domain = '${domain}'
  286. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  287. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  288. GROUP BY status
  289. ORDER BY count DESC
  290. `;
  291. };
  292. export const getHostStatusBreakdownEventView = ({domain, datetime}) => {
  293. return EventView.fromSavedQuery({
  294. name: '',
  295. fields: ['status', 'count()'],
  296. orderby: '-count',
  297. query: `module:http domain:${domain}`,
  298. start: datetime.start,
  299. end: datetime.end,
  300. range: datetime.period,
  301. dataset: DiscoverDatasets.SPANS_INDEXED,
  302. projects: [1],
  303. version: 2,
  304. });
  305. };
  306. export const getEndpointAggregatesQuery = ({datetime, transaction}) => {
  307. const {start_timestamp, end_timestamp} = datetimeToClickhouseFilterTimestamps(datetime);
  308. return `
  309. SELECT
  310. description,
  311. toStartOfInterval(start_timestamp, INTERVAL 12 HOUR) as interval,
  312. count() AS count,
  313. quantile(0.5)(exclusive_time) as p50
  314. FROM spans_experimental_starfish
  315. WHERE module = 'http'
  316. ${transaction ? `AND transaction = '${transaction}'` : ''}
  317. ${start_timestamp ? `AND greaterOrEquals(start_timestamp, '${start_timestamp}')` : ''}
  318. ${end_timestamp ? `AND lessOrEquals(start_timestamp, '${end_timestamp}')` : ''}
  319. GROUP BY description, interval
  320. ORDER BY interval asc
  321. `;
  322. };