@grafana/scenes 8.6.0 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- # v8.6.0 (Wed Jun 24 2026)
1
+ # v8.6.0 (Thu Jun 25 2026)
2
2
 
3
3
  ### Release Notes
4
4
 
@@ -1546,6 +1546,7 @@ class Foo {
1546
1546
 
1547
1547
  #### 🐛 Bug Fix
1548
1548
 
1549
+ - fix(AnnotationsDataLayer): pass sampled field names into `arrayToDataFrame` [#1538](https://github.com/grafana/scenes/pull/1538) ([@gtk-grafana](https://github.com/gtk-grafana))
1549
1550
  - Bump version to: v8.5.0 \[skip ci\] ([@grafanabot](https://github.com/grafanabot))
1550
1551
  - Update CHANGELOG.md \[skip ci\] ([@grafanabot](https://github.com/grafanabot))
1551
1552
  - Filters: Key fetching waits for other vars to load first [#1460](https://github.com/grafana/scenes/pull/1460) ([@mdvictor](https://github.com/mdvictor))
@@ -10,7 +10,7 @@ import { writeSceneLog } from '../../../utils/writeSceneLog.js';
10
10
  import { registerQueryWithController } from '../../registerQueryWithController.js';
11
11
  import { SceneDataLayerBase } from '../SceneDataLayerBase.js';
12
12
  import { executeAnnotationQuery } from './standardAnnotationQuery.js';
13
- import { postProcessQueryResult, dedupAnnotations } from './utils.js';
13
+ import { postProcessQueryResult, dedupAnnotations, getLikelyAnnotationEventFieldNames } from './utils.js';
14
14
  import { wrapInSafeSerializableSceneObject } from '../../../utils/wrapInSafeSerializableSceneObject.js';
15
15
  import { RefreshEvent } from '@grafana/runtime';
16
16
  import { DrilldownDependenciesManager } from '../../../variables/DrilldownDependenciesManager.js';
@@ -117,7 +117,8 @@ class AnnotationsDataLayer extends SceneDataLayerBase {
117
117
  let processedEvents = postProcessQueryResult(query, events.events || []);
118
118
  processedEvents = dedupAnnotations(processedEvents);
119
119
  const stateUpdate = { ...emptyPanelData, state: events.state };
120
- const df = arrayToDataFrame(processedEvents);
120
+ const names = getLikelyAnnotationEventFieldNames(processedEvents);
121
+ const df = arrayToDataFrame(processedEvents, names);
121
122
  df.meta = {
122
123
  ...df.meta,
123
124
  dataTopic: DataTopic.Annotations
@@ -1 +1 @@
1
- {"version":3,"file":"AnnotationsDataLayer.js","sources":["../../../../../src/querying/layers/annotations/AnnotationsDataLayer.tsx"],"sourcesContent":["import { arrayToDataFrame, DataTopic, AnnotationQuery, ScopedVars, PanelData } from '@grafana/data';\nimport { LoadingState } from '@grafana/schema';\nimport React from 'react';\nimport { map, Unsubscribable } from 'rxjs';\nimport { emptyPanelData } from '../../../core/SceneDataNode';\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport {\n SceneComponentProps,\n SceneDataLayerProvider,\n SceneDataLayerProviderState,\n SceneTimeRangeLike,\n} from '../../../core/types';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { getMessageFromError } from '../../../utils/getMessageFromError';\nimport { writeSceneLog } from '../../../utils/writeSceneLog';\nimport { registerQueryWithController } from '../../registerQueryWithController';\nimport { SceneDataLayerBase } from '../SceneDataLayerBase';\nimport { AnnotationQueryResults, executeAnnotationQuery } from './standardAnnotationQuery';\nimport { dedupAnnotations, postProcessQueryResult } from './utils';\nimport { wrapInSafeSerializableSceneObject } from '../../../utils/wrapInSafeSerializableSceneObject';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { DrilldownDependenciesManager } from '../../../variables/DrilldownDependenciesManager';\nimport { InlineSwitch } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\ninterface AnnotationsDataLayerState extends SceneDataLayerProviderState {\n query: AnnotationQuery;\n}\n\nexport class AnnotationsDataLayer\n extends SceneDataLayerBase<AnnotationsDataLayerState>\n implements SceneDataLayerProvider\n{\n static Component = AnnotationsDataLayerRenderer;\n\n private _scopedVars: ScopedVars = {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n };\n private _timeRangeSub: Unsubscribable | undefined;\n\n private _drilldownDependenciesManager: DrilldownDependenciesManager<AnnotationsDataLayerState> =\n new DrilldownDependenciesManager(this._variableDependency);\n\n public constructor(initialState: AnnotationsDataLayerState) {\n super(\n {\n isEnabled: true,\n ...initialState,\n },\n ['query']\n );\n }\n\n public onEnable(): void {\n this.publishEvent(new RefreshEvent(), true);\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n this.setState({\n query: {\n ...this.state.query,\n enable: true,\n },\n });\n\n this._timeRangeSub = timeRange.subscribeToState(() => {\n // setTimeout to let SceneVariableSet also respond to time range change\n // So that variables that depend on time range have time to switch to loading state\n setTimeout(() => this.runWithTimeRange(timeRange), 0);\n });\n }\n\n public onDisable(): void {\n this.publishEvent(new RefreshEvent(), true);\n\n this.setState({\n query: {\n ...this.state.query,\n enable: false,\n },\n });\n\n this._timeRangeSub?.unsubscribe();\n }\n\n public runLayer() {\n writeSceneLog('AnnotationsDataLayer', 'run layer');\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n const { query } = this.state;\n\n if (!query.enable) {\n return;\n }\n\n this._drilldownDependenciesManager.findAndSubscribeToDrilldowns(query.datasource?.uid, this);\n\n if (this.querySub) {\n this.querySub.unsubscribe();\n }\n\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('AnnotationsDataLayer', 'Variable dependency is in loading state, skipping query execution');\n return;\n }\n\n try {\n const ds = await this.resolveDataSource(query);\n\n let stream = executeAnnotationQuery(\n ds,\n timeRange,\n query,\n this,\n this._drilldownDependenciesManager.getFilters(),\n this._drilldownDependenciesManager.getGroupByKeys()\n ).pipe(\n registerQueryWithController({\n type: 'AnnotationsDataLayer/annotationsLoading',\n origin: this,\n cancel: () => this.cancelQuery(),\n }),\n map((events) => {\n const stateUpdate = this.processEvents(query, events);\n return stateUpdate;\n })\n );\n\n this.querySub = stream.subscribe((stateUpdate) => {\n this.publishResults(stateUpdate);\n });\n } catch (e) {\n this.publishResults({\n ...emptyPanelData,\n state: LoadingState.Error,\n errors: [\n {\n message: getMessageFromError(e),\n },\n ],\n });\n console.error('AnnotationsDataLayer error', e);\n }\n }\n\n protected async resolveDataSource(query: AnnotationQuery) {\n return await getDataSource(query.datasource || undefined, this._scopedVars);\n }\n\n protected processEvents(query: AnnotationQuery, events: AnnotationQueryResults): PanelData {\n let processedEvents = postProcessQueryResult(query, events.events || []);\n processedEvents = dedupAnnotations(processedEvents);\n\n const stateUpdate = { ...emptyPanelData, state: events.state };\n const df = arrayToDataFrame(processedEvents);\n\n df.meta = {\n ...df.meta,\n dataTopic: DataTopic.Annotations,\n };\n\n stateUpdate.series = [df];\n\n return stateUpdate;\n }\n}\n\nfunction AnnotationsDataLayerRenderer({ model }: SceneComponentProps<AnnotationsDataLayer>) {\n const { isEnabled, isHidden } = model.useState();\n const elementId = `data-layer-${model.state.key}`;\n\n if (isHidden) {\n return null;\n }\n\n return (\n <InlineSwitch\n className={switchStyle}\n id={elementId}\n value={isEnabled}\n onChange={() => model.setState({ isEnabled: !isEnabled })}\n />\n );\n}\n\nconst switchStyle = css({\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AnnotationsDataLayer.js","sources":["../../../../../src/querying/layers/annotations/AnnotationsDataLayer.tsx"],"sourcesContent":["import { AnnotationQuery, arrayToDataFrame, DataTopic, PanelData, ScopedVars } from '@grafana/data';\nimport { LoadingState } from '@grafana/schema';\nimport React from 'react';\nimport { map, Unsubscribable } from 'rxjs';\nimport { emptyPanelData } from '../../../core/SceneDataNode';\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport {\n SceneComponentProps,\n SceneDataLayerProvider,\n SceneDataLayerProviderState,\n SceneTimeRangeLike,\n} from '../../../core/types';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { getMessageFromError } from '../../../utils/getMessageFromError';\nimport { writeSceneLog } from '../../../utils/writeSceneLog';\nimport { registerQueryWithController } from '../../registerQueryWithController';\nimport { SceneDataLayerBase } from '../SceneDataLayerBase';\nimport { AnnotationQueryResults, executeAnnotationQuery } from './standardAnnotationQuery';\nimport { dedupAnnotations, getLikelyAnnotationEventFieldNames, postProcessQueryResult } from './utils';\nimport { wrapInSafeSerializableSceneObject } from '../../../utils/wrapInSafeSerializableSceneObject';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { DrilldownDependenciesManager } from '../../../variables/DrilldownDependenciesManager';\nimport { InlineSwitch } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\ninterface AnnotationsDataLayerState extends SceneDataLayerProviderState {\n query: AnnotationQuery;\n}\n\nexport class AnnotationsDataLayer\n extends SceneDataLayerBase<AnnotationsDataLayerState>\n implements SceneDataLayerProvider\n{\n static Component = AnnotationsDataLayerRenderer;\n\n private _scopedVars: ScopedVars = {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n };\n private _timeRangeSub: Unsubscribable | undefined;\n\n private _drilldownDependenciesManager: DrilldownDependenciesManager<AnnotationsDataLayerState> =\n new DrilldownDependenciesManager(this._variableDependency);\n\n public constructor(initialState: AnnotationsDataLayerState) {\n super(\n {\n isEnabled: true,\n ...initialState,\n },\n ['query']\n );\n }\n\n public onEnable(): void {\n this.publishEvent(new RefreshEvent(), true);\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n this.setState({\n query: {\n ...this.state.query,\n enable: true,\n },\n });\n\n this._timeRangeSub = timeRange.subscribeToState(() => {\n // setTimeout to let SceneVariableSet also respond to time range change\n // So that variables that depend on time range have time to switch to loading state\n setTimeout(() => this.runWithTimeRange(timeRange), 0);\n });\n }\n\n public onDisable(): void {\n this.publishEvent(new RefreshEvent(), true);\n\n this.setState({\n query: {\n ...this.state.query,\n enable: false,\n },\n });\n\n this._timeRangeSub?.unsubscribe();\n }\n\n public runLayer() {\n writeSceneLog('AnnotationsDataLayer', 'run layer');\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange);\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n const { query } = this.state;\n\n if (!query.enable) {\n return;\n }\n\n this._drilldownDependenciesManager.findAndSubscribeToDrilldowns(query.datasource?.uid, this);\n\n if (this.querySub) {\n this.querySub.unsubscribe();\n }\n\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('AnnotationsDataLayer', 'Variable dependency is in loading state, skipping query execution');\n return;\n }\n\n try {\n const ds = await this.resolveDataSource(query);\n\n let stream = executeAnnotationQuery(\n ds,\n timeRange,\n query,\n this,\n this._drilldownDependenciesManager.getFilters(),\n this._drilldownDependenciesManager.getGroupByKeys()\n ).pipe(\n registerQueryWithController({\n type: 'AnnotationsDataLayer/annotationsLoading',\n origin: this,\n cancel: () => this.cancelQuery(),\n }),\n map((events) => {\n const stateUpdate = this.processEvents(query, events);\n return stateUpdate;\n })\n );\n\n this.querySub = stream.subscribe((stateUpdate) => {\n this.publishResults(stateUpdate);\n });\n } catch (e) {\n this.publishResults({\n ...emptyPanelData,\n state: LoadingState.Error,\n errors: [\n {\n message: getMessageFromError(e),\n },\n ],\n });\n console.error('AnnotationsDataLayer error', e);\n }\n }\n\n protected async resolveDataSource(query: AnnotationQuery) {\n return await getDataSource(query.datasource || undefined, this._scopedVars);\n }\n\n protected processEvents(query: AnnotationQuery, events: AnnotationQueryResults): PanelData {\n let processedEvents = postProcessQueryResult(query, events.events || []);\n processedEvents = dedupAnnotations(processedEvents);\n\n const stateUpdate = { ...emptyPanelData, state: events.state };\n\n const names = getLikelyAnnotationEventFieldNames(processedEvents);\n const df = arrayToDataFrame(processedEvents, names);\n\n df.meta = {\n ...df.meta,\n dataTopic: DataTopic.Annotations,\n };\n\n stateUpdate.series = [df];\n\n return stateUpdate;\n }\n}\n\nfunction AnnotationsDataLayerRenderer({ model }: SceneComponentProps<AnnotationsDataLayer>) {\n const { isEnabled, isHidden } = model.useState();\n const elementId = `data-layer-${model.state.key}`;\n\n if (isHidden) {\n return null;\n }\n\n return (\n <InlineSwitch\n className={switchStyle}\n id={elementId}\n value={isEnabled}\n onChange={() => model.setState({ isEnabled: !isEnabled })}\n />\n );\n}\n\nconst switchStyle = css({\n borderBottomLeftRadius: 0,\n borderTopLeftRadius: 0,\n});\n"],"names":[],"mappings":"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"}
@@ -56,6 +56,25 @@ function dedupAnnotations(annotations) {
56
56
  function isPanelAlert(event) {
57
57
  return event.eventType === "panel-alert";
58
58
  }
59
+ function getLikelyAnnotationEventFieldNames(annotationEvents, samples = 250) {
60
+ const len = annotationEvents.length;
61
+ const firstIdx = 0;
62
+ const lastIdx = len - 1;
63
+ const stride = Math.max(1, Math.floor((lastIdx - firstIdx + 1) / samples));
64
+ const annotationEventNamesSet = /* @__PURE__ */ new Set();
65
+ for (let annotationEventIndex = firstIdx; annotationEventIndex < len; annotationEventIndex += stride) {
66
+ const annotationEvent = annotationEvents[annotationEventIndex];
67
+ for (const key of Object.keys(annotationEvent)) {
68
+ annotationEventNamesSet.add(key);
69
+ }
70
+ }
71
+ if (len > 0) {
72
+ for (const key of Object.keys(annotationEvents[lastIdx])) {
73
+ annotationEventNamesSet.add(key);
74
+ }
75
+ }
76
+ return Array.from(annotationEventNamesSet);
77
+ }
59
78
 
60
- export { dedupAnnotations, postProcessQueryResult };
79
+ export { dedupAnnotations, getLikelyAnnotationEventFieldNames, postProcessQueryResult };
61
80
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../src/querying/layers/annotations/utils.ts"],"sourcesContent":["// These opt outs are here only for quicker and easier migration to react based annotations editors and because\n// annotation support API needs some work to support less \"standard\" editors like prometheus and here it is not\n// polluting public API.\n\nimport { AnnotationEvent, AnnotationQuery, DataSourceApi } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { cloneDeep, concat, every, find, groupBy, head, map, partition } from 'lodash';\n\nconst legacyRunner = [\n 'prometheus',\n 'loki',\n 'elasticsearch',\n 'grafana-opensearch-datasource', // external\n];\n\n/**\n * Use legacy runner. Used only as an escape hatch for easier transition to React based annotation editor.\n */\nexport function shouldUseLegacyRunner(datasource: DataSourceApi): boolean {\n const { type } = datasource;\n return !datasource.annotations || legacyRunner.includes(type);\n}\n\nexport function postProcessQueryResult(annotation: AnnotationQuery, results: AnnotationEvent[]): AnnotationEvent[] {\n // if annotation has snapshotData\n // make clone and remove it\n if (annotation.snapshotData) {\n annotation = cloneDeep(annotation);\n delete annotation.snapshotData;\n }\n\n //\n const processed = results.map((item) => {\n const processedItem = { ...item };\n\n processedItem.source = annotation;\n processedItem.color = config.theme2.visualization.getColorByName(annotation.iconColor);\n processedItem.type = annotation.name;\n processedItem.isRegion = Boolean(processedItem.timeEnd && processedItem.time !== processedItem.timeEnd);\n\n switch (processedItem.newState?.toLowerCase()) {\n case 'pending':\n processedItem.color = 'yellow';\n break;\n case 'alerting':\n processedItem.color = 'red';\n break;\n case 'ok':\n processedItem.color = 'green';\n break;\n case 'normal': // ngalert (\"normal\" instead of \"ok\")\n processedItem.color = 'green';\n break;\n case 'no_data':\n processedItem.color = 'gray';\n break;\n case 'nodata': // ngalert\n processedItem.color = 'gray';\n break;\n }\n\n return processedItem;\n });\n\n return processed;\n}\n\nexport function dedupAnnotations(annotations: any) {\n let dedup = [];\n\n // Split events by annotationId property existence\n const events = partition(annotations, 'id');\n\n const eventsById = groupBy(events[0], 'id');\n dedup = map(eventsById, (eventGroup) => {\n if (eventGroup.length > 1 && !every(eventGroup, isPanelAlert)) {\n // Get first non-panel alert\n return find(eventGroup, (event) => {\n return event.eventType !== 'panel-alert';\n });\n } else {\n return head(eventGroup);\n }\n });\n\n dedup = concat(dedup, events[1]);\n return dedup;\n}\n\nfunction isPanelAlert(event: { eventType: string }) {\n return event.eventType === 'panel-alert';\n}\n"],"names":[],"mappings":";;;AAuBO,SAAS,sBAAA,CAAuB,YAA6B,OAAA,EAA+C;AAGjH,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,UAAA,GAAa,UAAU,UAAU,CAAA;AACjC,IAAA,OAAO,UAAA,CAAW,YAAA;AAAA,EACpB;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAhC1C,IAAA,IAAA,EAAA;AAiCI,IAAA,MAAM,aAAA,GAAgB,EAAE,GAAG,IAAA,EAAK;AAEhC,IAAA,aAAA,CAAc,MAAA,GAAS,UAAA;AACvB,IAAA,aAAA,CAAc,QAAQ,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,cAAA,CAAe,WAAW,SAAS,CAAA;AACrF,IAAA,aAAA,CAAc,OAAO,UAAA,CAAW,IAAA;AAChC,IAAA,aAAA,CAAc,WAAW,OAAA,CAAQ,aAAA,CAAc,WAAW,aAAA,CAAc,IAAA,KAAS,cAAc,OAAO,CAAA;AAEtG,IAAA,QAAA,CAAQ,EAAA,GAAA,aAAA,CAAc,QAAA,KAAd,IAAA,GAAA,MAAA,GAAA,EAAA,CAAwB,WAAA,EAAA;AAAe,MAC7C,KAAK,SAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,QAAA;AACtB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,OAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,OAAA;AACtB,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,MAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,MAAA;AACtB,QAAA;AAAA;AAGJ,IAAA,OAAO,aAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,iBAAiB,WAAA,EAAkB;AACjD,EAAA,IAAI,QAAQ,EAAC;AAGb,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,WAAA,EAAa,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AAC1C,EAAA,KAAA,GAAQ,GAAA,CAAI,UAAA,EAAY,CAAC,UAAA,KAAe;AACtC,IAAA,IAAI,WAAW,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,UAAA,EAAY,YAAY,CAAA,EAAG;AAE7D,MAAA,OAAO,IAAA,CAAK,UAAA,EAAY,CAAC,KAAA,KAAU;AACjC,QAAA,OAAO,MAAM,SAAA,KAAc,aAAA;AAAA,MAC7B,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAC/B,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAa,KAAA,EAA8B;AAClD,EAAA,OAAO,MAAM,SAAA,KAAc,aAAA;AAC7B;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../src/querying/layers/annotations/utils.ts"],"sourcesContent":["// These opt outs are here only for quicker and easier migration to react based annotations editors and because\n// annotation support API needs some work to support less \"standard\" editors like prometheus and here it is not\n// polluting public API.\n\nimport { AnnotationEvent, AnnotationQuery, DataSourceApi } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { cloneDeep, concat, every, find, groupBy, head, map, partition } from 'lodash';\n\nconst legacyRunner = [\n 'prometheus',\n 'loki',\n 'elasticsearch',\n 'grafana-opensearch-datasource', // external\n];\n\n/**\n * Use legacy runner. Used only as an escape hatch for easier transition to React based annotation editor.\n */\nexport function shouldUseLegacyRunner(datasource: DataSourceApi): boolean {\n const { type } = datasource;\n return !datasource.annotations || legacyRunner.includes(type);\n}\n\nexport function postProcessQueryResult(annotation: AnnotationQuery, results: AnnotationEvent[]): AnnotationEvent[] {\n // if annotation has snapshotData\n // make clone and remove it\n if (annotation.snapshotData) {\n annotation = cloneDeep(annotation);\n delete annotation.snapshotData;\n }\n\n //\n const processed = results.map((item) => {\n const processedItem = { ...item };\n\n processedItem.source = annotation;\n processedItem.color = config.theme2.visualization.getColorByName(annotation.iconColor);\n processedItem.type = annotation.name;\n processedItem.isRegion = Boolean(processedItem.timeEnd && processedItem.time !== processedItem.timeEnd);\n\n switch (processedItem.newState?.toLowerCase()) {\n case 'pending':\n processedItem.color = 'yellow';\n break;\n case 'alerting':\n processedItem.color = 'red';\n break;\n case 'ok':\n processedItem.color = 'green';\n break;\n case 'normal': // ngalert (\"normal\" instead of \"ok\")\n processedItem.color = 'green';\n break;\n case 'no_data':\n processedItem.color = 'gray';\n break;\n case 'nodata': // ngalert\n processedItem.color = 'gray';\n break;\n }\n\n return processedItem;\n });\n\n return processed;\n}\n\nexport function dedupAnnotations(annotations: any) {\n let dedup = [];\n\n // Split events by annotationId property existence\n const events = partition(annotations, 'id');\n\n const eventsById = groupBy(events[0], 'id');\n dedup = map(eventsById, (eventGroup) => {\n if (eventGroup.length > 1 && !every(eventGroup, isPanelAlert)) {\n // Get first non-panel alert\n return find(eventGroup, (event) => {\n return event.eventType !== 'panel-alert';\n });\n } else {\n return head(eventGroup);\n }\n });\n\n dedup = concat(dedup, events[1]);\n return dedup;\n}\n\nfunction isPanelAlert(event: { eventType: string }) {\n return event.eventType === 'panel-alert';\n}\n\n/**\n * getLikelyAnnotationEventFieldNames tests a few non-contiguous annotation events to get a more complete set of field\n * names to pass into arrayToDataFrame without iterating through the entire array.\n * Avoids the first annotation defining the schema of all subsequent annotations. (https://github.com/grafana/grafana/issues/105257)\n *\n * @param annotationEvents\n * @param samples\n */\nexport function getLikelyAnnotationEventFieldNames(annotationEvents: AnnotationEvent[], samples = 250): string[] {\n const len = annotationEvents.length;\n const firstIdx = 0;\n const lastIdx = len - 1;\n\n const stride = Math.max(1, Math.floor((lastIdx - firstIdx + 1) / samples));\n\n const annotationEventNamesSet = new Set<string>();\n for (let annotationEventIndex = firstIdx; annotationEventIndex < len; annotationEventIndex += stride) {\n const annotationEvent = annotationEvents[annotationEventIndex];\n for (const key of Object.keys(annotationEvent)) {\n annotationEventNamesSet.add(key);\n }\n }\n\n // Check last event too\n if (len > 0) {\n for (const key of Object.keys(annotationEvents[lastIdx])) {\n annotationEventNamesSet.add(key);\n }\n }\n\n return Array.from(annotationEventNamesSet);\n}\n"],"names":[],"mappings":";;;AAuBO,SAAS,sBAAA,CAAuB,YAA6B,OAAA,EAA+C;AAGjH,EAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,IAAA,UAAA,GAAa,UAAU,UAAU,CAAA;AACjC,IAAA,OAAO,UAAA,CAAW,YAAA;AAAA,EACpB;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AAhC1C,IAAA,IAAA,EAAA;AAiCI,IAAA,MAAM,aAAA,GAAgB,EAAE,GAAG,IAAA,EAAK;AAEhC,IAAA,aAAA,CAAc,MAAA,GAAS,UAAA;AACvB,IAAA,aAAA,CAAc,QAAQ,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,cAAA,CAAe,WAAW,SAAS,CAAA;AACrF,IAAA,aAAA,CAAc,OAAO,UAAA,CAAW,IAAA;AAChC,IAAA,aAAA,CAAc,WAAW,OAAA,CAAQ,aAAA,CAAc,WAAW,aAAA,CAAc,IAAA,KAAS,cAAc,OAAO,CAAA;AAEtG,IAAA,QAAA,CAAQ,EAAA,GAAA,aAAA,CAAc,QAAA,KAAd,IAAA,GAAA,MAAA,GAAA,EAAA,CAAwB,WAAA,EAAA;AAAe,MAC7C,KAAK,SAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,QAAA;AACtB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,OAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,OAAA;AACtB,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,MAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,aAAA,CAAc,KAAA,GAAQ,MAAA;AACtB,QAAA;AAAA;AAGJ,IAAA,OAAO,aAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,iBAAiB,WAAA,EAAkB;AACjD,EAAA,IAAI,QAAQ,EAAC;AAGb,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,WAAA,EAAa,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA;AAC1C,EAAA,KAAA,GAAQ,GAAA,CAAI,UAAA,EAAY,CAAC,UAAA,KAAe;AACtC,IAAA,IAAI,WAAW,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,UAAA,EAAY,YAAY,CAAA,EAAG;AAE7D,MAAA,OAAO,IAAA,CAAK,UAAA,EAAY,CAAC,KAAA,KAAU;AACjC,QAAA,OAAO,MAAM,SAAA,KAAc,aAAA;AAAA,MAC7B,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,KAAA,GAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAC/B,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAa,KAAA,EAA8B;AAClD,EAAA,OAAO,MAAM,SAAA,KAAc,aAAA;AAC7B;AAUO,SAAS,kCAAA,CAAmC,gBAAA,EAAqC,OAAA,GAAU,GAAA,EAAe;AAC/G,EAAA,MAAM,MAAM,gBAAA,CAAiB,MAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAA;AACjB,EAAA,MAAM,UAAU,GAAA,GAAM,CAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,OAAA,GAAU,QAAA,GAAW,CAAA,IAAK,OAAO,CAAC,CAAA;AAEzE,EAAA,MAAM,uBAAA,uBAA8B,GAAA,EAAY;AAChD,EAAA,KAAA,IAAS,oBAAA,GAAuB,QAAA,EAAU,oBAAA,GAAuB,GAAA,EAAK,wBAAwB,MAAA,EAAQ;AACpG,IAAA,MAAM,eAAA,GAAkB,iBAAiB,oBAAoB,CAAA;AAC7D,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,EAAG;AAC9C,MAAA,uBAAA,CAAwB,IAAI,GAAG,CAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA,EAAG;AACxD,MAAA,uBAAA,CAAwB,IAAI,GAAG,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAC3C;;;;"}
package/dist/index.js CHANGED
@@ -12846,6 +12846,25 @@ function dedupAnnotations(annotations) {
12846
12846
  function isPanelAlert(event) {
12847
12847
  return event.eventType === "panel-alert";
12848
12848
  }
12849
+ function getLikelyAnnotationEventFieldNames(annotationEvents, samples = 250) {
12850
+ const len = annotationEvents.length;
12851
+ const firstIdx = 0;
12852
+ const lastIdx = len - 1;
12853
+ const stride = Math.max(1, Math.floor((lastIdx - firstIdx + 1) / samples));
12854
+ const annotationEventNamesSet = /* @__PURE__ */ new Set();
12855
+ for (let annotationEventIndex = firstIdx; annotationEventIndex < len; annotationEventIndex += stride) {
12856
+ const annotationEvent = annotationEvents[annotationEventIndex];
12857
+ for (const key of Object.keys(annotationEvent)) {
12858
+ annotationEventNamesSet.add(key);
12859
+ }
12860
+ }
12861
+ if (len > 0) {
12862
+ for (const key of Object.keys(annotationEvents[lastIdx])) {
12863
+ annotationEventNamesSet.add(key);
12864
+ }
12865
+ }
12866
+ return Array.from(annotationEventNamesSet);
12867
+ }
12849
12868
 
12850
12869
  class AnnotationsDataLayer extends SceneDataLayerBase {
12851
12870
  constructor(initialState) {
@@ -12947,7 +12966,8 @@ class AnnotationsDataLayer extends SceneDataLayerBase {
12947
12966
  let processedEvents = postProcessQueryResult(query, events.events || []);
12948
12967
  processedEvents = dedupAnnotations(processedEvents);
12949
12968
  const stateUpdate = { ...emptyPanelData, state: events.state };
12950
- const df = data.arrayToDataFrame(processedEvents);
12969
+ const names = getLikelyAnnotationEventFieldNames(processedEvents);
12970
+ const df = data.arrayToDataFrame(processedEvents, names);
12951
12971
  df.meta = {
12952
12972
  ...df.meta,
12953
12973
  dataTopic: data.DataTopic.Annotations