llmMonitoringCharts.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import {CHART_PALETTE} from 'sentry/constants/chartPalette';
  2. import {t} from 'sentry/locale';
  3. import {DiscoverDatasets} from 'sentry/utils/discover/types';
  4. import {MutableSearch} from 'sentry/utils/tokenizeSearch';
  5. import {InsightsLineChartWidget} from 'sentry/views/insights/common/components/insightsLineChartWidget';
  6. import {
  7. useSpanIndexedSeries,
  8. useSpanMetricsSeries,
  9. } from 'sentry/views/insights/common/queries/useDiscoverSeries';
  10. interface TotalTokensUsedChartProps {
  11. groupId?: string;
  12. }
  13. export function EAPTotalTokensUsedChart({groupId}: TotalTokensUsedChartProps) {
  14. const aggregate = 'sum(ai.total_tokens.used)';
  15. let query = 'span.category:"ai"';
  16. if (groupId) {
  17. query = `${query} span.ai.pipeline.group:"${groupId}"`;
  18. }
  19. const {data, isPending, error} = useSpanIndexedSeries(
  20. {
  21. yAxis: [aggregate],
  22. search: new MutableSearch(query),
  23. transformAliasToInputFormat: true,
  24. },
  25. 'api.ai-pipelines.view',
  26. DiscoverDatasets.SPANS_EAP
  27. );
  28. return (
  29. <InsightsLineChartWidget
  30. title={t('Total tokens used')}
  31. series={[{...data[aggregate], color: CHART_PALETTE[2][0]}]}
  32. isLoading={isPending}
  33. error={error}
  34. />
  35. );
  36. }
  37. export function TotalTokensUsedChart({groupId}: TotalTokensUsedChartProps) {
  38. const aggregate = 'sum(ai.total_tokens.used)';
  39. let query = 'span.category:"ai"';
  40. if (groupId) {
  41. query = `${query} span.ai.pipeline.group:"${groupId}"`;
  42. }
  43. const {data, isPending, error} = useSpanMetricsSeries(
  44. {
  45. yAxis: [aggregate],
  46. search: new MutableSearch(query),
  47. transformAliasToInputFormat: true,
  48. },
  49. 'api.ai-pipelines.view'
  50. );
  51. return (
  52. <InsightsLineChartWidget
  53. title={t('Total tokens used')}
  54. series={[{...data[aggregate], color: CHART_PALETTE[2][0]}]}
  55. isLoading={isPending}
  56. error={error}
  57. />
  58. );
  59. }
  60. interface NumberOfPipelinesChartProps {
  61. groupId?: string;
  62. }
  63. export function EAPNumberOfPipelinesChart({groupId}: NumberOfPipelinesChartProps) {
  64. const aggregate = 'count()';
  65. let query = 'span.category:"ai.pipeline"';
  66. if (groupId) {
  67. query = `${query} span.group:"${groupId}"`;
  68. }
  69. const {data, isPending, error} = useSpanIndexedSeries(
  70. {
  71. yAxis: [aggregate],
  72. search: new MutableSearch(query),
  73. transformAliasToInputFormat: true,
  74. },
  75. 'api.ai-pipelines-eap.view',
  76. DiscoverDatasets.SPANS_EAP
  77. );
  78. return (
  79. <InsightsLineChartWidget
  80. title={t('Number of AI pipelines')}
  81. series={[{...data[aggregate], color: CHART_PALETTE[2][1]}]}
  82. isLoading={isPending}
  83. error={error}
  84. />
  85. );
  86. }
  87. export function NumberOfPipelinesChart({groupId}: NumberOfPipelinesChartProps) {
  88. const aggregate = 'count()';
  89. let query = 'span.category:"ai.pipeline"';
  90. if (groupId) {
  91. query = `${query} span.group:"${groupId}"`;
  92. }
  93. const {data, isPending, error} = useSpanMetricsSeries(
  94. {
  95. yAxis: [aggregate],
  96. search: new MutableSearch(query),
  97. transformAliasToInputFormat: true,
  98. },
  99. 'api.ai-pipelines.view'
  100. );
  101. return (
  102. <InsightsLineChartWidget
  103. title={t('Number of AI pipelines')}
  104. series={[{...data[aggregate], color: CHART_PALETTE[2][1]}]}
  105. isLoading={isPending}
  106. error={error}
  107. />
  108. );
  109. }
  110. interface PipelineDurationChartProps {
  111. groupId?: string;
  112. }
  113. export function EAPPipelineDurationChart({groupId}: PipelineDurationChartProps) {
  114. const aggregate = 'avg(span.duration)';
  115. let query = 'span.category:"ai.pipeline"';
  116. if (groupId) {
  117. query = `${query} span.group:"${groupId}"`;
  118. }
  119. const {data, isPending, error} = useSpanIndexedSeries(
  120. {
  121. yAxis: [aggregate],
  122. search: new MutableSearch(query),
  123. transformAliasToInputFormat: true,
  124. },
  125. 'api.ai-pipelines-eap.view',
  126. DiscoverDatasets.SPANS_EAP
  127. );
  128. return (
  129. <InsightsLineChartWidget
  130. title={t('Pipeline Duration')}
  131. series={[{...data[aggregate], color: CHART_PALETTE[2][2]}]}
  132. isLoading={isPending}
  133. error={error}
  134. />
  135. );
  136. }
  137. export function PipelineDurationChart({groupId}: PipelineDurationChartProps) {
  138. const aggregate = 'avg(span.duration)';
  139. let query = 'span.category:"ai.pipeline"';
  140. if (groupId) {
  141. query = `${query} span.group:"${groupId}"`;
  142. }
  143. const {data, isPending, error} = useSpanMetricsSeries(
  144. {
  145. yAxis: [aggregate],
  146. search: new MutableSearch(query),
  147. transformAliasToInputFormat: true,
  148. },
  149. 'api.ai-pipelines.view'
  150. );
  151. return (
  152. <InsightsLineChartWidget
  153. title={t('Pipeline Duration')}
  154. series={[{...data[aggregate], color: CHART_PALETTE[2][2]}]}
  155. isLoading={isPending}
  156. error={error}
  157. />
  158. );
  159. }