@intentius/chant-lexicon-grafana 0.97.0 → 0.99.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.
Files changed (451) hide show
  1. package/README.md +15 -5
  2. package/dist/actions/grafana.d.ts +24 -0
  3. package/dist/actions/grafana.d.ts.map +1 -0
  4. package/dist/actions/index.d.ts +2 -0
  5. package/dist/actions/index.d.ts.map +1 -0
  6. package/dist/alerting-build.d.ts +128 -0
  7. package/dist/alerting-build.d.ts.map +1 -0
  8. package/dist/alerting.d.ts +273 -0
  9. package/dist/alerting.d.ts.map +1 -0
  10. package/dist/api/apply.d.ts +156 -0
  11. package/dist/api/apply.d.ts.map +1 -0
  12. package/dist/api/bind.d.ts +32 -0
  13. package/dist/api/bind.d.ts.map +1 -0
  14. package/dist/api/client.d.ts +76 -0
  15. package/dist/api/client.d.ts.map +1 -0
  16. package/dist/api/converge.d.ts +33 -0
  17. package/dist/api/converge.d.ts.map +1 -0
  18. package/dist/api/dashboards.d.ts +102 -0
  19. package/dist/api/dashboards.d.ts.map +1 -0
  20. package/dist/api/datasources.d.ts +26 -0
  21. package/dist/api/datasources.d.ts.map +1 -0
  22. package/dist/api/fake-grafana-writes.d.ts +41 -0
  23. package/dist/api/fake-grafana-writes.d.ts.map +1 -0
  24. package/dist/api/fake-grafana.d.ts +61 -0
  25. package/dist/api/fake-grafana.d.ts.map +1 -0
  26. package/dist/api/folders.d.ts +110 -0
  27. package/dist/api/folders.d.ts.map +1 -0
  28. package/dist/api/library-panels.d.ts +52 -0
  29. package/dist/api/library-panels.d.ts.map +1 -0
  30. package/dist/build.d.ts +30 -2
  31. package/dist/build.d.ts.map +1 -1
  32. package/dist/catalog.d.ts +1 -1
  33. package/dist/catalog.d.ts.map +1 -1
  34. package/dist/codegen/docs.d.ts.map +1 -1
  35. package/dist/codegen/schema-types.d.ts +3 -3
  36. package/dist/codegen/schema-types.d.ts.map +1 -1
  37. package/dist/composites/agent-dashboard.d.ts.map +1 -1
  38. package/dist/composites/catalog.d.ts.map +1 -1
  39. package/dist/composites/index.d.ts +4 -2
  40. package/dist/composites/index.d.ts.map +1 -1
  41. package/dist/composites/red-dashboard.d.ts +21 -2
  42. package/dist/composites/red-dashboard.d.ts.map +1 -1
  43. package/dist/composites/shared.d.ts +7 -0
  44. package/dist/composites/shared.d.ts.map +1 -1
  45. package/dist/composites/slo-alert-rules.d.ts +92 -0
  46. package/dist/composites/slo-alert-rules.d.ts.map +1 -0
  47. package/dist/config.d.ts +111 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/contact-point-secrets.d.ts +17 -0
  50. package/dist/contact-point-secrets.d.ts.map +1 -0
  51. package/dist/dashboard.d.ts +16 -2
  52. package/dist/dashboard.d.ts.map +1 -1
  53. package/dist/datasource-refs.d.ts +95 -0
  54. package/dist/datasource-refs.d.ts.map +1 -0
  55. package/dist/datasource.d.ts +29 -0
  56. package/dist/datasource.d.ts.map +1 -1
  57. package/dist/deep-observe-hooks.d.ts +64 -0
  58. package/dist/deep-observe-hooks.d.ts.map +1 -0
  59. package/dist/deep-observe.d.ts +42 -0
  60. package/dist/deep-observe.d.ts.map +1 -0
  61. package/dist/describe-resources.d.ts +49 -0
  62. package/dist/describe-resources.d.ts.map +1 -0
  63. package/dist/detect.d.ts +28 -1
  64. package/dist/detect.d.ts.map +1 -1
  65. package/dist/export-resources.d.ts +38 -0
  66. package/dist/export-resources.d.ts.map +1 -0
  67. package/dist/import/alerting.d.ts +40 -0
  68. package/dist/import/alerting.d.ts.map +1 -0
  69. package/dist/import/edits.d.ts +47 -0
  70. package/dist/import/edits.d.ts.map +1 -0
  71. package/dist/import/embedded.d.ts +14 -0
  72. package/dist/import/embedded.d.ts.map +1 -0
  73. package/dist/import/generator.d.ts +60 -0
  74. package/dist/import/generator.d.ts.map +1 -0
  75. package/dist/import/live-export.d.ts +108 -0
  76. package/dist/import/live-export.d.ts.map +1 -0
  77. package/dist/import/mappings.d.ts +83 -0
  78. package/dist/import/mappings.d.ts.map +1 -0
  79. package/dist/import/model.d.ts +98 -0
  80. package/dist/import/model.d.ts.map +1 -0
  81. package/dist/import/normalize-alerting.d.ts +26 -0
  82. package/dist/import/normalize-alerting.d.ts.map +1 -0
  83. package/dist/import/normalize.d.ts +74 -0
  84. package/dist/import/normalize.d.ts.map +1 -0
  85. package/dist/import/parser.d.ts +110 -0
  86. package/dist/import/parser.d.ts.map +1 -0
  87. package/dist/import/report.d.ts +26 -0
  88. package/dist/import/report.d.ts.map +1 -0
  89. package/dist/import/testdata/fixtures.d.ts +35 -0
  90. package/dist/import/testdata/fixtures.d.ts.map +1 -0
  91. package/dist/import/v2.d.ts +72 -0
  92. package/dist/import/v2.d.ts.map +1 -0
  93. package/dist/index.d.ts +26 -9
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/integrity.json +18 -10
  96. package/dist/k8s.d.ts +107 -0
  97. package/dist/k8s.d.ts.map +1 -0
  98. package/dist/lint/audit-catalog.d.ts +2 -1
  99. package/dist/lint/audit-catalog.d.ts.map +1 -1
  100. package/dist/lint/post-synth/graf101.d.ts +2 -2
  101. package/dist/lint/post-synth/graf102.d.ts +1 -1
  102. package/dist/lint/post-synth/graf107.d.ts +1 -1
  103. package/dist/lint/post-synth/graf108.d.ts +8 -0
  104. package/dist/lint/post-synth/graf108.d.ts.map +1 -0
  105. package/dist/lint/post-synth/graf109.d.ts +8 -0
  106. package/dist/lint/post-synth/graf109.d.ts.map +1 -0
  107. package/dist/lint/post-synth/graf111.d.ts +8 -0
  108. package/dist/lint/post-synth/graf111.d.ts.map +1 -0
  109. package/dist/lint/post-synth/graf112.d.ts +8 -0
  110. package/dist/lint/post-synth/graf112.d.ts.map +1 -0
  111. package/dist/lint/post-synth/graf113.d.ts +8 -0
  112. package/dist/lint/post-synth/graf113.d.ts.map +1 -0
  113. package/dist/lint/post-synth/graf114.d.ts +8 -0
  114. package/dist/lint/post-synth/graf114.d.ts.map +1 -0
  115. package/dist/lint/post-synth/graf115.d.ts +8 -0
  116. package/dist/lint/post-synth/graf115.d.ts.map +1 -0
  117. package/dist/lint/post-synth/grafana-helpers.d.ts +7 -5
  118. package/dist/lint/post-synth/grafana-helpers.d.ts.map +1 -1
  119. package/dist/lint/post-synth/index.d.ts.map +1 -1
  120. package/dist/lint/rules/literal-secret.d.ts +7 -3
  121. package/dist/lint/rules/literal-secret.d.ts.map +1 -1
  122. package/dist/lsp/hover.d.ts.map +1 -1
  123. package/dist/manifest.json +1 -1
  124. package/dist/members.d.ts +27 -0
  125. package/dist/members.d.ts.map +1 -0
  126. package/dist/meta.json +135 -0
  127. package/dist/okf/index.md +36 -2
  128. package/dist/okf/rules/GRAF002.md +3 -2
  129. package/dist/okf/rules/GRAF101.md +3 -2
  130. package/dist/okf/rules/GRAF102.md +1 -0
  131. package/dist/okf/rules/GRAF108.md +11 -0
  132. package/dist/okf/rules/GRAF109.md +15 -0
  133. package/dist/okf/rules/GRAF111.md +11 -0
  134. package/dist/okf/rules/GRAF112.md +16 -0
  135. package/dist/okf/rules/GRAF113.md +16 -0
  136. package/dist/okf/rules/GRAF114.md +11 -0
  137. package/dist/okf/rules/GRAF115.md +11 -0
  138. package/dist/okf/types/AlertListPanel.md +9 -0
  139. package/dist/okf/types/AlertQuery.md +9 -0
  140. package/dist/okf/types/AlertRule.md +9 -0
  141. package/dist/okf/types/AlertRuleGroup.md +9 -0
  142. package/dist/okf/types/BarChartPanel.md +9 -0
  143. package/dist/okf/types/BarGaugePanel.md +9 -0
  144. package/dist/okf/types/CanvasPanel.md +9 -0
  145. package/dist/okf/types/ClassicConditionsExpression.md +9 -0
  146. package/dist/okf/types/ContactPoint.md +14 -0
  147. package/dist/okf/types/Dashboard.md +1 -0
  148. package/dist/okf/types/Datasource.md +3 -2
  149. package/dist/okf/types/ExternalDatasource.md +15 -0
  150. package/dist/okf/types/FlameGraphPanel.md +9 -0
  151. package/dist/okf/types/GeomapPanel.md +9 -0
  152. package/dist/okf/types/HistogramPanel.md +9 -0
  153. package/dist/okf/types/MathExpression.md +9 -0
  154. package/dist/okf/types/MuteTiming.md +13 -0
  155. package/dist/okf/types/NodeGraphPanel.md +9 -0
  156. package/dist/okf/types/NotificationPolicy.md +9 -0
  157. package/dist/okf/types/NotificationTemplate.md +9 -0
  158. package/dist/okf/types/PieChartPanel.md +9 -0
  159. package/dist/okf/types/ReduceExpression.md +9 -0
  160. package/dist/okf/types/ResampleExpression.md +9 -0
  161. package/dist/okf/types/SqlExpression.md +9 -0
  162. package/dist/okf/types/StateTimelinePanel.md +9 -0
  163. package/dist/okf/types/StatusHistoryPanel.md +9 -0
  164. package/dist/okf/types/ThresholdExpression.md +9 -0
  165. package/dist/okf/types/TrendPanel.md +9 -0
  166. package/dist/okf/types/XYChartPanel.md +9 -0
  167. package/dist/op/activities/grafana-apply.d.ts +75 -0
  168. package/dist/op/activities/grafana-apply.d.ts.map +1 -0
  169. package/dist/op/activities/index.d.ts +9 -0
  170. package/dist/op/activities/index.d.ts.map +1 -0
  171. package/dist/op/builders.d.ts +24 -0
  172. package/dist/op/builders.d.ts.map +1 -0
  173. package/dist/ownership.d.ts +67 -0
  174. package/dist/ownership.d.ts.map +1 -0
  175. package/dist/panel-options.d.ts +65 -0
  176. package/dist/panel-options.d.ts.map +1 -0
  177. package/dist/panels.d.ts +46 -9
  178. package/dist/panels.d.ts.map +1 -1
  179. package/dist/pin.d.ts +29 -7
  180. package/dist/pin.d.ts.map +1 -1
  181. package/dist/plugin.d.ts.map +1 -1
  182. package/dist/promql-check.d.ts +51 -0
  183. package/dist/promql-check.d.ts.map +1 -0
  184. package/dist/query.d.ts +9 -8
  185. package/dist/query.d.ts.map +1 -1
  186. package/dist/rules/graf101.ts +3 -3
  187. package/dist/rules/graf102.ts +1 -1
  188. package/dist/rules/graf107.ts +1 -1
  189. package/dist/rules/graf108.ts +17 -0
  190. package/dist/rules/graf109.ts +17 -0
  191. package/dist/rules/graf111.ts +17 -0
  192. package/dist/rules/graf112.ts +17 -0
  193. package/dist/rules/graf113.ts +17 -0
  194. package/dist/rules/graf114.ts +17 -0
  195. package/dist/rules/graf115.ts +17 -0
  196. package/dist/rules/grafana-helpers.ts +15 -8
  197. package/dist/rules/literal-secret.ts +60 -6
  198. package/dist/schema/barchart.gen.d.ts +198 -0
  199. package/dist/schema/barchart.gen.d.ts.map +1 -0
  200. package/dist/schema/bargauge.gen.d.ts +97 -0
  201. package/dist/schema/bargauge.gen.d.ts.map +1 -0
  202. package/dist/schema/canvas.gen.d.ts +152 -0
  203. package/dist/schema/canvas.gen.d.ts.map +1 -0
  204. package/dist/schema/dashboard.gen.d.ts +196 -21
  205. package/dist/schema/dashboard.gen.d.ts.map +1 -1
  206. package/dist/schema/expr.gen.d.ts +606 -0
  207. package/dist/schema/expr.gen.d.ts.map +1 -0
  208. package/dist/schema/gauge.gen.d.ts.map +1 -1
  209. package/dist/schema/geomap.gen.d.ts +100 -0
  210. package/dist/schema/geomap.gen.d.ts.map +1 -0
  211. package/dist/schema/heatmap.gen.d.ts.map +1 -1
  212. package/dist/schema/histogram.gen.d.ts +132 -0
  213. package/dist/schema/histogram.gen.d.ts.map +1 -0
  214. package/dist/schema/index.d.ts +12 -0
  215. package/dist/schema/index.d.ts.map +1 -1
  216. package/dist/schema/logs.gen.d.ts +1 -0
  217. package/dist/schema/logs.gen.d.ts.map +1 -1
  218. package/dist/schema/loki.gen.d.ts.map +1 -1
  219. package/dist/schema/nodegraph.gen.d.ts +49 -0
  220. package/dist/schema/nodegraph.gen.d.ts.map +1 -0
  221. package/dist/schema/piechart.gen.d.ts +127 -0
  222. package/dist/schema/piechart.gen.d.ts.map +1 -0
  223. package/dist/schema/prometheus.gen.d.ts.map +1 -1
  224. package/dist/schema/stat.gen.d.ts.map +1 -1
  225. package/dist/schema/statetimeline.gen.d.ts +124 -0
  226. package/dist/schema/statetimeline.gen.d.ts.map +1 -0
  227. package/dist/schema/statushistory.gen.d.ts +114 -0
  228. package/dist/schema/statushistory.gen.d.ts.map +1 -0
  229. package/dist/schema/table.gen.d.ts +22 -3
  230. package/dist/schema/table.gen.d.ts.map +1 -1
  231. package/dist/schema/tempo.gen.d.ts.map +1 -1
  232. package/dist/schema/text.gen.d.ts.map +1 -1
  233. package/dist/schema/timeseries.gen.d.ts +5 -1
  234. package/dist/schema/timeseries.gen.d.ts.map +1 -1
  235. package/dist/schema/trend.gen.d.ts +180 -0
  236. package/dist/schema/trend.gen.d.ts.map +1 -0
  237. package/dist/schema/xychart.gen.d.ts +145 -0
  238. package/dist/schema/xychart.gen.d.ts.map +1 -0
  239. package/dist/schema-validate.d.ts +30 -4
  240. package/dist/schema-validate.d.ts.map +1 -1
  241. package/dist/serializer.d.ts +11 -3
  242. package/dist/serializer.d.ts.map +1 -1
  243. package/dist/skill-defs.d.ts.map +1 -1
  244. package/dist/skills/chant-grafana-alerting.md +49 -0
  245. package/dist/skills/chant-grafana-provisioning.md +3 -3
  246. package/dist/skills/chant-grafana.md +12 -6
  247. package/dist/spec/fetch-units-cli.d.ts +3 -0
  248. package/dist/spec/fetch-units-cli.d.ts.map +1 -0
  249. package/dist/spec/overlay.d.ts +43 -0
  250. package/dist/spec/overlay.d.ts.map +1 -0
  251. package/dist/spec/schemas.d.ts +13 -7
  252. package/dist/spec/schemas.d.ts.map +1 -1
  253. package/dist/spec/units.d.ts +35 -0
  254. package/dist/spec/units.d.ts.map +1 -0
  255. package/dist/spec/units.gen.d.ts +2 -0
  256. package/dist/spec/units.gen.d.ts.map +1 -0
  257. package/dist/transformations.d.ts +459 -0
  258. package/dist/transformations.d.ts.map +1 -0
  259. package/dist/util.d.ts +6 -0
  260. package/dist/util.d.ts.map +1 -1
  261. package/dist/validate-alerting.d.ts +65 -0
  262. package/dist/validate-alerting.d.ts.map +1 -0
  263. package/dist/validate-output.d.ts +49 -9
  264. package/dist/validate-output.d.ts.map +1 -1
  265. package/dist/validate.d.ts.map +1 -1
  266. package/dist/variables.d.ts +7 -2
  267. package/dist/variables.d.ts.map +1 -1
  268. package/package.json +12 -4
  269. package/src/actions/actions.test.ts +24 -0
  270. package/src/actions/grafana.ts +40 -0
  271. package/src/actions/index.ts +1 -0
  272. package/src/alerting-build.ts +376 -0
  273. package/src/alerting.e2e.test.ts +212 -0
  274. package/src/alerting.test.ts +272 -0
  275. package/src/alerting.ts +435 -0
  276. package/src/api/apply.test.ts +238 -0
  277. package/src/api/apply.ts +384 -0
  278. package/src/api/bind.ts +58 -0
  279. package/src/api/client.ts +148 -0
  280. package/src/api/converge.ts +63 -0
  281. package/src/api/dashboards.ts +247 -0
  282. package/src/api/datasources.ts +33 -0
  283. package/src/api/fake-grafana-writes.ts +201 -0
  284. package/src/api/fake-grafana.ts +186 -0
  285. package/src/api/folders.ts +265 -0
  286. package/src/api/library-panels.ts +101 -0
  287. package/src/build.test.ts +210 -5
  288. package/src/build.ts +180 -43
  289. package/src/catalog.ts +86 -2
  290. package/src/codegen/docs.ts +42 -9
  291. package/src/codegen/schema-types.ts +16 -6
  292. package/src/composites/agent-dashboard.ts +6 -3
  293. package/src/composites/catalog.test.ts +2 -2
  294. package/src/composites/catalog.ts +82 -0
  295. package/src/composites/composites.test.ts +73 -9
  296. package/src/composites/index.ts +4 -2
  297. package/src/composites/queries.e2e.test.ts +374 -0
  298. package/src/composites/red-dashboard.ts +83 -12
  299. package/src/composites/shared.ts +11 -0
  300. package/src/composites/slo-alert-rules.ts +149 -0
  301. package/src/config.test.ts +61 -0
  302. package/src/config.ts +138 -0
  303. package/src/contact-point-secrets.ts +63 -0
  304. package/src/dashboard.ts +16 -2
  305. package/src/datasource-refs.test.ts +56 -0
  306. package/src/datasource-refs.ts +189 -0
  307. package/src/datasource.ts +52 -0
  308. package/src/deep-observe-hooks.ts +252 -0
  309. package/src/deep-observe.test.ts +265 -0
  310. package/src/deep-observe.ts +164 -0
  311. package/src/describe-resources.test.ts +255 -0
  312. package/src/describe-resources.ts +209 -0
  313. package/src/detect.ts +79 -2
  314. package/src/export-resources.test.ts +129 -0
  315. package/src/export-resources.ts +84 -0
  316. package/src/generated/lexicon-grafana.json +135 -0
  317. package/src/import/alerting-roundtrip.test.ts +161 -0
  318. package/src/import/alerting.ts +500 -0
  319. package/src/import/edits.ts +95 -0
  320. package/src/import/embedded.test.ts +45 -0
  321. package/src/import/embedded.ts +47 -0
  322. package/src/import/generated-types.e2e.test.ts +118 -0
  323. package/src/import/generator.test.ts +210 -0
  324. package/src/import/generator.ts +462 -0
  325. package/src/import/live-export.ts +264 -0
  326. package/src/import/mappings.ts +264 -0
  327. package/src/import/model.ts +110 -0
  328. package/src/import/normalize-alerting.ts +101 -0
  329. package/src/import/normalize.test.ts +117 -0
  330. package/src/import/normalize.ts +364 -0
  331. package/src/import/parser.test.ts +440 -0
  332. package/src/import/parser.ts +1236 -0
  333. package/src/import/report.ts +62 -0
  334. package/src/import/roundtrip.test.ts +468 -0
  335. package/src/import/testdata/fixtures.ts +129 -0
  336. package/src/import/v2.test.ts +292 -0
  337. package/src/import/v2.ts +803 -0
  338. package/src/import.e2e.test.ts +31 -84
  339. package/src/import.test.ts +9 -3
  340. package/src/index.ts +190 -5
  341. package/src/k8s.test.ts +98 -0
  342. package/src/k8s.ts +197 -0
  343. package/src/lint/audit-catalog.ts +60 -3
  344. package/src/lint/core-lint.test.ts +43 -0
  345. package/src/lint/post-synth/graf101.ts +3 -3
  346. package/src/lint/post-synth/graf102.ts +1 -1
  347. package/src/lint/post-synth/graf107.ts +1 -1
  348. package/src/lint/post-synth/graf108.ts +17 -0
  349. package/src/lint/post-synth/graf109.ts +17 -0
  350. package/src/lint/post-synth/graf111.ts +17 -0
  351. package/src/lint/post-synth/graf112.ts +17 -0
  352. package/src/lint/post-synth/graf113.ts +17 -0
  353. package/src/lint/post-synth/graf114.ts +17 -0
  354. package/src/lint/post-synth/graf115.ts +17 -0
  355. package/src/lint/post-synth/grafana-helpers.ts +15 -8
  356. package/src/lint/post-synth/index.ts +14 -0
  357. package/src/lint/post-synth/post-synth.test.ts +235 -11
  358. package/src/lint/rules/literal-secret.ts +60 -6
  359. package/src/lint/rules/rules.test.ts +27 -0
  360. package/src/lsp/completions.test.ts +5 -0
  361. package/src/lsp/hover.test.ts +7 -0
  362. package/src/lsp/hover.ts +8 -1
  363. package/src/members.ts +68 -0
  364. package/src/observe.e2e.test.ts +255 -0
  365. package/src/op/activities/grafana-apply.e2e.test.ts +175 -0
  366. package/src/op/activities/grafana-apply.test.ts +229 -0
  367. package/src/op/activities/grafana-apply.ts +171 -0
  368. package/src/op/activities/index.ts +8 -0
  369. package/src/op/builders.test.ts +40 -0
  370. package/src/op/builders.ts +34 -0
  371. package/src/ownership.ts +103 -0
  372. package/src/panel-options.ts +66 -0
  373. package/src/panels.test.ts +51 -0
  374. package/src/panels.ts +148 -10
  375. package/src/pin.ts +57 -6
  376. package/src/plugin.test.ts +5 -2
  377. package/src/plugin.ts +66 -0
  378. package/src/promql-check.test.ts +108 -0
  379. package/src/promql-check.ts +189 -0
  380. package/src/query.ts +13 -8
  381. package/src/schema/barchart.gen.ts +221 -0
  382. package/src/schema/bargauge.gen.ts +111 -0
  383. package/src/schema/canvas.gen.ts +176 -0
  384. package/src/schema/dashboard.gen.ts +206 -22
  385. package/src/schema/expr.gen.ts +618 -0
  386. package/src/schema/gauge.gen.ts +2 -1
  387. package/src/schema/geomap.gen.ts +112 -0
  388. package/src/schema/heatmap.gen.ts +2 -1
  389. package/src/schema/histogram.gen.ts +151 -0
  390. package/src/schema/index.ts +12 -0
  391. package/src/schema/logs.gen.ts +3 -1
  392. package/src/schema/loki.gen.ts +2 -1
  393. package/src/schema/nodegraph.gen.ts +58 -0
  394. package/src/schema/piechart.gen.ts +146 -0
  395. package/src/schema/prometheus.gen.ts +2 -1
  396. package/src/schema/stat.gen.ts +2 -1
  397. package/src/schema/statetimeline.gen.ts +143 -0
  398. package/src/schema/statushistory.gen.ts +132 -0
  399. package/src/schema/table.gen.ts +27 -4
  400. package/src/schema/tempo.gen.ts +2 -1
  401. package/src/schema/text.gen.ts +2 -1
  402. package/src/schema/timeseries.gen.ts +7 -2
  403. package/src/schema/trend.gen.ts +208 -0
  404. package/src/schema/xychart.gen.ts +167 -0
  405. package/src/schema-overlay.test.ts +282 -0
  406. package/src/schema-validate.ts +141 -50
  407. package/src/schema.test.ts +4 -2
  408. package/src/serializer.test.ts +13 -1
  409. package/src/serializer.ts +11 -3
  410. package/src/skill-defs.ts +17 -0
  411. package/src/skills/chant-grafana-alerting.md +49 -0
  412. package/src/skills/chant-grafana-provisioning.md +3 -3
  413. package/src/skills/chant-grafana.md +12 -6
  414. package/src/spec/fetch-cli.ts +3 -3
  415. package/src/spec/fetch-units-cli.ts +37 -0
  416. package/src/spec/overlay/canvas.overlay.json +142 -0
  417. package/src/spec/overlay/dashboard.overlay.json +378 -0
  418. package/src/spec/overlay/expr.overlay.json +14 -0
  419. package/src/spec/overlay/geomap.overlay.json +35 -0
  420. package/src/spec/overlay/logs.overlay.json +14 -0
  421. package/src/spec/overlay/nodegraph.overlay.json +31 -0
  422. package/src/spec/overlay/piechart.overlay.json +17 -0
  423. package/src/spec/overlay/table.overlay.json +84 -0
  424. package/src/spec/overlay/timeseries.overlay.json +21 -0
  425. package/src/spec/overlay/trend.overlay.json +17 -0
  426. package/src/spec/overlay/xychart.overlay.json +16 -0
  427. package/src/spec/overlay.ts +105 -0
  428. package/src/spec/schemas/barchart.jsonschema.json +419 -0
  429. package/src/spec/schemas/bargauge.jsonschema.json +224 -0
  430. package/src/spec/schemas/canvas.jsonschema.json +356 -0
  431. package/src/spec/schemas/dashboardv2.jsonschema.json +3387 -0
  432. package/src/spec/schemas/expr.jsonschema.json +987 -0
  433. package/src/spec/schemas/geomap.jsonschema.json +220 -0
  434. package/src/spec/schemas/histogram.jsonschema.json +308 -0
  435. package/src/spec/schemas/nodegraph.jsonschema.json +77 -0
  436. package/src/spec/schemas/piechart.jsonschema.json +275 -0
  437. package/src/spec/schemas/statetimeline.jsonschema.json +324 -0
  438. package/src/spec/schemas/statushistory.jsonschema.json +292 -0
  439. package/src/spec/schemas/trend.jsonschema.json +449 -0
  440. package/src/spec/schemas/xychart.jsonschema.json +428 -0
  441. package/src/spec/schemas.ts +22 -10
  442. package/src/spec/units.gen.ts +281 -0
  443. package/src/spec/units.ts +77 -0
  444. package/src/transformations.test.ts +65 -0
  445. package/src/transformations.ts +574 -0
  446. package/src/util.ts +8 -0
  447. package/src/validate-alerting.test.ts +255 -0
  448. package/src/validate-alerting.ts +428 -0
  449. package/src/validate-output.ts +332 -101
  450. package/src/validate.ts +14 -0
  451. package/src/variables.ts +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"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"}
