From d1846da0d29031192165c1ceefac142c010738a5 Mon Sep 17 00:00:00 2001 From: Tom Ratcliffe Date: Fri, 20 Dec 2024 16:13:32 +0000 Subject: [PATCH] Alerting: Skip non-expression queries in DAG creation (#98315) --- .../components/rule-editor/dag.test.ts | 48 ++++++++++++++++--- .../unified/components/rule-editor/dag.ts | 5 +- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/public/app/features/alerting/unified/components/rule-editor/dag.test.ts b/public/app/features/alerting/unified/components/rule-editor/dag.test.ts index eecc88977ff..513d41abffe 100644 --- a/public/app/features/alerting/unified/components/rule-editor/dag.test.ts +++ b/public/app/features/alerting/unified/components/rule-editor/dag.test.ts @@ -35,30 +35,64 @@ describe('working with dag', () => { type: 'math', }, }, + { + refId: 'D', + model: { + refId: 'D', + expression: 'B', + type: 'threshold', + }, + }, ] as AlertQuery[]; const dag = _createDagFromQueries(queries); - expect(Object.keys(dag.nodes)).toHaveLength(3); + expect(Object.keys(dag.nodes)).toHaveLength(4); expect(() => { dag.getNode('A'); dag.getNode('B'); dag.getNode('C'); + dag.getNode('D'); }).not.toThrow(); expect(dag.getNode('A').inputEdges).toHaveLength(0); - expect(dag.getNode('A').outputEdges).toHaveLength(1); - expect(dag.getNode('A').outputEdges[0].outputNode).toHaveProperty('name', 'B'); + expect(dag.getNode('A').outputEdges).toHaveLength(0); - expect(dag.getNode('B').inputEdges).toHaveLength(1); - expect(dag.getNode('B').outputEdges).toHaveLength(1); - expect(dag.getNode('B').inputEdges[0].inputNode).toHaveProperty('name', 'A'); + expect(dag.getNode('B').inputEdges).toHaveLength(0); + expect(dag.getNode('B').outputEdges).toHaveLength(2); expect(dag.getNode('B').outputEdges[0].outputNode).toHaveProperty('name', 'C'); + expect(dag.getNode('B').outputEdges[1].outputNode).toHaveProperty('name', 'D'); expect(dag.getNode('C').inputEdges).toHaveLength(1); - expect(dag.getNode('C').outputEdges).toHaveLength(0); expect(dag.getNode('C').inputEdges[0].inputNode).toHaveProperty('name', 'B'); + expect(dag.getNode('C').outputEdges).toHaveLength(0); + + expect(dag.getNode('D').inputEdges).toHaveLength(1); + expect(dag.getNode('D').inputEdges[0].inputNode).toHaveProperty('name', 'B'); + expect(dag.getNode('D').outputEdges).toHaveLength(0); + }); + + test('data queries cannot have references', () => { + const queries = [ + { + refId: 'A', + model: { + refId: 'A', + expression: 'vector(1)', + }, + }, + ] as AlertQuery[]; + + expect(() => _createDagFromQueries(queries)).not.toThrow(); + + const dag = _createDagFromQueries(queries); + + expect(Object.keys(dag.nodes)).toHaveLength(1); + + expect(() => { + dag.getNode('A'); + }).not.toThrow(); }); }); diff --git a/public/app/features/alerting/unified/components/rule-editor/dag.ts b/public/app/features/alerting/unified/components/rule-editor/dag.ts index cd4583fe6e2..4900ea70025 100644 --- a/public/app/features/alerting/unified/components/rule-editor/dag.ts +++ b/public/app/features/alerting/unified/components/rule-editor/dag.ts @@ -24,8 +24,11 @@ export function _createDagFromQueries(queries: AlertQuery[]): Graph { graph.createNodes(nodes); queries.forEach((query) => { + if (!isExpressionQuery(query.model)) { + return; + } const source = query.refId; - const isMathExpression = isExpressionQuery(query.model) && query.model.type === 'math'; + const isMathExpression = query.model.type === 'math'; // some expressions have multiple targets (like the math expression) const targets = isMathExpression