package/dist/pin.d.ts CHANGED
@@ -5,12 +5,19 @@
5
5
  * kinds. `grafana/grafana-foundation-sdk` runs them through cog and
6
6
  * publishes, beside its builder libraries, one JSON Schema per kind under
7
7
  * `jsonschema/`. This lexicon vendors the files it uses into `src/spec/schemas/`
8
- * (exact bytes, at the commit below) and generates `src/schema/*.gen.ts`
9
- * from them. Nothing is fetched at build or test time.
8
+ * (exact bytes, at the commit below), applies the correction overlay in
9
+ * `src/spec/overlay/` (see `src/spec/overlay.ts`), and generates
10
+ * `src/schema/*.gen.ts` from the result. Nothing is fetched at build or test
11
+ * time.
12
+ *
13
+ * The types track Grafana 12.4 and 13.x: v0.0.20 is labelled with the
14
+ * v11.6.x kind registry, but its dashboard schema largely matches those
15
+ * releases, and the overlay covers the rest.
10
16
  *
11
17
  * Bumping the pin: change `ref` and `commit`, run `just fetch-schemas`
12
18
  * (downloads and prints the new digests), paste the digests here, run
13
- * `npm run generate`, and review the diff of `src/schema/`.
19
+ * `npm run generate` (it refuses overlay patches the new schemas already
20
+ * carry; delete those), and review the diff of `src/schema/`.
14
21
  */
15
22
  export interface GrafanaSchemaPin {
16
23
  /** Where the schema files come from. */
@@ -19,14 +26,29 @@ export interface GrafanaSchemaPin {
19
26
  ref: string;
20
27
  /** The exact commit the vendored files were taken from. */
21
28
  commit: string;
22
- /** The Grafana kind registry version cog generated the schemas from. */
29
+ /**
30
+ * The kind registry label the SDK publishes the schemas under. It lags the
31
+ * content: the v0.0.20 schemas are labelled v11.6.x and cover 12.4 and 13.x.
32
+ */
23
33
  kindRegistry: string;
24
34
  /** sha256 of each vendored file, keyed by schema name (`src/spec/schemas/<name>.jsonschema.json`). */
25
- files: Readonly<Record<SchemaName, string>>;
35
+ files: Readonly<Record<VendoredSchemaName, string>>;
26
36
  }
27
- export declare const SCHEMA_NAMES: readonly ["dashboard", "timeseries", "stat", "gauge", "table", "logs", "heatmap", "text", "prometheus", "tempo", "loki"];
37
+ export declare const SCHEMA_NAMES: readonly ["dashboard", "timeseries", "stat", "gauge", "table", "logs", "heatmap", "text", "barchart", "bargauge", "piechart", "statetimeline", "statushistory", "histogram", "nodegraph", "xychart", "trend", "canvas", "geomap", "prometheus", "tempo", "loki", "expr"];
28
38
  export type SchemaName = (typeof SCHEMA_NAMES)[number];
39
+ /**
40
+ * Schemas vendored from the same commit for reading, not for types: no
41
+ * `.gen.ts` is generated from them and GRAF107 does not use them, since chant
42
+ * builds classic dashboards. `dashboardv2` is the v2 dashboard kind the
43
+ * importer reads (#2947); `src/import/v2.test.ts` checks the importer knows
44
+ * every key it defines.
45
+ */
46
+ export declare const IMPORT_ONLY_SCHEMA_NAMES: readonly ["dashboardv2"];
47
+ export type ImportOnlySchemaName = (typeof IMPORT_ONLY_SCHEMA_NAMES)[number];
48
+ /** Every schema file under `src/spec/schemas/`. */
49
+ export type VendoredSchemaName = SchemaName | ImportOnlySchemaName;
50
+ export declare const VENDORED_SCHEMA_NAMES: readonly VendoredSchemaName[];
29
51
  export declare const GRAFANA_SCHEMA_PIN: GrafanaSchemaPin;
30
52
  /** The raw URL of one schema file at the pinned commit. */
31
- export declare function schemaUrl(name: SchemaName, pin?: GrafanaSchemaPin): string;
53
+ export declare function schemaUrl(name: VendoredSchemaName, pin?: GrafanaSchemaPin): string;
32
54
  //# sourceMappingURL=pin.d.ts.map
package/dist/pin.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../src/pin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,YAAY,EAAE,MAAM,CAAC;IACrB,sGAAsG;IACtG,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C;AAED,eAAO,MAAM,YAAY,0HAYf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,kBAAkB,EAAE,gBAkB/B,CAAC;AAEH,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,GAAE,gBAAqC,GAAG,MAAM,CAE9F"}
1
+ {"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../src/pin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,sGAAsG;IACtG,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAED,eAAO,MAAM,YAAY,0QAwBf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,0BAA2B,CAAC;AAEjE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,oBAAoB,CAAC;AAEnE,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAAmD,CAAC;AAEnH,eAAO,MAAM,kBAAkB,EAAE,gBA+B/B,CAAC;AAEH,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,GAAE,gBAAqC,GAAG,MAAM,CAEtG"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AA0B9D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,aAgF3B,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAkD9D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,aA0H3B,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * GRAF108: the PromQL a dashboard sends to Prometheus, syntax-checked with
3
+ * the prometheus lexicon's `checkPromql` (the grammar behind the Prometheus
4
+ * web UI's editor, `@prometheus-io/lezer-promql`).
5
+ *
6
+ * Only queries that reach a Prometheus datasource are parsed, as
7
+ * `datasourceUses()` resolves them: a query's own ref, else its panel's, a
8
+ * datasource variable's plugin type, or an undeclared ref's own `type`. A
9
+ * query whose datasource can't be told (no ref at all, a `-- Mixed --` panel
10
+ * query with none of its own) is left alone.
11
+ *
12
+ * Grafana interpolates template variables before Prometheus sees the query,
13
+ * so `$var`, `${var}`, `${var:format}`, `[[var]]` and the `$__` macros are
14
+ * replaced with a placeholder that parses where they stand: a duration
15
+ * inside `[...]` or after `offset`, a number for the `_ms`/`_s` macros and
16
+ * `$__from`/`$__to`, an identifier anywhere else. Inside a string literal
17
+ * they are left as they are.
18
+ */
19
+ import { type KnownDatasource } from "./datasource-refs.js";
20
+ type Json = Record<string, unknown>;
21
+ export interface Substituted {
22
+ text: string;
23
+ /** Maps an offset in `text` back to one in the original query. */
24
+ originalOffset(at: number): number;
25
+ }
26
+ /** Replace every template variable outside a string literal with a placeholder that parses in its place. */
27
+ export declare function substituteTemplateVariables(query: string): Substituted;
28
+ export type PromqlSyntax = {
29
+ ok: true;
30
+ } | {
31
+ ok: false;
32
+ message: string;
33
+ };
34
+ /** Check one query's PromQL syntax after substituting its template variables. */
35
+ export declare function checkGrafanaPromql(query: string): PromqlSyntax;
36
+ /**
37
+ * The PromQL inside a Prometheus query variable's query. Grafana handles
38
+ * `label_names()`, `label_values(selector, label)`, `metrics(regex)` and
39
+ * `query_result(expr)` itself and sends only the selector or expression; any
40
+ * other text is a series selector (`/api/v1/series?match[]=`).
41
+ */
42
+ export declare function variablePromql(query: string): string[];
43
+ /** One piece of PromQL a dashboard sends to Prometheus, and where it is written. */
44
+ export interface PromqlUse {
45
+ where: string;
46
+ expr: string;
47
+ }
48
+ /** Every PromQL query a dashboard sends to Prometheus: panel queries, query variables and the library panels an export embeds in `__elements`. */
49
+ export declare function prometheusQueries(dashboard: Json, known: ReadonlyMap<string, KnownDatasource>): PromqlUse[];
50
+ export {};
51
+ //# sourceMappingURL=promql-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promql-check.d.ts","sourceRoot":"","sources":["../src/promql-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtF,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAsBpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC;AAED,4GAA4G;AAC5G,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA0DtE;AAED,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAS9D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAWtD;AASD,oFAAoF;AACpF,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAmBD,kJAAkJ;AAClJ,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAAE,CAa3G"}
package/dist/query.d.ts CHANGED
@@ -3,23 +3,24 @@
3
3
  * `TempoQuery` (TraceQL) and `LokiQuery` (LogQL), each typed from that
4
4
  * plugin's query schema at `GRAFANA_SCHEMA_PIN`.
5
5
  *
6
- * The expression is a string; this lexicon does not parse PromQL, TraceQL or
7
- * LogQL. What it does check is where the query goes: `datasource` only
8
- * accepts a datasource of the query's own plugin type, and GRAF101, GRAF102
9
- * and GRAF103 check the emitted references after a build.
6
+ * The expression is a string. What the lexicon checks is where the query
7
+ * goes: `datasource` only accepts a datasource of the query's own plugin
8
+ * type, and GRAF101, GRAF102 and GRAF103 check the emitted references after
9
+ * a build. GRAF108 parses the PromQL of every query that reaches a
10
+ * Prometheus; TraceQL and LogQL are not parsed.
10
11
  *
11
12
  * `defineQuery` is the extension point for any other datasource plugin, and
12
13
  * the three built-ins are defined through it.
13
14
  */
14
15
  import type { Declarable } from "@intentius/chant/declarable";
15
- import type { DatasourceEntity, DatasourceRef } from "./datasource.js";
16
+ import type { DatasourceEntity, DatasourceRef, ExternalDatasourceEntity } from "./datasource.js";
16
17
  import type { DatasourceVariableEntity } from "./variables.js";
17
18
  import type { SchemaName } from "./pin.js";
18
19
  import type { Dataquery as PrometheusDataquery } from "./schema/prometheus.gen.js";
19
20
  import type { Dataquery as TempoDataquery } from "./schema/tempo.gen.js";
20
21
  import type { Dataquery as LokiDataquery } from "./schema/loki.gen.js";
21
- /** Where a query or panel sends its request: a declared datasource, a datasource variable, or the ref of one declared elsewhere. */
22
- export type DatasourceInput<T extends string = string> = DatasourceEntity<T> | DatasourceVariableEntity<T> | DatasourceRef<T>;
22
+ /** Where a query or panel sends its request: a declared or external datasource, a datasource variable, or the ref of one declared elsewhere. */
23
+ export type DatasourceInput<T extends string = string> = DatasourceEntity<T> | ExternalDatasourceEntity<T> | DatasourceVariableEntity<T> | DatasourceRef<T>;
23
24
  /** A query model's fields, less what chant fills in (`datasource`, `refId` stays optional). */
24
25
  export type QueryModel<M> = Omit<M, "datasource">;
25
26
  export type QueryProps<M, T extends string> = QueryModel<M> & {
@@ -67,7 +68,7 @@ export declare function queryDefinitionFor(datasourceType: string): QueryDefinit
67
68
  * });
68
69
  * ```
69
70
  */
70
- export declare function defineQuery<M>(): <T extends string>(def: Omit<QueryDefinition<T, M>, "builtin">) => QueryClass<T, M>;
71
+ export declare function defineQuery<M = Record<string, unknown>>(): <T extends string>(def: Omit<QueryDefinition<T, M>, "builtin">) => QueryClass<T, M>;
71
72
  export declare function isQueryEntity(value: unknown): value is QueryEntity;
72
73
  /** A Prometheus query: `expr` is PromQL. */
73
74
  export declare const PromQuery: QueryClass<"prometheus", PrometheusDataquery>;
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * GRAF101: A panel, query or variable uses a datasource no Datasource in the build declares
2
+ * GRAF101: A panel, query or variable uses a datasource no Datasource or ExternalDatasource in the build declares
3
3
  *
4
- * Grafana shows "datasource not found" on the panel. Typed references cannot go wrong this way, so it mostly catches a { type, uid } ref or a hand-edited dashboard. A panel with queries and no datasource at all is a warning: Grafana sends them to its default datasource. This check joins dashboards against the Datasource declarations of the same build root, so it goes silent across build roots (chant #1939): with no Datasource declared in the build it reports nothing, and a datasource declared in another build root looks undeclared. Keep datasources and the dashboards that use them in one build root.
4
+ * Grafana shows "datasource not found" on the panel. Typed references cannot go wrong this way, so it mostly catches a { type, uid } ref or a hand-edited dashboard. A datasource variable whose plugin type no declared datasource has is an error too. A panel with queries and no datasource at all is a warning: Grafana sends them to its default datasource. This check joins dashboards against the datasources of the same build root (chant #1939): declare one that exists in Grafana but is provisioned elsewhere with ExternalDatasource, which the check counts and the build never provisions. A build that declares no datasource at all gets one warning per dashboard that references any, since nothing can be checked.
5
5
  */
6
6
 
7
7
  import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
@@ -9,7 +9,7 @@ import { grafanaDiagnostics } from "./grafana-helpers";
9
9
 
10
10
  export const graf101: PostSynthCheck = {
11
11
  id: "GRAF101",
12
- description: "A panel, query or variable uses a datasource no Datasource in the build declares",
12
+ description: "A panel, query or variable uses a datasource no Datasource or ExternalDatasource in the build declares",
13
13
 
14
14
  check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
15
  return grafanaDiagnostics(ctx, "GRAF101");
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * GRAF102: A query is sent to a datasource of another plugin type
3
3
  *
4
- * A PromQL query sent to Tempo fails at query time. The typed classes prevent this at compile time; the check catches refs, datasource variables of the wrong plugin type and hand-edited dashboards. Like GRAF101 it joins against the Datasource declarations of the same build root and goes silent across build roots (chant #1939).
4
+ * A PromQL query sent to Tempo fails at query time. The typed classes prevent this at compile time; the check catches refs, datasource variables of the wrong plugin type and hand-edited dashboards. Like GRAF101 it joins against the Datasource and ExternalDatasource declarations of the same build root (chant #1939).
5
5
  */
6
6
 
7
7
  import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * GRAF107: A dashboard does not match the pinned Grafana schema
3
3
  *
4
- * The dashboard is validated against the dashboard schema at GRAFANA_SCHEMA_PIN, and each panel's options, fieldConfig.defaults.custom and queries against their plugin's schema with required fields relaxed (Grafana fills those in). What fails is a key the schema does not have or a value it does not allow: the edits Grafana would otherwise need on import.
4
+ * The dashboard is validated against the dashboard schema at GRAFANA_SCHEMA_PIN, with the correction overlay in src/spec/overlay/ applied, and each panel's options, fieldConfig.defaults.custom and queries against their plugin's schema with required fields relaxed (Grafana fills those in). Library panel models embedded in an export's __elements are checked the same way. A value the schema does not allow is an error: the edits Grafana would otherwise need on import. A key the schema does not know is a warning, since newer Grafana versions add keys before the pin catches up.
5
5
  */
6
6
 
7
7
  import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF108: A query sent to Prometheus is not valid PromQL
3
+ *
4
+ * Each panel query, query variable and alert rule query whose datasource resolves to a prometheus datasource is parsed with the prometheus lexicon's checkPromql (@prometheus-io/lezer-promql), after its template variables ($var, ${var}, [[var]], $__interval, $__rate_interval, $__range and the other $__ macros) are replaced with placeholders that parse where they stand. A query whose datasource can't be told is not parsed; an alert rule query is parsed when its datasourceUid is a declared prometheus datasource or its model says `datasource.type: prometheus`. It is a syntax check: an unbalanced bracket or a bad duration fails, rate over an instant vector does not.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf108: PostSynthCheck = {
11
+ id: "GRAF108",
12
+ description: "A query sent to Prometheus is not valid PromQL",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF108");
16
+ },
17
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF109: Dashboard provisioning puts a dashboard somewhere other than its declared folder, or loads it twice
3
+ *
4
+ * Read from the dashboard provisioning file and where each dashboard file sits under dashboards/. Two providers in one org whose paths are the same or nested load every dashboard twice, and Grafana then takes database writes away from both: an error. A provider that sets folder and folderUid with foldersFromFilesStructure is refused by Grafana: an error; with one of them, that folder is ignored: a warning. Dashboards that declare a folder when no provider sets foldersFromFilesStructure all land in the provider's folder: a warning. A nested folder ("Platform/Kubernetes") is a warning: Grafana 13.1 and later nest the folders, 12.4 and 13.0 use only the last level; past Grafana's default depth of 4 it says so, and past its hard limit of 7 it is an error.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf109: PostSynthCheck = {
11
+ id: "GRAF109",
12
+ description: "Dashboard provisioning puts a dashboard somewhere other than its declared folder, or loads it twice",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF109");
16
+ },
17
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF111: An alert rule's condition, expression inputs or refIds do not fit together
3
+ *
4
+ * Each alert rule's condition, each server-side expression's inputs (a reduce, threshold or resample `expression`, the `$A` references of a math expression, a classic condition's query) and a recording rule's record.from must name a refId of the same rule; refIds must be unique, and a rule needs a condition unless it records. Each expression model is also validated against the pinned `expr` schema (a missing reducer, an unknown evaluator type). Grafana refuses such a rule, and a refused rule stops it provisioning every alerting file at startup.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf111: PostSynthCheck = {
11
+ id: "GRAF111",
12
+ description: "An alert rule's condition, expression inputs or refIds do not fit together",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF111");
16
+ },
17
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF112: An alert rule queries a datasource the build does not declare, or of another type
3
+ *
4
+ * Each alert rule query's datasourceUid must be a datasource the build declares: a Datasource it provisions or an ExternalDatasource that already exists in Grafana. A query whose model states a datasource type (model.datasource.type) must match the declared type, and a recording rule's targetDatasourceUid must be a declared Prometheus datasource. With no datasource declared at all, it warns once that it cannot check.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf112: PostSynthCheck = {
11
+ id: "GRAF112",
12
+ description: "An alert rule queries a datasource the build does not declare, or of another type",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF112");
16
+ },
17
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF113: Alerting routes to a contact point or mute timing the build does not declare, or a policy matcher does not parse
3
+ *
4
+ * The notification policy tree's receivers, every rule's notification_settings.receiver, and each mute_time_intervals and active_time_intervals entry must name a ContactPoint or MuteTiming the build declares (grafana-default-email exists in every Grafana). Policy object_matchers must be [label, op, value] with op =, !=, =~ or !~ and a valid regex; matchers must parse as Alertmanager matchers. With no contact point or mute timing declared it warns once that it cannot check.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf113: PostSynthCheck = {
11
+ id: "GRAF113",
12
+ description: "Alerting routes to a contact point or mute timing the build does not declare, or a policy matcher does not parse",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF113");
16
+ },
17
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF114: An alerting uid, name, title or interval Grafana rejects, or one declared twice
3
+ *
4
+ * Rule uids and contact point receiver uids must be 1-40 letters, digits, - and _; rules need a title of at most 190 characters; groups need a name, a folder and an interval that is a positive multiple of 10s; for and keepFiringFor must be durations; noDataState and execErrState must be values Grafana knows. Rule uids, group names within a folder, contact point names, receiver uids, mute timing and template names must be unique per organisation, and each organisation has one policy tree. Grafana refuses the file otherwise, and one refused file stops it provisioning every alerting file.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf114: PostSynthCheck = {
11
+ id: "GRAF114",
12
+ description: "An alerting uid, name, title or interval Grafana rejects, or one declared twice",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF114");
16
+ },
17
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GRAF115: A unit Grafana doesn't know
3
+ *
4
+ * Each panel's `fieldConfig.defaults.unit`, every `unit` override, a heatmap's `options.yAxis.unit` and `options.cellValues.unit`, and a legacy graph panel's `yaxes[].format` are looked up in Grafana's unit registry at v13.2.2 (`src/spec/units.gen.ts`). Custom units (`prefix:`, `suffix:`, `time:`, `si:`, `count:`, `currency:`, `bool:`) pass. Anything else Grafana shows as a literal suffix, so it is a warning that names the closest registered id.
5
+ */
6
+
7
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
8
+ import { grafanaDiagnostics } from "./grafana-helpers";
9
+
10
+ export const graf115: PostSynthCheck = {
11
+ id: "GRAF115",
12
+ description: "A panel unit Grafana doesn't know, which it shows as a literal suffix",
13
+
14
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
15
+ return grafanaDiagnostics(ctx, "GRAF115");
16
+ },
17
+ };
@@ -1,18 +1,21 @@
1
1
  /**
2
- * Shared plumbing for the grafana post-synth checks: find the dashboards and
3
- * provisioned datasources in a build's output, and run the plain-function
4
- * checks in `validate-output.ts` over them.
2
+ * Shared plumbing for the grafana post-synth checks: find the dashboards,
3
+ * provisioned datasources, dashboard providers and alerting provisioning
4
+ * files in a build's output, and run the plain-function checks in
5
+ * `validate-output.ts` over them.
5
6
  *
6
7
  * Any output file shaped like a dashboard or a datasource provisioning file
7
8
  * counts, not only the grafana lexicon's own, so a dashboard another lexicon
8
- * embeds is checked the same way.
9
+ * embeds is checked the same way. `ExternalDatasource` declarations are never
10
+ * written to a provisioning file, so they come from the build's entities.
9
11
  */
10
12
 
11
13
  import type { PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
12
14
  import type { SerializerResult } from "@intentius/chant/serializer";
13
15
  import { loadAll } from "js-yaml";
14
- import { looksLikeDashboard, looksLikeDatasourceProvisioning } from "../../detect";
15
- import type { ProvisionedDatasource } from "../../build";
16
+ import { looksLikeAlertingProvisioning, looksLikeDashboard, looksLikeDashboardProvisioning, looksLikeDatasourceProvisioning } from "../../detect";
17
+ import { externalDatasourceRecord, type ProvisionedDatasource } from "../../build";
18
+ import { isExternalDatasource } from "../../datasource";
16
19
  import { issuesFor, type GrafanaArtifacts, type GrafanaIssueCode } from "../../validate-output";
17
20
 
18
21
  function parse(text: string, name: string): unknown[] {
@@ -30,9 +33,10 @@ function parse(text: string, name: string): unknown[] {
30
33
  }
31
34
  }
32
35
 
33
- /** Every dashboard and provisioned datasource in the build's output. */
36
+ /** Every dashboard, provisioned datasource and dashboard provider and alerting provisioning file in the build's output, and every `ExternalDatasource` it declares. */
34
37
  export function grafanaArtifacts(ctx: PostSynthContext): GrafanaArtifacts {
35
- const out: GrafanaArtifacts = { dashboards: [], datasources: [] };
38
+ const externalDatasources = [...(ctx.entities?.values() ?? [])].filter(isExternalDatasource).map(externalDatasourceRecord);
39
+ const out: GrafanaArtifacts = { dashboards: [], datasources: [], externalDatasources, providers: [], alerting: [] };
36
40
  for (const [lexicon, output] of ctx.outputs) {
37
41
  const texts: Array<[string, string]> =
38
42
  typeof output === "string"
@@ -42,6 +46,9 @@ export function grafanaArtifacts(ctx: PostSynthContext): GrafanaArtifacts {
42
46
  if (!text) continue;
43
47
  for (const doc of parse(text, source)) {
44
48
  if (looksLikeDashboard(doc)) out.dashboards.push({ source, json: doc });
49
+ else if (looksLikeDashboardProvisioning(doc)) {
50
+ for (const p of doc.providers) if (p && typeof p === "object" && !Array.isArray(p)) out.providers!.push(p as Record<string, unknown>);
51
+ } else if (looksLikeAlertingProvisioning(doc)) out.alerting!.push({ source, json: doc });
45
52
  else if (looksLikeDatasourceProvisioning(doc)) {
46
53
  for (const d of doc.datasources) {
47
54
  if (d && typeof d === "object" && typeof (d as ProvisionedDatasource).name === "string") {
@@ -1,15 +1,38 @@
1
1
  import * as ts from "typescript";
2
2
  import type { LintRule, LintDiagnostic, LintContext } from "@intentius/chant/lint/rule";
3
3
  import { constInitializers, constructorArgs, literalText, position, propertyName, resolveObject } from "./grafana-ast";
4
+ import { CONTACT_POINT_SECRET_SETTINGS, EXPANDED_VALUE as EXPANDED } from "../../contact-point-secrets";
4
5
 
5
- /** How Grafana provisioning reads a value from outside the file: `$VAR`, `${VAR}`, `$__env{…}`, `$__file{…}`, `$__vault{…}`. */
6
- const EXPANDED = /\$(\{[A-Za-z_][A-Za-z0-9_]*\}|[A-Za-z_][A-Za-z0-9_]*|__(env|file|vault)\{[^}]+\})/;
6
+ /** Follow an identifier to the array literal it was declared as, when it is one in this file. */
7
+ function resolveArray(node: ts.Expression, consts: Map<string, ts.Expression>, depth = 0): ts.ArrayLiteralExpression | undefined {
8
+ let n: ts.Expression = node;
9
+ while (ts.isAsExpression(n) || ts.isSatisfiesExpression(n) || ts.isParenthesizedExpression(n)) n = n.expression;
10
+ if (ts.isArrayLiteralExpression(n)) return n;
11
+ if (ts.isIdentifier(n) && depth < 5) {
12
+ const init = consts.get(n.text);
13
+ if (init) return resolveArray(init, consts, depth + 1);
14
+ }
15
+ return undefined;
16
+ }
17
+
18
+ /** The value of a property, `name: value` or the shorthand `name` (followed as an identifier). */
19
+ function prop(obj: ts.ObjectLiteralExpression, name: string): ts.Expression | undefined {
20
+ for (const p of obj.properties) {
21
+ if (propertyName(p) === name) return (p as ts.PropertyAssignment).initializer;
22
+ if (ts.isShorthandPropertyAssignment(p) && p.name.text === name) return p.name;
23
+ }
24
+ return undefined;
25
+ }
7
26
 
8
27
  /**
9
- * GRAF002: a datasource secret written as a literal.
28
+ * GRAF002: a datasource or contact point secret written as a literal.
10
29
  *
11
- * `secureJsonData` holds passwords, tokens and TLS keys. A literal there is a
12
- * secret in the repository and in the emitted provisioning file. Grafana
30
+ * A datasource's `secureJsonData` holds passwords, tokens and TLS keys, and
31
+ * so do the settings Grafana stores encrypted for each contact point
32
+ * integration (a Slack webhook `url`, a PagerDuty `integrationKey`, a
33
+ * webhook's `authorization_credentials`; see `CONTACT_POINT_SECRET_SETTINGS`).
34
+ * A literal there is a secret in the repository and in the emitted
35
+ * provisioning file. Grafana
13
36
  * expands `$__env{NAME}`, `$__file{/path}` and `${NAME}` when it reads the
14
37
  * file, so the declaration never needs the value. A value written as a
15
38
  * named `const` in the same file is followed.
@@ -18,7 +41,7 @@ export const literalSecretRule: LintRule = {
18
41
  id: "GRAF002",
19
42
  severity: "error",
20
43
  category: "security",
21
- description: "Datasource secureJsonData value declared as a literal instead of $__env{...} or $__file{...}",
44
+ description: "Datasource secureJsonData or contact point secret setting declared as a literal instead of $__env{...} or $__file{...}",
22
45
 
23
46
  check(context: LintContext): LintDiagnostic[] {
24
47
  const diagnostics: LintDiagnostic[] = [];
@@ -43,6 +66,37 @@ export const literalSecretRule: LintRule = {
43
66
  }
44
67
  }
45
68
  }
69
+ for (const { arg } of constructorArgs(source, (n) => n === "ContactPoint")) {
70
+ const receivers = prop(arg, "receivers");
71
+ const list = receivers ? resolveArray(receivers, consts) : undefined;
72
+ for (const el of list?.elements ?? []) {
73
+ const receiver = resolveObject(el as ts.Expression, consts);
74
+ if (!receiver) continue;
75
+ const typeNode = prop(receiver, "type");
76
+ const type = typeNode ? literalText(typeNode) : undefined;
77
+ const settingsNode = prop(receiver, "settings");
78
+ const settings = settingsNode ? resolveObject(settingsNode, consts) : undefined;
79
+ if (!type || !settings) continue;
80
+ for (const path of CONTACT_POINT_SECRET_SETTINGS[type] ?? []) {
81
+ let node: ts.ObjectLiteralExpression | undefined = settings;
82
+ const segments = path.split(".");
83
+ for (const seg of segments.slice(0, -1)) {
84
+ const next: ts.Expression | undefined = node ? prop(node, seg) : undefined;
85
+ node = next ? resolveObject(next, consts) : undefined;
86
+ }
87
+ const valueNode = node ? prop(node, segments[segments.length - 1]) : undefined;
88
+ const text = valueNode ? literalText(valueNode) : undefined;
89
+ if (!valueNode || text === undefined || text === "" || EXPANDED.test(text)) continue;
90
+ diagnostics.push({
91
+ ruleId: "GRAF002",
92
+ severity: "error",
93
+ message: `${type} contact point setting ${path} is a literal secret; write "$__env{NAME}" or "$__file{/path}" and let Grafana read it`,
94
+ file: context.filePath,
95
+ ...position(source, valueNode),
96
+ });
97
+ }
98
+ }
99
+ }
46
100
  return diagnostics;
47
101
  },
48
102
  };