Compare commits

...

932 Commits

Author SHA1 Message Date
maicon
d68451b70e provisioning: acquire server lock before provisioning dashboards+folders (#114488)
* provisioning: acquire server lock before provisioning dashboards+folders

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>

---------

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>
2025-12-05 12:59:22 -03:00
Stephanie Hingtgen
2be78f8e63 Dashboards: Prevent panic in validation (#114436) 2025-12-05 12:57:49 -03:00
Renato Costa
076d378adc fix: update search request for existing provisioned dashboards in modes 3+ (#114412)
Fix search for existing provisioned dashboards in modes 3+

The search query was not requesting the dashboard's "legacy ID". As a result,
the provisioning process would not find existing provisioned dashboards, making
copies of these dashboards every time there was a change in the provisioned
dashboard's definition.

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>
2025-12-05 12:32:30 -03:00
Daniele Stefano Ferru
6b854bc57d Hotfix: Granting None role Viewer access for a fixed API group list (#114310) 2025-12-04 12:35:23 -05:00
Victor Marin
336aa06966 Dashboards: Add non-applicable filter pills per panel (#112507)
* wip non-applicable pills

* refactor

* fix

* tests

* locales

* canary version

* mods

* fix query fetching

* fix

* fix

* Add VizPanelSubHeader component

* lint

* extra check

* refactor

* wip

* refactor wipp

* refactor

* refactor

* use canary scenes

* prettier

* canary scenes

* interpolate ds uid for ds var case

* refactor

* refactor

* memoize values + tests + rename component

* refactor

* refactor

* refactor

* refactor

* canary scenes + fixes

* Fix infinite loop casused by unstable useEffect dependency

* lint

* helper functions

* bump scenes

* reduce applicability calls to only when filters or groupBy keys change, not any var state change

* refactor

* fix

* fix

* fixes

---------

Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
2025-11-21 18:03:27 +02:00
Matheus Macabu
5e949fc955 Secrets: Fix secure value creation timestamp changing when updating it (#114290) 2025-11-21 16:31:17 +01:00
Bruno
0d67442f1a Secrets manager: create secure value using the active keeper (#114039)
* Secrets manager: create secure value using the active keeper

* SecureValueService.Update: fetch secure value from db to get the keeper

* fix keeper_store_test.go

* SecureValueService: fix bug in update where the current version keeper wasn't being passed to the createNewVersion method

* make gofmt

* remove outdated test

* update TestModel

* undo enterprise_imports changes

* use xkube.Namespace

* migrator: set secret_secure_value.keeper to 'system' when the column is null

* indent cue

* fix tests

* fix enterprise imports

* properly fix enterprise imports

* make update-workspace

* go mod tidy

---------

Co-authored-by: Matheus Macabu <macabu.matheus@gmail.com>
2025-11-21 11:20:16 -03:00
Galen Kistler
133677d1d6 Explore: fix logs viz toggle alignment (#114302)
chore: fix alignment
2025-11-21 14:05:19 +00:00
Gareth
57d0228317 Tempo: Bump gRPC limit to allow for larger streaming queries (#114286) 2025-11-21 23:01:52 +09:00
Konrad Lalik
10e0c435ad Alerting: Fix NotificationPreview permission checking (#114303)
Add permission check to NotificationPreview component
2025-11-21 14:59:25 +01:00
Peter Štibraný
198375599e Fix/ignore some common dashboard problems (#114296)
* Fix some common problems found when parsing dashboards for indexing
2025-11-21 14:41:45 +01:00
Peter Štibraný
def4c644ec Use infra/log instead of slog in pkg/storage/unified (#114292)
Use infra/log instead of slog. Use log.FromContext to add contextual info to log messages.
2025-11-21 14:38:09 +01:00
Galen Kistler
c0f6d90971 Loki: Set Query limits context header (#114112)
* feat(lokiQueryLimitsContext): send full query range & expr on initial split requests
2025-11-21 07:19:55 -06:00
Gábor Farkas
669382c212 datasources: ClearAuthHeadersMiddleware: refactor (#113707)
* refactor: extract logic

* directly use the setting.cfg in the middleware

* more granular config handling, per section

* fixed unit test

* refactor code to avoid lint error
2025-11-21 14:18:32 +01:00
Matheus Macabu
203549ce3c Chore: Fix enterprise imports drift (#114288)
* Chore: Fix enterprise imports drift

* Fix indirect dependency
2025-11-21 12:53:15 +01:00
Sergej-Vlasov
b366217aa6 SchemaV2ToScenes: Adjust ad hoc multi value check in v2 (#114291)
adjust ad hoc multi value check in v2
2025-11-21 11:40:44 +00:00
Mustafa Sencer Özcan
af684248b5 feat: add reindex trigger as a migration validation (#114283)
* feat: add search validation

* chore: remove comment

* fix: remove local test

* fix: revert rebuild index portion

* chore: remove unnecessary comments

* refactor: validator

* fix: revert setting
2025-11-21 12:21:19 +01:00
Matias Chomicki
b17ba6677e Logs: Feature flag logsInfiniteScrolling removed (#113585)
* Remove feature flag definition

* Remove feature flag from code

* Update imports

* LogsNavigationPages: remove deprecated component

* Finally deprecate navigation pages

* Update tests

* Update translations

* Remove unused code

* More cleanup

* Test cleanup

* Remove deprecated props

* More props removal

* Update feature flags

* Revert changes
2025-11-21 11:51:56 +01:00
Oscar Kilhed
e09905df35 SchemaV2: Add library panel repeat options to v2 schema during conversion (#114109)
* Add library panel repeat options to v2 schema during conversion

* use any instead of interface{}

* change to common.Unstructured instead of byte[] for model field

* Fix the tests and let the library panel behavior fetch repeat options in public and scripted dashboards

* fix library panel differences between backend and frontend conversion
2025-11-21 11:41:03 +01:00
Galen Kistler
3d2f702ae5 Loki: fix status in body not matching http status code (#114201)
* fix: status in body not matching http status code
2025-11-21 04:40:29 -06:00
Victor Marin
42babc7ce7 Select: Fix width bug when maxVisibleValues is set (#113913)
* fix

* fix
2025-11-21 12:14:50 +02:00
Sonia Aguilar
e7377a8842 Alerting: Update docs for ash AI helper button (#114229)
Update docs for ash AI helper button
2025-11-21 09:31:22 +01:00
Mustafa Sencer Özcan
e2cbf8abf1 fix: handle empty provisioning folder gracefully in stub provisioning (#114273)
fix: provisioning folder empty case
2025-11-21 09:04:04 +01:00
Konrad Lalik
6f68b96097 Alerting: Fix minInterval interpolation when creating rules from panel (#114238)
Interpolate minInterval query parameter before query conversion
2025-11-21 08:56:17 +01:00
grafana-pr-automation[bot]
07d975134d I18n: Download translations from Crowdin (#114278)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-21 00:39:57 +00:00
Jesse David Peterson
ef00dd4940 Dashboard: New experimental time range zoom shortcuts (#114190)
* feat(toggle): new feature toggle for time range zoom keyboard shortcuts

* feat(keyboard-shortcuts): handle `t +` and `t -` key combinations

* test(keyboard-shortcuts): validate time range zoom with `t +`, and `t -`

* chore(i18n): update keyboard shortcut translations

* refactor(time-range): no-op when timespan is zero instead of defaulting
2025-11-20 17:14:27 -04:00
Paul Marbach
6f9c867660 Timeseries: More nuanced editing of linear threshold to avoid crashes (#112301)
* Timeseries: More nuanced editing of linear threshold to avoid crashes

* remove useEffect import

* remove unused import

* update error and invalid field handling to call out error case
2025-11-20 18:49:46 +00:00
Larissa Wandzura
0b020c5e30 DOCS: add alias to SQL expressions doc (#114253)
added alias to SQL expressions since the doc moved
2025-11-20 17:44:06 +00:00
Ashley Harrison
496d6f8021 Frontend Service: Avoid double counting boot errors (#114250)
avoid double counting boot errors
2025-11-20 17:33:58 +00:00
Ezequiel Victorero
5ca3c27e4f Chore: Fix playlist flaky test (#114241) 2025-11-20 14:17:53 -03:00
Juan Cabanas
4d25381716 DashboardLibrary: Template dashboards public preview (#114230) 2025-11-20 13:51:59 -03:00
Peter Štibraný
534ed3421b Fix search by both tags and folders. (#114246)
* Fix search by both tags and folders.

* Move // nolint:gocyclo to the new method.

* Revert unnecessary change.
2025-11-20 17:09:49 +01:00
Mustafa Sencer Özcan
30c04ab3fc feat: inject unified data migrations in dual writer (#114138)
* feat: draft changes for on-prem unified migration

* feat: further draft changes for on-prem unified migration

* fix: remove some tbis

* refactor: rename

* fix: another approach

* fix: background service related issues

* fix: address comments

* fix: make gen-go

* fix: background service related issues

* feat: refactor dual writer and legacy migrator

* fix: minor issues

* feat: working version in oss

* fix: wire

* fix: revert test data override

* fix: enterprise related issues

* chore: add todo

* fix: revert dual writer method

* fix: lint

* chore: logger format

* fix: reduce log level

* fix: log change

* fix: disable

* fix: address comments

* fix: return error on dual writer service

* fix: merge conflict

---------

Co-authored-by: Rafael Paulovic <rafael.paulovic@grafana.com>
2025-11-20 16:40:20 +01:00
Alexander Zobnin
cb06bba243 Zanzana: Add token namespace to config (#114165) 2025-11-20 15:54:32 +01:00
Gabriel MABILLE
b5a50e7772 grafana-iam: Use the UniStore as the default store (#113614)
* `grafana-iam`: Use the UniStore as the default store

* Refactor all instantiations

* Remove enableDualWriter

* Nit. dw is clear enough

* Use the correct access control client
2025-11-20 15:51:50 +01:00
Rafael Bortolon Paulovic
65fd15bbf9 feat: define unified disable migrations flag (#114120)
chore: add US data migrations config
2025-11-20 15:47:44 +01:00
Robby Milo
7db72e03b5 remove image rendering docs (#114217) 2025-11-20 15:39:10 +01:00
Kristina Demeshchik
834f1c5e98 TS checker: Increase memory limit (#114236)
Increase ts checker memory limit
2025-11-20 09:13:19 -05:00
Roberto Jiménez Sánchez
41276676eb Provisioning: add retry logic for transient errors in Kubernetes client (#114215)
* feat: add retry logic for transient errors in Kubernetes client

Add retry wrapper for dynamic.ResourceInterface that automatically retries
transient errors using Kubernetes' wait.ExponentialBackoff utility.

- Implements retry logic with exponential backoff for all Kubernetes API operations
- Detects transient errors: ServiceUnavailable, ServerTimeout, TooManyRequests,
  InternalError, Timeout, and network errors
- Uses wait.ExponentialBackoff from k8s.io/apimachinery/pkg/util/wait
- Respects context cancellation
- Includes comprehensive unit tests

Part of https://github.com/grafana/git-ui-sync-project/issues/634

* docs: add detailed documentation for defaultRetryBackoff

Document when retry attempts will happen, what errors trigger retries,
and the retry behavior (attempts, delays, exponential backoff, jitter).

* feat: add logging and increase retry attempts for Kubernetes client

- Add context logger to track retry attempts (Info for retries, Warn for exhaustion)
- Increase retry attempts from 5 to 8 steps (~10 seconds total retry window)
- Document when all retry attempts will fail:
  * API server completely unavailable/unreachable
  * Network connectivity issues persist beyond retry window
  * Consistent transient errors for entire retry duration
  * Context cancellation before retries complete

* chore: update retry client documentation

* fix: resolve linting issues in retry client

- Replace type assertions with errors.As for wrapped errors
- Remove deprecated Temporary() check (deprecated since Go 1.18)
- Update tests to remove temporary error test case

* fix: resolve staticcheck S1008 linting issue in retry_client.go

Simplify return statement to use errors.As directly instead of if-return pattern
2025-11-20 15:12:07 +01:00
Will Browne
7d179120b6 Plugins: Replace CDN class with FS CDN type (#113968)
replace cdn class with fs type
2025-11-20 14:03:24 +00:00
Tom Ratcliffe
3999d108f7 Folders: Make listFolders call correct API and fix tags sorting (#114181) 2025-11-20 14:00:33 +00:00
Roberto Jiménez Sánchez
a4cbbe10c0 Provisioning: Add retry logic for nanogit client operations (#114216)
* chore(deps): update nanogit to v0.3.0 in go.mod and go.sum files

* Add retry logic for nanogit client operations

- Configure retry logic in withGitContext to ensure all Git operations have retry support
- Use nanogit's ExponentialBackoffRetrier with 8 attempts (~10s retry window)
- Retry transient network errors and HTTP-specific server errors (5xx for GET/DELETE, 429 for all)
- Rename logger function to withGitContext to better reflect its responsibilities

* fix: resolve staticcheck S1008 linting issue in retry_client.go

Simplify return statement to use errors.As directly instead of if-return pattern

* Revert "fix: resolve staticcheck S1008 linting issue in retry_client.go"

This reverts commit bd367b5629.
2025-11-20 13:55:45 +00:00
Ryan McKinley
c9801fc66e FeatureFlags: Remove unused settings for admin UI (#114137) 2025-11-20 13:33:44 +00:00
Alexander Zobnin
f6a1d4a14e Revert Auth: Add None role to Viewer case (#114224) 2025-11-20 14:02:15 +01:00
Konrad Lalik
24d970e4b9 Alerting: Remove stale filtering code (#114231)
Remove the old filters file, update import paths
2025-11-20 13:58:13 +01:00
dependabot[bot]
e6a4e6fa4e deps(go): bump github.com/prometheus/common from 0.67.1 to 0.67.2 in /pkg/promlib (#113145)
* deps(go): bump github.com/prometheus/common in /pkg/promlib

Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.67.1 to 0.67.2.
- [Release notes](https://github.com/prometheus/common/releases)
- [Changelog](https://github.com/prometheus/common/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/common/compare/v0.67.1...v0.67.2)

---
updated-dependencies:
- dependency-name: github.com/prometheus/common
  dependency-version: 0.67.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* deps(go): update github.com/prometheus/common to v0.67.3

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
2025-11-20 12:50:38 +00:00
Priyansh Gupta
7f52586c68 Prometheus: Hide 'Kick start your query' button for existing queries (#113980)
* Prometheus: Hide 'Kick start your query' button for existing queries

* refactor: simplify query check logic in Prometheus editor

Remove unnecessary useMemo and buildVisualQueryFromString logic.
Just check query.expr directly to determine button visibility.

* fix: format code with prettier
2025-11-20 13:19:54 +01:00
Mihai Doarna
fbadbf385d IAM: Add validation for new tokens with no expiration when token_expiration_day_limit is set (#114166)
* do not create sa with no expiration when day limit is set

* disable No expiration option if day limit is set

* make i18n-extract

* run prettier

* address feedback
2025-11-20 13:44:15 +02:00
Ida Štambuk
b2f022fb5e Dynamic Dashboards: Make outline open by default (#114146) 2025-11-20 12:37:12 +01:00
Jay Clifford
e9116cd23c chore(testid): added missing testid to add datasource button (#114169)
* added missing testid

* added to pages.ts

* added e2e to datasource button

* fixed lint
2025-11-20 12:27:04 +01:00
Torkel Ödegaard
4637da8fcc Sidebar: A new reusable component for side toolbars and panes (#114141)
* initial wip

* fixes

* Switching to context

* New button design

* Overflow ellipsis

* Changes to button

* initial resize work

* resize progress

* Update

* no reszier in tabs mode

* fixing text truncte, and tabs right position

* Minor story tweaks

* added unit test

* added unit test

* Minor change

* minor story fix

* Fixes
2025-11-20 12:22:47 +01:00
Nathan Marrs
1d2426f880 Dashboard Favorites: Dashboard star icon stuck in loading state on initial load (#114211)
Co-Author: Haris Rozajac <haris.rozajac12@gmail.com>
2025-11-20 11:14:29 +00:00
Andreas Christou
3c777399d5 MSSQL: Minor refactor (#113976)
* Moving things around

* Copy parseURL function to where it's used

* Update test

* Remove experimental-strip-types

* Revert "Remove experimental-strip-types"

This reverts commit 70fbc1c0cd.

* Trigger build
2025-11-20 11:09:09 +00:00
Gareth
0efffd9ec8 Live: Add configuration for client_queue_max_size (#114225)
Live: add configuration for client_queue_max_size
2025-11-20 20:08:26 +09:00
Ida Štambuk
6e9a33e712 Dynamic Dashboards: Add more tracking (#114098) 2025-11-20 12:01:21 +01:00
Charandas
3c0d5745fe chore: remove remaining references to singular namespace (#114208) 2025-11-20 11:23:36 +01:00
Matheus Macabu
5d26bc5ee1 FeatureToggles: Remove feedbackButton unused toggle (#114222) 2025-11-20 11:18:50 +01:00
Anna Urbiztondo
bf509de89f Docs: IaC edits (#114086)
* Removed Grizzly from table

* Fixes

* Review

* Reviews

* Edits

* More edits

* Prettier

* Remove agent

* Review, removing Agent docs

* Prettier

* Fixes

* Prettier

* Edit

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Update docs/sources/as-code/infrastructure-as-code/ansible/ansible-cloud-stack/index.md

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>

* Feedback

* Prettier

* Variable style edits

---------

Co-authored-by: Clayton Cornell <131809008+clayton-cornell@users.noreply.github.com>
2025-11-20 10:24:47 +01:00
petergreen86
fbe29596f1 Docs: Team Sync correction (#114043) 2025-11-20 10:20:02 +01:00
Steve Simpson
cc6e037093 Alerting: Add message to alert_rule_version table (Part 1). (#114194)
This adds a `message` column to the `alert_rule_version` table. This follows the
pattern established for dashboards as closely as possible. A new type is
introduced internally for passing the new `message` field around in a type-safe
manner, but doing the same for the API types becomes very messy. In that case, a
new field is added with omitempty.

Note this PR is only:
- The column addition
- The "read" path; API for listing versions

Subsequent PRs will add code to actually set the message when updating rules.
2025-11-20 10:00:27 +01:00
Matheus Macabu
1d763df932 Docs: Document font_min_text_size setting in reporting section (#114155)
* Docs: Document font_min_text_size setting in reporting section

* better wording
2025-11-20 09:50:07 +01:00
Konrad Lalik
4e24b2977c Alerting: Fix expression queries when coming from a panel (#114095)
* Add getDefaultExpressions tests

* Fix expression queries when building form values from a panel

* make query params empty and add some better types

* update snapshots

* fix tests

* Revert devenv changes

* update shapshot

---------

Co-authored-by: Gilles De Mey <gilles.de.mey@gmail.com>
2025-11-20 08:38:49 +01:00
grafana-pr-automation[bot]
b0f3e531b1 I18n: Download translations from Crowdin (#114206)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-20 00:40:29 +00:00
Paul Marbach
946e6d9641 Table: Improve JSON rendering in inspect for JSON strings (#114189) 2025-11-19 19:38:06 -05:00
maicon
5754d7fbad chore: bump authlib/types to v0.0.0-20251119142549-be091cf2f4d4 (#114177)
* chore: bump authlib/types to v0.0.0-20251119142549-be091cf2f4d4

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>

* Update Go Workspace

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>

* Stop supporting deprecated namespace format in TestExtendedJWT_Authenticate

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>

* Update go mod

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>

---------

Signed-off-by: Maicon Costa <maiconscosta@gmail.com>
2025-11-19 16:05:20 -08:00
Josh Hunt
a4e1db66d3 Chore: Add html_handler_requests metric (#113991)
* Chore: Add html_handler_requests metric for tracking requests handled by index.go

* make a member of HttpServer

* make it a histogram instead

* update test
2025-11-19 16:40:54 -05:00
Isabel Matwawana
fabb4a603d Docs: Add panel time zoom with mouse (#113721)
Co-authored-by: Jesse David Peterson <jesdavpet@users.noreply.github.com>
Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>
2025-11-19 21:27:11 +00:00
alerting-team[bot]
53c39ccda3 Alerting: Update alerting module to 3befd25883e0d17673e5590cc5c5702bbc031b16 (#114062)
* [create-pull-request] automated change

* fix module path for alerting notify test receivers

---------

Co-authored-by: moustafab <27738648+moustafab@users.noreply.github.com>
Co-authored-by: Moustafa Baiou <moustafa.baiou@grafana.com>
2025-11-19 21:24:08 +00:00
Dave Henderson
7264803016 chore(deps): Switch to maintained gopkg.in/yaml fork (#114131)
Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
2025-11-19 15:20:32 -05:00
Ieva
84d6f54daa Chore: Remove references to editors_can_admin (#114168)
remove references to editors_can_admin
2025-11-19 19:40:54 +00:00
Juan Cabanas
62b8caec9b DashboardLibrary: Add template dashboard tests (#114179)
* dashboard template tests

* command plaette restored

* command plaette restored
2025-11-19 16:26:34 -03:00
Alexander Akhmetov
5a0e9e4183 Alerting: Add rule_uid filter support to the Prometheus-compatible list rules API (#114182) 2025-11-19 20:01:40 +01:00
Victor Cinaglia
164873591b IAM: Optionally make refresh tokens required if use_refresh_token is enabled (#114174)
* OAuth: Optionally make refresh tokens required if use_refresh_token is enabled

* make linter happy

* feedback: log missing refresh token during token refresh

* feedback: tweak wording in the message & change level
2025-11-19 15:21:40 -03:00
Eric Hilse
f074431a36 Plugins: add card extension to nav-landing-page (#113768)
* Plugins: add card extension to nav-landing-page

* feat(nav-landing-page): update card extension to include category and onClick support

* feat(NavLandingPage): add setPluginLinksHook to test setup

* feat(NavLandingPageCard): refactor className handling using cx for better style management

* feat(NavLandingPage): update card extension targets to use plural form for consistency

* feat(NavLandingPage): add warning for mutually exclusive extension points
2025-11-19 11:19:14 -07:00
Isabel Matwawana
e9c959a0e5 Docs: Add template dashboards page (#114113) 2025-11-19 12:48:23 -05:00
dependabot[bot]
235dec4e77 Bump glob from 10.4.1 to 11.1.0 in /e2e-playwright/test-plugins/grafana-extensionstest-app (#114061)
* Bump glob in /e2e-playwright/test-plugins/grafana-extensionstest-app

Bumps [glob](https://github.com/isaacs/node-glob) from 10.4.1 to 11.1.0.
- [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/node-glob/compare/v10.4.1...v11.1.0)

---
updated-dependencies:
- dependency-name: glob
  dependency-version: 11.1.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* update lockfile

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: samsch <git@samsch.org>
2025-11-19 12:27:05 -05:00
Denis Vodopianov
043b1a702a chore: Reflect changes in FF management in contribute guidelines. (#113312)
* Reflect changes in FF management in contribute guidelines.

* add a ref to the OpenFeature project

* fix codestyle in md file

* yet another key point

* Update contribute/feature-toggles.md

Co-authored-by: Tania <10127682+undef1nd@users.noreply.github.com>

* Update contribute/feature-toggles.md

Co-authored-by: Dave Henderson <dave.henderson@grafana.com>

---------

Co-authored-by: Tania <10127682+undef1nd@users.noreply.github.com>
Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
2025-11-19 11:57:49 -05:00
Brendan O'Handley
77d98fc73d Transformations: feature toggle cleanup transformations redesign (#113561)
* remove feature toggle transformationsRedesign

* remove for event tracking

* remove uneccessary code
2025-11-19 10:54:05 -06:00
Brendan O'Handley
20a8987ff1 Dataplane: feature toggle cleanup dataplane frontend fallback (#113542)
* remove feature toggle dataplaneFrontendFallback because GA

* remove feature toggle logic

* fix import

* fix toggle ownership from merging main

* merge main

* fix extra feature toggle
2025-11-19 10:53:24 -06:00
Luminessa Starlight
3e7b952488 Chore: Rudderstack upgrade to SDK v3 behind flag (#114126)
* add rudderstack version upgrade feature flag

* add new rudderstack backend file
gate new backend with feature flag

* fix global type error
2025-11-19 11:48:23 -05:00
Moustafa Baiou
1f9ed37b1b Alerting: Optimize cache metrics updates (#114134) 2025-11-19 11:39:13 -05:00
Peter Štibraný
42db6324c9 Collect and log search stats. (#114107)
* Collect and log search stats.

* Fix compilation problems.
2025-11-19 16:52:47 +01:00
Tom Ratcliffe
1fcf15d05f API Clients: Update codeowners for API clients to be more granular (#113928)
Co-authored-by: Ieva <ieva.vasiljeva@grafana.com>
2025-11-19 15:24:29 +00:00
Andrew Hackmann
a327fec8df Elasticsearch: data query refactor (#113360)
* split up data_query.go

* split up response_parser

* remove white space
2025-11-19 15:10:12 +00:00
Kevin Yu
a6343d7a68 CloudWatch Logs: Hide internal logs field (#114121) 2025-11-19 07:00:03 -08:00
Ivan Ortega Alba
40fb421556 Schema: Implement v2beta1 → v2alpha1 conversion (#113876) 2025-11-19 15:56:33 +01:00
github-actions[bot]
e66a49ce06 Release: update changelog for main (#114148)
* Update changelog

* Update changelog

* Update changelog

* Update changelog

* Update changelog

* Update changelog

* Update changelog

* Update changelog

* update changelog

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Kevin Minehart <5140827+kminehart@users.noreply.github.com>
2025-11-19 14:49:52 +00:00
Erik Sundell
be0857fa8f Plugins: Pass build mode to frontend (#114092)
* pass build mode to frontend

* set buildMode build time using shared plugin webpack conf
2025-11-19 15:42:27 +01:00
Peter Štibraný
acf6f1ae5f Ignore boolean ".spec.refresh" silently. (#114167) 2025-11-19 15:42:14 +01:00
ismail simsek
74e98fc183 Prometheus: Filter label values based on the search in metrics browser (#113949)
Filter label values based on the search
2025-11-19 15:38:31 +01:00
Matias Chomicki
dde5b6476c Remove feature flag from bad rebase (#114154) 2025-11-19 13:56:15 +01:00
Ashley Harrison
341a32266d Toggletip: Ensure consistent positioning in all scenarios (#114085)
* portal toggletip content

* add test to check focus trapping

* kick CI
2025-11-19 12:53:21 +00:00
Ashley Harrison
3f008acde2 PanelChrome: Wrap in a div to allow for hover headers (#114037)
wrap PanelChrome in a div that's outside of `overflow: hidden;` to allow for hover headers
2025-11-19 12:52:09 +00:00
Ashley Harrison
cf24e0bbd8 ToolbarButton: Require tooltip or aria-label if no children are present (#114097)
* split into separate stories

* make tooltip/aria-label required if no children present

* kick CI

* fix unit tests

* cleaner

* clean up story
2025-11-19 12:51:29 +00:00
Hugo Häggmark
5f3dcadf9e Docs: Revert move of plugin schema file (#114139)
* Docs: revert move of plugin schema file

* Trigger build
2025-11-19 13:40:52 +01:00
Jean-Philippe Quéméner
0e4b701bd6 fix(dashboards): apply permission search filter if provided (#114147) 2025-11-19 13:05:07 +01:00
Mariell Hoversholm
d19828870b feat: remove newPDFRendering ff (#113451) 2025-11-19 12:50:41 +01:00
Gábor Farkas
fc18c9315e update grafana/gafana-plugin-sdk-go dependency, and adjusted code accordingly (#113922)
* update dependencies

* query: stop handling _timeRange

* fixed unit test
2025-11-19 12:44:13 +01:00
Matias Chomicki
9dd68dbbcc Logs: Feature flag logRowsPopoverMenu removed (#113583)
* logRowsPopoverMenu: remove feature flag

* Remove import

* Remove feature flag
2025-11-19 11:43:59 +00:00
Matias Chomicki
bef8414781 logParser: memoize getVisibleFieldIndices (#113602)
* logParser: memoize getVisibleFieldIndices

* Remove unnecessary parameter
2025-11-19 12:17:10 +01:00
Tom Ratcliffe
6f8c1525da Folders: Improve wording for actions and move/delete (#114090) 2025-11-19 11:05:11 +00:00
Sam Jewell
cff5a42bce Rework Title of SQL Transformation card (#114093)
* Rework UI of SQL Transformation card

I made a few changes:
- Green - to indicate that this is DIFFERENT from the other transforms, not similar
- Command prompt, not a preview of the table input and output - to indicate that
   - you code this yourself, and
   - the output table format is not predictable - it's entirely outside of our control

I updated the card title to "Transform with SQL" because I felt this was more
indicative of what the user will be doing. It's a call to action.

* Reverse the change to the illustration

The changes to the illustration aren't ready yet,
As per PR feedback in comment: https://github.com/grafana/grafana/pull/114093#issuecomment-3547943167

* Update tests and code with new header text
2025-11-19 10:51:33 +00:00
Konrad Lalik
56e148408e Alerting: Remove unknown state filter (#114143)
* Remove unknown state filter

* Update translations
2025-11-19 11:42:39 +01:00
Ashley Harrison
99e0654fc9 Chore: Convert some more react class components to functional (#113951)
* convert LoginCtrl to a functional component

* convert NumberInput to a functional component

* convert StringArrayEditor to a functional component

* convert TeamPicker to a functional component

* convert AddToOrgModal to a functional component

* don't set noMargin yet

* convert UserProfile to a functional component

* convert AnnotationFieldMapper to a functional component

* convert PanelHeaderCorner to a functional component

* convert ShareExport to a functional component

* convert ShareLink to a functional component

* convert RawPrometheusContainer to a functional component
2025-11-19 09:58:16 +00:00
Lauren
6dcb921333 Alerting: Fix for fetching evaluation group in new filter (#113694)
* Alerting: Fix for fetching evaluation group in new filter

* WIP: Add async evaluation groups dropdown with 500 group limit

* Add text to query param if threshold limit reached

* update translations, remove group info tooltip

* resolve PR comment
2025-11-19 09:11:07 +00:00
Misi
56c2c1cfe2 IAM: Add validation to ExternalGroupMapping (#113957)
* Add validation before ExternalGroupMapping creation

* Add FIXME to implement team lookup

* Lint
2025-11-19 09:48:09 +01:00
Mustafa Sencer Özcan
0d4ad01b65 feat: add unified data migrations for dashboard and folders (#113853) 2025-11-19 09:09:08 +01:00
Jara Suárez de Puga García
92bee5e510 Docs: Update documentation on PDF/Email generation with logo (#114005)
Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>
2025-11-19 08:43:38 +01:00
Ryan McKinley
00329cab14 Stars: Move stars from preferences apiserver to a new collections apiserver (#114006) 2025-11-19 08:28:39 +03:00
grafana-pr-automation[bot]
e558c9af5d I18n: Download translations from Crowdin (#114130)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-19 00:40:18 +00:00
Jacob Valdez
03ed5a372d Docs: What's new and Upgrade guide v12.3 (#113372) 2025-11-18 20:24:25 +00:00
Ryan McKinley
2f591aaaeb GitSync: Fix documentation link (#114119) 2025-11-18 19:10:46 +00:00
owensmallwood
8dddff3ce4 Unified Storage: Pass ns, group, resource to GetResourceStats instead of just namespace (#114050)
* passes nsr to GetResourceStats instead of just namespace

* removes ns check

* fixes failing tests

* make update-workspace

* pass group and resource from rebuild request when getting resource stats
2025-11-18 13:05:21 -06:00
Kristina Demeshchik
bf3de07147 QueryEditor: datasource getQueryDisplayText error (#114106)
Fixes an issue where `getQueryDisplayText` throes an error and breaks the query editor.
2025-11-18 13:58:55 -05:00
Juan Cabanas
1458a28eee DashboardLibrary: Fix 404 not found error when browsing the page (#114094)
* 404 fix

* any enabled added
2025-11-18 15:43:25 -03:00
Paul Marbach
92ac33736b Suggestions: Proposed PanelPlugin API (#113688)
* Suggestions: Update ownership of core files and improve some types

* Suggestions: Proposed PanelPlugin API

* get rid of .useSuggestionsConfig

* update i18n

* iterate on TypeScript types, add example in radialbar

* tweak implementation, add commentary

* actually, suggestions really does not need panel defaults

* split suggestions handler into its own file and add tests for radialbar

* small comment revision

* fix test

* add ds.hasData check back for state-timeline

* restore a handful of comments that got lost in the merge shuffle

* more updated commnets

* remove pluginId from VisualizationSuggestion, whoops

* fix getAllSuggestions test

* update i18n

* might as well restore description here

* move fieldconfig back on radialbar

* call them suppliers, remove boolean return type in favor of internal util

* Update packages/grafana-data/src/panel/PanelPlugin.ts

* Update packages/grafana-data/src/panel/PanelPlugin.ts

* Update packages/grafana-data/src/panel/PanelPlugin.ts

* tweak return type for setSuggestionSupplier to be this
2025-11-18 18:49:29 +01:00
Matheus Macabu
a636e1dc8e Docs: Add secrets management beta API docs (#114020)
* Docs: Add secrets management beta API docs

* Apply suggestions from code review

Co-authored-by: Anna Urbiztondo <anna.urbiztondo@grafana.com>

* backtick params

* all caps JSON

* Apply suggestions from code review

Co-authored-by: Jacob Valdez <jacob.valdez@grafana.com>

* fix tab

* run yarn prettier

* fix anchor and permission for update

* example delete request

* Apply suggestions from code review

---------

Co-authored-by: Anna Urbiztondo <anna.urbiztondo@grafana.com>
Co-authored-by: Jacob Valdez <jacob.valdez@grafana.com>
2025-11-18 17:19:54 +00:00
Rafael Bortolon Paulovic
0fc0fb8db5 chore: move enable search to US configuration (#114070) 2025-11-18 17:32:25 +01:00
Torkel Ödegaard
11901cd242 PanelChrome: Hover header fixes (#113908)
* PanelChrome: Hover header fixes

* More fixes

* fixes

* Fix test

* restore hoverHeaderOffset feature

* Fixes
2025-11-18 17:05:30 +01:00
Sebastian Gaiser
e6f0107923 Prometheus: Add option to configure "use series endpoint" provisioned data source (#109852)
* feat(datasources,prometheus): add option to configure 'Use series endpoint' from datasource config

Signed-off-by: Sebastian Gaiser <sebastian.gaiser@hetzner-cloud.de>

# Conflicts:
#	docs/sources/datasources/prometheus/configure/_index.md

* Update public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/types.ts
2025-11-18 16:41:13 +01:00
Alexander Akhmetov
bbd0fbe9d0 Alerting: Update documentation for Prometheus list rules API (#114057) 2025-11-18 15:56:54 +01:00
Alexander Akhmetov
633c9a9cb0 Alerting: Add rule_limit parameter to the list rules API (#114055) 2025-11-18 15:56:40 +01:00
David Kim (DK)
66259bdede SLO: remove is new badge for SLO reports (#113784) 2025-11-18 14:30:46 +00:00
Konrad Lalik
a6952b554f Alerting: Rules filtering improvements (#114073)
* Reorganize filtering code structure

* Remove unused imports

* Simplify naming
2025-11-18 14:21:55 +01:00
Marcus Andersson
083c7f31f7 PluginExtensions: Prevent unneccesary re-renders (#113436)
* wip

* wip

* wip

* wip

* wip

* wip

* removed array.from.

* using concat

* added more tests.

* renamed according to feedback.

* Update the getPluginExtensions to use the slice.

* fixed expect statements.

* Reverted the test app from the allow list.

* cleanded up tests.

* added generic tests for base functionality.

* removed unused iport.
2025-11-18 14:12:23 +01:00
Peter Štibraný
ec74a721ea Be more tolerant to invalid JSON when parsing dashboards for indexing (#114040)
* Tags can only be string array.

* Be more lenient when parsing dashboard. Parse what we can, don't error out easily.

* Check element before parsing, log unexpected types.
2025-11-18 14:01:57 +01:00
Ida Štambuk
e821578ab0 Dynamic Dashboards: Disallow adding empty row and tab titles (#113941) 2025-11-18 12:58:45 +01:00
Andreas Christou
ad9f9fc408 Remove unneeded node options (#114081)
* Remove unneeded node options

* Remove experimentalWarning flag
2025-11-18 11:41:08 +00:00
Taha Derouiche
a5638b5c8b Docs: Fix SCIM EntraId broken link (#114078) 2025-11-18 12:39:06 +01:00
Will Browne
e00eb854f5 Plugins: Add ttlPluginInstanceManager feature toggle (#114084)
add ttlPluginInstanceManager feature toggle
2025-11-18 11:17:23 +00:00
Tobias Skarhed
82b283959b Scopes: Remove fallback title for scope node display (#114080)
* Remove fallback title for scope node display

* Remove newline
2025-11-18 11:05:27 +00:00
Will Browne
374cb1b163 Plugins: Bump plugin SDK version to v0.282.0 (#114079)
bump plugin SDK version to v0.282.0
2025-11-18 10:42:58 +00:00
Ashley Harrison
9321ca2019 Config: Set skip migrations in defaults.ini + override when running frontend service locally (#114007)
fs: skip migrations locally + add to defaults.ini
2025-11-18 09:49:26 +00:00
renovate-sh-app[bot]
db0b35f6df chore(deps): update dependency glob to v11.1.0 [security] (#114064)
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | glob    | 11.0.3 | 11.1.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-18 10:43:10 +01:00
Gábor Farkas
a1a73dde66 datasources: querier: forward more headers (#113897) 2025-11-18 10:33:59 +01:00
Torkel Ödegaard
c7727eb25c Scopes: Scope input UI update (#114002)
* Progress

* Update

* Progress

* Fixes

* Update

* update e2e

* e2e fix

* More e2e fixes

* fix
2025-11-18 10:09:55 +01:00
Ihor Yeromin
4c75ea918a Transformations: Wrap sql expression tile under FF (#114030)
* Transformations: Add empty state placeholder with SQL expression and transformation cards

- Extract TransformationCard and SqlExpressionCard into separate reusable components
- Add new empty transformations placeholder UI behind transformationsEmptyPlaceholder feature toggle
- Add auto-scroll to SQL expression when navigating from transformations tab
- Add analytics tracking for transformation interactions
- Split EmptyTransformationsMessage into Legacy and New variants for easier toggle removal

* add tests
2025-11-18 10:01:45 +01:00
Kevin Minehart
a553256b46 CI: run publish artifacts on self-hosted runner (#114068)
run publish artifacts on self-hosted runner
2025-11-18 01:00:40 -08:00
Costa Alexoglou
faabe2e46d feat: add library elements to dash service (#114016) 2025-11-18 09:21:05 +01:00
Paul Marbach
d6e81c6334 Table: Clean up filter popover layout and improve filter selection UX (#114052)
* Table: Clean up filter popover layout

* Table: Improve filter selection ux text

* remove unused ref

* update snapshot test

* whoops, we don't want to change the global input suffix padding
2025-11-18 06:57:08 +01:00
grafana-pr-automation[bot]
7e6b5505f0 I18n: Download translations from Crowdin (#114059)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-18 00:40:35 +00:00
Paul Marbach
dd3f085648 Heatmap: Improve error messaging if no numeric fields were provided (#113985)
* Heatmap: Improve error messaging if no numeric fields were provided

* update i18n
2025-11-17 22:27:01 +00:00
Kristina
b6784c4354 API Client: Add exact command to run (#113994) 2025-11-17 21:52:41 +00:00
Johnny Kartheiser
441556d1a3 alerts docs: triage page (#113869)
* alerts docs: triage page

documentation for the alert triage page

* public preview note added

* Update alert-triage.md

* prettier

* removed alerts triage references

* rename

* image

* prettier
2025-11-17 15:15:46 -06:00
Rafael Bortolon Paulovic
32da63a20f chore: remove US history pruner feature toggle (#114014) 2025-11-17 20:47:37 +01:00
Alexander Akhmetov
da5af29218 Alerting: Add search.rule_group to search rules by rule group name (#113680)
Co-authored-by: Konrad Lalik <konradlalik@gmail.com>
2025-11-17 20:38:42 +01:00
Yuri Tseretyan
9d928a3ac6 Alerting: Remove stale states in two steps (#114044) 2025-11-17 18:43:29 +00:00
Tobias Skarhed
b79ace082c Scopes: Nested scope navigations (#113394)
* Initial nested scope navigation

* Seperate sections for scope navigation vs groups

* Add ungrouped navigation items

* Create tree structure helper for mock scope navigations

* Improve generated folder structure and add link to change scope

* Update mocks

* DevEnv Navigations

* Remove mocks

* Update button position and add border

* Remove subScope from TreeLink

* Do unblocking async update

* Add loading state

* Allow '' for root groups

* Formatting

* Add unit and integration tests

* Update openapi spec

* Update tooltip for IconButton

* Update i18n

* Make code more DRY

* Update public/app/dev-utils.ts

* update folderUpdate type

* Remove isSubScope in facvor of checking subScopeName

* Do an early return

* Use subScopeName

* Remove use of isSubScope

* Prevent nested items with the same subScope

* Extract filder method to function

---------

Co-authored-by: Mariell Hoversholm <mariell@mardroemmar.dev>
2025-11-17 17:18:12 +01:00
Ihor Yeromin
b6d34acc44 Feature toggle: Remove addFieldFromCalculationStatFunctions feature toggle (#113757)
* Remove addFieldFromCalculationStatFunctions feature toggle

The addFieldFromCalculationStatFunctions feature toggle was at GA stage
and enabled by default. This commit removes the toggle and makes the
cumulative and window functions permanently available in the add field
from calculation transformation.

Changes:
- Removed feature toggle definition from registry.go
- Updated CalculateFieldTransformerEditor to always include cumulative and window functions
- Removed unused config import
- Removed documentation entry
- Regenerated all generated files (toggles_gen.go, toggles_gen.csv, toggles_gen.json, featureToggles.gen.ts)

* fix merge conflicts
2025-11-17 16:58:43 +01:00
Drew Slobodnjak
ddb4690633 Heatmap: Add timeRangePan (#113889)
* Heatmap: Add timeRangePan

* Add tests

* Consolidate tests

* Optimize time range pan tests
2025-11-17 11:48:32 -04:00
Drew Slobodnjak
749cc735bb Timeline: Add timeRangePan (#113890)
* Timeline: Add timeRangePan

* Add tests for state timeline

* Add tests for status history

* Fix state timeline test and use same dashboard

* Consolidate tests

* Optimize time range pan tests
2025-11-17 11:42:54 -04:00
Laura Fernández
7888f19443 FS: custom domain error message (#113779) 2025-11-17 16:29:32 +01:00
Alexa Vargas
c7e8291bd1 Dashboard Library: Add basic unit test to suggested dashboards flow (#113825)
* Create unit tests for communityDashboardHelper

* Add unit test for autoMapDatasources

* Create unit test for DashboardCard

* --wip-- [skip ci]

* Fix test

* fix linting

* Add unit test to the dashboardLibraryApi

* update codeowners for dashboard library code

* fix: improve test coverage and fix failing tests

- Fix image handling tests in DashboardCard to verify actual behavior
- Fix UID filtering test in autoMapDatasources to use correct mock data
- Add test for dimThumbnail prop
- Add test for undefined inputs edge case
- All 82 tests now passing

* render function modified

* merge with template dashboard modifications. tests modified

---------

Co-authored-by: nmarrs <nathanielmarrs@gmail.com>
Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>
2025-11-17 12:10:19 -03:00
Drew Slobodnjak
e9883f6c61 TimeSeries: Improve e2e for time range pan (#113981)
Timeseries: Improve e2e for time range pan
2025-11-17 11:02:08 -04:00
Drew Slobodnjak
fcceff99e2 CandleStick: Add timeRangePan (#113888)
* Candlestick: Add timeRangePan

* Add tests

* Rename test file

* Optimize time range pan tests
2025-11-17 10:36:36 -04:00
Matheus Macabu
cad9e1c5f3 Actions: Only run CodeQL analysis on main/release branches (#114021)
* Actions: Only run CodeQL analysis on main/release branches

* disble cache in go action
2025-11-17 14:26:33 +00:00
Anna Urbiztondo
2dfcaf9be8 Docs: Consolidate OaC intros (#113895)
* Consolidate

* Edits

* Remove Get started

* Prettier

* Edit

* Removing Grizzly

* Prettier
2025-11-17 15:10:31 +01:00
Natalia Bernarte Oses
c4f2f3f6f4 transformations and sql expressions discovery poc (#113664)
* transformations and sql expressions discovery poc

* add translations

* extract transformation card component

* scroll to sql expression

* put changes under ff

* fix translation

* add event tracker

* add tests

* naming, refactoring

* button amends

* add icons for sql expression tile

* TransformationPickerNg refactoring

* PanelDataTransformationsTab refactoring

* refactor empty message component

* refactor empty message component

* cleaning

* update feature toggle

* cover event tracking

* update interation events

---------

Co-authored-by: Develer <yeryomin.igor@gmail.com>
2025-11-17 14:57:05 +01:00
renovate-sh-app[bot]
100fb26d27 fix(deps): update dependency @reduxjs/toolkit to v2.10.1 (#113972)
| datasource | package          | from  | to     |
| ---------- | ---------------- | ----- | ------ |
| npm        | @reduxjs/toolkit | 2.9.0 | 2.10.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 13:47:01 +00:00
renovate-sh-app[bot]
f6df949bc3 chore(deps): update node.js to v24 (#114011)
| datasource   | package     | from     | to       |
| ------------ | ----------- | -------- | -------- |
| node-version | node        | v22.21.1 | v24.11.1 |
| npm          | @types/node | 24.9.2   | 24.10.1  |
| npm          | @types/node | 22.17.0  | 24.10.1  |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 13:46:26 +00:00
renovate-sh-app[bot]
a5103784fe fix(deps): update dependency swagger-ui-react to v5.30.2 (#114010)
| datasource | package          | from   | to     |
| ---------- | ---------------- | ------ | ------ |
| npm        | swagger-ui-react | 5.28.1 | 5.30.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 13:44:11 +00:00
Peter Štibraný
890fc1ea79 Support string version of "editable" field when indexing dashboard. (#114008) 2025-11-17 13:43:42 +00:00
renovate-sh-app[bot]
e6b12f865f fix(deps): update dependency ol to v10.7.0 (#114009)
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | ol      | 10.6.1 | 10.7.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 13:43:18 +00:00
Konrad Lalik
703e93d103 Alerting: Refactor rules filtering (#113898)
* Refactor rules filter to easily switch between frontend and backend filters

* Refactor getFilter functions to receive filters as an argument

* Move filter normalization to getFilter utils
2025-11-17 14:42:29 +01:00
Ihor Yeromin
10a699fb6c Transformers: Remove formatString feature toggle (#113756)
* Transformers: Remove formatString feature toggle

The formatString feature toggle was in GA stage and enabled by default.
This change removes the feature toggle and makes the format string
transformer always available.

Changes:
- Remove formatString feature toggle definition from registry
- Remove conditional check in standardTransformers.ts
- Update feature toggle git log with deletion timestamp
- Regenerate feature toggle files

* fix lint errors
2025-11-17 14:06:30 +01:00
Laura Benz
434d370394 BrowseDashboards: Add tracking (#113696)
* feat: add tracking for New button

* feat: add tracking for New button dashboard click

* refactor: move tracking

* refactor: add payload

* refactor: clean up

* refactor: include folder clicks

* refactor: add view to payload

* feat: add tracking in serach view

* refactor: fix TS error

* refactor: adjust payload

* refactor: adjust payload

* refactor: fix TS error

* refactor: clean up

* refactor: set trackingSource

* refactor: remove type declaration

Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>

* refactor: apply changes after code review

* Refactor: clean up

Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>

* refactor: fix tests

---------

Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>
2025-11-17 13:19:37 +01:00
Tom Ratcliffe
77dac4210f Chore: Remove pinNavItems feature toggle (#113855) 2025-11-17 12:12:47 +00:00
renovate-sh-app[bot]
6f8b4032c2 fix(deps): update dependency immer to v10.2.0 (#113974)
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | immer   | 10.1.3 | 10.2.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 12:02:14 +00:00
renovate-sh-app[bot]
3b328b2609 fix(deps): update dependency @prometheus-io/lezer-promql to v0.307.3 (#113971)
| datasource | package                     | from    | to      |
| ---------- | --------------------------- | ------- | ------- |
| npm        | @prometheus-io/lezer-promql | 0.305.0 | 0.307.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 12:01:16 +00:00
renovate-sh-app[bot]
6a047e8f95 fix(deps): update dependency @opentelemetry/semantic-conventions to v1.38.0 (#113970)
| datasource | package                             | from   | to     |
| ---------- | ----------------------------------- | ------ | ------ |
| npm        | @opentelemetry/semantic-conventions | 1.37.0 | 1.38.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 12:00:46 +00:00
Ezequiel Victorero
fe95e0a6db FrontendService: Add support for swagger in the local dev env (#113937) 2025-11-17 09:00:11 -03:00
Ihor Yeromin
d10dc81a79 Feature toggle: Remove groupToNestedTableTransformation feature toggle (#113761)
Remove groupToNestedTableTransformation feature toggle

The group to nested table transformation has reached GA and is now
enabled by default. This commit removes the feature toggle and makes
the transformation always available.

Changes:
- Removed feature toggle definition from registry.go
- Updated standardTransformers.ts to always include the transformation
- Updated feature toggles documentation
- Regenerated feature toggle files
2025-11-17 12:57:22 +01:00
Ihor Yeromin
950376c0d9 Feature toggle: Remove regressionTransformation feature toggle (#113759)
Remove regressionTransformation feature toggle

The regression analysis transformation feature is now GA and no longer needs to be behind a feature toggle.
2025-11-17 12:55:03 +01:00
Andres Martinez Gotor
151d9ec1cc Advisor: Expose endpoint to register checktypes (#113750) 2025-11-17 12:48:53 +01:00
Josh Hunt
aa26cc4254 FS: Preserve buildInfo.edition from backend (#113967) 2025-11-17 11:32:16 +00:00
Ryan McKinley
d0fe342cfe Chore: Update app-sdk and k8s.io (#113998) 2025-11-17 13:34:15 +03:00
Ryan McKinley
1ef7c68f53 Chore: use context rather than golang.org/x/net/context (#114000) 2025-11-17 12:53:44 +03:00
Jean-Philippe Quéméner
9dd8c85448 feat(dashboards): add ttl based caching for datasources (#113999) 2025-11-17 09:48:17 +01:00
Jean-Philippe Quéméner
64c61c6916 fix(dashboards): use index for schema migration datasource lookups (#113911) 2025-11-17 08:56:54 +01:00
renovate-sh-app[bot]
f50d513252 fix(deps): update dependency centrifuge to v5.5.2 (#113973)
| datasource | package    | from  | to    |
| ---------- | ---------- | ----- | ----- |
| npm        | centrifuge | 5.4.0 | 5.5.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-17 10:24:48 +03:00
Hugo Häggmark
7772c3ab2e chore: fix failing builds on main (#113996)
Update import path for contextSrv in DashboardScenePageStateManager
2025-11-17 07:04:35 +01:00
Hugo Häggmark
8288ce6dd6 chore: reduce barrel files (#113842)
chore: reduce barrelfiles
2025-11-17 05:58:35 +01:00
grafana-pr-automation[bot]
f5df0b05ef I18n: Download translations from Crowdin (#113987)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-16 00:32:25 +00:00
Dave Henderson
1f1c75f817 Revert "OFREP: add ST builder for the authorizer, APIEnabled=false needs it" (#113983)
Revert "OFREP: add ST builder for the authorizer, APIEnabled=false needs it (…"

This reverts commit 9ca6ad3b49.
2025-11-14 21:54:48 +00:00
Ezequiel Victorero
af7f110664 ShortURL: Support memoize when creating shorturl using k8s api (#113952) 2025-11-14 18:29:50 +00:00
Juan Cabanas
de45393eb5 Dashboard Library: Integrate template dashboards (#112906)
* Extend interpolate endpoint to support community dashboard json interpolation
Added unit tests

* Implement Frontend Side
- Show tabs
- Fetch Community dashboads
- basic cards for community
- Search bar for community

* Improve card community and show thumbnails

* quick poc with template dashboards

* better cards ui

* entry point conditional added. dashboard card improved

* dev dashboard for testing

* details removed in template dashboard modal

* improvement when loading the templates

* dashboard from template entry points

* interactions added

* tracking event improvements. card improvement

* unused import removed

* 90% Complete MVP community dashboards integraton
- Use DashboardCard component
- Search grafana dashboard in the community tab
- Make Tabs and pagination sticky
- Adjust titles to be scoped by datasource name/type
- Add skeleton loading for community tabs and pagination
- Add dashboard details tooltip

* Use DataSourcePicker for extra configuration page

* Fix suggested dashboard, don't use filter but slug and also add gcomURLink

* Implement badge, for now reuse Badge component

* translations added

* Refactor code, extract to utils function and clean up code

* refactor provisioned dashboards images

* add missing file

* Extract API functions

* standarize event handlers

* Auto select tab when provisioned or community are not present, also add empty state for provisioned tab

* use SecondaryAction iconButton for Details, and also use Tooltip

* For suggested dashboards change Grid for Stack to fix issue with less than 3 dashboards, also add the details next to
the main action

* Fix styling issue with description miss-aligment

* Change "use template" to use dashboard

* update i18n

* fix broken unit test

* FF added

* uid changed to make it work for both scenarios

* Apply PR feedback
- add eventLocation
- Fix description placeholder
- Fix issue with suggested dashboards card aligment, change to Grid

* use datasource type instead of name, extract i18n and fix linting

* Improve View on Grafana.com link

* remove console.log

* Fix issue with cards styling

* improvements

* Apply suggestion from @juanicabanas

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>

* Use query params for modal state and reorder dashboard empty to keep suggestions in the middle

* extract common interpolate logic in new function

* fix linting

* rename loadTemplateDashboard function to loadSuggestedDashboard

* Improve automapping layout, add dashboard name to title and pipe the mappings

* Apply style guide for callback functions, and refactor constant inputs initialization wiht reduce

* Fix styling issues with focus border and pagination

* fix issue with card aligment

* use attach skeleton instead of custom css

* Adjust all i18n to use dashboard-library key

* Refactor mapping form to use one array to handle unmapped ds

* Update public/app/features/dashboard/dashgrid/DashboardLibrary/CommunityDashboardSection.tsx

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>

* Refactor pagination, use api pagination data

* Remove unnecesary trim

* Fix issue with Stack height and justifyContent in modal

* Update public/app/features/dashboard/dashgrid/DashboardLibrary/SuggestedDashboards.tsx

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>

* Add missing dependency

* Fix issue with mapping config form, make buttons to be aligned at the bottom

* Fix unit tests

* Add and refactor tracking interactions to support experiment KPIS

* rename unmappedInputs to unmappedDsInputs for clarity

* Update public/app/features/dashboard/dashgrid/DashboardLibrary/CommunityDashboardSection.tsx

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>

* rename modal and move modal to section

* Simplify search params, extrack user selected dashboards to helper function, update pagination styles and use url based
pagination

* Move modal logic to the suggested dashboards component

* Fix tracking duplication on first load and revert change on pagination url persistence

* Extrac on preview community dashboard into utils

* Bring old datasource-provisioned box back and rely on new feature toggle for community dashboards

* change logic for showing suggested dashboards, we only need to enable that feature toggle

* update i18n

* Fix unit test for basic provisioned dashboard

* fix css

* Apply feedback

* Add suggested dashboards to endpoint

* Add missing feature toggle check in the backend to expose the interpolate api

* Add extra test case

* update swagger

* Update public/app/features/dashboard/dashgrid/DashboardEmpty/DashboardEmpty.tsx

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>

* update swagger

* changes applied to retrieve templates dashboards from raintank

* translations

* Remove duplicated tracking and add gnet id to the save tracking action

* interactions

* improvements applied

* last improvements

* tracking events modified with merge. translations fixed

* tests fixed

* uid property removed from dto. new way of tracking the ds types added

* ds types from gnet dashboard removed

* fixes

* tracking changed

* tracking modified

---------

Co-authored-by: alexandra vargas <alexa1866@gmail.com>
Co-authored-by: Alexa Vargas <239999+axelavargas@users.noreply.github.com>
Co-authored-by: nmarrs <nathanielmarrs@gmail.com>
2025-11-14 15:22:48 -03:00
renovate-sh-app[bot]
4581ed89a0 fix(deps): update dependency marked-mangle to v1.1.12 (#113923)
| datasource | package       | from   | to     |
| ---------- | ------------- | ------ | ------ |
| npm        | marked-mangle | 1.1.11 | 1.1.12 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 17:51:42 +00:00
renovate-sh-app[bot]
050f6572a8 chore(deps): update dependency js-yaml to v4.1.1 [security] (#113953)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | js-yaml | 4.1.0 | 4.1.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 17:03:27 +00:00
Yunwen Zheng
ffcd06c629 Git sync: Remove unnecessary comments (#113963)
remove comment
2025-11-14 12:03:08 -05:00
renovate-sh-app[bot]
58e0d03f46 chore(deps): update dependency ol-mapbox-style to v13.1.1 (#113880)
| datasource | package         | from   | to     |
| ---------- | --------------- | ------ | ------ |
| npm        | ol-mapbox-style | 13.1.0 | 13.1.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 17:01:01 +00:00
renovate-sh-app[bot]
f116208b88 chore(deps): update dependency nanoid to v5.1.6 (#113879)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | nanoid  | 5.1.5 | 5.1.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 17:00:36 +00:00
Lauren
ef61b67e66 Alerting: Update tooltip message when routing preview is disabled (#113962)
* update tooltip message

* generate translations

* update translations
2025-11-14 16:37:08 +00:00
Andres Torres
b70c6a726f refactor(annotations): Allow skipping always on dashboard UID migrations (#113780) 2025-11-14 11:34:13 -05:00
Alexander Akhmetov
e6eb40a679 Alerting: Propagate dashboard uid filter to the backend (#113947)
* Alerting: Propagate dashboard uid filter to the backend

* Fix variable casing

---------

Co-authored-by: Konrad Lalik <konradlalik@gmail.com>
2025-11-14 16:25:14 +00:00
Ashley Harrison
fe0486915e Card: Adjust grid styles conditionally based on the presence of description (#113848)
* adjust card grid styles conditionally based on presence of description

* handle everything as part of `gridTemplate`
2025-11-14 15:57:31 +00:00
renovate-sh-app[bot]
66766fe729 fix(deps): update dependency @lezer/highlight to v1.2.3 (#113091)
| datasource | package          | from  | to    |
| ---------- | ---------------- | ----- | ----- |
| npm        | @lezer/highlight | 1.2.1 | 1.2.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 15:36:09 +00:00
Ezequiel Victorero
a2c5d6e686 InviteUser: Remove experimental feature toggle (#113914) 2025-11-14 12:33:26 -03:00
Yunwen Zheng
3e9662d910 BootstrapStep: Display disabled option and add reason (#113881)
* BootstrapStep: Display disabled option and add reason
2025-11-14 10:22:17 -05:00
Will Browne
9818822e87 Plugins: Fix flaky backend tests (#113945)
* fix flaky tests

* tidy
2025-11-14 15:09:12 +00:00
ismail simsek
f7e07d814a Tempo: Fix "undefined is not object (evaluating 'super.query')" error (#113722)
remove arrow function
2025-11-14 15:48:17 +01:00
renovate-sh-app[bot]
77aac05b09 fix(deps): update dependency @lezer/common to v1.3.0 (#113924)
| datasource | package       | from  | to    |
| ---------- | ------------- | ----- | ----- |
| npm        | @lezer/common | 1.2.3 | 1.3.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 15:36:04 +01:00
Oscar Kilhed
a59c4e2fcc Dashboards: Wrap links and data layer controls in divs to make them behave like variables (#113927)
Wrap links and data layer controls in divs to make them float together with variables
2025-11-14 15:26:31 +01:00
Collin Fingar
5e2a579802 Saved Queries: Run query after replacing (#113366)
* Saved Queries: Run query after replacing

* Fix unit tests
2025-11-14 09:19:41 -05:00
Rafael Bortolon Paulovic
5a111bc087 fix: delete provisioned dashboard in unified if forceDeleteRules is set (#113839) 2025-11-14 14:11:05 +01:00
Lauren
c2b15ca786 Alerting: Prevent routing preview from auto-triggering on mount (#113749)
* Alerting: Prevent routing preview from auto-triggering on mount

* resolve PR comments

* add info on hover of preview routing when disabled
2025-11-14 12:41:16 +00:00
Alexander Akhmetov
6d7ce16883 Alerting: Add rule_type filter to the rules endpoint (#113701)
Alerting: Add type filter parameter to the rules endpoint
2025-11-14 13:03:15 +01:00
Andres Martinez Gotor
bfa7ce9d78 Advisor: Remove legacy app register (#113773) 2025-11-14 12:25:30 +01:00
Andre Pereira
4355b3ed0d Trace View: Span filters updated to use combobox filters (#112287)
* Start using adhoc filters component in trace view

* Migrate old span filters to adhoc filters

* Add support for duration filter

* Set placeholder in adhoc filters input

* Moved the span graph to the header, above the filters

* Update next and prev buttons, added filter pills, style fixes

* Fix types

* Use canary scenes version

* Remove copyright

* More duration operators

* Added tests for the controller

* More consistent spacing

* Remove unused container style from SpanGraph component

* Update scenes canary

* Update scenes to 6.42.0

* Fix all spans toggle

* Use InlineSwitch instead of Switch

* Fix critical path

* Fix duration filtering

* Add tooltips to filter pills

* Improve duration filter pill

* Improvements to backgrounds of span row. Fixed size of collapsible overview section

* Fix sticky trace view header

* Removed old span filters from panel options

* Migrate old filters to adhocfilters in panel. Use the adhoc filters component in panel options.

* i18n

* Fix tests

* Fix tests
2025-11-14 11:19:11 +00:00
Kevin Minehart
92ef1c4942 CI: release-build.yml missing pipe (#113915) 2025-11-14 10:53:12 +00:00
Andrei
bcc5d29bf7 Loki: Apply default_manage_alerts_ui_toggle config (#112297)
Datasources: Apply default_manage_alerts_ui_toggle config to Loki datasource

- Update AlertingSettings component to use config.defaultDatasourceManageAlertsUiToggle
- Change from options.jsonData.manageAlerts !== false to nullish coalescing operator
- Add comprehensive tests for config behavior
- Ensures consistency with Prometheus datasource implementation from PR #98441

Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
2025-11-14 11:52:45 +01:00
Kevin Minehart
9376d569cc CI: Fix release-build bug; github.repository includes org (#113909)
* CI: Fix release-build bug; github.repository includes org

* set pipefail

* fix notify in release-build; this step should fail if it actually fails
2025-11-14 10:27:32 +00:00
Ida Štambuk
c2489d2768 Dynamic Dashboards: Fix dashboard-group-panels E2E tests (#113902) 2025-11-14 11:25:59 +01:00
Ashley Harrison
67444cee78 Storybook: Set role="menuitem" on storybook menu links, fix positioning to not stretch menu (#113705)
* set role="menuitem" on storybook menu links, fix positioning to not stretch menu

* fix description/icon contrast for active items
2025-11-14 10:20:18 +00:00
Ashley Harrison
bfee2ecc65 Chore: Rename render method on classes which aren't actually react class components (#113808)
* rename canvas class method so it's not falsely marked as a react class component

* also rename scene method

* rename render method in OptionsPaneCategoryDescriptor and OptionsPaneItemDescriptor

* rename render to setup in test scenario class
2025-11-14 10:20:01 +00:00
Will Browne
1535cfc17b Plugins: Datasource breadcrumb link should link to settings tab (#113862)
datasource breadcrumb link should link to settings tab
2025-11-14 10:03:39 +00:00
renovate-sh-app[bot]
9ad6507eef chore(deps): update yarn to v4.11.0 (#113884)
| datasource | package      | from   | to     |
| ---------- | ------------ | ------ | ------ |
| npm        | @yarnpkg/cli | 4.10.3 | 4.11.0 |
| npm        | @yarnpkg/cli | 4.9.4  | 4.11.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 10:50:14 +01:00
Lauren
d8a5d8d882 Alerting: Update UI of instance counts on triage page (#113660)
* Alerting: Update UI of instance counts on triage page

* make boxes full height

* resolve PR comments- use grafana-ui components

* refactoring
2025-11-14 09:45:57 +00:00
renovate-sh-app[bot]
3fffb2d998 fix(deps): update dependency @grafana/plugin-ui to ^0.11.0 (#113886)
| datasource | package            | from    | to     |
| ---------- | ------------------ | ------- | ------ |
| npm        | @grafana/plugin-ui | 0.10.10 | 0.11.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-14 10:43:52 +01:00
Georges Chaudy
1162fa5104 kvstore: Add optimistic locking for unified resource storage backend (#113230)
* Add optimistic concurrency

* add optimistic concurrency

* fix test

* nit

* fix tests for sql

* fix tests for sql

* rebase fix

* add one more check

* Implement GetLatestAndPredecessor method in datastore and add corresponding tests. This new functionality retrieves the latest resource version and its immediate predecessor, handling cases for single and non-existent resources. Update WriteEvent to utilize this method for improved optimistic concurrency control.

* Enhance optimistic concurrency control in WriteEvent method. Added checks for concurrent create operations to ensure only one succeeds, preventing race conditions. Updated tests to validate this behavior with multiple concurrent create attempts.

* lint

* Refactor optimistic concurrency check in WriteEvent method. Simplified the logic by removing unnecessary condition for single version existence, ensuring more robust handling of concurrent modifications.
2025-11-14 10:42:39 +01:00
Kevin Minehart
8c3c3a851f CI: Continue notify even on error (#113906) 2025-11-14 09:41:47 +00:00
Roberto Jiménez Sánchez
1cc21a0705 Provisioning: Make image renderer note optional in PR comments (#113837)
* Provisioning: Remove image renderer note from PR comment template

Removes the 'NOTE: The image renderer is not configured' message from
the pull request comment template when image renderer is unavailable.
This addresses issue #656 in git-ui-sync-project.

- Updated commentTemplateMissingImageRenderer to be empty
- Updated testdata to reflect the change
- All unit tests pass

* Provisioning: Make image renderer note optional in PR comments

Make the image renderer note in pull request comments optional based on
the allowImageRendering configuration flag. When enabled, the note now
includes a link to the setup documentation.

- Add showImageRendererNote boolean field to commenter struct
- Update NewCommenter to accept showImageRendererNote parameter
- Update template to conditionally show note with documentation link
- Pass allowImageRendering from APIBuilder to commenter in register.go
- Update ProvidePullRequestWorker to use cfg.ProvisioningAllowImageRendering
- Add tests to verify note appears/disappears based on flag

Fixes https://github.com/grafana/git-ui-sync-project/issues/656

* Format code with go fmt

* Remove redundant text from image renderer note

Remove 'The image renderer is not configured.' from the note message.
The note now focuses on actionable guidance with the documentation link.

* Fix compilation error: use cfg.ProvisioningAllowImageRendering directly

Cannot access unexported field allowImageRendering from webhooks package.
Use cfg.ProvisioningAllowImageRendering directly since we have access to cfg.
2025-11-14 10:33:28 +01:00
Gareth
5b34d92dca OpenTSDB: Fix type mismatch with counterMax and counterResetValue (#113835)
* fix

* update test
2025-11-14 18:31:09 +09:00
Tobias Skarhed
668ef398d6 Scopes: Don't redirect on URL sync (#113851)
* Add toggle for redirection when applying a scope

* Add e2e tests

* Update unit tests
2025-11-14 10:15:28 +01:00
Kevin Minehart
d92cb9f7a6 CI: Make notify-pr workflow optional (#113896)
* CI: Make notify-pr workflow optional

* also set repo to the current repo

* fix find-pr
2025-11-14 08:40:03 +00:00
Alex Khomenko
326d374266 Provisioning: display limits (#113778)
* Provisioning: Add tier limit messages

* Style the icon

* Add upgrade link

* update free tier check

* Update repository button

* Add trial edition

* Fix card layout

* use custom link

* use variable text

* Update messages

* comment
2025-11-14 08:10:13 +00:00
grafana-pr-automation[bot]
5717da4b22 I18n: Download translations from Crowdin (#113883)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-14 00:43:10 +00:00
Yuri Tseretyan
0ab58642c4 Alerting: Resize created_by and updated_by columns in alert rules tables (#113870) 2025-11-13 17:15:54 -05:00
Victor Marin
09a7a0c94f CSV Export: FieldType.other objects will be stringified (#113854) 2025-11-13 15:11:10 -05:00
Galen Kistler
23c192f330 TableCellInspector: fix runtime error thrown when inspecting non-string table cells (#113865)
* fix: old table throwing error on inspect of dates and empty cells

---------

Co-authored-by: Paul Marbach <paul.marbach@grafana.com>
2025-11-13 19:48:40 +00:00
Matt Cowley
6b26391cf2 Theme: Add breakpoint methods for container queries (#113619)
* Theme: Add breakpoint methods for container queries

* Page: Define page as inline container
2025-11-13 18:55:28 +00:00
renovate-sh-app[bot]
cd40f7e36c chore(deps): update dependency micro-memoize to v4.2.0 (#113815)
| datasource | package       | from  | to    |
| ---------- | ------------- | ----- | ----- |
| npm        | micro-memoize | 4.1.3 | 4.2.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 17:33:08 +00:00
renovate-sh-app[bot]
bfca0d578c chore(deps): update dependency lossless-json to v4.3.0 (#113814)
| datasource | package       | from  | to    |
| ---------- | ------------- | ----- | ----- |
| npm        | lossless-json | 4.2.0 | 4.3.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 17:32:38 +00:00
renovate-sh-app[bot]
060af9cede chore(deps): update dependency @openfeature/web-sdk to v1.7.1 (#113811)
| datasource | package              | from  | to    |
| ---------- | -------------------- | ----- | ----- |
| npm        | @openfeature/web-sdk | 1.6.1 | 1.7.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 17:32:12 +00:00
Matheus Macabu
4ee2112ea4 Secrets: Remove unused register_api_server setting (#113849) 2025-11-13 09:26:04 -08:00
Charandas
9ca6ad3b49 OFREP: add ST builder for the authorizer, APIEnabled=false needs it (#113809) 2025-11-13 09:19:16 -08:00
xavi
3f48a6358f Stricter validation for redirect URLs (#113852) 2025-11-13 18:04:20 +01:00
Roberto Jiménez Sánchez
c1485ecf5f Provisioning: detect stale sync status and trigger resync (#113826)
* provisioning: detect stale sync status and trigger resync

When sync jobs expire and are cleaned up by the expired job cleanup
controller, the Repository sync status remains stuck in Pending or
Working state. This prevents new sync jobs from being queued because
shouldResync() blocks on these states.

This change adds detection logic in shouldResync() to check if a sync
job referenced in the sync status still exists. If the job doesn't exist
(NotFound), we trigger a resync to reconcile the stale state.

Fixes grafana/git-ui-sync-project#626

* test: remove unused mocks and fix test case

- Remove unused mockRepositoryLister and mockRepositoryNamespaceLister types
- Remove unused imports (labels, listers)
- Remove test case for sync disabled scenario as we don't care about sync enabled state when detecting stale status
2025-11-13 16:58:33 +00:00
Kevin Yu
1491607e8e CloudWatch: Add links to data source docs in the config editor (#113795)
* CloudWatch: Add links to data source docs in the config editor

* fix tests
2025-11-13 08:54:00 -08:00
renovate-sh-app[bot]
7c709f0b89 chore(deps): update dependency i18next to v25.6.1 (#113813)
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | i18next | 25.5.2 | 25.6.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 16:41:19 +00:00
renovate-sh-app[bot]
42bca68966 chore(deps): update dependency @reduxjs/toolkit to v2.10.1 (#113812)
| datasource | package          | from  | to     |
| ---------- | ---------------- | ----- | ------ |
| npm        | @reduxjs/toolkit | 2.9.2 | 2.10.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 16:40:33 +00:00
Jesse David Peterson
df44209e53 Dashboards: Fix timeseries off-by N time shift bug after mouse x-axis zoom in panel (#113821)
fix(panel-time-range): override method to account for time shift
2025-11-13 12:25:05 -04:00
Victor Marin
ed17fb22dc Dashboards: Query variable editor sets default ds on variable on init (#113843)
* Query variable editor sets default ds on var instead of undefined

* fix old arch tests
2025-11-13 18:19:10 +02:00
Torkel Ödegaard
1bb9de6f75 Sidepane: Remove padding (#113819) 2025-11-13 16:36:18 +01:00
Yuri Tseretyan
6603abc873 Alerting: Support for imported receivers in API (#112138)
* add support for converting Mimir integrations to Integration
* implement imported config revision
* update service to load staged receivers if configured
* make sure non-Grafana origin cannot be mutated
* set access control metadata for imported origin
* set includeImported from feature flag. Disabled for service used by provisioning
* add tests for new functionality
* add snapshot-based integration test
2025-11-13 15:35:21 +00:00
Will Browne
f041563df3 Plugins: Prevent passing host environment variables to plugin processes by default (#113412)
* remove pluginsSkipHostEnvVars toggle

* fix tests
2025-11-13 15:31:57 +00:00
Oscar Kilhed
ae8a8cf16e Dynamic dashboards: Fix empty space under time controls when dashboard has many variables (#113765)
* fix space under time controls by using floats instead of flex

* remove commented out styles

* adjust spacing: use marginBottom and reduce bottom padding

* make Add variable button float inline with variables
2025-11-13 16:16:21 +01:00
Sven Grossmann
906d32b437 Tempo: Disable streaming for grafana-assistant-app (#113847) 2025-11-13 15:54:22 +01:00
Alexander Akhmetov
44a92d252b Alerting: Support rule title search on the backend (#113738) 2025-11-13 15:52:14 +01:00
Jack Baldry
7fe5772888 Restructure As code and developer resources (#113845) 2025-11-13 14:04:57 +00:00
Ieva
0d67fac87f RBAC: Correctly display the new roles after updating user, service account and team roles (#113783)
always fetch the new roles after updating user/team roles
2025-11-13 13:29:17 +00:00
Piotr Jamróz
3e4933ec60 Span Details: Two-column view (#112856)
* Span Details: Two-column view

Fixes #108465

* Use different flow

* Remove redundant comment

* Fix resizing and background color

* Clean up styles

* Fix tests

* Clean up

* Update types

* Revert i18n key changes

* Clean up i18n keys
2025-11-13 13:59:18 +01:00
Victor Marin
a2150b0b79 Deps: Bump scenes version to v6.46.0 (#113823)
bump scenes
2025-11-13 14:33:43 +02:00
Ashley Harrison
f5f0c1e6f6 Playwright: fix timezone test to work at all times (#113827)
* fix timezone test to work at all times

* remove unused imports
2025-11-13 12:23:25 +00:00
Alexander Zobnin
b550750a9b Zanzana: Rename namespace to req_namespace label (#113822) 2025-11-13 12:08:10 +00:00
Jean-Philippe Quéméner
e92a976de2 fix(unified-storage): process list items concurrently (#113801) 2025-11-13 12:08:14 +01:00
Jesse David Peterson
108693eb31 TimeSeries: X-axis (time range) click-and-drag panning in panel (#112982)
* feat(time-range): click and drag interaction to pan x-axis over time

* feat(timeseries): add x-axis interaction area uPlot plugin

* test(timeseries): validate x-axis pan with Playwright browser test

* refactor(uplot-config): simplify state management for x-axis panning

* refactor(uplot-config): plot state union type

* fix(time-range-pan): simplify calcs, mouse handler cleanup function
2025-11-13 06:33:09 -04:00
Gabriel MABILLE
97a6ab7b1c AuthZ: Remove outdated comments (#113817) 2025-11-13 11:06:02 +01:00
Matt Cowley
3bd49f6546 fix(TopBar): consistent ToolbarButton styling for sidebar buttons (#113804)
* Remove custom styles from ExtensionToolbarItemButton

* Use active ToolbarButton variant for ExtensionToolbarItemButton

* Use active ToolbarButton variant for HelpTopBarButton

* Simplify ExtensionToolbarItemButton conditional logic

* Replace nested ternary with iife
2025-11-13 09:57:27 +00:00
Roberto Jiménez Sánchez
73657be5e7 Provisioning: Fix history write for expired jobs (#113764)
* refactor: Move job cleanup to separate controller and fix history write

- Created JobCleanupController in apps/provisioning/pkg/controller
- Separated cleanup logic from ConcurrentJobDriver
- Fixed bug where expired jobs were not written to history
- Added comprehensive tests with 93.8% coverage
- Removed cleanup interval parameter from ConcurrentJobDriver
- Cleanup now properly follows Complete + WriteJob pattern

Fixes expired jobs being lost instead of archived

* refactor: Update lease renewal interval to use jobExpiry variable

- Changed the lease renewal interval in the GetPostStartHooks method to utilize the jobExpiry variable for improved clarity and maintainability.

* Format code

* Fix Unix milliseconds

* fix: correct Unix timestamp assertions and remove duplicate test expectations

- Changed Unix() to UnixMilli() for correct millisecond timestamp validation
- Removed duplicate store.AssertExpectations(t) calls throughout tests
2025-11-13 10:54:07 +01:00
Dafydd
3082a762d3 Update grafana socks proxy information (#110832)
Co-authored-by: Jacob Valdez <jacob.valdez@grafana.com>
Co-authored-by: Irene Rodríguez <irene.rodriguez@grafana.com>
2025-11-13 10:53:54 +01:00
Gabriel MABILLE
b4b410f5be grafana-iam: Register a flag to configure dualwrite modes (#113610)
* `grafana-iam`: Register a flag to configure dualwrite modes

* Streamline helper code

* Launch sync job only with mode 1 to 3
2025-11-13 10:34:55 +01:00
Mustafa Sencer Özcan
6eac95f860 fix: inject index min update interval into resource server (#113816) 2025-11-13 09:27:54 +00:00
Ihor Yeromin
5091c946b5 Correlations: Remove correlations feature toggle (#113752)
* Remove correlations feature toggle

The correlations feature toggle has been removed from the registry and all
usages throughout the codebase have been cleaned up. Correlations are now
always available.
2025-11-13 10:21:46 +01:00
Tom Ratcliffe
6da33546a5 Chore: Mark more files as generated in gitattributes (#113776) 2025-11-13 09:09:15 +00:00
Torkel Ödegaard
ac5e54a225 Prom/Loki: Query editor padding fix (#113727) 2025-11-13 09:56:10 +01:00
Gabriel MABILLE
0a9f93436a Docs: Fix grpc server key file param in config ini (#113798)
Docs: Fix config ini grpc server key param
2025-11-13 09:40:47 +01:00
renovate-sh-app[bot]
eaa1b62c01 fix(deps): update dependency @lezer/lr to v1.4.3 (#113787)
| datasource | package   | from  | to    |
| ---------- | --------- | ----- | ----- |
| npm        | @lezer/lr | 1.4.2 | 1.4.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 05:30:10 +00:00
renovate-sh-app[bot]
7ee61a9277 fix(deps): update dependency @grafana/assistant to v0.1.4 (#113786)
| datasource | package            | from  | to    |
| ---------- | ------------------ | ----- | ----- |
| npm        | @grafana/assistant | 0.1.1 | 0.1.4 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 05:29:42 +00:00
renovate-sh-app[bot]
00e4d98ca3 chore(deps): update dependency ol-mapbox-style to v13.1.1 (#113785)
| datasource | package         | from   | to     |
| ---------- | --------------- | ------ | ------ |
| npm        | ol-mapbox-style | 13.1.0 | 13.1.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 05:29:11 +00:00
renovate-sh-app[bot]
55a29bd2d1 fix(deps): update dependency ol-ext to v4.0.36 (#113788)
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | ol-ext  | 4.0.35 | 4.0.36 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 03:37:48 +00:00
renovate-sh-app[bot]
a5b8038f35 chore(deps): update dependency nanoid to v5.1.6 (#113497)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | nanoid  | 5.1.5 | 5.1.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-13 03:33:43 +00:00
Ashley Harrison
3563388d4d Frontend Service: Client side redirect to custom domain (#113717)
* handle redirect in frontend service

* add comments
2025-11-13 03:32:14 +00:00
Ashley Harrison
6c8c4c32b5 Chore: Cleanup FEP feature toggles (#113772)
* reassign some feature toggles

* remove templateVariablesUsesCombobox toggle as it's unused
2025-11-13 03:31:18 +00:00
grafana-pr-automation[bot]
e60ad6f195 I18n: Download translations from Crowdin (#113805)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-13 00:40:07 +00:00
Paul Marbach
3e31f7b713 Suggestions: Update ownership of core files and improve some types (#113254) 2025-11-12 16:31:33 -05:00
Charandas
cbd794d0b8 Provisioning: fix regression with webhook authz failing in MT (#113793) 2025-11-12 13:21:28 -08:00
Johnny Kartheiser
a67fad4734 alerting: best practices docs update (#113188)
* alerting: best practices docs update

best practices docs update re: recording rules

* Update _index.md
2025-11-12 19:26:51 +00:00
Adela Almasan
a194219365 VizSuggestions: Add new feature toggle (#113549) 2025-11-12 13:26:29 -06:00
Isabella Siu
ec9f39d54a AWS Datasources: add toggle for http proxy (#113777) 2025-11-12 13:51:23 -05:00
renovate-sh-app[bot]
c9e381b96f chore(deps): update prom/prometheus docker tag to v3.7.3 (#113515)
| datasource | package         | from   | to     |
| ---------- | --------------- | ------ | ------ |
| docker     | prom/prometheus | v3.7.2 | v3.7.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-12 17:32:15 +00:00
renovate-sh-app[bot]
97c8121785 chore(deps): update grafana/alloy docker tag to v1.11.3 (#113498)
| datasource | package       | from    | to      |
| ---------- | ------------- | ------- | ------- |
| docker     | grafana/alloy | v1.11.2 | v1.11.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-12 17:31:43 +00:00
renovate-sh-app[bot]
59ff606106 chore(deps): update dependency @openfeature/core to v1.9.1 (#113496)
| datasource | package           | from  | to    |
| ---------- | ----------------- | ----- | ----- |
| npm        | @openfeature/core | 1.9.0 | 1.9.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-12 17:30:26 +00:00
renovate-sh-app[bot]
4cb290e4cc chore(deps): update dependency @formatjs/intl-durationformat to v0.7.6 (#113495)
| datasource | package                       | from  | to    |
| ---------- | ----------------------------- | ----- | ----- |
| npm        | @formatjs/intl-durationformat | 0.7.4 | 0.7.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-12 17:29:51 +00:00
Johnny Kartheiser
1f14f1447f alerting docs: target data source clarification (#113126)
adding information to create grafana managed recording rules doc per support request 16892
2025-11-12 10:51:13 -06:00
Johnny Kartheiser
67f811b6d8 alerting: mute timing clarification (#113129)
* alerting: mute timing clarification

clarify that mute timing takes precedence over active timing

* alerting docs: best practices addition

draft content for best practices re: recording rules

* wrong branch

* alerting: best practices docs

best practices addition re: recording rules

* smh
2025-11-12 10:49:50 -06:00
Alexander Zobnin
4bca10195e Zanzana: Fix shadow client metric (#113771) 2025-11-12 16:48:48 +00:00
Andres Torres
5162988fa1 feat(semconv): Add grafana namespace name attribute (#113767) 2025-11-12 16:33:26 +00:00
Alexa Vargas
6eabb9b2e4 Dashboard Library: Implement analytics tracking for Suggested Dashboards (#113417)
Implement analytics tracking for Suggested Dashboard
* loaded - Tracks when library content becomes available
* searchPerformed - Tracks search behavior (privacy-preserving, no query text)
* itemClicked - Tracks dashboard selection
* mappingFormShown - Tracks when datasource mapping form is displayed
* mappingFormCompleted - Tracks successful mapping form completion

---------

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>
Co-authored-by: nmarrs <nathanielmarrs@gmail.com>
2025-11-12 17:13:31 +01:00
Sven Grossmann
d35524915c BackendSrv: Remove extra console.logs in chunked (#113446)
BackendSrv: Remove extra `console.logs`
2025-11-12 16:06:09 +00:00
Alexander Zobnin
5ca48bc73d folder-operator: use new zanzana write APIs (#113732) 2025-11-12 17:03:02 +01:00
Dana Axinte
06954b7b0a Caching: Remove tsl memcached feature toggle (#113715)
* Remove tsl memcached feature toggle

* Remove feature flag from docs
2025-11-12 15:49:28 +00:00
Torkel Ödegaard
1f558b1e06 PanelChrome: Feature toggle increased panel header height and padding (#112613)
* PanelChrome: Feature toggle for increase header and content panel padding

* Update

* Update to panel menu

* Fix lint

* Revert theme feature ttoggle changes

Signed-off-by: Torkel Ödegaard <torkel@grafana.com>

* Update

* fix storybook

* Update

---------

Signed-off-by: Torkel Ödegaard <torkel@grafana.com>
2025-11-12 16:40:46 +01:00
Jean-Philippe Quéméner
a8dda428ce fix(dashboard): proper check int size (#113766) 2025-11-12 15:35:38 +00:00
Torkel Ödegaard
d1d8aa7c14 PanelEdit: Remove double border when viz picker is open (#113729) 2025-11-12 16:04:54 +01:00
Torkel Ödegaard
0392bf5724 ExternalPlugins: Restore backward compatability for util function (#113735)
* ExternalPlugins: Restore backward compatability for util function

* tweak

* fix withValue => withTitle
2025-11-12 16:04:35 +01:00
Jean-Philippe Quéméner
16ddd536ab fix(dashboard): proper check uint32 size (#113760) 2025-11-12 14:55:59 +00:00
Paul Marbach
4b1fbcbd04 Cleanup: Remove CSV drag-and-drop snapshot query feature (#113645)
* Chore: Remove editPanelCSVDragAndDrop feature

* update i18n

* fix issues from PR
2025-11-12 09:47:44 -05:00
Andres Martinez Gotor
d83c35fd71 Advisor: App installer setup (#113525) 2025-11-12 15:32:21 +01:00
Mike
6c512dabdc Secrets: Fix MariaDB syntax error due to unsupported CTE syntax (#111610) (#113690)
* Secrets: fix MariaDB syntax error due to unsupported CTE syntax (#111610)

* parametrize guid/created columns and re-generate test fixtures

---------

Co-authored-by: Matheus Macabu <macabu.matheus@gmail.com>
2025-11-12 15:15:43 +01:00
Yunwen Zheng
3e2dccb544 FilesView: .keep file should not be clickable and no actions available (#113687)
* FilesView: .keep file should not be clickable and no actions available
2025-11-12 09:06:41 -05:00
Mustafa Sencer Özcan
735b776edc fix: cleanup legacy resource if it is created in legacy during dual update (#113753) 2025-11-12 15:02:36 +01:00
Roberto Jiménez Sánchez
cdc6a6114c Provisioning: Improve logging and tracing in job processing (#113454)
* Provisioning: Improve logging and tracing in job processing

- Add comprehensive tracing with OpenTelemetry spans across all job operations
- Enhance logging with consistent style: lowercase, concise messages, appropriate log levels
- Use past tense for completed lifecycle events (e.g., 'stopped' vs 'stop')
- Add structured logging with contextual attributes for better searchability
- Handle graceful shutdowns without throwing errors on context cancellation
- Refactor Cleanup method into listExpiredJobs and cleanUpExpiredJob for better code quality
- Avoid double logging by only logging errors when handled locally
- Add tracing and logging to historyjob controller cleanup operations

Files modified:
- pkg/registry/apis/provisioning/jobs/driver.go: Add tracing spans and improve error handling for graceful shutdown
- pkg/registry/apis/provisioning/jobs/concurrent_driver.go: Add tracing and consistent logging
- pkg/registry/apis/provisioning/jobs/persistentstore.go: Add comprehensive tracing and logging to all public methods, refactor cleanup
- apps/provisioning/pkg/controller/historyjob.go: Add tracing and improve logging consistency

* Update pkg/registry/apis/provisioning/jobs/persistentstore.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Refactor logging in persistentstore.go

- Remove debug log statements at the start of job operations for cleaner output
- Maintain structured logging with contextual attributes for improved traceability

Files modified:
- pkg/registry/apis/provisioning/jobs/persistentstore.go: Clean up logging for job operations

* Enhance logging and tracing in provisioning job operations

- Introduce OpenTelemetry spans for better observability in job processing and webhook handling
- Improve structured logging with contextual attributes for key operations
- Remove unnecessary tracing spans in long-running functions to streamline performance
- Update error handling to record errors in spans for better traceability

Files modified:
- pkg/registry/apis/provisioning/controller/repository.go: Add tracing and structured logging to sync job operations
- pkg/registry/apis/provisioning/jobs/concurrent_driver.go: Remove tracing span from long-running function
- pkg/registry/apis/provisioning/jobs/driver.go: Enhance logging and tracing in job processing
- pkg/registry/apis/provisioning/webhooks/webhook.go: Implement tracing and structured logging for webhook connections

* Update pkg/registry/apis/provisioning/jobs/driver.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Improve error handling in ConcurrentJobDriver to differentiate between graceful shutdown and unexpected stops

* Remove unused import in driver.go to clean up code

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 14:59:27 +01:00
beejeebus
6d64c373ce Allow FlagQueryServiceWithConnections to enable datasource config CRUD
The FlagGrafanaAPIServerWithExperimentalAPIs is only available when
`app_mode=development`. We have a more specific flag that is usable in
production, so use that.

Also, there was some old code constraining these APIs to a static list
of datasources. We don't need that anymore, so this PR removes it.

The FlagQueryServiceWithConnections is left as is, because there are
multiple existing tests that rely on this development-only, experimental
flag. I don't want to understand why that is.
2025-11-12 08:48:46 -05:00
Jean-Philippe Quéméner
b9e39cdfcc chore(unified-storage): add debug log for read after write (#113747) 2025-11-12 14:39:03 +01:00
Gareth
4e050267c7 decouple the opentsdb data source from core (#113588)
* enable linting rules for opentsdb

* remove core imports

* update plugin.json

* write backend standalone files

* remove frontend core imports

* add yarn workspace

* remove core import for the plugin

* update grafana dependency

* update package.json

* add jest config
2025-11-12 22:33:17 +09:00
Lauren
ed19a92a2a Alerting: Fix to prevent regex escape on search input query (#113734)
prevent regex escape on search input query
2025-11-12 12:48:20 +00:00
Piotr Jamróz
d54a2b33fe Explore: Ensure data source is part of query object in internal data links (#112949)
* Explore: Ensure data source is part of query object in internal data links

Fixes #112945

* Fix tests

* Fix tests

* Update tests

* Update tests

* Add a safeguard for misconfigured links

* Update logic to update uid when only type or name is defined
2025-11-12 13:40:11 +01:00
Alex Khomenko
4eca53890f Provisioning: Collapse repository status messages (#113666)
* Provisioning: Add collapsible pull status messages

* Use text styles

* Add animation

* Fix error message

* cleanup

* a11y

* more a11y
2025-11-12 12:21:58 +00:00
Ivan Ortega Alba
e463781077 Schema: convert dashboards from v1beta1 to v2beta1 (#109037)
- Implement full conversion pipeline from v1beta1 → v2beta1
- Ensure frontend–backend parity for all dashboard serialization paths
- Add automatic data loss detection for conversions (panels, queries, annotations, links, variables)
- Extract atomic conversion functions for v0 → v1beta1 → v2alpha1 → v2beta1
- Introduce conversion metrics and detailed logging for loss tracking
- Normalize datasource resolution, defaults, and annotation processing
- Improve panel layout serialization and y-coordinate normalization
- Fix inconsistencies in nested panels and collapsed row behavior
- Refine variable handling:
  - Filter refId from variable query specs
  - Default variable refresh to 'never' (matches frontend)
  - Fix constant and interval variable handling for missing queries
- Unify schema defaults (enable, hide, iconColor, editable, liveNow)
- Fix pluginId usage (UID vs type) and datasource references
- Fix metrics.go bug swallowing errors (return nil → return err)
- Add tests for version-specific conversion error handling
- Add data loss detection tests using source/target version comparison
- Clean up lint issues, legacy code, and redundant files
- Update OpenAPI snapshots and migrated dashboards
- Improve backend migrator to reuse datasource provider and match frontend logic

Co-authored-by: Haris Rozajac <haris.rozajac12@gmail.com>
Co-authored-by: Oscar Kilhed <oscar.kilhed@grafana.com>
Co-authored-by: Stephanie Hingtgen <stephanie.hingtgen@grafana.com>
2025-11-12 11:43:46 +01:00
Sam Jewell
09942c08db Transforms: Extract Fields: Remove Deduplication feature toggle (#113709)
Remove extractFieldsNameDeduplication feature toggle

The extractFieldsNameDeduplication feature has reached GA (General Availability),
so the feature toggle is no longer needed. The name deduplication behavior is
now permanently enabled.

Changes:
- Removed feature toggle definition from registry.go
- Removed feature toggle check in extractFields.ts (always deduplicate now)
- Updated tests to remove feature toggle manipulation
- Regenerated feature toggle files
2025-11-12 10:08:13 +00:00
Sam Jewell
f0d18beaf3 AdHoc Filters in Tooltips: Remove feature toggle (#113695)
* Remove `dashboardDsAdHocFiltering` feature toggle

From our feature toggles machinery only.
Removing from our application code next.

* Remove feature toggle from application code
2025-11-12 10:05:30 +00:00
Alexander Zobnin
48438f49e7 grafana-iam: refactor resource permissions write to zanzana (#113700)
* grafana-iam: refactor resource permissions write to zanzana

* Fix linter

* fix linter
2025-11-12 10:23:15 +01:00
Chris Bedwell
6401901e5d GrafanaUI: Fix iconPlacement prop not being respected in LinkButton (#113708)
fix: iconPlacement now respected in LinkButton. Added tests.
2025-11-12 08:53:04 +00:00
Jean-Philippe Quéméner
76ab09a6a2 feat(unified-storage): add tracing to apistore (#113714) 2025-11-12 09:48:56 +01:00
grafana-pr-automation[bot]
04902b0419 I18n: Download translations from Crowdin (#113724)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-12 00:39:33 +00:00
Tom Ratcliffe
a9b52589ff Folders: Deprecate getFolderByUID method (#113173) 2025-11-11 18:11:57 +00:00
Yunwen Zheng
d8363bdfcf SaveProvisionedDashboardForm: When comment is edited, enable save button (#113686)
SaveProvisionedDashboardForm: When comment is edit, enable save button
2025-11-11 13:02:42 -05:00
Moustafa Baiou
559dab8b1b Alerting: Fix error when updating Alertmanager config with autogenerated receivers (#113710)
If an alert rule with an invalid receiver is created it breaks the entire alertmanager configuration rather than preventing the save.

This fixes the issue by erroring on save and apply, and logging invalid receivers only when applying the config after an update.

Introduced in #111838
2025-11-11 16:53:36 +00:00
Lauren
c4cf454cf0 Alerting: Fix label value dropdown suggestions in alert rule editor (#113702) 2025-11-11 16:40:23 +00:00
Josh Hunt
96f34f8f56 EchoSrv: Enable auto route tracking for Azure App Insights (#113354)
* Echo: Enable auto route tracking with Azure App Insights

* Add server config option to disable auto route tracking

* fix not using minified js
2025-11-11 16:33:46 +00:00
Laura Fernández
4ae1774e1f Chore: remove gf-form in grafana-ui components (#113659) 2025-11-11 15:58:16 +01:00
Ashley Harrison
ee6c8a6e20 Storybook: Ensure panels have unique titles (#113703)
ensure panels have unique titles
2025-11-11 13:47:31 +00:00
Ashley Harrison
562e7ba043 Frontend Service: Ensure the favicon/appletouchicon/loadinglogo are using the CDN url (#113699)
* ensure the favicon, appletouchicon and loadinglogo are using the CDN url

* add nosec comments since we control the cdn url
2025-11-11 13:47:21 +00:00
Rafael Bortolon Paulovic
194f7cb4f0 fix: detect circular references in GetDescendants (#113672)
* fix: detect circular references in GetDescendants

* chore: use map[string]bool and instantiate at the beginning of the function
2025-11-11 12:46:35 +01:00
Tom Ratcliffe
f34f7579a2 Stars: Update star toolbar button to include name only in the label (#113678) 2025-11-11 09:42:27 +00:00
Alexa Vargas
62eef87208 Dashboard Library: Integrate community dashboards on Suggested Dashboards Flow (#112808)
* Extend interpolate endpoint to support community dashboard json interpolation
Added unit tests

* Implement Frontend Side
- Show tabs
- Fetch Community dashboads
- Use DashboardCard component
- Search grafana dashboard in the community tab
- Make Tabs and pagination sticky
- Adjust titles to be scoped by datasource name/type
- Add skeleton loading for community tabs and pagination
- Add dashboard details tooltip
- Bring old datasource-provisioned box back and rely on new feature toggle for community dashboards
- update i18n
- update swagger
---------

Co-authored-by: Juan Cabanas <juan.cabanas@grafana.com>
Co-authored-by: nmarrs <nathanielmarrs@gmail.com>
2025-11-11 10:40:39 +01:00
Gábor Farkas
34e85113d2 datasources: apiserver: removed unnecessary code (#113384)
* datasources: apiserver: removed unnecessary code

* workspace fixes
2025-11-11 09:25:22 +01:00
Stephanie Hingtgen
2d4e432239 Dashboard provisioning: Add support for v2 schema (#113620) 2025-11-10 17:45:37 -06:00
Adam Simpson
fcc243886c chore: change ownership of disableSSEDataplane and sseGroupByDatasource (#113640) 2025-11-10 20:50:29 +00:00
Brendan O'Handley
43de885aad Feature toggles: remove unused recordedQueriesMulti feature toggle (#113616)
remove recordedQueriesMulti feature toggle

Co-authored-by: Tania B. <10127682+undef1nd@users.noreply.github.com>
2025-11-10 14:31:43 -06:00
Luminessa Starlight
b6bd31a4aa Slider: Add support for decimal values (#113473)
* UI: Fix Slider component to handle decimal inputs correctly

* format code and run eslint fix

* fix Slider to have:
- "single" source of truth for state
- state synchronization for controlled values
- clamp values to step
- disallow decimal values in input when min+step are integers
- tests for the new functionality
- design decision included in docs
- behavior notes in docs

* allow non-numeric characters all the time
always parse decimal numbers, stripping non-numerics
integer coercion is implicitly handled in clamping

---------

Co-authored-by: Harshada Gawas <harshadagawas95@gmail.com>
2025-11-10 14:41:39 -05:00
Moustafa Baiou
dd0a2d4cff Alerting: Add validation to check updates on rule groups (#113669)
This moves some of the validation logic for rule groups from the legacy storage layer to the validator.
2025-11-10 14:40:35 -05:00
Jean-Philippe Quéméner
142340e0ff refactor(folders): use set to detect circular references (#113665) 2025-11-10 20:37:02 +01:00
Sam Jewell
c49caead25 [--Dashboard-- data source] AdHoc filtering: Remove feature toggle (#113674)
* Remove dashboardDsAdHocFiltering feature toggle

The dashboardDsAdHocFiltering feature toggle has been enabled by default
and is now in General Availability stage. This commit removes the feature
toggle and makes the AdHoc filtering functionality for the dashboard
datasource permanently available.

Changes:
- Remove feature toggle from registry.go
- Regenerate feature toggle files
- Remove conditional checks in frontend code
- Update tests to reflect permanent enablement
- Always show AdHoc Filters toggle in dashboard query editor
- Always enable dashboard datasource in DataSourcePicker for variables

* Remove unused imports

* Fix Prettier formatting issues
2025-11-10 17:17:49 +00:00
ismail simsek
ac9259d6a4 Chore: Update pyroscope error sources logging (#113175)
* remove loggers

* more downstream errors

* more downstream errors 2

* uber nit
2025-11-10 16:47:29 +00:00
Moustafa Baiou
70e30df6ce Alerting: Fix support for converted Prometheus rules in app-platform apis (#113648)
* Alerting: Fix support for converted Prometheus rules in app-platform apis

Retrieving converted Prometheus retrieval rules was not supported in the app-platform apis and was throwing a 500 error due to the provenance not being handled properly.

Also adds a test to cover converted Prometheus rules when getting rules.

Closes https://github.com/grafana/alerting-squad/issues/1200

* add test to confirm provenance compatibility
2025-11-10 16:43:38 +00:00
Paul Marbach
fb20d7311e Chore: Change ownership of some Dataviz feature flags to Datapro (#113528)
* Chore: Change ownership of some Dataviz feature flags

* retain ownership of csv drag n drop
2025-11-10 15:26:38 +00:00
Jesse David Peterson
243f1fc64b Timeseries: Change mouse cursors to indicate active x-axis and y-axis zoom interactions (#113465)
* feat(panel-zoom): change mouse cursor when zooming x-axis or y-axis

* test(panel-zoom): browser test mouse cursor change interactions

* fix(mouse-cursor-styles): no need for important
2025-11-10 11:26:00 -04:00
Bruno
f094a9d5e5 Caching: Add flag to disable clean cache button (#113598)
Caching: add flag to disable clean cache button
2025-11-10 12:08:56 -03:00
Gábor Farkas
2dc48c0b98 datasources: querier: add mode-info (#113592)
* datasources: querier: add mode-info

* fixed unit test
2025-11-10 15:48:59 +01:00
Irene Rodríguez
704c6a47e3 Docs: Add Tempo to the list of unsupported data sources (#113667) 2025-11-10 14:42:44 +00:00
Andres Martinez Gotor
1a2beae38a Preinstall: Replace auto update feature flag with a permanent one (#113586) 2025-11-10 15:06:30 +01:00
Tom Ratcliffe
9a542489a7 APIs: Fix pre-processing of getApiResources & update godoc for teams endpoints (#113536) 2025-11-10 12:59:40 +00:00
Roberto Jiménez Sánchez
746efb4c56 Provisioning: Include ref field in DELETE endpoint response for branch operations (#113615)
Fix: Include ref field in DELETE endpoint response for branch operations

When deleting a dashboard file via DELETE endpoint with a ref query parameter
(for branch operations), the response was missing the ref field. This caused
the frontend branch workflow success handler to fail silently.

The issue was an inverted boolean condition in the Delete method. The code
was setting file.Ref = opts.Ref when shouldUpdateGrafanaDB returned true
(main branch operations), but it should have been setting it when false
(branch operations), since we read the file with an empty ref.

Fixed by inverting the condition from:
  if r.shouldUpdateGrafanaDB(opts, nil)
to:
  if !r.shouldUpdateGrafanaDB(opts, nil)

This ensures the ref field is properly included in the ResourceWrapper
response for branch operations.
2025-11-10 13:34:46 +01:00
Ezequiel Victorero
32db7e176d ShortURL: Fix wrong creation timestamp conversion (#113646) 2025-11-10 09:14:51 -03:00
Mustafa Sencer Özcan
8ce9098765 test: improve folder integration test performance (#113518) 2025-11-10 13:05:05 +01:00
Alex Khomenko
a7ace2dcdd API clients: Use open_snapshots for possibleOpenAPISpecs (#113587)
* API clients: Use open_snapshots for possibleOpenAPISpecs

* Tweak logic to throw error if we can't load openapi specs

---------

Co-authored-by: Tom Ratcliffe <tom.ratcliffe@grafana.com>
2025-11-10 11:43:00 +00:00
Ashley Harrison
51c18b57a2 Chore: some any fixes (#113290)
* fix some anys in select styles

* remove anys from ModalsContext

* improve some types

* improve ArrayDataFrame

* restore behavior

* use unknown for Parser type
2025-11-10 10:57:33 +00:00
Ezequiel Victorero
cd91f858e6 ShortURL: Graduate api v1alpha1 to v1beta1 (#113597) 2025-11-10 07:29:33 -03:00
Ashley Harrison
834ff1be3c MultiCombobox: Fix a11y and enable storybook a11y tests (#113411)
fix multicombobox a11y and enable storybook a11y tests
2025-11-10 09:47:01 +00:00
Günther Grill
478ae025a3 docs: fix typo (#111821) 2025-11-10 10:00:22 +01:00
Bradley
5806196797 Remove 'oss' label from Query Caching documentation (#113656) 2025-11-10 10:00:05 +01:00
Ezequiel Victorero
24e4e0946d Dashboard: Improve search error response (#113617)
* Dashboard: Improve search error response

* improve errors
2025-11-08 12:58:51 +01:00
grafana-pr-automation[bot]
aa75cc5bbe I18n: Download translations from Crowdin (#113568)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-08 00:38:38 +00:00
Jacob Valdez
cb43dea319 docs: clarifying info on what's new lading page (#113562) 2025-11-07 16:10:39 -06:00
Jesse David Peterson
f3843fc67a Linter: Custom eslint rule to prevent in-repo plugins from reaching into neighbouring plugin code (#112248)
* feat(linter-rule): prevent cross plugin relative path imports

* docs(readme): document new grafana/no-plugin-external-import-paths rule

* chore(test): add an NPM script to run linter rule tests

* test(linter-rule): prevent cross plugin relative path imports

* docs(eslint-config): add a commented out example of new rule usage
2025-11-07 21:18:50 +00:00
beejeebus
0e9fe9dc40 Register external datasource plugins on startup
Current code only registers core datasource k8s api groups.

Add external plugins.

Companion grafana-enterprise PR:

https://github.com/grafana/grafana-enterprise/pull/10125
2025-11-07 14:42:41 -05:00
Paul Marbach
90ddd922ad Chore: Cleanup panelMonitoring feature flag (#113530) 2025-11-07 14:04:42 -05:00
Moustafa Baiou
1e1adafeec Alerting: Add admission hooks for rules app (#113429)
This adds validating admission hooks to enforce the requirements on AlertRules and RecordingRules that are currently enforced through the provisioning service and storage mechanisms in preparation of a consistent validation in both legacy storage and unified storage. It also adds a mutating admission hook to the app to ensure that folder annotations and folder labels are kept in sync so we can perform label-selector lists.
2025-11-07 12:01:16 -05:00
Paul Marbach
ecc9e9257e E2E: Prevent issue where certain times can cause test failures (#110196)
* E2E: Prevent issue where certain times can cause test failures

* re-enable first test
2025-11-07 11:34:11 -05:00
Paul Marbach
4fee8b34ad Suggestions: Refactor getPanelDataSummary into its own method (#113251)
* Suggestions: Refactor getPanelDataSummary into its own method

* restore order

* update some imports

* update codeowners
2025-11-07 11:33:13 -05:00
Roberto Jiménez Sánchez
02464c19b8 Provisioning: Add validation for Job specifications (#113590)
* Validate Job Specs

* Add comprehensive unit test coverage for job validator

- Added 8 new test cases to improve coverage from 88.9% to ~100%
- Tests for migrate action without options
- Tests for delete/move actions with resources (missing kind)
- Tests for move action with valid resources
- Tests for move/delete with both paths and resources
- Tests for move action with invalid source paths
- Tests for push action with valid paths

Now covers all validation paths including resource validation and
edge cases for all job action types.

* Add integration tests for job validation

Added comprehensive integration tests that verify the job validator properly
rejects invalid job specifications via the API:

- Test job without action (required field)
- Test job with invalid action
- Test pull job without pull options
- Test push job without push options
- Test push job with invalid branch name (consecutive dots)
- Test push job with path traversal attempt
- Test delete job without paths or resources
- Test delete job with invalid path (path traversal)
- Test move job without target path
- Test move job without paths or resources
- Test move job with invalid target path (path traversal)
- Test migrate job without migrate options
- Test valid pull job to ensure validation doesn't block legitimate requests

These tests verify that the admission controller properly validates job specs
before they are persisted, ensuring security (path traversal prevention) and
data integrity (required fields/options).

* Remove valid job test case from integration tests

Removed the positive test case as it's not necessary for validation testing.
The integration tests now focus solely on verifying that invalid job specs
are properly rejected by the admission controller.

* Fix movejob_test to expect validation error at creation time

Updated the 'move without target path' test to expect the job creation
to fail with a validation error, rather than expecting the job to be
created and then fail during execution.

This aligns with the new job validation logic which rejects invalid
job specs at the API admission control level (422 Unprocessable Entity)
before they can be persisted.

This is better behavior as it prevents invalid jobs from being created
in the first place, rather than allowing them to be created and then
failing during execution.

* Simplify action validation using slices.Contains

Replaced manual loop with slices.Contains for cleaner, more idiomatic Go code.
This reduces code complexity while maintaining the same validation logic.

- Added import for 'slices' package
- Replaced 8-line loop with 1-line slices.Contains call
- All unit tests pass

* Refactor job action validation in ValidateJob function

Removed the hardcoded valid actions array and simplified the validation logic. The function now directly appends an error for invalid actions, improving code clarity and maintainability. This change aligns with the recent updates to job validation, ensuring that invalid job specifications are properly handled.
2025-11-07 16:31:50 +00:00
Sven Grossmann
62129bb91f Search: Change copy to Search with Grafana Assistant (#113609) 2025-11-07 16:27:19 +00:00
Paul Marbach
3d8da61569 E2E: Improve ad-hoc filtering test (#113558)
* E2E: Improve ad-hoc filtering test

* remove unused import

* fix some table e2es after making getCell sync
2025-11-07 11:06:33 -05:00
Misi
d7d296df8e Fix: Return auth labels from /api/users/lookup (#113584)
* wip

* Return auth labels from /api/users/lookup

* Rename

* Address feedback

* Add more tests, fix tests

* Cleanup
2025-11-07 16:51:41 +01:00
Jean-Philippe Quéméner
305ed25896 fix(folders): add a circuit breaker to prevent infinite loops (#113596) 2025-11-07 14:32:17 +00:00
Yunwen Zheng
8b6cc211e9 Git Sync: Allow user disable push to configured branch (#113564)
* Git Sync: Allow user disable push to configured branch
2025-11-07 09:24:34 -05:00
Jean-Philippe Quéméner
1ca95cda4a fix(folders): prevent circular dependencies (#113595) 2025-11-07 14:19:55 +00:00
Alexa Vargas
e5ed003fb2 Dashboard Library: Add new "suggestedDashboards" feature toggle (#113591) 2025-11-07 13:38:59 +00:00
Jo
176b0f8b48 IAM: Refactor user org hooks to use MutateRequest API (#113392)
* update with mutation hooks

* add missing delete mutation
2025-11-07 14:36:53 +01:00
Juan Cabanas
33390a1483 LibraryPanels: Improve getAllLibraryElements filter performance (#113544) 2025-11-07 10:16:41 -03:00
Gabriel MABILLE
e90759e5af grafana-iam: enable dual writing for resource permissions (#112793)
* `grafana-iam`: enable dual writing for resource permissions

Co-authored-by: jguer <joao.guerreiro@grafana.com>

* copy paste mistake

* Reduce complexity

* nits to make the code easy to review

* Forgot to check the error

---------

Co-authored-by: jguer <joao.guerreiro@grafana.com>
2025-11-07 13:50:40 +01:00
Alex Khomenko
8cb5f5646a Provisioning: Fix miscellaneous issues with setting and displaying sync status (#113529)
* Provisioning: Preserve in progress job data

* Refactor code and cover more situations

* Fix linting

* Fix issue with remove path operation for started time

* Cleanup

* prettier

---------

Co-authored-by: Roberto Jimenez Sanchez <roberto.jimenez@grafana.com>
2025-11-07 12:27:25 +01:00
Seunghun Shin
c784de6ef5 Alerting: Add compressed periodic save for alert instances (#111803)
What is this feature?

This PR implements compressed periodic save for alert state storage, providing a more efficient alternative to regular periodic saves by grouping alert instances by rule UID and storing them using protobuf and snappy compression. When enabled via the state_compressed_periodic_save_enabled configuration option, the system groups alert instances by their alert rule, compresses each group using protobuf serialization and snappy compression, and processes all rules within a single database transaction at specified intervals instead of syncing after every alert evaluation cycle.

Why do we need this feature?

During discussions in PR #111357, we identified the need for a compressed approach to periodic alert state storage that could further reduce database load beyond the jitter mechanism. While the jitter feature distributes database operations over time, this compressed periodic save approach reduces the frequency of database operations by batching alert state updates at explicitly declared intervals rather than syncing after every alert evaluation cycle.
This approach provides several key benefits:

- Reduced Database Frequency: Instead of frequent sync operations tied to alert evaluation cycles, updates occur only at configured intervals
- Storage Efficiency: Rule-based grouping with protobuf and snappy compression significantly reduces storage requirements

The compressed periodic save complements the existing jitter mechanism by providing an alternative strategy focused on reducing overall database interaction frequency while maintaining data integrity through compression and batching.

Who is this feature for?

- Platform/Infrastructure teams managing large-scale Grafana deployments with high alert cardinality
- Organizations looking to optimize storage costs and database performance for alerting workloads
- Production environments with 1000+ alert rules where database write frequency is a concern
2025-11-07 11:51:48 +01:00
Jean-Philippe Quéméner
589435b7c2 fix(unified-storage): resource server tracing (#113582) 2025-11-07 11:51:32 +01:00
Gilles De Mey
b4d2d1eaf5 Alerting: Fix width of the code editor for Alertmanager configurations (#113541)
fix width of the code editor for Alertmanager configurations
2025-11-07 11:15:18 +01:00
Tobias Skarhed
36e28963d3 Scopes: Script for setting up gdev scope resources (#113448)
* Script for setting up gdev scope objects

* Script for setting up gdev scope objects

* Format

* Update codeowners

* Do a feature flag check

* Formatting

* Remove FF check, because creation is explicit anyways

* Formatting
2025-11-07 10:56:16 +01:00
Ida Štambuk
942b847952 CloudWatch: Add anomaly command to language support, add documentation for anomaly queries (#113311) 2025-11-07 09:54:24 +00:00
Elliot Kirk
488423abfc Icons: add hand pointer icon (#113255)
add hand pointer icon
2025-11-07 09:53:42 +00:00
Roberto Jiménez Sánchez
f75c853b90 Provisioning: Update slog-gokit to v0.1.5 to fix data race (#113455)
* Use fork of slog-gokit to fix data race

Replace github.com/tjhop/slog-gokit with fork that includes fix for data race in handler.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update workspace

* Bump github.com/tjhop/slog-gokit to v0.1.5

* Update go.sum

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-07 09:47:53 +00:00
Ida Štambuk
4bbbd19049 CloudWatch: Make match exact toggle false by default (#113314) 2025-11-07 10:30:24 +01:00
Nathan Vērzemnieks
f4b23253b1 DataSources: Update SDKs in support of auth service (#112101)
* DataSources: Update SDKs for auth service

* Fix deprecated methods & types for new arrow-go version
2025-11-07 10:15:27 +01:00
Erik Sundell
06e1c83276 Chore: Bump plugin-e2e (#113578)
* bump plugin-e2e

* use plugin-e2e selector

* update lock file
2025-11-07 10:11:05 +01:00
Moustafa Baiou
54041155bd fix import path for annotation app 2025-11-06 19:33:12 -05:00
Adam Yeats
b9b1028b91 Elasticsearch: Handle keyed filters buckets and emit frames (#113478) 2025-11-06 17:20:08 -06:00
Taygun Bulmus
f468597ad8 Document rule_version_record_limit setting (#113511)
* Document rule_version_record_limit setting

Add documentation for rule_version_record_limit configuration.

* Update docs/sources/setup-grafana/configure-grafana/_index.md

Co-authored-by: Jacob Valdez <jacob.valdez@grafana.com>

* Update docs/sources/setup-grafana/configure-grafana/_index.md

* run prettier

---------

Co-authored-by: Jacob Valdez <jacob.valdez@grafana.com>
2025-11-06 15:10:25 -06:00
Kevin Yu
69060f5437 CloudWatch Logs: Limit CloudWatch logs queries to use logGroupIdentifiers only for monitoring accounts (#113137)
* Set the log group name when executing log queries from the frontend

* Add helper for a data source instance to check if its a monitoring account

* Execute log queries with log group identifiers only for monitoring account queries

* fix cloudwatch datasource.ts tests

* remove unneeded check
2025-11-06 12:19:39 -08:00
Leon Sorokin
2ac4d0a13e Chore: Remove Intl.DurationFormat polyfill from runtime (#113475) 2025-11-06 20:11:53 +00:00
Matias Chomicki
e953e76006 Log Details: Dedicated context provider + improvements (#113409)
* LogDetailsContext: create component

* LogListContext: extract details out of context

* Refactor components to use new context provider

* More component updates

* Update currentLog implementation

* Use new context provider

* LogLineDetails: prevent cascade of listeners

* LogDetailsContext: sync currentLog with changes

* LogLine: use icon status to show the current log

* LogLineDetails: first tab is the last open log line

* LogLineDetailsLog: respect font size

* Update tests

* Update tests

* LogList: add integration test

* LogLine: use level to mark the current log

* Chore: only check uids, no need for references

* Fix duplicated hook usage

* chore: overflow auto

* LogList: consider field selector width

* Revert "LogLine: use level to mark the current log"

This reverts commit 2d5d54d9a7.

* LogLine: darken details displayed, font weight bold current

* LogLineMenu: icon when current log

* Differenciate contrast from light and dark themes

* Use angle-right for the active icon
2025-11-06 20:21:51 +01:00
Will Assis
c9e4c26c11 unified-storage: add more list pagination tests (#113543)
* unified-storage: add more list pagination tests
2025-11-06 13:36:02 -05:00
Serge Zaitsev
95ea758475 Chore: Start annotations app (#113018)
* annotation legacy store with api server, read only

* Add a feature flag for annotations app

* implement list filters

* annotations are not addressable by ID for read operations

* fix registry apps test

* add ownership for an app

* disable linter

* typo, of course

* fix go workspace

* update workspace

* copy annotation app in dockerfile

* update workspace

---------

Co-authored-by: Tania B. <10127682+undef1nd@users.noreply.github.com>
2025-11-06 19:22:20 +01:00
Rafael Bortolon Paulovic
0931423259 fix: use step output instead of !cancelled() in condition (#113533)
* fix: use step output instead of !cancelled() in condition

We are uploading profile files without need otherwise

* fix: try using !cancelled() and output

Otherwise, step isn't triggered due to failure of the previous one
2025-11-06 19:17:05 +01:00
Rafael Bortolon Paulovic
75afc64dd0 fix: disable mode4,5 tests with library element table (#113539) 2025-11-06 17:49:44 +00:00
Ihor Yeromin
67ca3c231a Test: Fix array element removal in adhoc filter e2e test (#113514)
fix(test): adhoc-filter-from-panel
2025-11-06 18:46:23 +01:00
Adela Almasan
bcc2057456 Canvas: Fix Field image source when non-string field is used (#113534) 2025-11-06 11:01:25 -06:00
Konrad Lalik
720dfb65be Alerting: Alerts page performance improvements (#113391)
* Add IntersectionObserver to render rule viz panel only when visible

* Move data transformations to dataTransform file

* Add tests for data transform

* Use a new time series transformation algorithm

* Reduce the number of time series data conversion

* Memoize small components

* Update tests

* Remove some comments

* Use Box component for styling. Remove unnecessary effect dependency
2025-11-06 17:39:27 +01:00
Mihai Turdean
7df3582237 Authz: Implement Query operation for Zanzana with folder parent retrieval (#113483) 2025-11-06 09:06:42 -07:00
Irene Rodríguez
2e0cf9bb61 Update grafanacli-workflows.md with command link (#113527)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-06 17:02:50 +01:00
Yunwen Zheng
0ed742cad7 FilesView: Git sync repository -> Files list remove size column, added unit tests (#113425)
* FilesView: remove size column, added unit tests
2025-11-06 15:44:46 +00:00
Konrad Lalik
6746207c36 Alerting: Fix url rule form parsing (#113513)
Fix alertRuleFormSchema to properly handle query model objects
2025-11-06 16:43:42 +01:00
Alex Khomenko
4430699f2d Provisioning: Update recent jobs (#113509)
* Provisioning: refactor recent jobs

* Re-render only on initial load

* i18n

* Refactor init loading

* Update spinner

* upd
2025-11-06 17:35:23 +02:00
Gábor Farkas
acb0320796 datasources: apiserver: do not enable extra methods by default (#113395) 2025-11-06 15:34:32 +01:00
Ryan McKinley
95ffd1a55a LibraryPanel: Cleanup service calls (#113277)
* cleanup

* library panel via search

* test cleanup

* merge main

* add FindDashboards mock

* no matching dashbaords should return empty

* do not alllow name and libraryPanel query
2025-11-06 15:31:02 +01:00
linoman
ca5d898120 SCIM: Upgrade the User.UID field to allow for the new scim- prefix (#113500)
Upgrade the User.UID field to allow for the new scim- prefix
2025-11-06 15:26:18 +01:00
Roberto Jiménez Sánchez
e3d73ddb81 Bump nanogit version with delta resolution fixes (#113516)
* Bump nanogit version with delta fixes

* Update workspace
2025-11-06 15:12:00 +01:00
Rafael Bortolon Paulovic
e69f3c55f7 fix: delete folders using postorder (#113493)
* fix: delete folders using postorder

* chore: use helper function and do not add method to Folder store

- addresses other review comments fixing log messages and cleans up the unit tests

* chore: run library element tests on modes 2,3,5 only

* chore: adjust to folder.SortByPostorder(folders []*Folder)

* chore: run library panels tests in mode 2,3,5 only

* chore: run tests in all modes and increase timeout

- adjusting the modes and tweaking configs will be done separately
2025-11-06 15:04:34 +01:00
Tom Ratcliffe
fbf1cdd0ce Folders: Remove unneeded reducer (#113506) 2025-11-06 13:46:41 +00:00
Haris Rozajac
859865351d Dashboard Export: Don't pass already templateized ds var to ds service (#113319) 2025-11-06 06:42:21 -07:00
Rafael Bortolon Paulovic
7b3145a3c1 fix: delete subfolder dangling panels (#113419)
* fix: delete subfolder dangling panels and error if used

* chore: add observation about library panel DeleteInFolders

- logs folders UIDs on DeleteInFolders error

* chore: add integration test for blocking library panel deletion and handling dangling library panels

* chore: fix integration test on mode 4 and 5
2025-11-06 13:56:32 +01:00
Jean-Philippe Quéméner
fd14d4a5ed feat(unified-storage): add tracing to dual writer and legacy storage (#113504)
Co-authored-by: Mustafa Sencer Özcan <32759850+mustafasencer@users.noreply.github.com>
2025-11-06 11:42:46 +00:00
Leon Sorokin
efd6b250d9 Chore: Remove Chance.js dependency from runtime code (#113457) 2025-11-06 05:08:31 -06:00
renovate-sh-app[bot]
6bf5e3303e chore(deps): pin dependencies (#113494)
Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-11-06 11:04:40 +00:00
Sergej-Vlasov
71d511abd8 VariableControls: Adjust variable selection in edit mode (#113408)
* adjust variable selection logic

* clean up

* adjust attribute used
2025-11-06 10:27:26 +00:00
Esteban Beltran
1b278cc87e Plugins: cleanup feature toggle pluginsFrontendSandbox (#113439)
* clean feature pluginsFrontendSandbox

Co-authored-by: Andres Martinez Gotor <andres.martinez@grafana.com>
2025-11-06 11:06:53 +01:00
Mustafa Sencer Özcan
51c31e00a4 fix: dual writer log object formatting (#113492)
fix: logging
2025-11-06 11:03:28 +01:00
Gabriel MABILLE
ff53276870 grafana-iam: Instantiate ExternalGroupMappingStorage as a NoopStorage (#113499)
Co-authored-by: jguer <joao.guerreiro@grafana.com>
2025-11-06 11:00:37 +01:00
Tom Ratcliffe
b739e4e802 APIs: Include enterprise spec check (#113470) 2025-11-06 08:31:24 +00:00
Rafael Bortolon Paulovic
7281bb7069 fix: background delete on create failure after ctx cancellation (#113442)
* fix: background delete on create failure after ctx cancellation

* fix: address comments

* chore: remove tests using mock
2025-11-06 09:21:11 +01:00
Andres Martinez Gotor
35ac04bad3 Chore: Fix two minor bugs related to favorite datasources (#113444) 2025-11-06 09:18:11 +01:00
grafana-pr-automation[bot]
2411e78cd1 I18n: Download translations from Crowdin (#113428)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-06 00:39:34 +00:00
grafana-delivery-bot[bot]
7236ba5fce Release: Bump version to 12.4.0-pre (#113480)
bump version 12.4.0-pre

Co-authored-by: grafana-delivery-bot[bot] <grafana-delivery-bot[bot]@users.noreply.github.com>
2025-11-05 23:54:05 +01:00
colin-stuart
612a0d1c7f Revert "SCIM: Update UIDs for provisioned users (#113423)" (#113474)
This reverts commit daa28773d6.
2025-11-05 15:49:05 -06:00
Misi
06373ae47b IAM: Add ExternalGroupMapping kind for TeamSync (#113052)
* wip

* wip

* Add authorizer -> VERIFY it's working correctly

* Update openapi definitions

* Authorizer wip

* regen apis

* Increase timeout of pg int tests to 20m

* Revert "Increase timeout of pg int tests to 20m"

This reverts commit 8c20568217.

* Fix NewTestStore when Truncate is enabled
2025-11-05 18:02:34 +01:00
linoman
daa28773d6 SCIM: Update UIDs for provisioned users (#113423)
* Update UIDs for provisioned users

* change the prefix from scim_ to scim-

* Update tests
2025-11-05 17:52:23 +01:00
Ivana Huckova
1830e2ce9d CommanPalette: Add Assistant integration for empty state (#112601)
* CommanPalette: Add Assistant integration for empty state

* Update assistant package and use new onClick pop

* i18n

* Update public/locales/en-US/grafana.json

Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>

* Update public/app/features/commandPalette/CommandPalette.tsx

Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>

* Update test

---------

Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>
2025-11-05 16:13:47 +01:00
Sven Grossmann
9a8d17a209 Toolbar: Move ExtensionSidebar next to toolbar (#113404)
* Toolbar: Move ExtensionSidebar next to toolbar

* Toolbar: Simplify AppChrome

* simplify height calculation

* Fix scrollbar positon

* remove irrelevant comment

Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com>

---------

Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com>
2025-11-05 16:05:20 +01:00
Galen Kistler
8149f586b3 Annotations: Multi-lane annotations rendering (lane per frame) (#111559)
* feat: support multi-lane annotations panel option

---------

Co-authored-by: Leon Sorokin <leeoniya@gmail.com>
2025-11-05 09:00:28 -06:00
Andre Pereira
c7dd159db1 Trace View: Span tree style updates (#113095)
* Style tweaks of span bar row

* More tweaks

* More tweaks to span style

* 2px width for the service color border

* Refactor SpanBarRow to function component

* Refactor SpanDetailRow to function component

* Refactor SpanTreeOffset to function component

* eslint ignore

* Service name font weight to 500

* Don't render the last indentGuide if the span doens't have children

* Fix tests
2025-11-05 14:49:47 +00:00
Yunwen Zheng
a17d5a75fe FolderActionsButton: Provisioned folder should hide "Manage Permission" folder action (#113367)
* FolderActionsButton: Hide Manage permission option when folder is git provisioned
2025-11-05 08:59:26 -05:00
Yunwen Zheng
2ccb7f618d ConfigFormGithubCollapse: Hide github features section if nothing is available (#113410)
ConfigFormGithubCollapse: Hide github features section if nothing is available. Added unit tests
2025-11-05 08:59:07 -05:00
Mustafa Sencer Özcan
b97fb638ad fix: only validate allowed descendants for folder deletion (#113440) 2025-11-05 14:04:43 +01:00
Bogdan Matei
d9d227ec4d Dashboard: Hide add variable button in edit views (#113438) 2025-11-05 14:38:31 +02:00
Josh Hunt
93f1c24b82 FS: Update devenv docker images with renovate (#112943)
* FS: Use renovate to update devenv docker images

* add gha check to test tiltfile

* setup nodejs

* create empty config files
2025-11-05 12:24:45 +00:00
Tom Ratcliffe
7c2f38641a Chore: Add gitattributes config for generated files (#113402)
* Add gitattributes config for generated files

* Add snapshots and manifest files
2025-11-05 11:24:58 +00:00
Darren Janeczek
6376484b13 Card: apply grid fractional unit to description instead of heading (#113424) 2025-11-05 10:18:14 +00:00
Alexander Zobnin
d1334a6dff Zanzana: Log token namespace in case of error (#113437) 2025-11-05 11:13:08 +01:00
Alexander Zobnin
505e025d18 Zanzana: Fix namespace in remote client (#113433) 2025-11-05 11:12:41 +01:00
Roberto Jiménez Sánchez
571e5c2e3c Provisioning: Fix data race in job progress and leasing (#113157)
* Fix data race in provisioning job execution

* Fix TODO

* Update pkg/registry/apis/provisioning/jobs/driver.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update pkg/registry/apis/provisioning/jobs/driver.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix unlocking issue on panic

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-05 10:07:21 +00:00
Oscar Kilhed
4ceb7eec52 Dynamic Dashboards: Change dragging to using grid items instead of viz panels. (#113343)
* Preserve grid item size and repeat options when dragging between grids

* push gridItem usage all the way

* do console.warn and log to faro instead
2025-11-05 10:47:19 +01:00
Andres Martinez Gotor
2e507d5042 Advisor: Add mock checks to standalone setup (#113406) 2025-11-05 10:33:45 +01:00
Lauren
1bd5b29963 Alerting: Bug fix for regex matching in Alerts page (#113400)
* Alerting: bug fix for regex matching in Alerts page

* remove test
2025-11-05 09:24:48 +00:00
Jean-Philippe Quéméner
98ec655f33 fix: add resource type to not empty log (#113432) 2025-11-05 10:12:44 +01:00
Lauren
1d38cf7f0d Alerting: Add empty state to triage page WIP (#113390)
* add empty state to triage page WIP

* tidy up and refactor

* generate translations

* resolve PR comments

* generate translations

* resolve PR comment part 2
2025-11-05 08:46:41 +00:00
Anna Urbiztondo
891ed6c4b7 Docs: Git Sync permissions (#113405)
* Permissions

* Prettier

* Edit
2025-11-05 09:38:48 +01:00
Jesse David Peterson
e067b1de98 FeatureToggle: Create experimental timeRangePan flag (#112988)
feat(toggle): new experimental timeRangePan feature toggle
2025-11-04 21:39:46 -04:00
Stephanie Hingtgen
4cecab3185 Dashboards: add isPublic to dto and remove public endpoint call (#113334)
---------

Co-authored-by: Matheus Macabu <macabu.matheus@gmail.com>
2025-11-04 16:57:05 -06:00
Paul Marbach
867e8bb98f StatusHistory: Add e2e suite to confirm standard cases (#113358)
* StatusHistory: Add e2e suite to confirm standard cases

* update dev dashbord tests

* update CODEOWNERS
2025-11-04 16:21:30 -04:00
Paul Marbach
5abc0d0d91 Coverage: Add new exclusions for team coverage report (#112997) 2025-11-04 15:35:56 -04:00
Ashley Harrison
3972046695 Chore: Improve step name to differentiate between light/dark themes (#113407)
improve step name to differentiate between light/dark themes
2025-11-04 17:38:42 +00:00
Pepe Cano
ffa5e41bec docs(alerting): add note about invalid numeric identifiers in templates (#113269) 2025-11-04 17:56:41 +01:00
Alex Spencer
84bd99f1c1 SQL Expressions: Update to feature badges (#112795)
* chore: update badge + update logic

* chore: update comment
2025-11-04 08:18:15 -08:00
Todd Treece
de512fb02e Plugins: Fix API sync error handling (#113240) 2025-11-04 10:47:58 -05:00
Alexander Zobnin
3fca7cf952 Zanzana: Refactor basic role write APIs (#113397)
* Zanzana: Refactor basic role write APIs

* Fix updates

* fix linter
2025-11-04 16:29:56 +01:00
Serge Zaitsev
8f8ed2bbec Chore: Change ownership for annotations (#112791)
change ownership for annotations
2025-11-04 13:30:47 +00:00
Josh Hunt
69e4b4667b Backend: Add logs and metric for when host is redirected (#112373) 2025-11-04 13:28:33 +00:00
Ihor Yeromin
0c016e210a Linter: Rollback suppressed errors (#113396)
chore(linter): rollback suppressed errors
2025-11-04 13:15:54 +01:00
Jo
769787ea40 IAM: Improve team binding hooks error handling and validation (#113393)
small team hook fixes
2025-11-04 11:54:38 +01:00
Levente Balogh
b4312a220f Dashboard Controls: Adjust spacing for annotation controls (#113381)
* fix: spacing issues with annotation control switches inside the dashboad controls

* refactor: remove unnecessary css class
2025-11-04 11:20:10 +01:00
Lauren
c75a451b13 Alerting: Add counts for firing and pending alert rules (#113309)
* add counts for firing and pending alert rules

* resolve Pr comments part 1

* resolve PR comments part 2

* resolve PR comments part 3
2025-11-04 10:17:07 +00:00
dependabot[bot]
df816d00e4 deps(actions): bump actions/upload-artifact from 4 to 5 (#113025)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-04 10:03:56 +00:00
Rafael Bortolon Paulovic
782c819727 Get traces and profiles of nocgo sqlite integration tests as GH artifact (#113034) 2025-11-04 10:36:20 +01:00
Gábor Farkas
6fc82629d4 codeowners: updated ownership of datasources code (#113387) 2025-11-04 09:29:57 +00:00
Sonia Aguilar
fc34b18122 Alerting: Fix data source recording rules editor (#113363)
fix data source recording rules editor
2025-11-04 09:01:26 +01:00
Gábor Farkas
ac162e203b datasources: querier: do not forward these headers (#113383) 2025-11-04 09:01:16 +01:00
Georges Chaudy
ddeb970b4d unistore: replace CDK backend with KV store backend (again) (#113184)
* Reapply "unistore: replace CDK backend with KV store backend"" (#113132)

This reverts commit 7127b2538c.

* enable cluster scope
2025-11-04 00:33:36 +00:00
Charandas
a06905e2d3 fix: switch to test-containers from grafana/e2e for API server tests (#113256) 2025-11-03 16:10:32 -08:00
Georges Chaudy
07bf7b2ae1 kvstore: add cluster-scoped resource support (#113183)
kvstore add experimental clusterscope resource
2025-11-03 15:53:59 -08:00
Austin Pond
0649635639 Apps: call app.Runner().Run() in a goroutine in the post-start hook (#113371)
Run the app runner in a goroutine in the post-start hook, as the '/readyz' endpoint for the API server waits for a non-nil error response from the post-start hook to mark it as ready.
2025-11-03 17:05:20 -05:00
Ezequiel Victorero
126e6dbcd8 ShortURL: Set same generateName for old and new API endpoints (#113368) 2025-11-03 17:50:02 -03:00
Stephanie Hingtgen
f56fec2c10 Short URLs: Skip flaky test for now (#113364) 2025-11-03 17:19:12 +00:00
Alexa Vargas
ca5cf5fe7c Dashboard datasource: Fix library panels not tracked in mixed queries (#112959)
* Dashboard datasource: Fix library panels not tracked in mixed queries

* Remove unnecessary code and add unit tests

* Add relevant comment
2025-11-03 18:01:29 +01:00
Oscar Kilhed
06fb3fef43 Dynamic Dashboards: Change look and copy of add variable control to make it more obvious what it does (#113361)
Change look+copy of add variable control
2025-11-03 18:00:25 +01:00
Moustafa Baiou
414524e799 Alerting: Add index for rule_group_index in alert_rule table
This is a slight optimization for the list queries which sort by these fields.
2025-11-03 11:36:18 -05:00
Moustafa Baiou
acf0da9b80 Make the ordering of test on case-sensitivity consistent across databases and charsets 2025-11-03 11:36:18 -05:00
Moustafa Baiou
6f7c525213 Alerting: Ensure case-sensitive ordering for alert rule group column
The query which fetches alert rules in a paginated manner ordered by `rule_group` can result in strange and inconsistent ordering when the database uses a case-insensitive collation for the `rule_group` column. This can lead to scenarios where rules from different groups are interleaved in the results, making pagination unreliable and the returned number of rule_groups incorrect.

Related to #88990
2025-11-03 11:36:18 -05:00
Ihor Yeromin
684156fdf1 Event Tracking: Add tracking for expression query removal (#113113)
* feat(tracking-events): add traking event on expression remove

* chore(traking): remove type assertion
2025-11-03 16:58:51 +01:00
Bruno
4cda8669a5 Caching: GetKey requires a namespace argument (#113180)
* Caching: GetKey requires a namespace argument

* GetKey: special case empty namespace
2025-11-03 12:22:36 -03:00
Andres Martinez Gotor
14c45b6db2 Advisor: Standalone server mock (#113224) 2025-11-03 16:09:54 +01:00
Jo
eeddc8cd18 Zanzana: Add team binding hooks (#113274)
add team binding hooks
2025-11-03 15:39:20 +01:00
Jo
99e4583cd1 Zanzana: Add user org role hooks (#113276)
* add user org role hooks

* update with feedback
2025-11-03 15:39:12 +01:00
Matias Chomicki
cbd6b53182 New Logs Panel: Enable new visualization by default (#113340)
* New Logs Panel: enabled by default

* Update toggles

* Change feature flag availability
2025-11-03 06:21:39 -08:00
Alexander Zobnin
259c7807cb Zanzana: Respect action sets for dashboards and folders during reconciliation (#113352)
Zanzana: Respect action sets for dashboards and folders during legacy reconciliation
2025-11-03 15:19:23 +01:00
Alexander Zobnin
d6fa822e89 Zanzana: Write API for org roles (#113339)
* Zanzana: Add write APIs for user org roles

* Add tests

* Fix tests

* fix role translation
2025-11-03 14:47:10 +01:00
Anna Urbiztondo
a89377337b Docs: Full instance Git Sync notes (#113083)
* Full instance sync

* Edits

* Prettier

* Fix

* Edits, note on import

* Feedback

* Fix?

* Fix

* Prettier

* Fixing lists

* Fixes

* X-refs

* Prettier

* Update docs/sources/observability-as-code/provision-resources/git-sync-setup.md

Co-authored-by: Roberto Jiménez Sánchez <roberto.jimenez@grafana.com>

* Update docs/sources/observability-as-code/provision-resources/intro-git-sync.md

Co-authored-by: Roberto Jiménez Sánchez <roberto.jimenez@grafana.com>

* Edits

* Prettier

---------

Co-authored-by: Roberto Jiménez Sánchez <roberto.jimenez@grafana.com>
2025-11-03 14:32:04 +01:00
Tobias Skarhed
3b99370aac Scopes: Fix icon lookup for scope navigation (#113313)
Fix icon lookup for scope navigation
2025-11-03 13:09:58 +01:00
Levente Balogh
3c0409fe05 Dashboard Controls: Add annotations to the dashboard controls menu (#112816)
* feat: add a placement property to annotations model v2

* chore: update scenes to `v6.42.1`

* chore: run `make gen-apps`

* fix: cater for cases when there is no data layer

* chore: swagger clean

* chore: update api clients

* fix: correct type guard

* fix: display control labels in the default renderer as well for DashboardDataLayerSet
2025-11-03 11:33:44 +01:00
Stephanie Hingtgen
6d9e28a59f Frontend tests: Fix for timechange (#113338) 2025-11-03 07:31:40 +00:00
Charandas
6c728f8dec Provisioning: allow access check to proceed even when non access policy (#112946)
* Provisioning: allow access check to proceed even when non access policy

* Provisioning: access checker needs this for MT

* add permissions registration

* remove scopes

* use in MT for now

* no need to document an internal flag here

* revert vscode change

* refactor the authZ permission evaluation and mapper code to allow evaluating unscoped actions beyond creation

* update wire

* gofmt

* add boolean to struct

---------

Co-authored-by: IevaVasiljeva <ieva.vasiljeva@grafana.com>
2025-11-02 13:14:08 -08:00
Stephanie Hingtgen
445e88cb93 Dashboard Provisioning: Add duplicate cleanup for modes 0-2 (#113336) 2025-11-02 20:39:15 +00:00
Charandas
c98259f74a Identity: adds ServiceIdentityForSingleNamespace helper (#113161) 2025-11-01 11:51:25 -07:00
grafana-pr-automation[bot]
83e3b1fac7 I18n: Download translations from Crowdin (#113326)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-01 00:40:48 +00:00
Isabel Matwawana
16a0f6c86e Docs: Clarify difference between "Add" and "Replace" for saved queries (#113318) 2025-10-31 17:25:59 -04:00
Isabel Matwawana
10833172b9 Docs: Add saved queries for annotations (#113302) 2025-10-31 18:30:41 +00:00
Jocelyn Collado-Kuri
d0ea82633f Jaeger: Migrate API calls to gRPC endpoint (#113297)
* Jaeger: Migrate Services and Operations to the gRPC Jaeger endpoint (#112384)

* add grpc feature toggle

* move types into types.go

* creates grpc client functions for services and operations

* Call grpc services function when feature flag is enabled for health check

* remove unnecessary double encoding

* check for successful status code before decoding response and return nil in case of successful response

* remove duplicate code

* use variable

* fix error type in testsz

* Jaeger: Migrate search and Trace Search calls to use gRPC endpoint (#112610)

* move all types into types package except for JagerClient

* move all helper functions into utils package

* change return type of search function to be frames and add grpc search functionality

* fix tests

* fix types and the way we check error response from grpc

* change trace name and duration unit conversion

* fix types and add tests

* support queryAttributes

* quick limit implementation in post processing

* add todo for attributes / tags

* make trace functionality ready to support grpc flow

* add functions to process search response for a specific trace and create the Trace frame

* tests for helper funtions

* remove grpc querying for now!

* change logic to be able to process and support multiple resource spans

* remove logic for gRPC from grpc_client.go

* add equivalent fields for logs and references

* add tests for grpcTraceResponse function

* fix types after merge with main

* fix status code checks and return nil for error on successful responses

* enable reading through config flag for trace search

* create sigle key value type since they are similar for OTLP and non OTLP based formats

* reference right type

* convert events and links into references and logs

* add status code, status message and kind to data frame

* fix tests to accomodate new format

* remove unused function and add more tests

* remove edit flag for jsonc golden test files

* add clarifying comment

* fix tests and linting

* fix golden files for testing

* fix typo

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix typo

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix typo

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* add clarifying comment

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove unnecessary logging statement

* fix downstream errors

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* use downstreamerrorf where applicable and add missing downstream eror sources.

* tests

---------

Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-31 11:19:16 -07:00
Paul Marbach
64da716a2e Heatmap: Fix runtime error when no data is present, add e2e test (#113242)
* Heatmap: Fix runtime error when no xAxis is present, add e2e test

* update migration test fixture

* updates from review
2025-10-31 18:17:30 +00:00
Isabel Matwawana
2d250ab364 Docs: Add share dashboard as image section and links (#113136)
Co-authored-by: Nathan Marrs  <nathanielmarrs@gmail.com>
Co-authored-by: Nathan Marrs <nathanielmarrs@gmail.com>
2025-10-31 17:58:37 +00:00
Owen Diehl
b0ecc36fd6 [App-Platform,Git-Sync]: Add sync job & phase metrics (#113253)
* [git-sync] add sync job & phase metrics

* refactoring sync jobs for clarity and ease of instrumentation

* make gofmt
2025-10-31 10:24:17 -07:00
Paul Marbach
d64cc987b8 Table: Fix JSON display for array and object (#113246) 2025-10-31 12:31:07 -04:00
Ryan McKinley
ac7c1eed42 ShortURL: Increase timeout checking for lastSeenAt (#113294) 2025-10-31 15:38:43 +00:00
Alexander Zobnin
cfc8989d24 Zanzana: Inject client into standalone AuthZ client (#113293) 2025-10-31 16:15:45 +01:00
Kim Nylander
33b4d43248 [DOC] Add doc for critical path highlighting (#113194) 2025-10-31 11:12:24 -04:00
Kyle Brandt
92a6faeff2 SQL Expressions: Add Functions to Allow list (#113291)
Add assorted math, windowing, json, date/time, regex, string, conditional, and aggregation functions to allow list
2025-10-31 10:45:56 -04:00
Jo
a339a2dad3 AuthZ: Instantiate needed clients for IAM hooks (#113268)
build API with zanzana hooks support
2025-10-31 15:37:43 +01:00
Stephanie Hingtgen
ea90bdff9c Dashboard: Fix editor specific permissions in /api (#113292) 2025-10-31 09:03:35 -05:00
John-George Sample
f6e4dd9b0c Icon: Add thumbs-down to availableIconIndex (#113108)
add `thumbs-down` to icon types
2025-10-31 09:30:06 -04:00
Yunwen Zheng
460ed5b827 navModel: Hide Panels tab when a folder is provisioned (#113250) 2025-10-31 09:08:47 -04:00
Gilles De Mey
8010784322 Alerting: Improve test notification visualization (#113228) 2025-10-31 14:08:24 +01:00
Tobias Skarhed
f9c0924f0c Scopes: Sync scope_node in favor of scope_parent in the URL (#113212)
* Enhance ScopesService to support scopeNodeId in URL parameters for improved backward compatibility. Update changeScopes method to accept scopeNodeId, allowing for better handling of scope nodes. Adjust ScopesInput to prioritize scope node titles and ensure loading states are managed correctly. Refactor related logic in ScopesSelectorService for consistent scope handling.

* Scopes: Add tests for scope_node URL sync and scopeNodeId handling

- Add ScopesService.test.ts with tests for URL parameter handling
  - Test scope_node and scope_parent reading from URL
  - Test scope_node writing to URL with scope_parent reset
  - Test backward compatibility with legacy scope_parent
  - Test URL sync when scopes and scopeNodeId change

- Add tests to ScopesSelectorService.test.ts for changeScopes
  - Test scopeNodeId assignment (only first scope gets it)
  - Test handling scopeNodeId without parentNodeId
  - Test backward compatibility when only parentNodeId provided

All 13 new tests passing, maintaining 100% test coverage.

* Fix linting error

* Fix comments
2025-10-31 13:36:10 +01:00
Tania
4813256e0a OpenFeature: Log key name and namespace in handler (#113288) 2025-10-31 12:31:48 +00:00
Matias Chomicki
28e8d7d56e Logs in Explore: Hide "show original line" when using the table (#113215)
* Logs in Explore: Hide "show original line" when using the table

* Test update
2025-10-31 12:00:30 +00:00
grafana-pr-automation[bot]
3a6459cda3 I18n: Download translations from Crowdin (#113285)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-31 11:59:48 +00:00
Tobias Skarhed
03d738004d Scopes: Disable support for public dashboards (#113267)
Disable scopes support for public dashboards
2025-10-31 12:45:56 +01:00
Neeraj Panwar
e3d1fc9c2c Docs: Clarify Grafana Live data format requirements (#112926)
Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
Co-authored-by: Irene Rodriguez <irene.rodriguez@grafana.com>
2025-10-31 11:18:38 +00:00
Matias Chomicki
52d758dc93 Field Selector: Show scroll and add "suggested" section for fields (#113178)
* Show scrollbar

* ActiveFields: move suggested fields to another section

* Translations

* Update tests
2025-10-31 12:18:10 +01:00
Matheus Macabu
452fc04d1d PublicDashboards: Dont call API on dashboard page if public dashboards is disabled (#113273) 2025-10-31 12:05:26 +01:00
Sonia Aguilar
3e6a601fba Alerting: Update width to instance details drawer in Triage page (#113209)
* add depreacted width to instance details drawer

* prettier

* use percentage instead

* use width aligned with the left column in the parent

* clamp value for wide screen monitors

* refactor: use hook instead of function for calculations

* refactor: use context provider for right column for the calculation of the width

* remove unnecessary changes exporting styles values
2025-10-31 11:05:07 +00:00
Misi
e09deb6889 IAM: Use the new authorizer for Teams (#113275)
Use the new authorizer for Teams
2025-10-31 10:48:01 +00:00
Janos Gub
1070f94fbb Navigation: Move Cost management and billing plugin to root (#111739) 2025-10-31 10:41:01 +00:00
Torkel Ödegaard
137803a32a NewGauge: Fixes issue with too eager migration (#113200) 2025-10-31 10:58:57 +01:00
Pepe Cano
7648eac654 ui(alerting): show correct tooltip when label search includes spaces (#113038) 2025-10-31 10:56:56 +01:00
Kevin Minehart
0a8d15dcac SQL: Fix 32 bit arm builds (#113270)
* add arm specific frame_db_conf

* use proper field type and fix error

* add extra mising func
2025-10-31 09:42:25 +00:00
Alex Khomenko
b5cf192331 Provisioning: Move nav item to General (#113266) 2025-10-31 10:06:41 +02:00
Tom Ratcliffe
f678f5a2cb Nav: Render menu items as p tags so truncation logic can work (#113248) 2025-10-31 08:04:30 +00:00
Alex Khomenko
ca5e7202b9 Provisioning: Update onPrem check to use stacks (#113262) 2025-10-31 07:40:33 +00:00
Yunwen Zheng
ce6523c5f6 RepositoryOverview: Always display recent jobs (#113249)
* RepositoryOverview: always display recent jobs

* clean up import
2025-10-31 08:44:57 +02:00
Stephanie Hingtgen
83bed02a41 Dashboards: Fix bug with anon users with editor permissions creating dashboards (#113260) 2025-10-31 09:05:38 +03:00
Ryan McKinley
1759732d91 Alerting/Notification: Remove unused status sub-resource (#113198) 2025-10-31 08:24:19 +03:00
Ryan McKinley
53aed34652 LibraryPanels: Support CRUD via apiserver (#113035) 2025-10-31 08:14:38 +03:00
Michael Mandrus
cf242def3a Secrets: Refactor data_key_id out of the encoded secure value payload (#112077)
* Secrets: Refactor data_key_id out of the encoded secure value payload (#111852)

* everything compiles

* tests pass

* remove file included by accident

* add entry to gitignore

* some scaffolding for the migration executor

* remove file

* implement and test the migration

* use xkube.Namespace in our interfaces

* add todo

* update wire deps

* add some logs

* fix wire dependency ordering

* create tests to validate error conditions during migrations

* only run the migration as an MT api server

* formatting issues

* change detection of secrets running as MT server

* add todo

* use more specific initializer flags

* make secrets playwright tests work

* set new properties to true by default

* remove developer mode flag

* fix unit tests
2025-10-30 23:04:32 -04:00
Drew Slobodnjak
f61578a50f Geomap: Add a MapLibre style base layer (#109841)
* GeoMap: Add maplibre style basemap

* Docs: Add maplibre GeoMap base map

* GeoMap: Add test dashboard to devenv

* Add support for opacity

* Simplify layer name and description

* Add no repeat support

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Update docs/sources/panels-visualizations/visualizations/geomap/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* Fix vale issues

* Move to consistent async await approach

* Increment ol-ext

* Remove mapbox temporarily

* Add mapbox back

* Add access token url to docs

* Highlight access token as public

* Make capitalization consistent

* Update yarn lock

* Grab yarn lock from main

* Add missing line to yarn lock

* Fix last line again

* Remove gdev dashboard for now

---------

Co-authored-by: Remo Geissbühler <37411349+remogeissbuehler@users.noreply.github.com>
Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>
2025-10-30 17:56:30 -07:00
grafana-pr-automation[bot]
3965761168 I18n: Download translations from Crowdin (#113258)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-31 00:39:11 +00:00
Drew Slobodnjak
f5ee26540b Geomap: Add ol-mapbox-style to package.json (#113257) 2025-10-30 17:00:43 -07:00
Nathan Marrs
21b120cbae Dashboards: Promote export dashboard as image feature to GA (#113192) 2025-10-30 13:34:33 -07:00
Isabel Matwawana
50932cbdab Docs: Saved queries remove menu references (#113125) 2025-10-30 15:57:19 -04:00
J Stickler
1f4720a0fd docs: Update Logs Visualizations topic (#112541)
* docs: Update Logs Visualizations topic

* updated based on review comments

* Add log details options

* Updated main image, moved log details info to intro and added screenshot of menu

* Changed max width of log menu image

* Added screenshot with log line icons highlighted

* Replaced example image

---------

Co-authored-by: Isabel Matwawana <isabel.matwawana@grafana.com>
2025-10-30 14:16:36 -04:00
Oscar Kilhed
9cbdaef4be Codegen: Revert gen-cue verification (#113247)
* Revert "Codegen/CI: Update makefile to also verify gen-cue (#113211)"

This reverts commit 1342858f36.

* fix wording of generated code verification error
2025-10-30 17:21:41 +00:00
Collin Fingar
782b521c0f E2E-Skip: Skipping test due to failing CI test run (#113244)
* E2E-Skip: Skipping test due to failing CI test run

* Skipping entire file due to repeated failures
2025-10-30 12:56:32 -04:00
Yunwen Zheng
8d5e5e2ead SaveDashboardAsForm: Adjust form field spacing (#113243) 2025-10-30 12:17:06 -04:00
Drew Slobodnjak
1613d2815c Geomap: Move beta layers to GA (#113186) 2025-10-30 09:12:04 -07:00
Drew Slobodnjak
7fbe2e5962 PanelTimeSettings: Update wording (#113176)
* PanelTimeSettings: Update wording

* Update wording
2025-10-30 09:02:09 -07:00
Jay Clifford
72e244c1e7 fix(nav): Add tooltip to help button (#113225)
Co-authored-by: Jack Baldry <jack.baldry@grafana.com>
2025-10-30 15:57:16 +00:00
Misi
44beedd09a IAM: Handle NULL external_uid, is_provisioned correctly for Teams (#113219)
* Handle NULL external_uid correctly with MySQL

* Add NULL handling to is_provisioned column
2025-10-30 15:50:40 +00:00
Lauren
d6bcca2f7e Alerting: Hide metadata if grouping by folder (#113216)
* Alerting: Hide metadata if grouping by folder

* resolve comments

* resolve comments 2
2025-10-30 15:14:37 +00:00
Yunwen Zheng
20ec8ee61c useProvisionedRequestHandler: reset ref when a new request is loading (#113196) 2025-10-30 10:37:13 -04:00
Oscar Kilhed
1342858f36 Codegen/CI: Update makefile to also verify gen-cue (#113211)
* update makefile to also verify gen-cue

* update for jsonnet
2025-10-30 15:31:57 +01:00
Ashley Harrison
63c5d8cb8f Collapse: Improve layout and deprecate collapsible prop (#113164)
* deprecate collapsible prop, improve Collapse to allow for buttons in the header

* add ariaLabel

* Revert "add ariaLabel"

This reverts commit a903a0da5d.

* add aria-labelledby
2025-10-30 14:23:03 +00:00
Ashley Harrison
92375279f7 Slider: Expose prop to control visibility of input (#113084)
expose prop to control visibility of slider input
2025-10-30 14:22:44 +00:00
Kyle Brandt
c3d7dbc258 SQL Expressions: Add endpoint to get Schemas (#108864)
Return the SQL schema for all DS queries in request (to provide information to AI / Autocomplete for SQL expressions).

All DS queries are treated as if they were inputs to SQL expressions in terms of conversion, regardless if they are selected in a query or not.

Requires feature toggle queryService = true

Endpoint is apis/query.grafana.app/v0alpha1/namespaces/default/sqlschemas

---------

Co-authored-by: Todd Treece <360020+toddtreece@users.noreply.github.com>
2025-10-30 10:05:12 -04:00
Paul Marbach
c487952279 Table: Support DataLinks and Actions in SparklineCell (#112244)
* Table: Support DataLinks in SparklineCell

* add data links to sparkline gdev

* fix migrator test

* Clean up single action use case
2025-10-30 10:04:08 -04:00
Tom Ratcliffe
05dc9b2be1 API Clients: Add lazy hooks to clients (#113226) 2025-10-30 13:08:14 +00:00
Ryan McKinley
d303746ff9 ShortURL: Use UpdateStatus client (#111170) 2025-10-30 15:57:03 +03:00
Ezequiel Victorero
f185377c68 ShortURL: Use RTK api for creation (#113185) 2025-10-30 09:29:40 -03:00
Ida Štambuk
80d5cfa184 CloudWatch: Add tracking for logs anomalies (#113181)
- Fix tracking for new logs queries with logGroups field
2025-10-30 12:10:00 +00:00
Piotr Jamróz
5f2074e84c Explore: Use compact mode only when targeting Tempo (#113037)
* Explore: Use compact mode only when targeting Tempo

* Fix checking ds type when data source is not in the query object
2025-10-30 12:55:06 +01:00
Costa Alexoglou
bbfb8268d1 Provisioning: concurrent deletes in finalizers and 404 handling (#113155)
* fix: concurrent deletes in finalizers and 404 handling

* chore: feedback review

* fix: broken tests
2025-10-30 11:55:36 +01:00
maicon
cb86be2e32 Unistore: ensure dashboard DeleteInFolders work on both storages (#113197)
Signed-off-by: Maicon Costa <maiconscosta@gmail.com>
2025-10-30 11:51:31 +01:00
Torkel Ödegaard
344fc5606f PanelTimeCompare: Support saving time compare window (#113150)
* PanelTimeCompare: Support saving time compare window

* fix indentation

* Fix merge issue

* Update

* Update

* make gen-cue

---------

Co-authored-by: oscarkilhed <oscar.kilhed@grafana.com>
2025-10-30 10:50:05 +01:00
Torkel Ödegaard
3cabc12f4c PanelEditor: Fixes double top border around Queries (#112865)
* PanelEditor: Fixes double top border around Queries

* Fixes
2025-10-30 10:49:54 +01:00
Konrad Lalik
ee62a8d431 Alerting: Alerts page improvements (#113172)
* Remove column header from Triage workbench

* Use md size for details Drawers

* Fix top workbench border

* Fix query filter for alert instances

* Remove the default grouping

* Update translations
2025-10-30 10:43:13 +01:00
Konrad Lalik
d399f116b8 Alerting: Improve instance details drawer in Alerts (#113106)
* Add alert instance breadcrumbs, change instance drawer title

* Update translations

* Add instance drawer title component and unify its usage
2025-10-30 10:28:15 +01:00
Ashley Harrison
8b31ec5040 Chore: Convert to functional components (#112951)
* refactor ErrorBoundary so it doesn't trigger the lint rule

* refactor ErrorBoundaryAlert to functional component

* convert StatPanel to a functional component

* convert ServiceAccountPicker to a functional component

* convert UserPicker to a functional component

* don't need displayName when not memoized

* convert TimelineChart to a functional component

* convert UserLdapSyncInfo to a functional component

* convert UserOrgs to functional component

* convert OrgRow to a functional component

* convert UserSessions to a functional component

* convert TimePickerSettings to a functional component

* convert DataSourcePluginSettings to a functional component

* convert ExploreTimeControls to a functional component

* convert SearchBarInput to a functional component

* convert LiveConnectionWarning to a functional component

* convert ConcatenateTransformerEditor

* convert ConstantVariableEditor a functional component

* convert VariableInput to a functional component

* convert ConfigEditor to a functional component

* convert CSVWavesEditor to a functional component
2025-10-30 09:23:21 +00:00
Mustafa Sencer Özcan
58098f9339 chore: improve unified dual writer logging (#113203)
chore: improve dual writer logging
2025-10-30 10:12:29 +01:00
Levente Balogh
f9ef1b6bd0 Switch variable: Stop allowing identical values (#113166)
* fix: don't allow identical values for enabled and disabled states

* fix: add missing translation
2025-10-30 10:08:10 +01:00
antonio
5dce711680 add feedback survey to contributing related docs (#113168)
* add feedback survey to contributing related docs

* removed deprecated drone logo and link

* all pretty, no pity

* removed indentation
2025-10-30 09:36:44 +01:00
Alex Khomenko
31a2d2aff4 Provisioning: Show last and preview branches in the branch dropdown (#113148)
* Provisioning: Show configured and last used branches

* Remove unused var

* Add hooks

* Extract branch logic

* remove type assertion

* fix tests

* Memoize descriptions
2025-10-30 07:20:41 +00:00
Dominik Prokop
209aa13ff7 Dashboard performance analytics system with Scenes integration (#112137)
* Dashboard performance profiling architecture improvements

- Create shared performanceUtils.ts with type-safe performance.memory access
- Add standardized grouped logging utilities for structured console output
- Convert observer methods to arrow functions eliminating constructor bindings
- Implement DashboardAnalyticsAggregator for comprehensive panel metrics
- Add ScenePerformanceLogger for performance marks and measurements
- Create DashboardAnalyticsInitializerBehavior for automatic profiling setup
- Update dashboard scene integration to use improved profiling system
- Add numeric duration logging for better programmatic analysis
- Fix localStorage usage to use @grafana/data store for consistency
- Consolidate performance tracking logic into shared utilities

* canary scenes

* tests/lint

* docs

* performanceUtils namespace

* Review and sync scenes

* Only enable dashboard profiling when needed

* docs update

* update scenes

---------

Co-authored-by: Victor Marin <victor.marin@grafana.com>
2025-10-30 06:25:55 +00:00
Yunwen Zheng
84edc45dee PreviewBannerViewPR: Display branch info in preview banner (#113195) 2025-10-30 08:49:15 +03:00
Anna Urbiztondo
0b56628622 Docs: Plugins link to catalog (#113103)
* Plugins link

* Typo

* Prettier

* Edits

* More edits
2025-10-30 06:33:26 +01:00
Ryan McKinley
4c8c32a1d4 Chore: Update @playwright/test (#113179) 2025-10-30 04:25:59 +00:00
grafana-pr-automation[bot]
c0c31afdde I18n: Download translations from Crowdin (#113191)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-30 00:40:00 +00:00
Yuri Tseretyan
a4df6c8bb9 Alerting: Prohibit receivers with empty name (#113064) 2025-10-29 16:30:38 -04:00
dependabot[bot]
f2404361bf deps(actions): bump actions/download-artifact from 5 to 6 (#113024)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-29 18:51:40 +00:00
Ida Štambuk
30bd4e7dba CloudWatch Logs: Support Log Anomalies query type (#113067) 2025-10-29 18:47:33 +01:00
Todd Treece
de88abafdd Plugins API: Merge meta and installs (#112962) 2025-10-29 13:32:31 -04:00
Ivan Ortega Alba
6a3e95913e Scenes: Fix timezone not being preserved in links (#112879)
* Scenes: Fix timezone not being preserved in links

* Update E2E
2025-10-29 17:15:16 +00:00
dependabot[bot]
0124aab805 deps(actions): bump trufflesecurity/trufflehog from 3.90.11 to 3.90.12 (#113069)
Bumps [trufflesecurity/trufflehog](https://github.com/trufflesecurity/trufflehog) from 3.90.11 to 3.90.12.
- [Release notes](https://github.com/trufflesecurity/trufflehog/releases)
- [Changelog](https://github.com/trufflesecurity/trufflehog/blob/main/.goreleaser.yml)
- [Commits](ad6fc8fb44...b84c3d14d1)

---
updated-dependencies:
- dependency-name: trufflesecurity/trufflehog
  dependency-version: 3.90.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-29 20:08:38 +03:00
Laura Fernández
af8d166b90 Chore: Update node to v24 (#112649) 2025-10-29 17:17:07 +01:00
Yunwen Zheng
ec6e516e28 DashboardEmpty: Disable import dashboard function when a new dashboard is git provisioned (#113122)
DashboardEmpty: Disable import dashboard function when a new dashboar is git provisioned
2025-10-29 12:14:57 -04:00
Yunwen Zheng
269c145051 SaveProvisionedDashboardForm: Bug fix repo type incorrectly showing in preview banner (#113120)
* SaveProvisionedDashboardForm: fix repo type incorrectly showing in preview banner
2025-10-29 12:14:12 -04:00
Todd Treece
3bfbbb1961 Plugins: Skip angular check for CDN source (#113163) 2025-10-29 11:33:43 -04:00
Pepe Cano
7eb8a9af99 docs(alerting): clarify notification group deletion after group interval elapses (#113160) 2025-10-29 16:08:08 +01:00
Sergej-Vlasov
51b39d8c6e DashboardScene: Ignore defaults changes when exiting edit mode (#112796)
* exit dashboard without confirmation with only optional changes

* centralise

* clean up logic

* export to util
2025-10-29 15:07:55 +00:00
Kyle Brandt
284648df9e SQL Expressions: Point to grafana GMS fork (#113104)
Use fork that does not have cgo as default, had to revert build tag method attempt since it broke things like running go test on macs (without the tag) #112289.
2025-10-29 15:06:56 +00:00
Tobias Skarhed
04ab552950 DashboardControls: Render UNSAFE hidden dashboard controls (#113046)
* Render UNSAFE hidden dashboard controls

* Remove unused imports

* Extract to function and write test

* Remove unnecessary context from test

* Remove exclamation
2025-10-29 08:33:48 -06:00
Gilles De Mey
87794bec12 Alerting: Add instances with no label value to an ungrouped group (#113170)
add instances with no label value to an ungrouped group in alerting
triage – these will be collapsed by default
2025-10-29 15:21:05 +01:00
Haris Rozajac
19826b5b26 Dashboard Save: Fix the issue of clicking Save button that wouldn't trigger save (#113134)
* fix the issue of clicking Save button that wouldn't trigger save

* clean up
2025-10-29 08:15:43 -06:00
Brendan O'Handley
2472555af0 Add to dashboard: expose add to dashboard form component for external apps (#112609)
* add extension for drilldown to add to dashboard

* reuse configure add to dashboard function callback

* structure for drilldown add to dashboard

* fix imports

* fix tests

* expose as a component

* remove extension link

* get component ready to extend

* lazy load component

* add component to exposed component registry

* update folder structure to not work in explore folder

* keep dependencies clean

* nice structure to let folks know this is a drilldown integration

* update code owners for new file

* make exposed component more generic, step one, update component id

* step 2, expose add to dashboard form component

* add more explicit useAbsolutePath option to form

* remove old implementation code for drilldown specific component

* commit translation

* add comments to avoid breaking changes

* add e2e test for add to dashboard form component

* fix flaky test

* add exposed component id to e2e test app

* remove gridPos in buildPanel fallback fn

* add code comment for useAbsolutePath's purpose

* remove gridPos from e2e test
2025-10-29 09:15:20 -05:00
Matheus Macabu
7dbacddb18 CloudMigrations: Check contact point permissions before fetching it (#113159) 2025-10-29 15:08:43 +01:00
Janos Gub
c1808a00c2 Adding adaptive telemetry's own weight (#113167) 2025-10-29 14:07:56 +00:00
Isabel Matwawana
edc7302c2f Docs: Add query variable static options (#113058) 2025-10-29 09:35:53 -04:00
Tom Ratcliffe
f533a5a6e5 API clients: Update API clients to include all endpoints & add hooks (#113061) 2025-10-29 13:20:19 +00:00
Gábor Farkas
ec0c14ac1a log: added debug-log (#113156)
* log: added debug-log

* fixed unit test

* fixed another unit test
2025-10-29 14:19:24 +01:00
Luminessa Starlight
8bff09b88b Docs: Add storybook links to components (#113102)
* for every storybook component, a storybook link

* typo fix

* text improvements
2025-10-29 09:11:23 -04:00
Pepe Cano
86bf99aaaa docs(alerting): add additional migration details (#112383) 2025-10-29 13:58:13 +01:00
Irene Rodríguez
1d0ab617e8 Update Git Sync and File provisioning status to private preview (#113158) 2025-10-29 15:38:49 +03:00
Tom Ratcliffe
6093afddd4 Folders: Migrate FolderFilter component to ComboBox (#113047) 2025-10-29 11:21:58 +00:00
Ryan McKinley
c0b8fc6e6c Chore: update storybook/test-runner (#113154) 2025-10-29 11:06:35 +00:00
Chris Chang
86cb5d8af7 Cloudwatch: Add missing AWS regions (#113010)
Add missing cw regions
2025-10-29 11:58:58 +01:00
Ashley Harrison
e75610ed03 Frontend service: Ensure we set Cache-Control header in the response (#113152)
ensure we set Cache-Control header in the response from frontend-service
2025-10-29 10:09:06 +00:00
Tobias Skarhed
c0ae0f437f Scopes: Display subtitle and enable direct scopes apply (#112876)
* Display subtitle and enable direct scopes apply

* Extract each type into its own component

* Fix unit integration test

* Fix fe linting

* Fix imports

* Import order

* Update generated type

* Update type generation

* Format go

* Add test case for radio button container selection

* Remove infra mock

* Remove non-existant imports

* Remove unused assertions

* Refactor tree item for a11y

* Add proper keyboard support for directly applying scope

* Update i18n

* Fix button selector

* Remove test code

* Fix race condition for seletion vs blur update
2025-10-29 10:52:18 +01:00
Stephanie Hingtgen
2d5713e330 Docs: Add information on continue tokens (#113144) 2025-10-29 12:26:42 +03:00
Stephanie Hingtgen
3176821ddc Docs: Update search default information (#113146) 2025-10-29 10:13:26 +01:00
Javier Ruiz
c7d77c6c64 Nav: Update Observability section nav to phase 2 (#112806)
* Move up a level the knowledge graph children

* Remove unused frontend id

* Add special id to plugin pages
2025-10-29 09:25:09 +01:00
Torkel Ödegaard
5a031b370f PanelTimeSettings: Support panel time range settings changes from dashboard in view mode (#113027)
* Something is working

* Progress

* Update

* Update

* Update

* Some new unit tests

* Fix

* time shift fix

* Update

* Always show hidden toggle

* Update
2025-10-29 09:06:23 +01:00
Costa Alexoglou
25dd7e927f feat: add granular context timeout (#112952)
* feat: add granular context timeout

* test: forced thread timeout

* fix: test assumption for blocks

* test: new change

* trigger build

* remove loggers to test

* test with fmt.print

* fix: deadlocks
2025-10-29 08:41:53 +01:00
grafana-pr-automation[bot]
2c1aa65f2d I18n: Download translations from Crowdin (#113140)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-29 00:41:02 +00:00
Nathan Marrs
1492db8ead Grafana: Fix main build by skipping flaky test (#113138)
skip panel smokescreen test due to breaking main build (potentially flaky)
2025-10-28 23:27:37 +00:00
Georges Chaudy
9533cc4dbb kvstore: Fix missing Folder field in listModifiedSinceEventStore data lookup (#113131)
* fix: ListModifiedSince for resources in folders

* fix: ListModifiedSince for resources in folders
2025-10-28 23:18:15 +01:00
Ryan McKinley
d72e048bfe Chore: Use Kind().GroupVersionResource() (#113133) 2025-10-28 14:54:10 -07:00
Paul Marbach
329d6a11fa Table: Fix cell inspect for Sparkline and inferred JSON cells (#113059)
* Table: Sparkline Cell inspect support

* update to better support FieldType.other structures

* clean up styling a bit for empty case

* fix test import

* add test for no x case for sparkline

* fix merge mistake

* fix test import
2025-10-28 21:50:46 +00:00
Stephanie Hingtgen
7127b2538c Revert "unistore: replace CDK backend with KV store backend"" (#113132)
Revert "unistore: replace CDK backend with KV store backend" (#112746)"

This reverts commit fe9c21ebf8.
2025-10-28 21:37:51 +00:00
Paul Marbach
237ab6c1b4 Table: Pill and JSON Cells should allow formatting (#111951)
* Table: PillCell should use formatted text inside pills

* Table: JSONCell should use formatted text

* remove unused imports
2025-10-28 16:37:28 -04:00
Nathan Marrs
8263803e81 Grafana Data Source: Add random walk configuration options (#113009)
* Grafana: Add random walk configuration options to Grafana datasource

Add UI controls to configure random walk parameters (min, max, start value,
spread, noise, drop percent) to match TestData datasource functionality.

- Add RandomWalkEditor component with inline number inputs for all parameters
- Update GrafanaQuery type to include random walk configuration fields
- Update backend to parse and apply query parameters to RandomWalk function
- Configuration options match TestData datasource UX for consistency

* Grafana: Add series count support to random walk

Add ability to generate multiple random walk series in a single query
for complete parity with TestData datasource.

- Add seriesCount field to RandomWalkEditor
- Update backend to loop and generate multiple frames based on series count
- Default to 1 series if not specified for backward compatibility

* Grafana: Improve random walk editor UI with better organization and tooltips

Enhance the random walk configuration UI for better usability:

- Organize fields into two logical rows (core config vs fine-tuning)
- Add helpful tooltips to all fields explaining their purpose
- Increase label width to prevent text wrapping
- Group related fields visually for better comprehension

Row 1: Series count, Start value, Min, Max (basic shape and range)
Row 2: Spread, Noise, Drop % (randomness and variation controls)

This provides a cleaner, more intuitive experience compared to TestData's
single-row layout, making it easier for users to configure random walks.

* Grafana: Format RandomWalkEditor code

Apply consistent formatting to RandomWalkEditor component.

* Grafana: Add E2E tests for random walk configuration

Add comprehensive Playwright E2E tests to verify random walk functionality:

- Test that all configuration fields render correctly
- Test min/max value constraints
- Test multiple series generation
- Test spread and noise parameters
- Test drop percentage for simulating missing data
- Test that tooltips are present and functional

These tests ensure the random walk configuration works end-to-end from
UI input to data rendering in panels.

* Grafana: Fix E2E tests for random walk configuration

Fix Playwright test selectors and assertions to work reliably:

- Use specific element IDs to avoid selector conflicts
- Remove flaky dropPercent check from rendering test (covered separately)
- Simplify test assertions to focus on functional verification
- All 7 tests now passing consistently

Tests verify: field rendering, min/max constraints, series count,
spread/noise configuration, drop percentage, and tooltips.

* Grafana: Add advanced E2E tests for random walk

Add two additional tests for better coverage:

- Test configuration value persistence across interactions
- Test that series count actually generates the expected number of series

These tests verify deeper functionality beyond basic UI rendering,
ensuring the random walk feature works correctly end-to-end.

All 9 tests passing consistently (20.1s runtime).

* Grafana: Remove redundant Min/Max tooltips

Remove tooltips from Min and Max fields that just repeated the label text.
These fields are self-explanatory and don't need tooltip icons.

Keeps the UI cleaner while maintaining helpful tooltips on fields that
actually benefit from explanation (Series count, Start value, Spread,
Noise, Drop %).

* Grafana: Add CODEOWNERS entry for random walk E2E tests

Add codeowner assignment for the new grafana-datasource-random-walk.spec.ts
test file to @grafana/grafana-frontend-platform, matching the ownership of
the Grafana datasource code.

* Add dashboardTemplates feature toggle and put new changes behind this toggle to limit impact

* Grafana: Add unit tests for dashboardTemplates feature toggle

Add unit tests to verify RandomWalkEditor renders correctly based on
the dashboardTemplates feature toggle:

- Test that random walk editor renders when FF is enabled
- Test that random walk editor is hidden when FF is disabled

These tests ensure the feature toggle works as expected and prevents
the random walk configuration UI from appearing when the feature is disabled.

* revert previous codeowners change as not necessary

* Grafana: Remove redundant E2E test for feature flag disabled

Remove E2E test for dashboardTemplates feature flag disabled scenario
since it's already covered by unit tests and E2E environment can't
reliably control server-side feature flags.

Feature flag behavior is properly tested in QueryEditor.test.tsx unit tests.
E2E tests focus on functional validation when the feature is enabled.

* fix lint
2025-10-28 13:05:32 -07:00
Isabel Matwawana
e5cf0e2086 Docs: Add styling from field cell option (#113107)
Co-authored-by: Paul Marbach <paul.marbach@grafana.com>
2025-10-28 13:16:37 -04:00
Stephanie Hingtgen
6a3dfacc95 Datasources: Add service function to get by group, name, and namespace (#113066) 2025-10-28 16:43:03 +00:00
Georges Chaudy
147ff4279b kvstore: fix events lookback + startkey (#113092)
* fix snowflakes events

* add tests
2025-10-28 17:25:55 +01:00
Collin Fingar
0973a44e6a Saved Queries: Update query's ds to default if necessary (#112674) 2025-10-28 11:51:09 -04:00
William Wernert
75fb832826 Alerting: Ensure state history client has external labels set (#113101)
* Ensure state history client has external labels set

* Run `make update-workspace`

* Add dep owner
2025-10-28 11:35:54 -04:00
Tom Ratcliffe
f3e7576f0c ComboBox: Add loading state to dropdown and prefixIcon (#112967) 2025-10-28 15:22:18 +00:00
Matias Chomicki
8863ed9d6f Logs Panel: Improve search terms highlighting for highlighted JSON logs (#113093)
* Rename for clarity

* New logs panel: improve highlighting of search terms between highlighted JSON logs
2025-10-28 16:11:52 +01:00
Bruno
437dcc875c QueryCaching: Use CachingServiceClient for query caching (#112128)
* Integrate mt querier with query caching

* typo

* let the caller set cache status response header

* fix TestQueryAPI

* make gen-go

* handle CachingServiceClient being nil and make gen-go

* include namespace in cache key

* set signed in user namespace in query_test.go

* fix test

* remove commented out code

* undo services/query/query.go changes

* make gen-go

* remove namespace requirement

* fix tests

* fix test

* remove namespace from SignedInUser in tests

* make gen-go
2025-10-28 11:41:46 -03:00
Levente Balogh
3131a69f04 Switch variable type: Add docs (#113029)
* docs: add docs for the switch variable type

* chore: prettier fix

* docs: fix review notes

* Apply suggestions from code review

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

* docs: move the switch variable section after ad-hoc variables

* fix: vale fixes

* Update docs/sources/visualizations/dashboards/variables/add-template-variables/index.md

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>

---------

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>
2025-10-28 14:15:54 +00:00
Alyssa Joyner
1cb66d86b0 [InfluxDB]: Update product selection and UI (#112074) 2025-10-28 08:09:43 -06:00
Yunwen Zheng
79a5b024e1 MegaMenu: Spacing alignment tweaks (#113055) 2025-10-28 09:34:33 -04:00
Yunwen Zheng
238244fe5c SaveProvisionedDashboardForm: Show preview banner when pushing to non-configured existing branch (#112947)
* SaveProvisionedDashboardForm: Show preview banner when pushing to non-configured existing branch

* useProvisionedRequestHandler: use ref to prevent handler triggered twice
2025-10-28 09:34:18 -04:00
Paul Marbach
2a5ce2f031 Gauge: Fix migration version targeting and gdev dashboard (#112974) 2025-10-28 09:31:20 -04:00
Ryan McKinley
e1ddbda1bb LibraryPanels: Remove unique name constraints (#113077) 2025-10-28 16:30:39 +03:00
Gilles De Mey
5670f1c34c Alerting: Normalize health when filtering rules (#113087) 2025-10-28 13:23:29 +00:00
Oscar Kilhed
7df95261f3 Dynamic dashboards: Refactor ungroup rows and tabs (#112575)
* refactor ungroup

* deleting last row/tab no longer ungroups

* Change test for deleting last row to not test for ungroup

* fix comment with correct pull request

* use isLayoutGroup instead

* fix implementations

* missing import
2025-10-28 13:55:20 +01:00
Konrad Lalik
68bc0f8076 Alerting: Use common labels tooltip in Triage (#113072)
* Add a tooltip mode for common labels and use it in Triage workbench

* Change Tooltip to ToggleTip for displaying common labels
2025-10-28 12:09:41 +01:00
Ashley Harrison
b39708e439 Accessibility: Wrap data source info onto 2 lines at small viewports (#113033)
* wrap data source info onto 2 lines at small viewports

* undo other changes

* need flex-start
2025-10-28 10:48:44 +00:00
Christian Simon
74a9a288e2 grafana-flamegraph: Improve prompt for open assistant to analyze flamegraph (#113071)
* feat: Improve prompt for open assistant

Existing prompt is not specific enough and uses a new visual tool, which will result in taking a screenshot to analyze the flame graph.

* Apply suggestion from @cyriltovena

less instructions for now.

---------

Co-authored-by: Cyril Tovena <cyril.tovena@gmail.com>
2025-10-28 10:39:00 +00:00
Alexander Zobnin
7a7fd45bdd Zanzana: app platform style write APIs (#112812)
* refactor zanzana client instantiation

* refactor client imports

* POC write API (Mutate)

* fix linter

* delete exisitng folder parents

* refactor common functions

* minor refactor

* groupd operations by type

* atomic folder operations

* use deleteExisting for deletes

* Add tests for folders

* more tests

* resource permissions tests

* add more tests

* fix mock zanzana client

* fix linter

* fix linter

* re-use types from apps

* add some comments to the protobuf
2025-10-28 11:22:13 +01:00
renovate-sh-app[bot]
19d88de3cf fix(deps): update dependency @grafana/azure-sdk to v0.0.8 (#113054)
| datasource | package            | from  | to    |
| ---------- | ------------------ | ----- | ----- |
| npm        | @grafana/azure-sdk | 0.0.7 | 0.0.8 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-28 10:07:59 +00:00
Georges Chaudy
fe9c21ebf8 unistore: replace CDK backend with KV store backend" (#112746)
* deprecate the cdk backend in favor of the kv storage backend

* lint

* fix watchtests

* cover limit=0 for ListHistory

* fix rv too large
2025-10-28 10:56:08 +01:00
grafana-pr-automation[bot]
a0180f8031 I18n: Download translations from Crowdin (#113068)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-28 09:37:03 +00:00
Ashley Harrison
92fb6872f0 FileDropzone: expose id to underlying input, fix story a11y violations (#113042)
* expose inputId to underlying input, add field to story

* just use id instead of inputId
2025-10-28 09:22:09 +00:00
Ryan McKinley
d4d8b2562e Chore: Update gocloud.dev, removing opencensus (#113056) 2025-10-28 09:10:37 +00:00
Andres Martinez Gotor
bee486be23 Advisor: update app-sdk and deps (#112937) 2025-10-28 09:24:44 +01:00
Kyle Brandt
4bb91a7846 Revert "SQL Expressions: (Chore) Update GMS (go-mysql-server) depende… (#113050) 2025-10-28 06:48:57 +00:00
Anna Urbiztondo
b77a99214a Docs: Admin tweaks - Edits, weights (#113031)
* Edits, weights

* WIP

* Weights

* prettier
2025-10-28 07:45:32 +01:00
Erik Sundell
3dd4493d50 Plugin Details Page: Fix tabs not loading on hard refresh (#112915)
* don't show nav children while plugin config is loading

* add tests
2025-10-28 07:32:35 +01:00
Moustafa Baiou
ce246936c4 Alerting: Surface remote AM silence creation errors properly
When creating silences in remote Alertmanager instances, all 4xx errors were treated as 500s.

This change ensures that 4xx errors are properly surfaced as bad payload errors, allowing callers to handle them appropriately.
2025-10-27 14:21:46 -04:00
Matias Chomicki
555deb5d28 Logs panel: Respect selected fields for downloading logs (#111753)
* txt: download selected fields

* csv: download selected fields

* json: download selected fields

* Address lint issues

* Update tests

* Update tests

* Update suppressions
2025-10-27 18:34:14 +01:00
Jo
d216d75fbb Access: Add CoreRole/Role Delete/Update hooks for OpenFGA (#112839)
* Add delete and update hooks for roles/core roles

no need to capture non reference types

small cleanup on vars

* fix ticket priming in hooks

* fix ticket priming in hooks

* Revert "fix ticket priming in hooks"

This reverts commit f8e953ca09.

* use old testing blocks

* protect runtime obj in go func

* update test for correctness

* separate files for test correctness. fix leaking goroutines in go tests

* go workspace fixes

* attribute owner

* clean up go mod
2025-10-27 17:20:59 +00:00
Paul Marbach
edef69fdc8 Canvas: Allow non-icon bg image fields (#112308)
* Canvas: Allow non-icon bg image fields

* add tests
2025-10-27 12:24:26 -04:00
Austin Pond
bf65c43783 Apps: Add Example App to ./apps (#112069)
* [API Server] Add Example App for reference use.

* Remove Printlns.

* Upgrade app-sdk to v0.46.0, update apps to handle breaking changes.

* Only start the reconciler for the example app if the v1alpha1 API version is enabled.

* Some comment doc updates.

* Run make update-workspace

* Set codeowner for /apps/example

* Run make gofmt and make update-workspace

* Run prettier on apps/example/README.md

* Add COPY apps/example to Dockerfile

* Add an authorizer to the example app.

* Fix import ordering.

* Update apps/example/kinds/manifest.cue

Co-authored-by: Owen Diehl <ow.diehl@gmail.com>

* Run make update-workspace

* Re-run make gen-go for enterprise import updates

* Run make update-workspace

---------

Co-authored-by: Owen Diehl <ow.diehl@gmail.com>
2025-10-27 12:01:10 -04:00
ksemtinimahmoud
d25f5199c7 Docs: Fix incorrect label in recording rules documentation (#111464)
* Fix incorrect label: 'New Grafana recording rule' → 'New Data source recording rule'

* lowercase
2025-10-27 15:29:12 +00:00
renovate-sh-app[bot]
9c8a13c8c8 chore(deps): update dependency nanoid to v5.1.6 (#113040)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | nanoid  | 5.1.5 | 5.1.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-27 15:23:37 +00:00
Bogdan Matei
e91144950b Dashboard: Fix eslint suppressions in conditional rendering (#113045) 2025-10-27 15:23:03 +00:00
Yuri Tseretyan
5673d0b532 Alerting: Skip logging in case of invalid receivers during auto generating policies (#111838)
* skip logging of invalid receivers during autogen
* log warn instead of error
2025-10-27 11:03:06 -04:00
Ryan McKinley
6783c7f998 Dashboards: Remove unused version types (#113036) 2025-10-27 09:12:31 -04:00
Samarth Bagga
f9fb2cfd50 Flame Graph: Anchor exact match when clicking a table symbol in search (#111101)
* fixed #110680

* Edit

* Fixed test

---------

Co-authored-by: Samarth Bagga <samarth.bagga@meesho.com>
2025-10-27 14:03:19 +01:00
Gilles De Mey
7b2ea9a735 Alerting: Rename triage to alerts (#113039) 2025-10-27 12:47:51 +00:00
Kyle Brandt
0e9a3881e7 SQL Expressions: (Chore) Update GMS (go-mysql-server) dependency (#112289)
- Added gms_pure_go build tags to disable cgo - (cgo was added to GMS since we last updated it)
- Docs note on regex limitations

---------

Co-authored-by: Matheus Macabu <macabu.matheus@gmail.com>
2025-10-27 08:22:51 -04:00
Georges Chaudy
bc9540fadb kvstore: use batch delete to cleanup old events (#112737)
* use batchdelete for cleaning up old events

* comment
2025-10-27 12:27:31 +01:00
Alex Khomenko
b53e3ac860 Provisioning: Update pulling disabled badge (#112832)
* Provisioning: Update pulling disabled badge

* Move props

* Use early return
2025-10-27 11:03:22 +00:00
Levente Balogh
5a5aa18570 Dashboard Controls: Address the spacing between switch variables (#112819)
fix: adjust switch variable height in dashboard-controls menu
2025-10-27 11:40:47 +01:00
renovate-sh-app[bot]
7cd3e5dc54 chore(deps): update dependency @reduxjs/toolkit to v2.9.1 (#112975)
| datasource | package          | from  | to    |
| ---------- | ---------------- | ----- | ----- |
| npm        | @reduxjs/toolkit | 2.9.0 | 2.9.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-27 09:57:37 +00:00
Sonia Aguilar
3c57a1880c Alerting: Fix enrichment tab to be rendered only for grafana alerting rules (#113030)
fix enrichment tab to be rendered only for grafana alerting rules
2025-10-27 10:54:50 +01:00
Hugo Häggmark
4f2abe185c Chore: Replace deprecated i18next-parser (#112512)
* chore: replace deprecated i18next-parser

* chore: bump i18next-cli to 1.11.6

* chore: revert translation files

* chore: bumps to i18next-cli 1.11.9

* Trigger build

* chore: revert translations files

* chore: bump i18next-cli

* chore: changes after yarn i18n-extract

* chore: revert translation files

* chore: bump i18next-cli to 1.11.12

* chore: fix select space

* chore: add i18next to packages

* chore: add i18next-cli to plugin dev deps

* chore: fix yarn lock
2025-10-27 10:38:31 +01:00
Tobias Skarhed
f76a4885ec PanelStateWrapper: Add error boundary name (#112841)
Add error boundary name to PanelStateWrapper
2025-10-27 10:04:37 +01:00
Ryan McKinley
5df4a3b9a3 Chore: Update app-sdk to v0.48.1 (#113023) 2025-10-27 09:34:26 +03:00
Hugo Häggmark
6a15f40a85 Plugins: Remove plugin load failure logging for unauth users (#112940) 2025-10-27 05:48:31 +01:00
Kevin Minehart
cc4a6cff64 CI: End process if e2e tests fail in daggerbuild (#113013) 2025-10-25 08:50:04 -06:00
grafana-pr-automation[bot]
b9b0ff1219 I18n: Download translations from Crowdin (#113012)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-25 00:39:21 +00:00
Isabel Matwawana
815ced0f70 Docs: Update saved queries permissions for Viewer role (#112978) 2025-10-24 15:13:47 -04:00
Paul Marbach
1bf0861738 TimeSeries: Tests for x-axis units (#112956)
* more panels

* fix

* TimeSeries: Tests for x-axis units

---------

Co-authored-by: Leon Sorokin <leeoniya@gmail.com>
2025-10-24 15:05:13 -04:00
Paul Marbach
5656f62cf4 Gauge: Update codeownership for RadialGauge grafana/ui component (#112972) 2025-10-24 15:04:49 -04:00
Paul Marbach
eabb348152 StateTimeline: Comment and metadata cleanup (#112960) 2025-10-24 15:04:33 -04:00
Mihai Turdean
f019d58a99 [grafana-iam] Add resourcePermissions hooks to sync write to Zanzana on UPDATE and DELETE (#112767) 2025-10-24 11:45:24 -06:00
Andreas Christou
d2dbb816b2 Graphite: Fix legacy response unmarshalling (#112968)
Fix legacy response unmarshalling
2025-10-24 12:28:04 -05:00
Jacob Valdez
e23ba8aa6c docs: Fix broken refs in single stack access doc (#112903) 2025-10-24 11:45:49 -05:00
Josh Hunt
59bfb44a50 FS: Apply versionString in help menu in frontend (#112958)
Set version in help menu in the frontend instead
2025-10-24 17:42:42 +01:00
Leon Sorokin
9b7c68c994 TimeSeries: Allow custom time units on x-axis (#112913)
* more panels

* fix
2025-10-24 12:35:52 -04:00
renovate-sh-app[bot]
a7349af934 chore(deps): update dependency @openfeature/web-sdk to v1.6.2 (#112923)
| datasource | package              | from  | to    |
| ---------- | -------------------- | ----- | ----- |
| npm        | @openfeature/web-sdk | 1.6.1 | 1.6.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-24 17:34:24 +01:00
Leon Sorokin
adcc634db6 Histogram: Properly handle sparse heatmap-cells frames (#112907)
* Histogram: Properly handle sparse heatmap-cells frames

* add test

* fix crash with float bounds and rounding

* tweak comment

* add test for float bounds
2025-10-24 12:19:49 -04:00
Sergej-Vlasov
e818234a4e E2E: Skip flaky test (#112964)
skip falky test
2025-10-24 16:12:14 +00:00
Denis Vodopianov
81683d554d chore : Deprecating FeatureToggles.IsEnabledGlobally (#112885)
* add deprecation on featuremgmt.IsEnabledGlobally

* add nolint reason

* add reasonable deprecation message

* remove junk edits

* add more nolints

* addressing review comments

* Update pkg/services/featuremgmt/models.go

Co-authored-by: Dave Henderson <dave.henderson@grafana.com>

---------

Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
2025-10-24 12:02:53 -04:00
Ieva
4cea71ee73 Access Control: Fix the permission checks for saving/updating/deleting annotations (#112953)
pass in the correct scope for evaluating annotation permissions on a dashboard
2025-10-24 16:11:58 +01:00
Paul Marbach
3f02f50cf9 StateTimeline: Complete E2E tests and add simple StateTimelineTooltip unit tests (#112901)
* StateTimeline: E2E tests for basic rendering, no data, and tooltip interactions

* Add tests for StateTimelineTooltip sub-component

* Remove unused import from state-timeline.spec.ts

* updates from PR review
2025-10-24 10:45:48 -04:00
Alex Khomenko
f7eac7f7ba Provisioning: Fix badge for classic provisioning (#112954) 2025-10-24 14:37:06 +00:00
Tom Ratcliffe
2362f9bd6b API Clients: Fix exports for correlations API (#112950) 2025-10-24 14:19:32 +00:00
Tom Ratcliffe
5ffff1e39d Teams: Refactor tests and tidy up reducer (#112850) 2025-10-24 14:14:12 +00:00
Alex Khomenko
bda35611f1 Dashboard v2: Use valid default timestamp (#112928) 2025-10-24 14:00:19 +00:00
Sonia Aguilar
681f27e6b3 Alerting: Create alertingAlertRuleFormSchema in restrictedGrafanaApis (#112794)
* create navigateToAlertFormSchemaApi in restrictedGrafanaApis and use it in formDefaults.ts

* update alertingSchemaApi

* fix test

* move alertingSchemaApi.ts and the alerting section in README.md to a new alerting folder

* move cloud rules form schema outside restrictedGrafanaApis

* remove cloud fields in schema and use values from existing enums for some fields

* refactor RestrictedGrafanaApisContextTypeInternalenrichment type adding a high level entry for alerting

* refactor: change naming and come back to one single level in the RestrictedGrafanaApisContextType

* update README.md
2025-10-24 15:47:52 +02:00
Matheus Macabu
2c6c564c18 Secrets: Add decrypter to decrypt duration metric (#112942) 2025-10-24 15:23:54 +02:00
Oscar Kilhed
c1e308f61e Dynamic dashboards: Clarify conditional rendering disabled tooltip (#112843)
* change conditional rendering copy

* update link

* small fix
2025-10-24 13:05:52 +00:00
Andrej Ocenas
2f22073ad8 Plugin navigation: Fix active nav item selection when there are more than 10 items in a group (#112886)
Fix passing depth in map function
2025-10-24 15:04:24 +02:00
Tom Ratcliffe
546d3ec313 Dashboard Picker: Update to use correct search + dashboards APIs (#112341) 2025-10-24 14:00:16 +01:00
Ashley Harrison
466f1b8271 Frontend service: Improve logging to include hostname/traceid (#112889)
improve frontend service logging to include hostname/traceid
2025-10-24 13:55:44 +01:00
Jason Marshall
83ec5e6789 Onboarding issues I noticed (#105211)
* Fix inconsistency in command instructions between the Backend and Frontend section.

* Increase ulimit advice.

On a bare system I'm getting almost 6200 files from the given `find` command.
It's clear that this project has grown considerably since this line was added
to the onboarding docs.

* starting grafana is not explained in the devenv readme.
2025-10-24 14:54:30 +02:00
Josh Hunt
5ee636d47d FS: Fix tempo-init not working in devenv (#112938) 2025-10-24 12:42:29 +00:00
Hugo Häggmark
be2944ea16 Chore: Add Bytespider to frontend bot list (#112941) 2025-10-24 12:41:10 +00:00
Paul Marbach
027eeb99e1 StateTimeline: Fix color display in tooltip (#112878) 2025-10-24 08:40:56 -04:00
Gilles De Mey
2a3b3c0003 Alerting: Promote the policy matching functions to stable (#112931) 2025-10-24 12:36:23 +00:00
Todd Treece
dc77da11cf Plugins: API sync (#112452) 2025-10-24 08:09:26 -04:00
Jo
8b12bbcc55 AccessControl: Include hidden roles in service account role display (#112924)
* AccessControl: Include hidden roles in service account role fetches

Add includeHidden=true parameter to role API calls to ensure service accounts
with hidden roles assigned properly display those roles in the UI.

Previously, service accounts with only hidden roles would appear to have no
roles assigned in the UI, even though the API showed they had roles when
queried with includeHidden=true.

This change affects both:
- Bulk role fetching for the service accounts list
- Individual user role fetching used by the role picker

* format
2025-10-24 14:04:13 +02:00
Jack Baldry
e48eaa567e Restructure IAM documentation (#112929)
Co-authored-by: Misi <mgyongyosi@users.noreply.github.com>
2025-10-24 12:54:59 +01:00
Tom Ratcliffe
5b717af829 Codeowners: Add search nav org team to codeowners for navtree (#112918) 2025-10-24 11:43:14 +01:00
Tom Ratcliffe
e21c0d4724 Folders: Simplify FolderFilter and use GrafanaSearcher (#112639) 2025-10-24 11:42:36 +01:00
Sven Grossmann
f03125279a Loki: Fix merging responses would merge null notices (#112920)
* Loki: Fix merging responses would merge `null` notices

* fix tests
2025-10-24 10:28:39 +00:00
Josh Hunt
bb6d7d02c7 FS: Call IndexDataHooks for custom version string (#112670)
* Add enterprise hooks

* wip...

* undo

* update wire gen

* remove old hook thing

* move build info into seperate func

* align fs context middleware with grafana, setting SignedInUser

* Call IndexDataHooks to get modified build info

* update tests

* go workspace

* idk, reset workspace files or whatever

* conditionally mount license

* support loading decoupled plugins from cdn

---------

Co-authored-by: Ashley Harrison <ashley.harrison@grafana.com>
2025-10-24 11:04:44 +01:00
Jo
71d10a3fa3 FolderPermissions: Return 404 error when folder does not exist instead of 500 (#112919)
* AccessControl: Improve folder permissions error handling

- Add proper error type handling for folder permission checks
- Convert dashboards.ErrFolderNotFound to folder.ErrFolderNotFound
- Preserve errutil.Error types when returned
- Wrap unhandled errors with new ErrFolderUnhandledError for better error tracking

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update pkg/services/accesscontrol/ossaccesscontrol/folder.go

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-24 09:50:38 +00:00
Matias Chomicki
df4922ea78 mergeResponses: use map to find frames to combine (#112855)
* mergeResponses: use map to find frames to combine

* Remove console
2025-10-24 11:25:02 +02:00
Kevin Minehart
e7a49fc472 CI: Windows builds with CGO cross-compiler toolchain (#112922)
* CI: Windows builds with CGO cross-compiler toolchain

* fix comments
2025-10-24 09:23:14 +00:00
Mihai Doarna
4bdee91501 IAM: Implement the delete method for team bindings (#112844)
* implement the delete method for team bindings

* add integration test

* remove team binding search from legacy store
2025-10-24 11:58:13 +03:00
Gilles De Mey
5f9ed73f82 Alerting: Mark triage as new in the navigation (#112887) 2025-10-24 10:54:25 +02:00
grafana-pr-automation[bot]
0fe06800d5 I18n: Download translations from Crowdin (#112911)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-24 08:46:41 +00:00
renovate-sh-app[bot]
6f82e44283 chore(deps): update dependency @openfeature/core to v1.9.1 (#112896)
| datasource | package           | from  | to    |
| ---------- | ----------------- | ----- | ----- |
| npm        | @openfeature/core | 1.9.0 | 1.9.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-24 09:41:55 +01:00
Gareth
20a11e0bc0 Tempo error source fix (#112916)
fix tempo error source
2025-10-24 16:58:58 +09:00
Marcus Andersson
52cd4d434f Bugfix: Adding support for resolving panel plugins that expose a Promise<PanelPlugin> (#112899)
Fixed issue where panel plugin module returns an async function that resolves a panel plugin.
2025-10-24 08:31:55 +02:00
Alex Khomenko
f7748676b3 Provisioning: Display manager kind (#112831)
* Provisioning: Display manager kind

* Show repo id

* Show repository name
2025-10-24 08:02:08 +03:00
Adam Yeats
df305c111e Elasticsearch: Update documentation to state that Elastic Cloud Serverless is not supported (#112898)
Elasticsearch: Update documentation to state Elastic Cloud Serverless is not supported
2025-10-23 22:04:36 +01:00
Larissa Wandzura
64f6bd5348 DOCS: Added a warning about using timezone with macros in MSSQL (#112900)
added warning about using timezone with macros in MSSQL
2025-10-23 16:03:58 -05:00
Juan Cabanas
89ca1dd0e4 DashboardLibrary: Fix border radius box (#112905) 2025-10-23 20:45:09 +00:00
renovate-sh-app[bot]
7ecb057414 chore(deps): update dependency @formatjs/intl-durationformat to v0.7.6 (#112884)
| datasource | package                       | from  | to    |
| ---------- | ----------------------------- | ----- | ----- |
| npm        | @formatjs/intl-durationformat | 0.7.4 | 0.7.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-23 17:06:41 +01:00
Matias Chomicki
34cf970b54 Logs volume: set line width to 0 (#112881) 2025-10-23 17:36:51 +02:00
Yunwen Zheng
ddc5ae6f4d Git Sync UI a11y finding fixes (#112751)
* ProgressBar: progressbar nodes must have accsible name fix

* BrowseActions: Bulk move and delete drawwer a11y fix

* FolderActionsButton: Move and delete drawer a11y fix

* ConfigForm: a11y fix missing id

* GettingStarted: Skip img alt since its decorative

* JobContent: heading a11y fix

* StatusBadge: add displayOnly prop to avoid cursor pointer display when its not necessary

* RepositoryTypeCards: Card missing discernible text

* i18n

* input id fix
2025-10-23 11:25:26 -04:00
Gilles De Mey
62c5df36d6 Alerting: Always initialize an empty slice of routes for the routingtree (#112880) 2025-10-23 17:21:13 +02:00
Ashley Harrison
c74af4f3d4 Modal: Fix button focus being clipped (#112867)
add padding to modalbuttonrow
2025-10-23 16:18:30 +01:00
Gábor Farkas
87f40c65e4 datasources: forward the x-forwarded-for header (#112863) 2025-10-23 17:14:50 +02:00
Yuri Tseretyan
8b7f119cad Alerting: Provisioning to fix contact point type on save (#112246)
fix contact point type on create\update
2025-10-23 11:11:36 -04:00
Costa Alexoglou
2b9c138d7e feat: allow service_name override (#112875) 2025-10-23 14:36:23 +00:00
Kevin Minehart
6b2b9bd7c2 CI: release windows no cgo (#112870)
* fix nocgo option

* set nocgo for windows and darwin
2025-10-23 16:12:07 +02:00
Misi
9c676b3ae7 IAM: Rename Name to Title in UserSpec (#112862)
* Use Title as the name of the display name for User

* Align tests
2025-10-23 16:03:28 +02:00
Tom Ratcliffe
811ee99dac API clients: Extract into a package (#111810)
Co-authored-by: Tom Ratcliffe <tom.ratcliffe@grafana.com>
Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>
2025-10-23 13:57:51 +00:00
Torkel Ödegaard
91b7ff2ece RadialGauge: Fixes glow effect in light theme (#112768)
* RadialGauge: Fixes glwo effect in light theme

* Update
2025-10-23 15:41:16 +02:00
Selene
0ba040e866 Return the correct model (#112858) 2025-10-23 13:38:22 +00:00
renovate-sh-app[bot]
51ad754d1e chore(deps): update yarn to v4.10.3 (#112801)
| datasource | package      | from  | to     |
| ---------- | ------------ | ----- | ------ |
| npm        | @yarnpkg/cli | 4.9.4 | 4.10.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-23 14:34:02 +01:00
Dan Cech
4ff6919731 Chore: Refine side nav item layout (#112824)
adjust padding of sidebar menu items
2025-10-23 08:53:09 -04:00
Rafael Bortolon Paulovic
4e296fa9ec fix: sqlite nocgo with ionice and parallel flag (#112849)
* chore: log test DB path

* fix: run sqlite_nocgo with parallel 4 and ionice to reduce IO operations
2025-10-23 14:08:39 +02:00
Kevin Minehart
2a0f149a63 pkg/build: Add nocgo option (#112834)
Add nocgo option
2025-10-23 12:01:18 +00:00
Peter Štibraný
a4aa3529c8 Cleanup old entries from resource_last_import_time table. (#112438)
* Cleanup old entries from resource_last_import_time table.

* Add index for last_import_time column.

* Address review feedback.
2025-10-23 11:17:08 +00:00
Tom Ratcliffe
9021719437 Library Panels: Remove direct use of legacy search (#112231) 2025-10-23 11:41:12 +01:00
Anna Urbiztondo
913b303664 Docs: Change of doc name (#112847)
Change of doc
2025-10-23 12:30:40 +02:00
Tania
82e5b81a30 OpenFeature: Fix instrumentation in OFREP API (#112845)
OpenFeature: Fix instrumentation in ofrep api
2025-10-23 10:09:41 +00:00
Neeraj Panwar
876bfeb9ad CloudMonitoring: Fix 3h alignment period (#112830)
Updated 3h alignment period
2025-10-23 10:59:56 +01:00
Ashley Harrison
13c62a47a9 Chore: Remove barrel files (#112803)
* remove AccessControl barrel file

* fix richhistory barrel file

* fix auth-config barrel file

* remove ConnectionsRedirectNotice barrel file

* remove ConnectData barrel file

* remove CategoryHeader barrel file

* remove NoAccessModal barrel file

* remove Search barrel file

* actually prune it...

* remove ConnectData barrel file

* remove AddLibraryPanelWidget barrel file

* remove DashExportModal barrel file

* remove DashNav barrel file

* remove DashboardRow barrel file

* remove DashboardSettings barrel file

* remove TracePageHeader barrel file

* remove TimelineHeaderRow barrel file

* remove reexport in utils

* remove unnecessary barrel file export

* remove DraggableManager demo barrel file

* remove barrel export in useStateSync

* remove GetStartedWithPlugin barrel file

* remove pickers barrel file

* remove ArgQueryEditor barrel file

* remove LogsQueryEditor barrel file

* remove the QueryEditor barrel file

* remove ResourceField barrel file

* remove ResourcePicker barrel file

* remove TracesQueryEditor barrel file

* remove SQLBuilderEditor barrel file

* remove MetricStatEditor barrel file

* remove nodeGraph barrel file

* Revert "remove barrel export in useStateSync"

This reverts commit e3b5dd8891.
2025-10-23 10:31:10 +01:00
Misi
ad9d8098ef IAM: Add email, login field validation to User create/update API (#112391)
* wip

* wip

* wip

(cherry picked from commit 8cedf25892)

* Search seems to be working, the validation is still wip

* Use keyword.Name analyzer for Filterable fields

* Only string fields should be indexed with keyword analyzer

* Change search query for email and login fields to use term query
* Remove unnecessary Exact from the resource protobuf definitions

Co-Authored-By: Ryan McKinley <ryantxu@gmail.com>

* Add legacy search support to the API

* Tests for legacy search, validate and integration tests for user

* Lint

* Add snapshot tests to userDocumentBuilder

* Address CodeQL issues

* Improvements, handle Mode2, tests should pass

* Change default limit from 0 to 1 for requests

* Cleanup

* Add fixme

* Update pkg/registry/apis/iam/register.go

Co-authored-by: Stephanie Hingtgen <stephanie.hingtgen@grafana.com>

* Update pkg/registry/apis/iam/user/legacy_search.go

Co-authored-by: Stephanie Hingtgen <stephanie.hingtgen@grafana.com>

---------

Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
Co-authored-by: Stephanie Hingtgen <stephanie.hingtgen@grafana.com>
2025-10-23 11:29:02 +02:00
Tobias Skarhed
f191acf811 Codeowners: Assign scopes frontend types (#112784)
* Codeowners: Assign scopes frontend types

* Fix CODEOWNERS entry for scopes.ts
2025-10-23 09:17:54 +00:00
Gábor Farkas
a53ce56bca datasources: querier: handle the X-Real-IP header (#112838) 2025-10-23 10:47:48 +02:00
Oscar Kilhed
31726e4a73 Dynamic dashboard: Click row title should not collapse row in edit (#112786)
click title should not collapse row in edit
2025-10-23 11:40:08 +03:00
Mihai Doarna
3076f7a9b9 IAM: Implement the update method for team bindings (#112788)
* implement the update method for team bindings

* fix lint error

* add integration tests

* add integration test for non existing team binding

* try to fix lint error
2025-10-23 11:39:38 +03:00
Kevin Minehart
24d3c88c09 CI: pr-test-docker should look for itself not for integration test (#112840)
pr-test-docker should look for itself not for integration test
2025-10-23 08:28:40 +00:00
xavi
043451685b chore(iam): Remove skipTokenRotationIfRecent feature flag (#112799) 2025-10-23 10:02:41 +02:00
Serge Zaitsev
f3eabbf588 Chore: Add more metrics to annotation service to see its usage (#112651) 2025-10-23 09:48:07 +02:00
Jo
2e1704b56f Access: Add AfterCreate hooks for Roles/Core Roles (#112666)
As part of migrating Grafana's authorization system to Zanzana (OpenFGA), we need to ensure that role permissions defined in the IAM API are automatically synced to the authorization backend. Without this sync, roles created through the API would not be enforced by Zanzana, creating an inconsistency between defined permissions and actual authorization decisions.

This is a critical piece of the dual-write pattern during the migration to Zanzana, ensuring that:

    Role permissions are immediately available for authorization checks
    The legacy RBAC system and new Zanzana system remain in sync
    Users experience consistent permission enforcement regardless of which backend is queried

safe to revert
2025-10-23 09:47:39 +02:00
Kevin Minehart
cd961af818 CI: update stale branch action (#112836)
update stale branch action
2025-10-23 07:45:59 +00:00
Andres Martinez Gotor
eb0824a881 Advisor: Add support for multiple orgs (#112577) 2025-10-23 09:22:31 +02:00
Yuri Tseretyan
15c6afafb3 Update developer-guide (#112299) 2025-10-23 08:38:40 +02:00
Hugo Häggmark
c0391ad2ea Chore: Enable new pluginImporter (#112625)
* Chore: Enable new pluginImporter

* chore: remove pluginLoader
2025-10-23 06:18:23 +02:00
grafana-pr-automation[bot]
04ea9eebd4 I18n: Download translations from Crowdin (#112825)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-23 00:39:33 +00:00
Roberto Jiménez Sánchez
c9daec7b6d Provisioning: discontinue use of service identity based background tasks when onlyApiServer is true (#112634)
* Skip informers if Provisioning disable controllers is enabled

* Hydrate requester correctly for Grafana Live

* revert to old code because eventualRestConfig provider issues

---------

Co-authored-by: Charandas Batra <charandas.batra@grafana.com>
2025-10-23 00:35:46 +00:00
Dave Henderson
fbc81d2fd0 fix(accesscontrol): Reduce memory usage in GroupScopesByActionContext (#112295)
Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
2025-10-22 18:25:10 -04:00
Costa Alexoglou
b1ddba9767 docs: remove ai generated file (#112821) 2025-10-22 22:20:41 +02:00
Paul Marbach
123e46c33b Coverage: Add some DX improvements to by codeowner script (#112673)
* Coverage: Add some DX improvements to by codeowner script

* Potential fix for code scanning alert no. 3796: Shell command built from environment values

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* Potential fix for code scanning alert no. 3797: Shell command built from environment values

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* fix package.json and yarn lock

* reorder imports

* fix issue for frontend-platform: exclude files in any /test/ dir

* wip

* add ora spinner for codeowners manifest step

* cleanup

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-10-22 15:09:39 -04:00
Paul Marbach
23726c7c90 Table: Update ad-hoc filter to use name instead of displayName (#112815)
* Table: Update ad-hoc filter to use name instead of displayName

* update e2e test to exercise failure case
2025-10-22 14:07:00 -04:00
Rafael Bortolon Paulovic
4ae5c2ea84 fix: retry with backoff busy/locked errors on SQLite TruncateDBTables (#112667)
* fix: SQLite truncate with retry/backoff on busy/locked errors

* fix: use retryer package for retrying SQLite TruncateDBTables

* fix: use dskit/backoff package to return last error

* fix: do not log number of attempts
2025-10-22 18:54:44 +02:00
Todd Treece
638a1808f8 Access Control: Add fixed role loader service (#112747) 2025-10-22 12:04:42 -04:00
Will Assis
13f44336f2 unified-storage: remove full ngram feature toggle (#111994)
* unified-storage: remove full ngram feature toggle
2025-10-22 10:11:40 -04:00
Matias Chomicki
9e0fe94e8d Fields Selector: Add component and integrate with Logs and Logs table visualization (#112534)
* Copy base components

* Refactor FieldSelector and add LogList wrapper

* Get field names from data frame

* FieldSelector: get labels and fields from dataframes

* Show active fields

* Show all fields

* Fix field list height

* Toggle fields

* Reorder fields

* Hide active fields if there are no fields

* Show suggested fields

* Sort available fields

* Hide drag icon if not draggable

* Filter fields

* Add collapse control

* Table: use FieldSelector component

* Remove deprecated components

* Improve Logs Table sidebar

* Store table sidebar resizes

* Lint issues

* Minor refactor to columns getters

* Fix column sorting

* Translations

* Fix columns reset

* Prettier

* Add showFieldSelector option

* Implement suggested fields

* Remove margin from button

* Update stored width on expand/collapse

* Update test

* Add unit test

* Prettier

* Translations

* Add integration test

* Return null

* Update comment

* More integration tests

* Use forEach

* Make dataFrame possibly undefined

* Move components

* Memoize callback

* Prettier

* Table: improve resize behavior

* Update public/app/features/logs/components/fieldSelector/FieldSelector.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Prettier

* Analytics: report sidebar state

* Analytics: add interactions

* Search: add clear button

* Translations

* LogLineContext: pass missing storage key prop

953¿

* Field: report toggling

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-22 13:45:58 +00:00
Ida Štambuk
be1b18a3d6 CloudWatch Logs: Don't add console link to every field in the logs response (#112230) 2025-10-22 13:43:52 +00:00
Adela Almasan
a011ec29fe Actions: Add analytics (#111200) 2025-10-22 13:38:25 +00:00
Mihai Doarna
9587f9374b Docs: Fix markdown syntax for config options table (#112805)
* fix markdown syntax for config options table

* yarn run prettier:write
2025-10-22 16:37:40 +03:00
Irene Rodríguez
6cfcc32895 Remove hipchat alert notification details (#112804) 2025-10-22 13:22:05 +00:00
Bogdan Matei
a38b210472 Dashboard: Fix dropping panels in tabs (#112728) 2025-10-22 15:56:39 +03:00
Bogdan Matei
ae1a389f0f Dashboard: Fix dropping panels in tabs nested in rows (#112718) 2025-10-22 15:56:26 +03:00
Todd Treece
815e782ad0 Server Lock: Handle context cancellation (#112535) 2025-10-22 08:27:51 -04:00
Ashley Harrison
e317e751d1 Internationalisation: Translate time ranges (#112745)
* translations for time ranges

* provide default single value
2025-10-22 13:17:34 +01:00
renovate-sh-app[bot]
ab888c0435 chore(deps): update dependency nanoid to v5.1.6 (#112790)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | nanoid  | 5.1.5 | 5.1.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-22 11:36:10 +01:00
renovate-sh-app[bot]
ae65a9ae89 chore(deps): update dependency @openfeature/web-sdk to v1.6.2 (#112789)
| datasource | package              | from  | to    |
| ---------- | -------------------- | ----- | ----- |
| npm        | @openfeature/web-sdk | 1.6.1 | 1.6.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-22 11:35:45 +01:00
Tobias Skarhed
2bbba880cd Scopes: Change redirectUrl to redirectPath (#112783)
* Scopes: change redirectUrl to redirectPath

* Update e2e helpers
2025-10-22 11:21:14 +02:00
Matthew Thorning
9b72973293 Chore: Add Namespace Support To Grafana-i18n ESLint Rule (#112730) 2025-10-22 10:12:54 +01:00
renovate-sh-app[bot]
f3cf17c069 chore(deps): update dependency @openfeature/core to v1.9.1 (#112740)
| datasource | package           | from  | to    |
| ---------- | ----------------- | ----- | ----- |
| npm        | @openfeature/core | 1.9.0 | 1.9.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-22 09:43:42 +01:00
renovate-sh-app[bot]
1f6cb61941 chore(deps): update dependency @formatjs/intl-durationformat to v0.7.6 (#112739)
| datasource | package                       | from  | to    |
| ---------- | ----------------------------- | ----- | ----- |
| npm        | @formatjs/intl-durationformat | 0.7.4 | 0.7.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-22 09:43:19 +01:00
Torkel Ödegaard
df9b36292d SoloPanel: Fixes issue with solo route and scopes variable (#112769)
* SoloPanel: Fixes issue with solo route and scopes variable

* fix lint
2025-10-22 10:40:06 +02:00
Peter Štibraný
3391163f9c Check that we see less calls than allowed maximum. (#112785)
Check that we see less calls than allowed maximum.
2025-10-22 08:39:19 +00:00
Jack Baldry
1abb5aa0f9 Rename behavior related to the interactive learning plugin (#112752) 2025-10-22 09:06:21 +01:00
Tobias Skarhed
b3d9fd677b Scopes: Redirect to redirectUrl on selection (#112721)
* Add redirectUrl frontend functionality

* Add test

* Add e2e test suite

* Fix linting
2025-10-22 09:16:58 +02:00
Gábor Farkas
8ab7a20265 update dependency grafana/grafana-plugin-sdk-go to v0.281.0 (#112726)
* go get github.com/grafana/grafana-plugin-sdk-go@v0.281.0

* make update-workspace

* updated failing unit test

* disable deprecation warnings

* datasources: allow underscore-prefixed local time range

* updated go.work.sum
2025-10-22 09:02:11 +02:00
Alex Khomenko
0098a68983 Restore dashboards: Add sort by deleted date (#112648)
* Restore dashboards: Add sort by deleted date

* Use Date.parse
2025-10-22 08:25:14 +03:00
Galen Kistler
fcf7aa5e2f Annotations: VizActions support in annotation tooltips (#112141)
Co-authored-by: Leon Sorokin <leeoniya@gmail.com>
2025-10-21 20:52:08 -05:00
grafana-pr-automation[bot]
5aef57af73 I18n: Download translations from Crowdin (#112763)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-22 00:39:45 +00:00
Dan83
1ffe3cc486 Forms: Remove gf-form from BasicSettings.tsx (#112310) 2025-10-21 15:50:56 -06:00
Todd Treece
069cc909ea Revert "chore(tracing): Initialize tracing early, before wire" (#112758)
Revert "chore(tracing): Initialize tracing early, before wire (#112007)"

This reverts commit 8ec162afec.
2025-10-21 21:23:09 +00:00
Oscar Kilhed
f3cc62569b Dynamic dashboards: Make sure tab is selected when creating a new tab inside a row (#112630)
Make sure tab is selected when creating a new tab inside a row
2025-10-21 23:13:08 +02:00
Larissa Wandzura
e5627bcc67 Docs: Added known limitations to SQL Expressions (#112676)
* initial new section creation

* added additional known limitations

* adding some clarification
2025-10-21 16:06:26 -05:00
Anton Chimrov
24751850c6 Canvas: Fix SVG Icons blinking issue with streaming data (#99941) (#110128)
* Canvas: Fix IconDisplay blinking issue with streaming data (#99941)

* Merge main and fix formatting
2025-10-21 12:46:18 -07:00
Georges Chaudy
9a154ac15f kvstore: add batch delete (#112723)
-add batch delete to the grpc
2025-10-21 21:32:03 +02:00
Galen Kistler
def449293b Annotations: Datalink support in annotation tooltips (#112129)
Co-authored-by: Leon Sorokin <leeoniya@gmail.com>
2025-10-21 14:23:50 -05:00
Jesse David Peterson
05461b1455 TimeComparison: Automatically show/hide menu on hover (#112750)
feat(time-comparison): show menu on hover, like three dots menu
2025-10-21 15:19:18 -04:00
Pepe Cano
fb5c5411f8 docs(alerting): clarify usage of templates in webhook custom payloads (#112672)
* docs(alerting): clarify usage of templates in webhook custom payloads

* Update docs/sources/alerting/configure-notifications/template-notifications/manage-notification-templates.md

Co-authored-by: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com>

---------

Co-authored-by: Johnny Kartheiser <140559259+JohnnyK-Grafana@users.noreply.github.com>
2025-10-21 13:32:01 -05:00
Austin Pond
56b088aa2e APIServer: Add Method for Installer-Based Apps to Self-Register with the APIRegistrar (#112479)
* [APIServer] Add the method RegisterAPIInstaller to the APIRegistrar interface, and implement it in the builder. This allows new installer-based apps to register themselves in enterprise.

* Rename RegisterAPIInstaller to RegisterAppInstaller
2025-10-21 14:25:16 -04:00
owensmallwood
c8664d303e Unified Storage: Match all included tags (#112748)
* if you include multiple tags in the search query, search for them using AND logic

* go-fmt
2025-10-21 11:54:14 -06:00
dependabot[bot]
590230f107 deps(actions): bump actions/setup-go from 5.5.0 to 6.0.0 (#112621)
* deps(actions): bump actions/setup-go from 5.5.0 to 6.0.0

Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.5.0 to 6.0.0.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v5.5.0...v6)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* update enterprise imports

Signed-off-by: Dave Henderson <dave.henderson@grafana.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
2025-10-21 17:53:02 +00:00
Paul Marbach
00652f1f96 StateTimeline: Add unit tests for usePagination hook, reorganize/rename some files (#112532)
* StateTimeline: Add unit tests for usePagination hook

* reorganize styles

* StateTimelineTooltip2 -> StateTimelineTooltip
2025-10-21 13:01:08 -04:00
Will Assis
545b7bf8ff fix: file and file_meta migrations (#112611)
* fix file and file_meta migrations to check the database state to decide which migration to run
2025-10-21 12:46:32 -04:00
Ashley Harrison
7678fc9de1 Chore: convert some class components to functional (#112661)
* convert BigValue to functional component

* convert AbstractList

* Revert "convert AbstractList"

This reverts commit 673c22a81d.

* ignore and deprecate remaining list components

* convert NotFoundDisplay

* convert rectangle

* fix some test components

* convert thresholds.tsx

* convert SpanGraph to functional component

* convert InviteeRow to functional component

* converted InviteesTable to functional component

* convert PanelPluginError to functional components

* convert UserOrganizations

* convert UserSessions to a functional component

* convert UserTeams to a functional component

* convert CloudMonitoringCheatSheet to a functional component

* convert ConfigEditor a react functional component

* convert TestInfoTab to a functional component

* convert DebugPanel to a functional component

* fix types + BigValue story
2025-10-21 17:33:38 +01:00
Stephanie Hingtgen
5d82502535 Dashboards: Set limit to default if negative; document functionality (#112659) 2025-10-21 11:06:02 -05:00
Torkel Ödegaard
27ac08dd51 NewGauge: Fix segmented gauge with min value != 0 (#112697)
* NewGauge: Fix segmented gauge with min value != 0

* update gdev dashboard to exercise case

* update gdev dashboard with panel to exercise

* update

---------

Co-authored-by: Paul Marbach <paul.marbach@grafana.com>
2025-10-21 17:49:04 +02:00
Matheus Macabu
5a798afb3f AccessControl: Fix flaky set resource permission integration test (#112738)
* AccessControl: Fix flaky set resource permission integration test

* Also remove println
2025-10-21 15:45:35 +00:00
Georges Chaudy
eca379e98e kvstore: update storage backend to use batch get (#112704)
* consume batchget

* remove rv

* remove un-necessary limit

* do not pass stop to the iterators

* ensure we return the error
2025-10-21 15:42:07 +00:00
github-actions[bot]
0a2564c4d5 Release: update changelog for main (#112719)
* Update changelog

* Update changelog

* Update changelog

* Update changelog

* Update changelog

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-21 15:17:05 +00:00
Ashley Harrison
59dedb387f Modal: Expose ariaLabel prop to use with custom header element (#112668)
add optional aria-label for modal when passing custom header element
2025-10-21 16:09:53 +01:00
Tania
451004d152 OpenFeature: Add debug logs (#112724) 2025-10-21 17:03:19 +02:00
Kyle Brandt
e930b3e6c4 SQL Expressions: Replace NaN/Inf values with Null (#112641)
This is because MySQL doesn't support storing of NaN valuels, and therefore go-mysql-server isn't going to either.

Float fields/columns are always mapped to be nullable now, otherwise we would have to replace NaN/Inf with 0.
2025-10-21 10:43:04 -04:00
renovate-sh-app[bot]
5d8492d728 chore(deps): update dependency micro-memoize to v4.2.0 (#112701)
| datasource | package       | from  | to    |
| ---------- | ------------- | ----- | ----- |
| npm        | micro-memoize | 4.1.3 | 4.2.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-21 15:38:48 +01:00
renovate-sh-app[bot]
c83db36573 chore(deps): update dependency lossless-json to v4.3.0 (#112700)
| datasource | package       | from  | to    |
| ---------- | ------------- | ----- | ----- |
| npm        | lossless-json | 4.2.0 | 4.3.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-21 15:38:15 +01:00
Alexander Zobnin
adf1224e82 AuthZ: Zanzana only evaluation toggle (#112715)
* Zanzana: Feature toggle to enable zanzana only evaluation

* refactor

* Update pkg/services/featuremgmt/toggles_gen.json

Co-authored-by: Ieva <ieva.vasiljeva@grafana.com>

---------

Co-authored-by: Ieva <ieva.vasiljeva@grafana.com>
2025-10-21 16:03:17 +02:00
Andres Martinez Gotor
12e294d8ab Advisor: Avoid automatic check creation (#111678) 2025-10-21 15:40:00 +02:00
Yuri Tseretyan
5f9a51418c Alerting: Fix unmarshalling of GettableStatus to include time intervals (#112602)
* move test files into test-data

* add test for the bug

* populate time-intervals of gettableStatus config
2025-10-21 09:28:04 -04:00
Austin Pond
6851ca2988 Docs: Add Additional /apis Versioning Guidance (#109134)
* [docs] Add extra guidance for new /apis versioning.

* Fix typo

* fix typo

* Run prettier on changes.

* Update docs/sources/developers/http_api/apis.md

Co-authored-by: Igor Suleymanov <radiohead@users.noreply.github.com>

* Update docs/sources/developers/http_api/apis.md

Co-authored-by: Igor Suleymanov <radiohead@users.noreply.github.com>

* Update docs/sources/developers/http_api/apis.md

Co-authored-by: Igor Suleymanov <radiohead@users.noreply.github.com>

* Run prettier on doc

---------

Co-authored-by: Irene Rodríguez <irene.rodriguez@grafana.com>
Co-authored-by: Igor Suleymanov <radiohead@users.noreply.github.com>
2025-10-21 09:22:28 -04:00
linoman
e8d4c63071 SCIM: Remove SCIM config requirements from the Teams List page (#112717)
Remove SCIM config requirements from the Teams List page
2025-10-21 14:56:35 +02:00
Ivan Ortega Alba
e51ec6a827 Dashboards: Hide error notifications in kiosk mode on dashboards (#112390)
Hide error notifications in kiosk mode on dashboards

Suppress error alerts when dashboard is viewed in kiosk mode

Kiosk mode is typically used for TV displays without interaction

Other notification types (success, warning, info) remain visible


---------

Co-authored-by: Tom Ratcliffe <tom.ratcliffe@grafana.com>
2025-10-21 14:56:20 +02:00
Mihai Doarna
7d88b0130c IAM: Generate a unique name for a new TeamBinding object (#112525)
* generate a unique name for TeamBinding and store it in the uid column

* generate testdata

* fix team binding name
2025-10-21 15:01:49 +03:00
Tom Ratcliffe
a651fb1348 Chore: Add 'import/no-extraneous-dependencies' rule for packages (#111931) 2025-10-21 12:55:57 +01:00
Tom Ratcliffe
29f3a1f1b2 Alerting: Make GMA import use appropriate API for folders (#112229) 2025-10-21 12:55:42 +01:00
Tom Ratcliffe
8ff11b57b3 Stars: Refactor StarsToolbarButton and unify nav update logic (#112582) 2025-10-21 12:55:31 +01:00
Tom Ratcliffe
11235e7153 Accessibility: Improve no-unreduced-motion rule and fix violations (#110304) 2025-10-21 12:46:11 +01:00
Matheus Macabu
6158167163 CloudMigrations: Increase timeout of eventual checks and add debug message (#112714) 2025-10-21 12:58:29 +02:00
Georges Chaudy
7be30abab0 fix folder missing in the event key (#112698) 2025-10-21 10:40:56 +00:00
Sonia Aguilar
a107e7db6b Alerting: Remove ai feedback button from alert form (#112713)
remove ai feedback button from alert form
2025-10-21 10:20:01 +00:00
Alex Khomenko
268f3ed0fb Restore dashboards: Fix restore timing issue (#112638)
* Restore dashboards: Fix restore timing issue

* Cleanup
2025-10-21 13:15:13 +03:00
ismail simsek
5e8294c9d3 Chore: Mark prometheus query json unmarshaling errors as downstream error (#112314)
* mark json unmarshaling errors as downstream

* shortcut
2025-10-21 09:58:30 +00:00
Tobias Skarhed
4ac8063bda Scopes: Add redirectUrl to ScopeNode (#112699)
* Scopes: Add redirectUrl to ScopeNode

* Update go mod
2025-10-21 09:44:35 +00:00
Josh Hunt
f7070b8ccc NPM: Improve package validation (#112426)
* update validation script to run all checks, but fail if any fail

* fix package validation

* reduce comment
2025-10-21 10:32:57 +01:00
Bogdan Matei
143ea45ea6 Dashboard: Add variable button in dashboard controls (#112387) 2025-10-21 09:16:09 +00:00
Tom Ratcliffe
d1b9543189 Chore: Move feature toggles test util to test/test-utils (#111173) 2025-10-21 10:12:40 +01:00
Tobias Skarhed
5c97059d5c Scopes: Redirect to first available dashboard on select (#112257)
* Redirect to first available dashboard on select

* Check currently active url before redirecting

* Expand currently selected group on selection

* Add unit test

* Test group expansion on URL change

* Don't expand any group if the active item is already in an expanded one

* Mock dashboardsService better

* Fix linitng issue

* Add and remove subscrioption based on open state

* Extract scope navigation utils

* Fix import order

* Fix import path

* Add redirection tests to ScopesSelectorService

* Fix import order
2025-10-21 10:56:37 +02:00
renovate-sh-app[bot]
d2462a80f6 chore(deps): update dependency i18next to v25.6.0 (#112671)
| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | i18next | 25.5.2 | 25.6.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-21 09:52:38 +01:00
renovate-sh-app[bot]
587e42d673 fix(deps): update react aria (#112663)
| datasource | package              | from   | to     |
| ---------- | -------------------- | ------ | ------ |
| npm        | @react-aria/dialog   | 3.5.30 | 3.5.31 |
| npm        | @react-aria/focus    | 3.21.1 | 3.21.2 |
| npm        | @react-aria/overlays | 3.29.1 | 3.30.0 |
| npm        | @react-aria/utils    | 3.30.1 | 3.31.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-21 09:50:32 +01:00
renovate-sh-app[bot]
08518cc6c6 fix(deps): update dependency vis-network to v10.0.2 (#112662)
| datasource | package     | from   | to     |
| ---------- | ----------- | ------ | ------ |
| npm        | vis-network | 10.0.1 | 10.0.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-21 09:49:52 +01:00
Costa Alexoglou
4959197e37 fix: speedup client (#112640) 2025-10-21 10:48:43 +02:00
antonio
b7ef0df821 docs/tutorials: add video (#112628)
* docs/tutorials: add video

* prettier

* Prettier

Signed-off-by: Jack Baldry <jack.baldry@grafana.com>

---------

Signed-off-by: Jack Baldry <jack.baldry@grafana.com>
Co-authored-by: Irene Rodriguez <irene.rodriguez@grafana.com>
Co-authored-by: Jack Baldry <jack.baldry@grafana.com>
2025-10-21 08:32:59 +00:00
Goutham Veeramachaneni
af2d5d98b5 tempo: Use the correct filter separator for negative selector (#112280)
Signed-off-by: Goutham Veeramachaneni <goutham@grafana.com>
2025-10-21 10:31:19 +02:00
ismail simsek
7c7c9490fb Pyroscope: Add error source (#112645)
* set downstream errors in pyroscope

* Update pkg/tsdb/grafana-pyroscope-datasource/instance.go

Co-authored-by: Gareth <email@garethdawson.xyz>

* Update pkg/tsdb/grafana-pyroscope-datasource/instance.go

Co-authored-by: Gareth <email@garethdawson.xyz>

* more error source

---------

Co-authored-by: Gareth <email@garethdawson.xyz>
2025-10-21 10:00:59 +02:00
Kevin Minehart
ef2e62c852 Include author in patch creation (#112675)
Include author in security mirror
2025-10-21 09:03:31 +02:00
dependabot[bot]
232d211812 deps(go): bump github.com/mattn/go-sqlite3 from 1.14.22 to 1.14.32 (#112556)
Bumps [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) from 1.14.22 to 1.14.32.
- [Release notes](https://github.com/mattn/go-sqlite3/releases)
- [Commits](https://github.com/mattn/go-sqlite3/compare/v1.14.22...v1.14.32)

---
updated-dependencies:
- dependency-name: github.com/mattn/go-sqlite3
  dependency-version: 1.14.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-20 20:29:23 +00:00
dependabot[bot]
05dff2f7cb deps(go): bump github.com/open-feature/go-sdk from 1.14.1 to 1.16.0 (#112489)
* deps(go): bump github.com/open-feature/go-sdk from 1.14.1 to 1.16.0

Bumps [github.com/open-feature/go-sdk](https://github.com/open-feature/go-sdk) from 1.14.1 to 1.16.0.
- [Release notes](https://github.com/open-feature/go-sdk/releases)
- [Changelog](https://github.com/open-feature/go-sdk/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-feature/go-sdk/compare/v1.14.1...v1.16.0)

---
updated-dependencies:
- dependency-name: github.com/open-feature/go-sdk
  dependency-version: 1.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* make update-workspace

Signed-off-by: Dave Henderson <dave.henderson@grafana.com>

* fix(lint): SA1019: openfeature.GetApiInstance is deprecated, using NewDefaultClient

Signed-off-by: Dave Henderson <dave.henderson@grafana.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
2025-10-20 19:56:00 +00:00
dependabot[bot]
9573cd3395 deps(actions): bump actions/setup-node from 4 to 6 (#112620)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-20 18:40:29 +00:00
dependabot[bot]
bc1d3569ba deps(actions): bump actions/stale from 9 to 10 (#112622)
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v9...v10)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-20 18:38:57 +00:00
Torkel Ödegaard
7df537c9fc NewGauge: Adds new feature toggle named newGauge (#112593)
* NewGauge: Feature toggle and fixes

* Gauge: New migration test dashboard

* Update

* Updates

* Tweaked default barWidth

* Fix multi data links

* remove sizing options

* merge fix

* Update

* Restore

* Update

* Tweaked name font size logic

* use file snapshots instead of inline

---------

Co-authored-by: Paul Marbach <paul.marbach@grafana.com>
2025-10-20 18:33:19 +02:00
Lucy Chen
17771e0e1d QueryCaching: Add feature flag for mt query caching (#112660)
Add feature flag for mt query caching
2025-10-20 10:11:25 -06:00
Luminessa Starlight
0204bdab55 Frontend service: Update boot failure request to GET (#112603)
* update boot failure request to GET, add notes about why/how

* remove now unused function

* remove unneeded header
2025-10-20 11:46:37 -04:00
Torkel Ödegaard
b1b7d81e0b UnitPicker/Cascader: Fixes type to search for unit feature (#112614)
* UnitPicker/Cascader: Fixes searching broken state

* Update
2025-10-20 17:36:52 +02:00
Matias Chomicki
0505507219 LogLineContext: add copy link to log line support (#112632)
* LogLineContext: add copy link to log line

* Prettier

* InfiniteScroll: prevent ghost infinite scrolling in log context
2025-10-20 15:36:09 +00:00
Andrew Hackmann
63c8fe287f Grafana Advisor: Prometheus Type Migration check (#110853)
* add check for prom dep auth check in grafana advisor

* remove non prom DS

* clean up and add grafana docs links

* lint

* tests

* Apply suggestions from code review

Co-authored-by: Andres Martinez Gotor <andres.martinez@grafana.com>

* Thank you for your great feedback @andresmgot

* caching now resets on refresh. also check if plugin is installed

* remove unused errors

* add steps back sigh

* make naming clearer

---------

Co-authored-by: Andres Martinez Gotor <andres.martinez@grafana.com>
2025-10-20 10:35:30 -05:00
renovate-sh-app[bot]
05b8013a8e fix(deps): update dependency immutable to v5.1.4 (#112629)
| datasource | package   | from  | to    |
| ---------- | --------- | ----- | ----- |
| npm        | immutable | 5.1.3 | 5.1.4 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-20 16:27:20 +01:00
Ezequiel Victorero
02dd1303c9 Saved Queries: Hide save button when user is not an editor (#112585) 2025-10-20 12:26:49 -03:00
Ezequiel Victorero
8c9624ba5f Library Panels: Cancel in flight previous search requests (#112606) 2025-10-20 12:26:29 -03:00
renovate-sh-app[bot]
caac463427 fix(deps): update dependency lru-cache to v11.2.2 (#112524)
| datasource | package   | from   | to     |
| ---------- | --------- | ------ | ------ |
| npm        | lru-cache | 11.2.1 | 11.2.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Ashley Harrison <ashley.harrison@grafana.com>
2025-10-20 16:26:04 +01:00
renovate-sh-app[bot]
4aa5fbbb20 fix(deps): update dependency @grafana/lezer-traceql to v0.0.25 (#112522)
| datasource | package                | from   | to     |
| ---------- | ---------------------- | ------ | ------ |
| npm        | @grafana/lezer-traceql | 0.0.24 | 0.0.25 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-20 16:24:45 +01:00
Ieva
0a0311a2b2 RBAC: Only write action sets (#112429)
* implementation + broken tests

* finish tests and cleanup

* fix a bug in logic where we'd return too early for non dash and folder resources
2025-10-20 16:02:56 +01:00
Serge Zaitsev
c95b057cdc Chore: Use go-version-file again instead of an explicit version (#112644)
* use go-version-file again instead of an explicit version

* try setup-to 6.0.0
2025-10-20 14:21:44 +00:00
Juan Cabanas
dd6f9bcac9 DashboardLibrary: Improve dashboard library image visualization (#112643) 2025-10-20 11:05:20 -03:00
Paul Marbach
1d23c6cf88 Stat: Fix math for percent change value heights when sparkline is not rendered (#112599)
* Stat: Fix math for percent change value heights when sparkline is not rendered

* add tests
2025-10-20 13:59:49 +00:00
Yunwen Zheng
dacfa2afed ConnectStep: Provisioning connect step input error highlighted (#112539)
ConnectStep: Provisioning connect step input error highlight
2025-10-20 09:40:13 -04:00
renovate-sh-app[bot]
212156289d fix(deps): update dependency @grafana/lezer-logql to v0.2.9 (#112521)
| datasource | package              | from  | to    |
| ---------- | -------------------- | ----- | ----- |
| npm        | @grafana/lezer-logql | 0.2.8 | 0.2.9 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: Ashley Harrison <ashley.harrison@grafana.com>
2025-10-20 14:31:01 +01:00
Matheus Macabu
93af167f9c Secrets: Add config for enabling gRPC client-side load balancing (#111989) 2025-10-20 14:04:59 +02:00
Ashley Harrison
bd7ee6d602 Modal: Adjust padding at small screen sizes (#112635)
adjust modal padding at small screen sizes
2025-10-20 13:01:47 +01:00
Costa Alexoglou
c04f6bedec fix: apiserver metrics in custom handlers (#112508)
* fix: apiserver metrics in custom handlers

* chore: review feedback
2025-10-20 13:17:56 +02:00
Josh Hunt
b0acfd1189 CI: Remove OIDC debug step from npm publish (#112631) 2025-10-20 11:09:45 +00:00
Will Browne
a55e502aed OpenFeature: Make OpenFeature initialization reusable with config struct (#112456)
* make existing pieces more reusable

* inline func

* tidy comment
2025-10-20 11:44:03 +01:00
linoman
0e4237b775 Update validation of non-provisioned users rejection (#112615)
* Update validation of non-provisioned users rejection

* Align tests
2025-10-20 12:40:52 +02:00
Jean-Philippe Quéméner
14750785b0 Revert "Convert unique keys in file and file_meta tables into primary key." (#112626)
Revert "Convert unique keys in file and file_meta tables into primary key. (#…"

This reverts commit e290c92e1b.
2025-10-20 12:30:31 +02:00
Pepe Cano
9e505ea2de docs(alerting) Add examples of high-cardinality alerts (#112311)
* docs(alerting) Add examples of high-cardinality alerts

* minor intro edits
2025-10-20 12:17:58 +02:00
renovate-sh-app[bot]
7d6e91f0a6 fix(deps): update dependency semver to v7.7.3 (#112568)
| datasource | package       | from  | to    |
| ---------- | ------------- | ----- | ----- |
| npm        | semver        | 7.7.2 | 7.7.3 |
| npm        | @types/semver | 7.7.0 | 7.7.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-20 10:03:35 +01:00
Ryan McKinley
5c5ecac6ee Provisioning: Ensure name and email are always set for the AuthorSignature (#112594)
* all properties

* lint
2025-10-20 08:45:02 +00:00
Alex Spencer
e478ee2e5f Event Tracking: Add event tracking for expression queries (#110983)
* chore: add event tracking for expressions

* chore: fix lint

* chore: cleanup

* fix: update commenet

* chore: prune suppressions

* feedback

* update events

* chore: more pr feedback

* chore: only add __expr__ query types to event tracking

* chore: make it work with v2 dashboard spec!

* chore: linter!

* chore: tests!
2025-10-20 09:25:43 +01:00
Peter Štibraný
7604653fd8 Change testing.Short() check with SkipIntegrationTestInShortMode check. (#112442)
* Change testing.Short() check with SkipIntegrationTestInShortMode check.
2025-10-20 09:40:38 +02:00
Stephanie Hingtgen
891d5f0625 Unistore: Propagate DeprecatedLegacyID on upsert (#112619)
Unistore: Fix label propogation on upsert
2025-10-20 09:29:03 +02:00
Ryan McKinley
8b319086e7 Correlations: Add RTK client (#112538)
add correlations RTK client
2025-10-19 23:04:26 -05:00
grafana-pr-automation[bot]
a1e813bb0d I18n: Download translations from Crowdin (#112612)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-18 00:38:01 +00:00
Todd Treece
69628baa9d Plugins: Add pluginStoreServiceLoading feature toggle (#112588) 2025-10-17 16:01:43 -04:00
Collin Fingar
626b799cff Saved Queries: Context State Migration (#112018)
* wip: moving saved queries items to context

* more wip

* Tidying up unused types
2025-10-17 15:48:15 -04:00
Tania
688248198e OpenFeature: Add eval ctx and http status code to span attributes (#112572)
* Add HTTP status codes to handlers spans

* Add a span for namespace validation
2025-10-17 21:21:33 +02:00
Matheus Macabu
8512b219c5 Secrets: Try to get the service identity from the context if not found in errors (#112598) 2025-10-17 17:35:01 +02:00
Matias Chomicki
bbb5322008 Grammar: wrap in try/catch in case regex creation fails (#112595)
* Grammar: wrap in try/catch in case regex creation fails

* Improve breadcrumbs
2025-10-17 15:27:24 +00:00
Luminessa Starlight
8c97ba4f08 Storybook: improve Stack docs (#112529)
* improve Stack docs

* mention theme.spacing
2025-10-17 11:19:01 -04:00
Dominik Prokop
7f99cce8c8 Fix flaky save button validation in SaveDashboardAsForm (#112526)
Fix flakiness in save as dashboard form
2025-10-17 08:50:39 -06:00
Ryan McKinley
7c6afeabec Chore: Use IAM DBTime utility in dashboard migrator (#112589) 2025-10-17 17:48:30 +03:00
Ashley Harrison
4cf11b721a PanelChrome: Put overflow: hidden; behind a feature toggle for safety (#112580)
put overflow: hidden behind a feature toggle for safety
2025-10-17 15:40:08 +01:00
Anna Urbiztondo
083f12d06e Docs: Git Sync resource reqs (#112433)
* Resources

* Edits after talking to Roberto

* Prettier

* Fix?

* Prettier

* Feedback - migration tool

* Fix

* Prettier

* Add 'cloud' label to Git Sync documentation

* Feedback

* Prettier

* Fix?

* Fix?

---------

Co-authored-by: Irene Rodríguez <irene.rodriguez@grafana.com>
2025-10-17 16:04:44 +02:00
Bruno Abrantes
29c1e37ac2 fix: Skip flaky test TestIntegrationFoldersApp (#112584)
Signed-off-by: Bruno Abrantes <bruno@brunoabrantes.com>
2025-10-17 13:28:04 +00:00
Nathan Vērzemnieks
4ed9af397d Chore: Add logsdrilldown replace to apps/iam/go.mod (#112581) 2025-10-17 13:13:20 +00:00
dependabot[bot]
eb9c8e539c deps(actions): bump docker/setup-docker-action from 4.3.0 to 4.4.0 (#112550)
Bumps [docker/setup-docker-action](https://github.com/docker/setup-docker-action) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/docker/setup-docker-action/releases)
- [Commits](b60f85385d...3fb92d6d9c)

---
updated-dependencies:
- dependency-name: docker/setup-docker-action
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-17 13:07:58 +00:00
dependabot[bot]
ea77062daf deps(actions): bump github/codeql-action from 3 to 4 (#112549)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-17 13:01:06 +00:00
dependabot[bot]
7756f2c416 deps(actions): bump grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1 from 1.2.1 to 1.3.0 (#112551)
deps(actions): bump grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1

Bumps [grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1](https://github.com/grafana/shared-workflows) from 1.2.1 to 1.3.0.
- [Release notes](https://github.com/grafana/shared-workflows/releases)
- [Changelog](https://github.com/grafana/shared-workflows/blob/main/release-please-config.json)
- [Commits](https://github.com/grafana/shared-workflows/compare/get-vault-secrets/v1.2.1...get-vault-secrets/v1.3.0)

---
updated-dependencies:
- dependency-name: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-17 09:00:02 -04:00
dependabot[bot]
8459fc2c4d deps(actions): bump actions/checkout from 4 to 5 (#112552)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-17 12:59:28 +00:00
Mihai Doarna
1937f62c02 IAM: Run team_member uid migrations on team service startup (#112565)
* run uid migrations on team service startup

* go mod tidy

* make update-workspace

* remove logsdrilldown pkg
2025-10-17 15:57:10 +03:00
Torkel Ödegaard
e014f1ba0c NewGauge: Adds scale labels (threshold labels) (#112517)
* Progress on scale label

* Progress

* Progress on labels

* Progress

* fix for segments

* Update

* Fix

* Update

* Some basic unit tests

* fixes

* fixes
2025-10-17 13:51:54 +02:00
Andreas Christou
cfba349fdb Graphite: Update backend types (#112576)
Remove tags
2025-10-17 12:01:46 +01:00
Torkel Ödegaard
e31e70d0c4 Stat/BarGauge: Border radius tweak (#112562)
* Stat/BarGauge: Border radius tweak

* Fix lint
2025-10-17 12:36:47 +02:00
Jean-Philippe Quéméner
d746266b0d fix(folders): allow correct max depth on update (#112570) 2025-10-17 12:17:13 +02:00
Matheus Macabu
208ccd054b LogsDrilldown: Add dependency to root go mod (#112571) 2025-10-17 11:51:57 +02:00
renovate-sh-app[bot]
f63bdf4d09 fix(deps): update dependency dompurify to v3.3.0 (#112523)
| datasource | package   | from  | to    |
| ---------- | --------- | ----- | ----- |
| npm        | dompurify | 3.2.6 | 3.3.0 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-17 11:24:53 +03:00
Ryan McKinley
1a372e2dec Dashboards: Use the common service authorizer (#111571)
* authorizer

* authorizer
2025-10-17 10:03:35 +03:00
grafana-pr-automation[bot]
18e727ee7f I18n: Download translations from Crowdin (#112554)
New Crowdin translations by GitHub Action

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-17 00:39:10 +00:00
Liza Detrick
b3f9dad044 logsdrilldown: add app platform (#112133) 2025-10-17 00:31:42 +03:00
Ivan Ortega Alba
075fa52190 Scenes: Upgrade to v6.39.8 (#112542) 2025-10-16 21:06:29 +00:00
Oscar Kilhed
2e115d0e93 Dynamic dashboards: Ungroup tabs (#112332)
* ungroup tabs

* fix i18n

* break out confirmation from utils

* update tests

* click convert in modal in e2e
2025-10-16 19:52:04 +00:00
Ryan McKinley
bea45a94f0 Correlations: Add legacy storage (#112038) 2025-10-16 21:13:39 +03:00
John Troy
bb08b2deea Auth: Increase SSO config size limit (#112531)
Increase sso_setting.settings column for MySQL from TEXT to MEDIUMTEXT.
2025-10-16 14:02:20 -04:00
Costa Alexoglou
163a88056e feat: parallel processChange (#112198)
* feat: parallel processChange

* all except move work

* fix: tests and order of operations

* fix: tests

* chore: review feedback

* chore: review feedback
2025-10-16 19:17:04 +02:00
linoman
aa8af6b798 Update Org Mapping limitations description (#112520)
* Update Org Mapping limitations description

* Update docs/sources/setup-grafana/configure-security/configure-authentication/saml/configure-saml-org-mapping/_index.md

Co-authored-by: John Troy <jtroy@users.noreply.github.com>

---------

Co-authored-by: John Troy <jtroy@users.noreply.github.com>
2025-10-16 18:56:22 +02:00
Tania
bceeabd6c3 Revert "OpenFeature: Include HTTP status code and evaluation context in traces" (#112527)
Revert "OpenFeature: Include HTTP status code and evaluation context in trace…"

This reverts commit ffee922fae.
2025-10-16 16:28:54 +00:00
Ashley Harrison
bb082f9490 Chore: Change eslint rule to allow jsx utility classes (#112528)
* change rule to allow jsx utility classes

* update suppressions

* actually prune this one...
2025-10-16 16:17:36 +00:00
Todd Treece
30d79476cd App SDK: Update to v0.47.0 (#112519) 2025-10-16 15:41:41 +00:00
Dominik Prokop
26d36ec7ff Fix v38 table panel overrides migration when defaults.custom is missing (#112430)
Dashboard Migration: Fix v38 table panel overrides migration when defaults.custom is missing

The v38 migration was incorrectly skipping field config overrides processing
when fieldConfig.defaults.custom didn't exist. This caused custom.displayMode
properties in overrides to not be migrated to the new custom.cellOptions format.

The fix ensures migrateOverrides is always called for table panels, regardless
of whether defaults.custom exists.

Added comprehensive unit test covering this edge case to prevent regression.

Issue discovered through comprehensive migration testing infrastructure.
2025-10-16 17:33:03 +02:00
Dominik Prokop
8449a2e4fb Fix v16 grid position calculation for fractional spans (#112428)
Fix v16 grid position calculation for fractional spans

Match frontend span-to-width conversion logic by flooring span first,
then multiplying by width factor, instead of multiplying first then flooring.

This fixes dashboard layout inconsistencies where panels with fractional
spans (e.g. 5.929860088365242) would have different widths between
backend and frontend migration paths.

- Backend old: Math.floor(5.93 * 2) = Math.floor(11.86) = 11
- Backend new: Math.floor(5.93) * 2 = 5 * 2 = 10 (matches frontend)

Includes comprehensive unit test to prevent regression.
2025-10-16 17:32:42 +02:00
antonio
3bc5cf4b5d community contributions: update developers/contribute.md (#111935)
* community contributions: update developers/contribute.md

* fix links

* guidance on comm channels

* changed order in no code contrib

* modifed help wanted label
2025-10-16 17:21:54 +02:00
antonio
8a19d663b0 contributing.md : first time contributions (#111727)
* community: detail tech contributions section

* detailed tech contribution sections

* changed items in step by step

* modified list items

* formated sections

* added section for issues

* format-sections

* added-link

* prettier

* added guidance on comm channels

* Update CONTRIBUTING.md

Added "making technical contributions, with or without code" section in the introductory part to improve the flow of information

* header and link to github

* all pretty no pity

* Update CONTRIBUTING.md

Fixed formatting to avoid Prettier issues again

* changed order of items

* added links

* Update CONTRIBUTING.md

Co-authored-by: Simon Prickett <simon@crudworks.org>

* Update CONTRIBUTING.md

Co-authored-by: Simon Prickett <simon@crudworks.org>

* Update CONTRIBUTING.md

Co-authored-by: Simon Prickett <simon@crudworks.org>

* Update CONTRIBUTING.md

Co-authored-by: Simon Prickett <simon@crudworks.org>

* removed ordered list

---------

Co-authored-by: ewamag <eva.magiera@gmail.com>
Co-authored-by: Simon Prickett <simon@crudworks.org>
2025-10-16 17:21:41 +02:00
Jo
bc9c42f5c2 AuthZ: ignore duplicates on write and missing on delete in OpenFGA (#112451)
Authz: ignore duplicates on write and missing on delete in zanzana
2025-10-16 15:42:44 +01:00
Ryan McKinley
a1a750d440 Chore: update dependencies in go.mod (#112516)
update go mod
2025-10-16 17:31:32 +03:00
Will Browne
2223338e34 Plugins: Update plugin fakes package name (#112503)
update plugin fakes package name
2025-10-16 15:14:05 +01:00
Yunwen Zheng
1fb7953a95 ConfigForm: Add field-specific error handling (#112397)
* ConfigForm: Show api error to field

* i18n

* alert message only if error is not fetch error, consolidate getFormErros helpers
2025-10-16 10:05:10 -04:00
Costa Alexoglou
ac503c5194 fix: run create_docker_compose.sh from anywhere (#112513) 2025-10-16 14:58:00 +01:00
Torkel Ödegaard
77e571b079 RadialGauge: (#111841)
* Radial gauge

* Update

* Update

* Update

* Updated

* Progress

* Spotlight

* Glow

* More effects

* Update

* Update

* Update

* Update

* Fix overflow

* Progress

* Progress

* Barwidth factor

* Update

* segmemnted

* Update

* Update

* Update

* Display processor

* Progress

* Updated

* Update

* rounded bars option

* added option for rounded

* Fixed gauge shape and segments

* Updated text and sparkline placmeent

* progress

* New spotlight effect is working

* refactorings

* Update

* hue working in gauge mode

* Update

* Update

* Progress

* Refactorings and sizing improvements

* Refactorings

* Progress

* Unify arc path

* Thresholdsbar

* Update

* Progress

* Update

* Close to mergable

* Unit tests

* Update

* Update

* Fix

* Update

* update

* simple test

* Fix

* Minor tweak

* added icon to shape

* Progress on color simplification

* progress on new color system

* Simplify color gradient modes around a single auto mode

* Progress on text sizing

* Fixes

* Update

* Update

* Hook up manual font size

* Restore old behavior in old panel
2025-10-16 15:53:38 +02:00
dependabot[bot]
16b02e86fa deps(actions): bump actions/download-artifact from 4 to 5 (#112484)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-16 13:07:43 +00:00
dependabot[bot]
252ac75368 deps(actions): bump aquasecurity/setup-trivy from 0.2.3 to 0.2.4 (#112485)
Bumps [aquasecurity/setup-trivy](https://github.com/aquasecurity/setup-trivy) from 0.2.3 to 0.2.4.
- [Release notes](https://github.com/aquasecurity/setup-trivy/releases)
- [Commits](9ea583eb67...e6c2c5e321)

---
updated-dependencies:
- dependency-name: aquasecurity/setup-trivy
  dependency-version: 0.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-16 13:07:26 +00:00
dependabot[bot]
b762bdcaf7 deps(actions): bump trufflesecurity/trufflehog from 3.90.9 to 3.90.11 (#112483)
Bumps [trufflesecurity/trufflehog](https://github.com/trufflesecurity/trufflehog) from 3.90.9 to 3.90.11.
- [Release notes](https://github.com/trufflesecurity/trufflehog/releases)
- [Changelog](https://github.com/trufflesecurity/trufflehog/blob/main/.goreleaser.yml)
- [Commits](e88e7d019e...ad6fc8fb44)

---
updated-dependencies:
- dependency-name: trufflesecurity/trufflehog
  dependency-version: 3.90.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-16 13:06:25 +00:00
dependabot[bot]
b7eb566195 deps(actions): bump github/actions-oidc-debugger from 2e9ba5d3f4bebaad1f91a2cede055115738b7ae8 to bc12dcf1a852221e54f27c95b2db36d135c1b97f (#112482)
deps(actions): bump github/actions-oidc-debugger

Bumps [github/actions-oidc-debugger](https://github.com/github/actions-oidc-debugger) from 2e9ba5d3f4bebaad1f91a2cede055115738b7ae8 to bc12dcf1a852221e54f27c95b2db36d135c1b97f.
- [Release notes](https://github.com/github/actions-oidc-debugger/releases)
- [Commits](2e9ba5d3f4...bc12dcf1a8)

---
updated-dependencies:
- dependency-name: github/actions-oidc-debugger
  dependency-version: bc12dcf1a852221e54f27c95b2db36d135c1b97f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-16 13:05:40 +00:00
dependabot[bot]
e281cb65f9 deps(actions): bump peter-evans/create-or-update-comment from 4.0.0 to 5.0.0 (#112486)
deps(actions): bump peter-evans/create-or-update-comment

Bumps [peter-evans/create-or-update-comment](https://github.com/peter-evans/create-or-update-comment) from 4.0.0 to 5.0.0.
- [Release notes](https://github.com/peter-evans/create-or-update-comment/releases)
- [Commits](71345be026...e8674b0752)

---
updated-dependencies:
- dependency-name: peter-evans/create-or-update-comment
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-16 13:04:42 +00:00
dependabot[bot]
a00bcb0154 deps(go): bump the go-opentelemetry-io group across 2 directories with 4 updates (#112488)
* deps(go): bump the go-opentelemetry-io group across 2 directories with 4 updates

Bumps the go-opentelemetry-io group with 4 updates in the / directory: [go.opentelemetry.io/collector/pdata](https://github.com/open-telemetry/opentelemetry-collector), [go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace](https://github.com/open-telemetry/opentelemetry-go-contrib), [go.opentelemetry.io/contrib/propagators/jaeger](https://github.com/open-telemetry/opentelemetry-go-contrib) and [go.opentelemetry.io/contrib/samplers/jaegerremote](https://github.com/open-telemetry/opentelemetry-go-contrib).
Bumps the go-opentelemetry-io group with 1 update in the /pkg/apiserver directory: [go.opentelemetry.io/contrib/propagators/jaeger](https://github.com/open-telemetry/opentelemetry-go-contrib).


Updates `go.opentelemetry.io/collector/pdata` from 1.30.0 to 1.43.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-collector/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-collector/blob/main/CHANGELOG-API.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-collector/compare/pdata/v1.30.0...pdata/v1.43.0)

Updates `go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace` from 0.62.0 to 0.63.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.62.0...zpages/v0.63.0)

Updates `go.opentelemetry.io/contrib/propagators/jaeger` from 1.37.0 to 1.38.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/v1.37.0...v1.38.0)

Updates `go.opentelemetry.io/contrib/samplers/jaegerremote` from 0.31.0 to 0.32.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.31.0...zpages/v0.32.0)

Updates `go.opentelemetry.io/contrib/propagators/jaeger` from 1.37.0 to 1.38.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/v1.37.0...v1.38.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/collector/pdata
  dependency-version: 1.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-opentelemetry-io
- dependency-name: go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
  dependency-version: 0.63.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-opentelemetry-io
- dependency-name: go.opentelemetry.io/contrib/propagators/jaeger
  dependency-version: 1.38.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-opentelemetry-io
- dependency-name: go.opentelemetry.io/contrib/samplers/jaegerremote
  dependency-version: 0.32.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-opentelemetry-io
- dependency-name: go.opentelemetry.io/contrib/propagators/jaeger
  dependency-version: 1.38.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-opentelemetry-io
...

Signed-off-by: dependabot[bot] <support@github.com>

* make update-workspace

Signed-off-by: Dave Henderson <dave.henderson@grafana.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
2025-10-16 12:59:05 +00:00
renovate-sh-app[bot]
9fd0e767eb chore(deps): update dependency semver to v7.7.3 (#112471)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | semver  | 7.7.2 | 7.7.3 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-16 13:55:29 +01:00
renovate-sh-app[bot]
226c550d30 chore(deps): update dependency nanoid to v5.1.6 (#112447)
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | nanoid  | 5.1.5 | 5.1.6 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-16 13:54:43 +01:00
renovate-sh-app[bot]
f8bb7549f4 chore(deps): update dependency @openfeature/web-sdk to v1.6.2 (#112446)
| datasource | package              | from  | to    |
| ---------- | -------------------- | ----- | ----- |
| npm        | @openfeature/web-sdk | 1.6.1 | 1.6.2 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-16 13:54:17 +01:00
renovate-sh-app[bot]
985fc97a08 chore(deps): update dependency @openfeature/core to v1.9.1 (#112445)
| datasource | package           | from  | to    |
| ---------- | ----------------- | ----- | ----- |
| npm        | @openfeature/core | 1.9.0 | 1.9.1 |

Signed-off-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
Co-authored-by: renovate-sh-app[bot] <219655108+renovate-sh-app[bot]@users.noreply.github.com>
2025-10-16 13:53:49 +01:00
dependabot[bot]
9ae4e3898c Bump github.com/madflojo/testcerts from 1.1.1 to 1.4.0 (#110375)
* Bump github.com/madflojo/testcerts from 1.1.1 to 1.4.0

Bumps [github.com/madflojo/testcerts](https://github.com/madflojo/testcerts) from 1.1.1 to 1.4.0.
- [Release notes](https://github.com/madflojo/testcerts/releases)
- [Commits](https://github.com/madflojo/testcerts/compare/v1.1.1...v1.4.0)

---
updated-dependencies:
- dependency-name: github.com/madflojo/testcerts
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* make update-workspace

Signed-off-by: Dave Henderson <dave.henderson@grafana.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Dave Henderson <dave.henderson@grafana.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Dave Henderson <dave.henderson@grafana.com>
2025-10-16 08:34:05 -04:00
Ivana Huckova
89e3fa7245 Add open Assistant keyboard shortcut (#112228) 2025-10-16 14:27:47 +02:00
Hugo Häggmark
a30a71905e Chore: replace feature toggle filterOutBotsFromFrontendLogs with config (#112355)
* Chore: replace feature toggle with config

* chore: small fixes

* chore: updates after pr feedback

* chore: fixes writers toolkit error
2025-10-16 12:03:07 +00:00
3739 changed files with 256653 additions and 53317 deletions

10
.gitattributes vendored
View File

@@ -1 +1,11 @@
* text=auto eol=lf
*.gen.ts linguist-generated
*_gen.ts linguist-generated
*_gen.go linguist-generated
*_gen.csv linguist-generated
*_gen.json linguist-generated
**/openapi_snapshots/*.json linguist-generated
apps/**/pkg/apis/*_manifest.go linguist-generated
public/openapi3.json linguist-generated
public/api-merged.json linguist-generated
public/api-enterprise-spec.json linguist-generated

58
.github/CODEOWNERS vendored
View File

@@ -41,6 +41,8 @@
/docs/sources/ @irenerl24
/docs/sources/alerting/ @JohnnyK-Grafana
/docs/sources/as-code/ @urbiz-grafana
/docs/sources/developer-resources/ @urbiz-grafana
/docs/sources/datasources/ @lwandz13
/docs/sources/upgrade-guide/ @jtvdez
/docs/sources/whatsnew/ @jtvdez
@@ -87,6 +89,7 @@
/apps/folder/ @grafana/grafana-app-platform-squad
/apps/playlist/ @grafana/grafana-app-platform-squad
/apps/plugins/ @grafana/plugins-platform-backend
/apps/collections/ @grafana/grafana-app-platform-squad @grafana/grafana-frontend-platform
/apps/preferences/ @grafana/grafana-app-platform-squad @grafana/grafana-frontend-platform
/apps/shorturl/ @grafana/sharing-squad
/apps/secret/ @grafana/grafana-operator-experience-squad
@@ -96,6 +99,9 @@
/apps/iam/ @grafana/access-squad
/apps/sdk.mk @grafana/grafana-app-platform-squad
/apps/correlations @grafana/datapro
/apps/example/ @grafana/grafana-app-platform-squad
/apps/logsdrilldown/ @grafana/observability-logs
/apps/annotation/ @grafana/grafana-backend-services-squad
/pkg/api/ @grafana/grafana-backend-group
/pkg/apis/ @grafana/grafana-app-platform-squad
/pkg/apis/query @grafana/grafana-datasources-core-services
@@ -149,7 +155,7 @@
/pkg/promlib @grafana/oss-big-tent
/pkg/storage/ @grafana/grafana-search-and-storage
/pkg/storage/secret/ @grafana/grafana-operator-experience-squad
/pkg/services/annotations/ @grafana/grafana-search-and-storage
/pkg/services/annotations/ @grafana/grafana-backend-services-squad
/pkg/services/apikey/ @grafana/identity-squad
/pkg/services/cleanup/ @grafana/grafana-backend-group
/pkg/services/contexthandler/ @grafana/grafana-backend-group @grafana/grafana-app-platform-squad
@@ -165,7 +171,7 @@
/pkg/services/kmsproviders/ @grafana/grafana-operator-experience-squad
/pkg/services/licensing/ @grafana/grafana-operator-experience-squad
/pkg/services/dsquerierclient/ @grafana/grafana-datasources-core-services
/pkg/services/navtree/ @grafana/grafana-backend-group
/pkg/services/navtree/ @grafana/grafana-backend-group @grafana/grafana-search-navigate-organise
/pkg/services/notifications/ @grafana/grafana-backend-group
/pkg/services/org/ @grafana/grafana-backend-group
/pkg/services/playlist/ @grafana/grafana-app-platform-squad
@@ -179,7 +185,7 @@
/pkg/services/search/ @grafana/grafana-search-and-storage
/pkg/services/searchusers/ @grafana/grafana-search-and-storage
/pkg/services/secrets/ @grafana/grafana-operator-experience-squad
/pkg/services/shorturls/ @grafana/grafana-backend-group
/pkg/services/shorturls/ @grafana/sharing-squad
/pkg/services/sqlstore/ @grafana/grafana-search-and-storage
/pkg/services/ssosettings/ @grafana/identity-squad
/pkg/services/star/ @grafana/grafana-search-and-storage
@@ -197,6 +203,7 @@
/pkg/tests/apis/features @grafana/grafana-backend-services-squad
/pkg/tests/apis/folder @grafana/grafana-search-and-storage
/pkg/tests/apis/iam @grafana/identity-access-team
/pkg/tests/apis/shorturl @grafana/sharing-squad
/pkg/tests/api/correlations/ @grafana/datapro
/pkg/tsdb/grafanads/ @grafana/grafana-backend-group
/pkg/tsdb/opentsdb/ @grafana/partner-datasources
@@ -223,6 +230,7 @@
/devenv/datasources.yaml @grafana/grafana-backend-group
/devenv/datasources_docker.yaml @grafana/grafana-backend-group
/devenv/dev-dashboards-without-uid/ @grafana/dashboards-squad
/devenv/scopes/ @grafana/grafana-operator-experience-squad
/devenv/dev-dashboards/annotations @grafana/dataviz-squad
/devenv/dev-dashboards/migrations @grafana/dataviz-squad
@@ -239,6 +247,7 @@
/devenv/dev-dashboards/panel-library @grafana/dataviz-squad
/devenv/dev-dashboards/panel-piechart @grafana/dataviz-squad
/devenv/dev-dashboards/panel-stat @grafana/dataviz-squad
/devenv/dev-dashboards/panel-status-history @grafana/dataviz-squad
/devenv/dev-dashboards/panel-table @grafana/dataviz-squad
/devenv/dev-dashboards/panel-timeline @grafana/dataviz-squad
/devenv/dev-dashboards/panel-timeseries @grafana/dataviz-squad
@@ -248,7 +257,6 @@
/devenv/dev-dashboards/all-panels.json @grafana/dataviz-squad
/devenv/dev-dashboards/dashboards.go @grafana/dataviz-squad
/devenv/dev-dashboards/home.json @grafana/dataviz-squad
/devenv/dev-dashboards/datasource-elasticsearch/ @grafana/partner-datasources
/devenv/dev-dashboards/datasource-opentsdb/ @grafana/partner-datasources
/devenv/dev-dashboards/datasource-influxdb/ @grafana/partner-datasources
@@ -412,8 +420,8 @@
/crowdin.yml @grafana/grafana-frontend-platform
/public/locales/ @grafanabot
/public/locales/i18next-parser.config.cjs @grafana/grafana-frontend-platform
/public/locales/i18next-parser-enterprise.config.cjs @grafana/grafana-frontend-platform
i18next.config.ts @grafana/grafana-frontend-platform
/public/locales/enterprise/i18next.config.ts @grafana/grafana-frontend-platform
/public/app/core/internationalization/ @grafana/grafana-frontend-platform
/e2e/ @grafana/grafana-frontend-platform
/e2e-playwright/cloud-plugins-suite/ @grafana/partner-datasources
@@ -470,22 +478,12 @@
/e2e-playwright/fixtures/long-trace-response.json @grafana/observability-traces-and-profiling
/e2e-playwright/fixtures/tempo-response.json @grafana/oss-big-tent
/e2e-playwright/fixtures/prometheus-response.json @grafana/datapro
/e2e-playwright/panels-suite/canvas-scene.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/ @grafana/dataviz-squad
/e2e-playwright/panels-suite/dashlist.spec.ts @grafana/grafana-search-navigate-organise
/e2e-playwright/panels-suite/datagrid-data-change.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/datagrid-editing-features.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/frontend-sandbox-panel.spec.ts @grafana/plugins-platform-frontend
/e2e-playwright/panels-suite/geomap-layer-types.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/geomap-map-controls.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/geomap-spatial-operations-transform.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/panelEdit_base.spec.ts @grafana/dashboards-squad
/e2e-playwright/panels-suite/panelEdit_queries.spec.ts @grafana/dashboards-squad
/e2e-playwright/panels-suite/panelEdit_transforms.spec.ts @grafana/datapro
/e2e-playwright/panels-suite/table-footer.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/table-kitchenSink.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/table-markdown.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/table-sparkline.spec.ts @grafana/dataviz-squad
/e2e-playwright/panels-suite/table-utils.ts @grafana/dataviz-squad
/e2e-playwright/plugin-e2e/ @grafana/oss-big-tent @grafana/partner-datasources
/e2e-playwright/plugin-e2e/plugin-e2e-api-tests/ @grafana/plugins-platform-frontend
/e2e-playwright/smoke-tests-suite/ @grafana/grafana-frontend-platform
@@ -502,6 +500,7 @@
/e2e-playwright/various-suite/frontend-sandbox-app.spec.ts @grafana/plugins-platform-frontend
/e2e-playwright/various-suite/frontend-sandbox-datasource.spec.ts @grafana/plugins-platform-frontend
/e2e-playwright/various-suite/gauge.spec.ts @grafana/dataviz-squad
/e2e-playwright/various-suite/grafana-datasource-random-walk.spec.ts @grafana/grafana-frontend-platform
/e2e-playwright/various-suite/graph-auto-migrate.spec.ts @grafana/dataviz-squad
/e2e-playwright/various-suite/inspect-drawer.spec.ts @grafana/dashboards-squad
/e2e-playwright/various-suite/keybinds.spec.ts @grafana/grafana-frontend-platform
@@ -553,6 +552,7 @@
/packages/grafana-data/src/geo/ @grafana/dataviz-squad
/packages/grafana-data/src/monaco/ @grafana/partner-datasources
/packages/grafana-data/src/panel/ @grafana/dashboards-squad
/packages/grafana-data/src/panel/suggestions/ @grafana/dataviz-squad
/packages/grafana-data/src/query/ @grafana/grafana-datasources-core-services
/packages/grafana-data/src/rbac/ @grafana/access-squad
/packages/grafana-data/src/table/ @grafana/dataviz-squad
@@ -560,6 +560,8 @@
/packages/grafana-data/src/themes/ @grafana/grafana-frontend-platform
/packages/grafana-data/src/transformations/ @grafana/datapro
/packages/grafana-data/src/types/ @grafana/grafana-frontend-platform
/packages/grafana-data/src/types/scopes.ts @grafana/grafana-operator-experience-squad
/packages/grafana-data/src/types/suggestions.ts @grafana/dataviz-squad
/packages/grafana-data/src/utils/__snapshots__/ @grafanabot
/packages/grafana-data/src/utils/anyToNumber.ts @grafana/grafana-frontend-platform
/packages/grafana-data/src/utils/arrayUtils* @grafana/grafana-frontend-platform
@@ -717,6 +719,7 @@
/packages/grafana-ui/src/components/BarGauge/ @grafana/dataviz-squad
/packages/grafana-ui/src/components/DataLinks/ @grafana/dataviz-squad
/packages/grafana-ui/src/components/Gauge/ @grafana/dataviz-squad
/packages/grafana-ui/src/components/RadialGauge/ @grafana/dataviz-squad
/packages/grafana-ui/src/components/PluginSignatureBadge/ @grafana/plugins-platform-frontend
/packages/grafana-ui/src/components/Sparkline/ @grafana/grafana-frontend-platform @grafana/app-o11y-visualizations
/packages/grafana-ui/src/components/Table/ @grafana/dataviz-squad
@@ -739,6 +742,17 @@
# @grafana/test-utils
/packages/grafana-test-utils @grafana/grafana-frontend-platform
# @grafana/api-clients
/packages/grafana-api-clients/ @grafana/grafana-frontend-platform @grafana/grafana-search-navigate-organise
/packages/grafana-api-clients/src/clients/rtkq/advisor/ @grafana/plugins-platform-frontend
/packages/grafana-api-clients/src/clients/rtkq/correlations/ @grafana/datapro
/packages/grafana-api-clients/src/clients/rtkq/dashboard/ @grafana/dashboards-squad
/packages/grafana-api-clients/src/clients/rtkq/folder/ @grafana/grafana-search-navigate-organise
/packages/grafana-api-clients/src/clients/rtkq/iam/ @grafana/access-squad @grafana/identity-squad
/packages/grafana-api-clients/src/clients/rtkq/preferences/ @grafana/plugins-platform-frontend
/packages/grafana-api-clients/src/clients/rtkq/provisioning/ @grafana/grafana-git-ui-sync-team
/packages/grafana-api-clients/src/clients/rtkq/shorturl/ @grafana/sharing-squad
# root files, mostly frontend
/.browserslistrc @grafana/frontend-ops
/package.json @grafana/frontend-ops
@@ -789,7 +803,7 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform
/public/app/core/components/ColorScale/ @grafana/dataviz-squad
/public/app/core/components/DynamicImports/ @grafana/grafana-search-navigate-organise
/public/app/core/components/EmptyListCTA/ @grafana/grafana-frontend-platform
/public/app/core/components/FolderFilter/ @grafana/sharing-squad
/public/app/core/components/FolderFilter/ @grafana/grafana-search-navigate-organise
/public/app/core/components/Footer/ @grafana/grafana-search-navigate-organise
/public/app/core/components/ForgottenPassword/ @grafana/grafana-search-navigate-organise
/public/app/core/components/Form/ @grafana/grafana-frontend-platform
@@ -831,7 +845,6 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform
/public/app/core/constants.ts @grafana/grafana-frontend-platform
/public/app/core/context/ @grafana/grafana-frontend-platform
/public/app/core/copy/appNotification.ts @grafana/grafana-search-navigate-organise
/public/app/core/core.ts @grafana/grafana-frontend-platform
/public/app/core/crash/ @grafana/observability-traces-and-profiling
/public/app/core/history/ @grafana/observability-traces-and-profiling
/public/app/core/hooks/useBusEvent.ts @grafana/grafana-frontend-platform
@@ -940,6 +953,7 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform
/public/app/features/notifications/ @grafana/grafana-search-navigate-organise
/public/app/features/org/ @grafana/grafana-search-navigate-organise
/public/app/features/panel/ @grafana/dashboards-squad
/public/app/features/panel/suggestions/ @grafana/dataviz-squad
/public/app/features/playlist/ @grafana/dashboards-squad
/public/app/features/plugins/ @grafana/plugins-platform-frontend
/public/app/features/profile/ @grafana/grafana-frontend-platform
@@ -957,7 +971,6 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform
/public/app/features/transformers/timeSeriesTable/ @grafana/dataviz-squad @grafana/app-o11y-visualizations
/public/app/features/users/ @grafana/access-squad
/public/app/features/variables/ @grafana/dashboards-squad
/public/app/features/preferences/ @grafana/grafana-frontend-platform
/public/app/features/bookmarks/ @grafana/grafana-search-navigate-organise
/public/app/plugins/panel/* @grafana/dataviz-squad
/public/app/plugins/panel/alertlist/ @grafana/alerting-frontend
@@ -1053,13 +1066,10 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform
/scripts/trigger_windows_build.sh @grafana/grafana-developer-enablement-squad
/scripts/cleanup-husky.sh @grafana/frontend-ops
/scripts/verify-repo-update/ @grafana/grafana-developer-enablement-squad
/scripts/generate-rtk-apis.ts @grafana/grafana-frontend-platform
/scripts/process-specs.ts @grafana/grafana-frontend-platform
/scripts/generate-alerting-rtk-apis.ts @grafana/alerting-frontend
/scripts/levitate-parse-json-report.js @grafana/plugins-platform-frontend
/scripts/levitate-show-affected-plugins.js @grafana/plugins-platform-frontend
/scripts/codemods/explicit-barrel-imports.cjs @grafana/frontend-ops
/scripts/rtk-client-generator/ @grafana/grafana-search-navigate-organise
/scripts/codeowners-manifest/ @grafana/dataviz-squad
/scripts/test-coverage-by-codeowner.js @grafana/dataviz-squad
@@ -1100,6 +1110,7 @@ eslint-suppressions.json @grafanabot
# Grafana Sharing Squad
/public/app/features/dashboard-scene/sharing/ @grafana/sharing-squad
/public/app/features/dashboard/components/ShareModal/ @grafana/sharing-squad
/public/app/features/dashboard/dashgrid/DashboardLibrary/ @grafana/sharing-squad
/public/app/features/manage-dashboards/components/SnapshotListTable.tsx @grafana/sharing-squad
/pkg/services/dashboardsnapshots/ @grafana/sharing-squad
/public/app/features/explore/QueryLibrary/ @grafana/sharing-squad
@@ -1170,6 +1181,7 @@ embed.go @grafana/grafana-as-code
/pkg/registry/ @grafana/grafana-as-code
/pkg/registry/apis/ @grafana/grafana-app-platform-squad
/pkg/registry/apis/folders @grafana/grafana-search-and-storage
/pkg/registry/apis/datasource @grafana/grafana-datasources-core-services
/pkg/registry/apis/query @grafana/grafana-datasources-core-services
/pkg/registry/apis/secret @grafana/grafana-operator-experience-squad
/pkg/registry/apis/userstorage @grafana/grafana-app-platform-squad @grafana/plugins-platform-backend

View File

@@ -31,6 +31,9 @@ outputs:
dockerfile:
description: Whether the dockerfile or self have changed in any way
value: ${{ steps.changed-files.outputs.dockerfile_any_changed || 'true' }}
devenv:
description: Whether the devenv or self have changed in any way
value: ${{ steps.changed-files.outputs.devenv_any_changed || 'true' }}
runs:
using: composite
steps:
@@ -136,6 +139,9 @@ runs:
- '.vale.ini'
- '.github/actions/change-detection/**'
- '${{ inputs.self }}'
devenv:
- 'devenv/**'
- '${{ inputs.self }}'
- name: Print all change groups
shell: bash
run: |
@@ -157,3 +163,5 @@ runs:
echo " --> ${{ steps.changed-files.outputs.docs_all_changed_files }}"
echo "Dockerfile: ${{ steps.changed-files.outputs.dockerfile_any_changed || 'true' }}"
echo " --> ${{ steps.changed-files.outputs.dockerfile_all_changed_files }}"
echo "devenv: ${{ steps.changed-files.outputs.devenv_any_changed || 'true' }}"
echo " --> ${{ steps.changed-files.outputs.devenv_all_changed_files }}"

View File

@@ -1,6 +1,6 @@
{
extends: ["config:recommended"],
enabledManagers: ["npm"],
enabledManagers: ["npm", "docker-compose"],
ignorePresets: [
"github>grafana/grafana-renovate-config//presets/labels",
],
@@ -26,7 +26,7 @@
"@types/slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
"@types/slate", // we don't want to continue using this on the long run, use Monaco editor instead of Slate
],
includePaths: ["package.json", "packages/**", "public/app/plugins/**"],
includePaths: ["package.json", "packages/**", "public/app/plugins/**", "devenv/frontend-service/docker-compose.yaml"],
ignorePaths: ["emails/**", "**/mocks/**"],
labels: ["area/frontend", "dependencies", "no-changelog"],
postUpdateOptions: ["yarnDedupeHighest"],

View File

@@ -54,7 +54,7 @@ jobs:
- name: Upload to GitHub security events
if: success() || failure()
# If there are security problems, GitHub will automatically comment on the PR for us.
uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16
uses: github/codeql-action/upload-sarif@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v4.30.8
with:
sarif_file: results.sarif
category: actionlint

View File

@@ -15,7 +15,7 @@ jobs:
fetch-depth: 2
persist-credentials: false
- name: Set go version
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
with:
go-version-file: go.mod
- name: Build swagger

View File

@@ -29,7 +29,7 @@ jobs:
fi
- name: Setup Go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # 5.5.0
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # 6.0.0
with:
"go-version-file": "go.mod"

View File

@@ -17,7 +17,7 @@ jobs:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'

View File

@@ -46,12 +46,9 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
# Explicitly set Go version to 1.24.1 to ensure consistent OpenAPI spec generation
# The crypto/x509 package has additional fields in Go 1.24.1 that affect the generated specs
# This ensures the GHAs environment matches what we use in the Drone pipeline
go-version: 1.24.1
go-version-file: go.mod
cache: true
- name: Verify code generation
@@ -82,7 +79,7 @@ jobs:
make swagger-clean && make openapi3-gen
# Check if the generated specs differ from what's in the repository
for f in public/api-merged.json public/openapi3.json; do git add $f; done
for f in public/api-merged.json public/openapi3.json public/api-enterprise-spec.json; do git add $f; done
if [ -z "$(git diff --name-only --cached)" ]; then
echo "OpenAPI specs are up to date!"
else

View File

@@ -59,7 +59,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
- name: Run unit tests
@@ -94,7 +94,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
- name: Setup Enterprise

View File

@@ -40,7 +40,7 @@ jobs:
}' "$GITHUB_EVENT_PATH" > /tmp/pr_info.json
- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: pr_info
path: /tmp/pr_info.json

View File

@@ -36,7 +36,7 @@ jobs:
private_key: ${{ fromJSON(steps.secrets.outputs.secrets).APP_PEM }}
- name: Download PR info artifact
uses: actions/download-artifact@v4
uses: actions/download-artifact@v6
id: download-pr-info
with:
github-token: ${{ github.token }}

View File

@@ -97,7 +97,7 @@ jobs:
fetch-depth: 0
fetch-tags: true
- name: Setup nodejs environment
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
- name: "Configure git user"

View File

@@ -12,7 +12,7 @@ jobs:
pull-requests: read
steps:
- uses: actions/checkout@v5
- uses: grafana/shared-workflows/actions/cleanup-branches@cleanup-branches/v1.0.0
- uses: grafana/shared-workflows/actions/cleanup-branches@cleanup-branches/v0.2.1
with:
dry-run: true
max-date: "1 month ago"

View File

@@ -8,7 +8,9 @@ name: "CodeQL checks"
on:
workflow_dispatch:
push:
branches: ['**'] # run on all branches
branches:
- main
- release-*.*.*
paths-ignore:
- '**/*.cue'
- '**/*.json'
@@ -72,14 +74,15 @@ jobs:
- if: matrix.language == 'go' && needs.detect-changes.outputs.go == 'true'
name: Set go version
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
with:
cache: false
go-version-file: go.mod
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
if: needs.detect-changes.outputs[matrix.language] == 'true'
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -94,4 +97,4 @@ jobs:
make build-go
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4

View File

@@ -64,7 +64,7 @@ jobs:
- name: 'Set up Cloud SDK'
uses: 'google-github-actions/setup-gcloud@aa5489c8933f4cc7a4f7d45035b3b1440c9c10db'
- name: Setup nodejs environment
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: yarn
@@ -101,7 +101,7 @@ jobs:
echo "has_backend=false" >> "$GITHUB_OUTPUT"
fi
- name: Setup golang environment
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
if: steps.check_backend.outputs.has_backend == 'true'
with:
go-version-file: go.mod
@@ -193,7 +193,7 @@ jobs:
exit 1
fi
- name: store build artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: build-artifacts
path: ${{ steps.get_dir.outputs.dir }}/ci/packages/*.zip

View File

@@ -25,4 +25,5 @@ jobs:
patch_ref: "${{ github.base_ref }}" # this is the target branch name, Ex: "main"
patch_repo: "grafana/grafana-security-patches"
patch_prefix: "${{ github.event.pull_request.number }}"
sender: "${{ github.event.pull_request.user.login }}"
secrets: inherit # zizmor: ignore[secrets-inherit]

View File

@@ -34,7 +34,7 @@ jobs:
path: './pr'
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: './pr/.nvmrc'
@@ -64,7 +64,7 @@ jobs:
run: zip -r ./pr_built_packages.zip ./packages/**/*.tgz
- name: Upload build output as artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: buildPr
path: './pr/pr_built_packages.zip'
@@ -86,7 +86,7 @@ jobs:
ref: ${{ github.event.pull_request.base.ref }}
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: './base/.nvmrc'
@@ -116,7 +116,7 @@ jobs:
run: zip -r ./base_built_packages.zip ./packages/**/*.tgz
- name: Upload build output as artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: buildBase
path: './base/base_built_packages.zip'
@@ -136,17 +136,17 @@ jobs:
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
- name: Get built packages from pr
uses: actions/download-artifact@v4
uses: actions/download-artifact@v6
with:
name: buildPr
- name: Get built packages from base
uses: actions/download-artifact@v4
uses: actions/download-artifact@v6
with:
name: buildBase
@@ -189,7 +189,7 @@ jobs:
PR_NUMBER: ${{ github.event.pull_request.number }}
- name: Upload check output as artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: levitate
path: levitate/
@@ -225,7 +225,7 @@ jobs:
persist-credentials: false
- name: 'Download artifact'
uses: actions/download-artifact@v4
uses: actions/download-artifact@v6
with:
name: levitate

View File

@@ -24,7 +24,7 @@ jobs:
persist-credentials: false
- name: Set up Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: 'go.mod'
cache: true

View File

@@ -42,7 +42,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
@@ -63,7 +63,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
@@ -89,7 +89,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
@@ -109,7 +109,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
@@ -133,7 +133,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
@@ -164,7 +164,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'

View File

@@ -41,7 +41,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-go@v5.5.0
- uses: actions/setup-go@v6.0.0
with:
go-version-file: ./go.mod
- name: Run gofmt
@@ -62,7 +62,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-go@v5.5.0
- uses: actions/setup-go@v6.0.0
with:
go-version-file: ./go.mod
- name: golangci-lint

View File

@@ -39,7 +39,7 @@ jobs:
- name: "Get vault secrets"
id: vault-secrets
uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1 # zizmor: ignore[unpinned-uses]
uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.3.0 # zizmor: ignore[unpinned-uses]
with:
# Secrets placed in the ci/repo/grafana/grafana/plugins_platform_issue_commands_github_bot path in Vault
repo_secrets: |
@@ -71,7 +71,7 @@ jobs:
- name: "Get vault secrets"
id: vault-secrets
uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1 # zizmor: ignore[unpinned-uses]
uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.3.0 # zizmor: ignore[unpinned-uses]
with:
# Secrets placed in the ci/repo/grafana/grafana/plugins_platform_issue_triager path in Vault
repo_secrets: |
@@ -139,7 +139,7 @@ jobs:
steps:
- name: "Get vault secrets"
id: vault-secrets
uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.2.1 # zizmor: ignore[unpinned-uses]
uses: grafana/shared-workflows/actions/get-vault-secrets@get-vault-secrets/v1.3.0 # zizmor: ignore[unpinned-uses]
with:
# Secrets placed in the ci/repo/grafana/grafana/plugins_platform_issue_triager path in Vault
repo_secrets: |

View File

@@ -35,7 +35,7 @@ jobs:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'

View File

@@ -29,9 +29,9 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: "javascript"
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4

View File

@@ -39,10 +39,10 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
if: steps.check-python.outputs.skip != 'true'
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: "python"
- name: Perform CodeQL Analysis
if: steps.check-python.outputs.skip != 'true'
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4

View File

@@ -45,7 +45,7 @@ jobs:
persist-credentials: false
- name: Set go version
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
with:
go-version-file: go.mod

View File

@@ -94,14 +94,14 @@ jobs:
id: artifact
- name: Upload grafana.tar.gz
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
retention-days: 1
name: grafana-tar-gz
path: build-dir/grafana.tar.gz
- name: Upload grafana docker tarball
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
retention-days: 1
name: grafana-docker-tar-gz
@@ -122,7 +122,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
cache: ${{ !github.event.pull_request.head.repo.fork }}
@@ -133,7 +133,7 @@ jobs:
# We want a static binary, so we need to set CGO_ENABLED=0
CGO_ENABLED=0 go build -o ./e2e-runner ./e2e/
echo "artifact=e2e-runner-${{github.run_number}}" >> "$GITHUB_OUTPUT"
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
id: upload
with:
retention-days: 1
@@ -159,7 +159,7 @@ jobs:
with:
registry: 'us-docker.pkg.dev'
environment: 'dev'
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: grafana-docker-tar-gz
path: .
@@ -221,10 +221,10 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v6
with:
name: grafana-tar-gz
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v6
with:
name: ${{ needs.build-e2e-runner.outputs.artifact }}
- name: chmod +x
@@ -245,7 +245,7 @@ jobs:
run: |
set -euo pipefail
echo "suite=$(echo "$SUITE" | sed 's/\//-/g')" >> "$GITHUB_OUTPUT"
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
if: success() || failure()
with:
name: ${{ steps.set-suite-name.outputs.suite }}-${{ github.run_number }}
@@ -267,7 +267,7 @@ jobs:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
@@ -298,7 +298,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v6
with:
name: grafana-tar-gz
- name: Run E2E tests
@@ -307,7 +307,7 @@ jobs:
version: 0.18.8
verb: run
args: go run ./pkg/build/e2e-playwright --package=grafana.tar.gz --shard=${{ matrix.shard }}/${{ matrix.shardTotal }} --blob-dir=./blob-report
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
if: success() || failure()
with:
name: playwright-blob-${{ github.run_number }}-${{ matrix.shard }}
@@ -360,7 +360,7 @@ jobs:
run: |
docker cp cpp-e2e-deploy:/outputs.json /tmp/outputs.json
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v6
with:
name: grafana-tar-gz
@@ -395,12 +395,12 @@ jobs:
with:
persist-credentials: false
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v6
with:
path: blobs
pattern: playwright-blob-*
@@ -439,7 +439,7 @@ jobs:
- name: Upload HTML report
id: upload-html
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
name: playwright-html-${{ github.run_number }}
path: playwright-report
@@ -479,7 +479,7 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/download-artifact@v4
- uses: actions/download-artifact@v6
with:
name: grafana-tar-gz
- name: Run PR a11y test
@@ -498,7 +498,7 @@ jobs:
args: go run ./pkg/build/a11y --package=grafana.tar.gz --no-threshold-fail --results=./pa11y-ci-results.json
- name: Upload pa11y results
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v5
with:
retention-days: 1
name: pa11y-ci-results
@@ -525,13 +525,13 @@ jobs:
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
- name: Install dependencies
run: yarn install --immutable
- name: Get pa11y results
uses: actions/download-artifact@v4
uses: actions/download-artifact@v6
with:
name: pa11y-ci-results
- name: Extract and publish metrics

View File

@@ -18,6 +18,7 @@ jobs:
contents: read
outputs:
changed: ${{ steps.detect-changes.outputs.frontend }}
devenv-changed: ${{ steps.detect-changes.outputs.devenv }}
steps:
- uses: actions/checkout@v5
with:
@@ -169,3 +170,26 @@ jobs:
needs: ${{ toJson(needs) }}
failure-message: "One or more unit test jobs have failed"
success-message: "All unit tests completed successfully"
devenv:
needs:
- detect-changes
if: needs.detect-changes.outputs.devenv-changed == 'true'
runs-on: ubuntu-x64-large
name: "Devenv frontend-service build"
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Docker
uses: docker/setup-docker-action@3fb92d6d9c634363128c8cce4bc3b2826526370a # v4
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Install Tilt
run: curl -fsSL https://raw.githubusercontent.com/tilt-dev/tilt/master/scripts/install.sh | bash
- name: Create empty config files # TODO: the tiltfile should conditionally mount these only if they exist, like the enterprise license
run: |
touch devenv/frontend-service/configs/grafana-api.local.ini
touch devenv/frontend-service/configs/frontend-service.local.ini
- name: Test frontend-service Tiltfile
run: tilt ci --file devenv/frontend-service/Tiltfile

View File

@@ -39,7 +39,7 @@ jobs:
persist-credentials: false
- name: Set go version
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
with:
cache: false
go-version-file: go.mod
@@ -76,7 +76,7 @@ jobs:
persist-credentials: false
- name: Set go version
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
with:
cache: false
go-version-file: go.mod

View File

@@ -24,7 +24,7 @@ jobs:
persist-credentials: false
- name: Set go version
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00
with:
go-version-file: go.mod

View File

@@ -21,7 +21,7 @@ jobs:
id: detect-changes
uses: ./.github/actions/change-detection
with:
self: .github/workflows/pr-test-integration.yml
self: .github/workflows/pr-test-docker.yml
build-dockerfile:
needs: detect-changes
@@ -34,6 +34,6 @@ jobs:
uses: actions/checkout@v5
with:
persist-credentials: false
- uses: docker/setup-docker-action@b60f85385d03ac8acfca6d9996982511d8620a19 # v4
- uses: docker/setup-docker-action@3fb92d6d9c634363128c8cce4bc3b2826526370a # v4
- name: Build Dockerfile
run: make build-docker-full

View File

@@ -58,7 +58,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
cache: true
@@ -78,6 +78,7 @@ jobs:
# We don't need more than this since it has to wait for the other tests.
shard: [
1/4, 2/4, 3/4, 4/4,
profiled,
]
fail-fast: false
@@ -91,17 +92,79 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
cache: true
- name: Run tests
if: matrix.shard != 'profiled'
env:
SHARD: ${{ matrix.shard }}
CGO_ENABLED: 0
SKIP_PACKAGES: |-
pkg/tests/apis/folder
pkg/tests/apis/dashboard
run: |
set -euo pipefail
readarray -t PACKAGES <<< "$(./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -N"$SHARD" -d-)"
CGO_ENABLED=0 go test -tags=sqlite -timeout=8m -run '^TestIntegration' "${PACKAGES[@]}"
# Build regex pattern like: pkg1$|pkg2$|pkg3$
SKIP_PATTERN=$(echo "$SKIP_PACKAGES" | sed '/^$/d' | sed 's|.*|&$|' | paste -sd '|' -)
readarray -t PACKAGES <<< "$(./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -N "$SHARD" -d - | grep -Ev "($SKIP_PATTERN)")"
go test -tags=sqlite -timeout=8m -run '^TestIntegration' "${PACKAGES[@]}"
- name: Run profiled tests
id: run-profiled-tests
if: matrix.shard == 'profiled'
env:
CGO_ENABLED: 0
PROFILED_PACKAGES: |-
pkg/tests/apis/folder
pkg/tests/apis/dashboard
run: |
set -euo pipefail
# Build regex pattern line: pkg1$|pkg2$|pkg3$
PROFILE_PATTERN=$(echo "$PROFILED_PACKAGES" | sed '/^$/d' | sed 's|.*|&$|' | paste -sd '|' -)
readarray -t PACKAGES <<< "$(./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | grep -E "($PROFILE_PATTERN)")"
if [ ${#PACKAGES[@]} -eq 0 ]; then
echo "⚠️ No profiled packages found"
exit 0
fi
mkdir -p profiles
EXIT_CODE=0
# Run each profiled package sequentially
for full_pkg in "${PACKAGES[@]}"; do
# Build valid file name
pkg_name=$(basename "$full_pkg" | tr '/' '_' | tr '.' '_')
echo "📦 Running $full_pkg"
set +e
go test -tags=sqlite -timeout=8m -run '^TestIntegration' \
-outputdir=profiles \
-cpuprofile="cpu_${pkg_name}.prof" \
-memprofile="mem_${pkg_name}.prof" \
-trace="trace_${pkg_name}.out" \
"$full_pkg" 2>&1 | tee "profiles/test_${pkg_name}.log"
TEST_EXIT=$?
set -e
if [ $TEST_EXIT -ne 0 ]; then
echo "❌ $full_pkg failed with exit code $TEST_EXIT"
EXIT_CODE=1
else
echo "✅ $full_pkg passed"
fi
done
# Set output for artifact upload
if [ $EXIT_CODE -ne 0 ]; then
echo "upload_artifacts=true" >> "$GITHUB_OUTPUT"
else
echo "upload_artifacts=false" >> "$GITHUB_OUTPUT"
fi
exit $EXIT_CODE
- name: Output test profiles and traces
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v4
if: matrix.shard == 'profiled' && !cancelled() && steps.run-profiled-tests.outputs.upload_artifacts == 'true'
with:
name: integration-test-profiles-sqlite-nocgo-${{ github.run_number }}
path: profiles/
retention-days: 7
if-no-files-found: ignore
mysql:
needs: detect-changes
if: needs.detect-changes.outputs.changed == 'true'
@@ -139,7 +202,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
cache: true
@@ -188,7 +251,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
cache: true

View File

@@ -44,7 +44,7 @@ jobs:
permissions:
id-token: write
steps:
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: ${{ inputs.name }}
pattern: ${{ inputs.pattern }}

View File

@@ -27,7 +27,7 @@ jobs:
persist-credentials: false
- name: "Setup Go"
uses: "actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5"
uses: "actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00"
with:
go-version-file: go.mod

View File

@@ -30,7 +30,7 @@ jobs:
persist-credentials: false
- name: "Setup Go"
uses: "actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5"
uses: "actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00"
with:
go-version-file: go.mod

View File

@@ -156,16 +156,16 @@ jobs:
artifacts: targz:grafana:linux/arm/v6,deb:grafana:linux/arm/v6
verify: true
- name: windows-amd64
artifacts: targz:grafana:windows/amd64,zip:grafana:windows/amd64,msi:grafana:windows/amd64
artifacts: targz:grafana:windows/amd64:nocgo,zip:grafana:windows/amd64:nocgo,msi:grafana:windows/amd64:nocgo
verify: true
- name: windows-arm64
artifacts: targz:grafana:windows/arm64,zip:grafana:windows/arm64
artifacts: targz:grafana:windows/arm64:nocgo,zip:grafana:windows/arm64:nocgo
verify: true
- name: darwin-amd64
artifacts: targz:grafana:darwin/amd64
artifacts: targz:grafana:darwin/amd64:nocgo
verify: true
- name: darwin-arm64
artifacts: targz:grafana:darwin/arm64
artifacts: targz:grafana:darwin/arm64:nocgo
verify: true
steps:
- uses: grafana/shared-workflows/actions/dockerhub-login@dockerhub-login/v1.0.2
@@ -187,12 +187,12 @@ jobs:
output: artifacts-${{ matrix.name }}.txt
verify: ${{ matrix.verify }}
build-id: ${{ github.run_id }}
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
with:
name: artifacts-list-${{ matrix.name }}
path: ${{ steps.build.outputs.file }}
retention-days: 1
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
- uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4
with:
name: artifacts-${{ matrix.name }}
path: ${{ steps.build.outputs.dist-dir }}
@@ -212,6 +212,7 @@ jobs:
run-id: ${{ github.run_id }}
bucket-path: ${{ needs.setup.outputs.version }}_${{ github.run_id }}
environment: prod
runs-on: ubuntu-x64-small
publish-dockerhub:
if: github.ref_name == 'main'
@@ -224,27 +225,27 @@ jobs:
- build
steps:
- uses: grafana/shared-workflows/actions/dockerhub-login@dockerhub-login/v1.0.2
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: artifacts-list-linux-amd64
path: .
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: artifacts-list-linux-arm64
path: .
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: artifacts-list-linux-armv7
path: .
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: artifacts-linux-amd64
path: dist
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: artifacts-linux-arm64
path: dist
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
- uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53
with:
name: artifacts-linux-armv7
path: dist
@@ -320,20 +321,29 @@ jobs:
repositories: '["grafana"]'
permissions: '{"issues": "write", "pull_requests": "write", "contents": "read"}'
- name: Find PR
continue-on-error: true
id: find-pr
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
GRAFANA_COMMIT: ${{ needs.setup.outputs.grafana-commit }}
run: echo "ISSUE_NUMBER=$(gh api "/repos/grafana/grafana/commits/${GRAFANA_COMMIT}/pulls" | jq -r '.[0].number')" >> "$GITHUB_ENV"
REPO: ${{ github.repository }}
run: |
set -eo pipefail
gh api "/repos/${REPO}/commits/${GRAFANA_COMMIT}/pulls" | jq -r '.[0].number' | tee issue_number.txt
echo "ISSUE_NUMBER=$(cat issue_number.txt)" >> "$GITHUB_ENV"
- name: Find Comment
uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3
if: ${{ steps.find-pr.outcome == 'success' }}
id: fc
continue-on-error: true
with:
issue-number: ${{ env.ISSUE_NUMBER }}
comment-author: 'grafana-delivery-bot[bot]'
body-includes: GitHub Actions Build
token: ${{ steps.generate_token.outputs.token }}
- name: Create or update comment
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v4
if: ${{ steps.find-pr.outcome == 'success' }} # Run even if comment wasn't found
with:
token: ${{ steps.generate_token.outputs.token }}
comment-id: ${{ steps.fc.outputs.comment-id }}

View File

@@ -60,7 +60,7 @@ jobs:
echo "github.ref: $GITHUB_REF"
- name: Checkout workflow ref
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
persist-credentials: false
fetch-depth: 100
@@ -86,7 +86,7 @@ jobs:
shell: bash
- name: Checkout build commit
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
persist-credentials: false
ref: ${{ inputs.grafana_commit }}
@@ -123,11 +123,6 @@ jobs:
- name: Validate packages
run: ./scripts/validate-npm-packages.sh
- name: Debug OIDC Claims
uses: github/actions-oidc-debugger@2e9ba5d3f4bebaad1f91a2cede055115738b7ae8
with:
audience: '${{ github.server_url }}/${{ github.repository_owner }}'
- name: Publish packages
env:
NPM_TAG: ${{ steps.npm-tag.outputs.NPM_TAG }}

View File

@@ -133,10 +133,10 @@ jobs:
path: .grafana-main
- name: Setup nodejs environment
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
- uses: actions/setup-go@v5.5.0
- uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
- name: Configure git user

View File

@@ -29,12 +29,12 @@ jobs:
with:
persist-credentials: false
- name: Pin Go version to mod file
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: 'go.mod'
cache: true
- run: go version
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'

View File

@@ -22,11 +22,11 @@ jobs:
with:
persist-credentials: false
- name: Pin Go version to mod file
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: 'go.mod'
- run: go version
- uses: actions/setup-node@v4
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'

View File

@@ -11,7 +11,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
- uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
operations-per-run: 750

View File

@@ -34,12 +34,12 @@ jobs:
id-token: write
needs: detect-changes
if: needs.detect-changes.outputs.changed == 'true'
name: "Run Storybook a11y tests"
name: "Run Storybook a11y tests (light theme)"
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v5
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
package-manager-cache: false # too large for GH's cache limits :-(
@@ -64,12 +64,12 @@ jobs:
id-token: write
needs: detect-changes
if: needs.detect-changes.outputs.changed == 'true'
name: "Run Storybook a11y tests"
name: "Run Storybook a11y tests (dark theme)"
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@v5
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
package-manager-cache: false # too large for GH's cache limits :-(

View File

@@ -49,7 +49,7 @@ jobs:
with:
persist-credentials: false
- name: Setup Go
uses: actions/setup-go@v5.5.0
uses: actions/setup-go@v6.0.0
with:
go-version-file: go.mod
- name: Setup Enterprise

View File

@@ -20,7 +20,7 @@ jobs:
with:
persist-credentials: false
- name: Install Trivy
uses: aquasecurity/setup-trivy@9ea583eb67910444b1f64abf338bd2e105a0a93d
uses: aquasecurity/setup-trivy@e6c2c5e321ed9123bda567646e2f96565e34abe1
with:
version: v0.56.2
cache: true
@@ -64,7 +64,7 @@ jobs:
.
if: always() && github.repository == 'grafana/grafana'
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: 'trivy-results.sarif'
if: always() && github.repository == 'grafana/grafana'

View File

@@ -31,6 +31,6 @@ jobs:
persist-credentials: false
fetch-depth: ${{ steps.fetch_depth.outputs.fetch_depth }}
- name: Trufflehog
uses: trufflesecurity/trufflehog@e88e7d019eb84ca64f6b768c82eb6bf1a6271401 # v3.90.9
uses: trufflesecurity/trufflehog@b84c3d14d189e16da175e2c27fa8136603783ffc # v3.90.12
with:
extra_args: --results=verified

View File

@@ -17,6 +17,6 @@ jobs:
bundle-schema-types:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: grafana/plugin-actions/bundle-schema-types@main

View File

@@ -21,7 +21,7 @@ jobs:
persist-credentials: false
- name: "Setup Go"
uses: "actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5"
uses: "actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00"
with:
go-version-file: go.mod

5
.gitignore vendored
View File

@@ -250,9 +250,12 @@ public/mockServiceWorker.js
/e2e-playwright/test-plugins/*/dist
/apps/provisioning/cmd/job-controller/bin/
# Ignore unified storage kv store files
/grafana-kv-data
# Ignore debug output from test library
/pkg/storage/secret/metadata/testdata/rapid/TestStateMachine/
/codeowners-manifest/
# Ignore grafana/hippocampus local cache folder

View File

@@ -83,7 +83,7 @@ linters:
deny:
- pkg: github.com/grafana/grafana/pkg
desc: apps/playlist is not allowed to import grafana core
apps-secret:
apps-secret:
list-mode: lax
files:
- ./apps/secret/*
@@ -105,6 +105,8 @@ linters:
- '**/pkg/tsdb/graphite/**/*'
- '**/pkg/tsdb/mysql/*'
- '**/pkg/tsdb/mysql/**/*'
- '**/pkg/tsdb/opentsdb/*'
- '**/pkg/tsdb/opentsdb/**/*'
- '**/pkg/tsdb/parca/*'
- '**/pkg/tsdb/parca/**/*'
- '**/pkg/tsdb/tempo/*'
@@ -179,7 +181,9 @@ linters:
- pkg: io/ioutil
desc: 'Deprecated: As of Go 1.16, the same functionality is now provided by package io or package os, and those implementations should be preferred in new code. See the specific function documentation for details.'
- pkg: gopkg.in/yaml.v2
desc: Grafana packages are not allowed to depend on gopkg.in/yaml.v2 as gopkg.in/yaml.v3 is now available
desc: use go.yaml.in/yaml/v3 instead
- pkg: gopkg.in/yaml.v3
desc: use go.yaml.in/yaml/v3 instead
- pkg: github.com/pkg/errors
desc: 'Deprecated: Go 1.13 supports the functionality provided by pkg/errors in the standard library.'
- pkg: github.com/xorcare/pointer

2
.nvmrc
View File

@@ -1 +1 @@
v22.16.0
v24.11.0

File diff suppressed because one or more lines are too long

View File

@@ -25,6 +25,6 @@ plugins:
path: .yarn/plugins/@yarnpkg/plugin-licenses.cjs
spec: "https://raw.githubusercontent.com/mhassan1/yarn-plugin-licenses/v0.15.0/bundles/@yarnpkg/plugin-licenses.js"
yarnPath: .yarn/releases/yarn-4.9.4.cjs
yarnPath: .yarn/releases/yarn-4.11.0.cjs
enableScripts: false

View File

@@ -1,3 +1,340 @@
<!-- 12.3.0 START -->
# 12.3.0 (2025-11-19)
### Features and enhancements
- **API Clients:** Add lazy hooks to clients [#113226](https://github.com/grafana/grafana/pull/113226), [@tomratcliffe](https://github.com/tomratcliffe)
- **API clients:** Automatically set PATCH headers [#111879](https://github.com/grafana/grafana/pull/111879), [@Clarity-89](https://github.com/Clarity-89)
- **API clients:** Extract into a package [#111810](https://github.com/grafana/grafana/pull/111810), [@Clarity-89](https://github.com/Clarity-89)
- **API clients:** Extract into a package (Enterprise)
- **API clients:** Update API clients to include all endpoints & add hooks [#113061](https://github.com/grafana/grafana/pull/113061), [@tomratcliffe](https://github.com/tomratcliffe)
- **AccessControl:** Include hidden roles in service account role display [#112924](https://github.com/grafana/grafana/pull/112924), [@Jguer](https://github.com/Jguer)
- **AccessControl:** Increase limit of LBAC for Datasources rules [#111560](https://github.com/grafana/grafana/pull/111560), [@Jguer](https://github.com/Jguer)
- **Accessibility:** Wrap data source info onto 2 lines at small viewports [#113033](https://github.com/grafana/grafana/pull/113033), [@ashharrison90](https://github.com/ashharrison90)
- **Alert Enrichment:** Add mutator to insert rule UID labels to allow for efficient use of labelSelector (Enterprise)
- **Alerting:** Add enrichment components to rule view page (Enterprise)
- **Alerting:** Add enrichment section to rule view page (Enterprise)
- **Alerting:** Add jitter support for periodic alert state storage to reduce database load spikes [#111357](https://github.com/grafana/grafana/pull/111357), [@softho0n](https://github.com/softho0n)
- **Alerting:** Add position-based matching for identical alert rules [#112407](https://github.com/grafana/grafana/pull/112407), [@konrad147](https://github.com/konrad147)
- **Alerting:** Create alertingAlertRuleFormSchema in restrictedGrafanaApis [#112794](https://github.com/grafana/grafana/pull/112794), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **Alerting:** Display error message in central state history view [#111445](https://github.com/grafana/grafana/pull/111445), [@laurenashleigh](https://github.com/laurenashleigh)
- **Alerting:** Enrichment per rule wip-2 (Enterprise)
- **Alerting:** Hide metadata if grouping by folder [#113216](https://github.com/grafana/grafana/pull/113216), [@laurenashleigh](https://github.com/laurenashleigh)
- **Alerting:** Improve template ai helper prompt and add some examples (Enterprise)
- **Alerting:** Move enrichment tab between details and versions [#110886](https://github.com/grafana/grafana/pull/110886), [@laurenashleigh](https://github.com/laurenashleigh)
- **Alerting:** Remove ai feedback button from alert form [#112713](https://github.com/grafana/grafana/pull/112713), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **Alerting:** Remove unused components [#111320](https://github.com/grafana/grafana/pull/111320), [@laurenashleigh](https://github.com/laurenashleigh)
- **Alerting:** Remove useRulesSourcesWithRuler for SmartAlertTypeDetector [#111623](https://github.com/grafana/grafana/pull/111623), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **Alerting:** Surface remote AM silence creation errors properly [#112757](https://github.com/grafana/grafana/pull/112757), [@moustafab](https://github.com/moustafab)
- **Alerting:** Triage [#110339](https://github.com/grafana/grafana/pull/110339), [@gillesdemey](https://github.com/gillesdemey)
- **Alerting:** Triage rule details drawer [#112055](https://github.com/grafana/grafana/pull/112055), [@konrad147](https://github.com/konrad147)
- **Alerting:** Update prompt examples for template AI Helper (Enterprise)
- **Alerting:** Update width to instance details drawer in Triage page [#113209](https://github.com/grafana/grafana/pull/113209), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **Alerting:** Use new enrichment endpoints in FE (Enterprise)
- **Alerting:** Use ruleUid as a prop instead of extracting it from the rule context (Enterprise)
- **Analytics:** Aggregate daily summary in datasources analytics (Enterprise)
- **Analytics:** Apply proper batching to Loki exports and add configurable settings (Enterprise)
- **Annotations:** Exclude internal dashboard id when saved via UID [#111535](https://github.com/grafana/grafana/pull/111535), [@ryantxu](https://github.com/ryantxu)
- **Azure:** Use SSO settings in plugin context [#112058](https://github.com/grafana/grafana/pull/112058), [@aangelisc](https://github.com/aangelisc)
- **Buttons:** Active style for buttons [#111235](https://github.com/grafana/grafana/pull/111235), [@gtk-grafana](https://github.com/gtk-grafana)
- **Caching:** Disable cache if datasource has oauthPassThru=true (Enterprise)
- **Canvas:** Allow non-icon bg image fields [#112308](https://github.com/grafana/grafana/pull/112308), [@fastfrwrd](https://github.com/fastfrwrd)
- **Chore:** Add logsdrilldown replace to apps/iam/go.mod [#112581](https://github.com/grafana/grafana/pull/112581), [@njvrzm](https://github.com/njvrzm)
- **CloudWatch Logs:** Don't add console link to every field in the logs response [#112230](https://github.com/grafana/grafana/pull/112230), [@idastambuk](https://github.com/idastambuk)
- **CloudWatch Logs:** Support Log Anomalies query type [#113067](https://github.com/grafana/grafana/pull/113067), [@idastambuk](https://github.com/idastambuk)
- **CloudWatch:** Add syntax highlighting and autocomplete for logs diff command [#111207](https://github.com/grafana/grafana/pull/111207), [@kevinwcyu](https://github.com/kevinwcyu)
- **CloudWatch:** Add tracking for logs anomalies [#113181](https://github.com/grafana/grafana/pull/113181), [@idastambuk](https://github.com/idastambuk)
- **Dashboard Controls:** Add annotations to the dashboard controls menu [#112816](https://github.com/grafana/grafana/pull/112816), [@leventebalogh](https://github.com/leventebalogh)
- **Dashboard Picker:** Update to use correct search + dashboards APIs [#112341](https://github.com/grafana/grafana/pull/112341), [@tomratcliffe](https://github.com/tomratcliffe)
- **Dashboard:** Backend always set `metricEditorMode: 0` regardless `metricQueryType` and `expression` [#111613](https://github.com/grafana/grafana/pull/111613), [@ivanortegaalba](https://github.com/ivanortegaalba)
- **Dashboards:** Add a new variable type called "Switch" [#111366](https://github.com/grafana/grafana/pull/111366), [@leventebalogh](https://github.com/leventebalogh)
- **Dashboards:** Hide error notifications in kiosk mode on dashboards [#112390](https://github.com/grafana/grafana/pull/112390), [@ivanortegaalba](https://github.com/ivanortegaalba)
- **Dynamic Dashboards:** Expand dashboards_init_dashboard_completed tracking info [#111102](https://github.com/grafana/grafana/pull/111102), [@idastambuk](https://github.com/idastambuk)
- **ErrorBoundary:** Report specific boundary type to Faro [#112071](https://github.com/grafana/grafana/pull/112071), [@tskarhed](https://github.com/tskarhed)
- **Explore:** Use compact mode only when targeting Tempo [#113037](https://github.com/grafana/grafana/pull/113037), [@ifrost](https://github.com/ifrost)
- **FeatureToggles:** Remove deprecated experimental apiserver [#111617](https://github.com/grafana/grafana/pull/111617), [@ryantxu](https://github.com/ryantxu)
- **Fields Selector:** Add component and integrate with Logs and Logs table visualization [#112534](https://github.com/grafana/grafana/pull/112534), [@matyax](https://github.com/matyax)
- **Flame Graph:** Anchor exact match when clicking a table symbol in search [#111101](https://github.com/grafana/grafana/pull/111101), [@samarthbagga-meesho](https://github.com/samarthbagga-meesho)
- **FlameGraph:** Improve prompt for open assistant to analyze flamegraph [#113071](https://github.com/grafana/grafana/pull/113071), [@simonswine](https://github.com/simonswine)
- **FolderPicker:** Don't show expand button for empty folders and move search icon [#111872](https://github.com/grafana/grafana/pull/111872), [@aocenas](https://github.com/aocenas)
- **FolderPicker:** Show parent folder when searching [#111026](https://github.com/grafana/grafana/pull/111026), [@aocenas](https://github.com/aocenas)
- **Geomap:** Add a MapLibre style base layer [#109841](https://github.com/grafana/grafana/pull/109841), [@remogeissbuehler](https://github.com/remogeissbuehler)
- **Geomap:** Move beta layers to GA [#113186](https://github.com/grafana/grafana/pull/113186), [@drew08t](https://github.com/drew08t)
- **Go:** Update to 1.25.2 + golangci-lint v2.5.0 + golang.org/x/net v0.45.0 [#112149](https://github.com/grafana/grafana/pull/112149), [@macabu](https://github.com/macabu)
- **Go:** Update to 1.25.3 [#112359](https://github.com/grafana/grafana/pull/112359), [@macabu](https://github.com/macabu)
- **Grafana Advisor:** Prometheus Type Migration check [#110853](https://github.com/grafana/grafana/pull/110853), [@bossinc](https://github.com/bossinc)
- **Grafana Data Source:** Add random walk configuration options [#113009](https://github.com/grafana/grafana/pull/113009), [@nmarrs](https://github.com/nmarrs)
- **IAM:** Add uid column in team_member DB table [#112439](https://github.com/grafana/grafana/pull/112439), [@dmihai](https://github.com/dmihai)
- **Jaeger:** Migrate API calls to gRPC endpoint [#113297](https://github.com/grafana/grafana/pull/113297), [@jcolladokuri](https://github.com/jcolladokuri)
- **LBAC for data sources:** Provide user feedback of potential performance loss from LBAC rules (Enterprise)
- **Library Panels:** Remove direct use of legacy search [#112231](https://github.com/grafana/grafana/pull/112231), [@tomratcliffe](https://github.com/tomratcliffe)
- **Logs panel:** Respect selected fields for downloading logs [#111753](https://github.com/grafana/grafana/pull/111753), [@matyax](https://github.com/matyax)
- **Nav:** Render menu items as `p` tags so truncation logic can work [#113248](https://github.com/grafana/grafana/pull/113248), [@tomratcliffe](https://github.com/tomratcliffe)
- **Navigation:** Move Cost management and billing plugin to root [#111739](https://github.com/grafana/grafana/pull/111739), [@gubjanos](https://github.com/gubjanos)
- **PanelTimeCompare:** Support saving time compare window [#113150](https://github.com/grafana/grafana/pull/113150), [@torkelo](https://github.com/torkelo)
- **PanelTimeSettings:** Support panel time range settings changes from dashboard in view mode [#113027](https://github.com/grafana/grafana/pull/113027), [@torkelo](https://github.com/torkelo)
- **Plugins:** Install Grafana Pathfinder behind a feature flag [#109909](https://github.com/grafana/grafana/pull/109909), [@Jayclifford345](https://github.com/Jayclifford345)
- **PostgreSQL:** Support PGPASSFILE by making password optional [#108856](https://github.com/grafana/grafana/pull/108856), [@taraspos](https://github.com/taraspos)
- **Provisioning:** Watch file system for changes [#112184](https://github.com/grafana/grafana/pull/112184), [@ryantxu](https://github.com/ryantxu)
- **Reporting:** Add support for schema v2 dashboards (Enterprise)
- **Reporting:** Wait for streaming to end before exporting CSVs (Enterprise)
- **SQL Expressions:** Add Functions to Allow list [#113291](https://github.com/grafana/grafana/pull/113291), [@kylebrandt](https://github.com/kylebrandt)
- **Snapshots:** Use appSubUrl for View all snapshots [#111652](https://github.com/grafana/grafana/pull/111652), [@Clarity-89](https://github.com/Clarity-89)
- **Span Details:** Bring back span id to span details [#112411](https://github.com/grafana/grafana/pull/112411), [@ifrost](https://github.com/ifrost)
- **Span Details:** Wrap label values [#112413](https://github.com/grafana/grafana/pull/112413), [@ifrost](https://github.com/ifrost)
- **Stars:** Refactor StarsToolbarButton and unify nav update logic [#112582](https://github.com/grafana/grafana/pull/112582), [@tomratcliffe](https://github.com/tomratcliffe)
- **Stat/BarGauge:** Border radius tweak [#112562](https://github.com/grafana/grafana/pull/112562), [@torkelo](https://github.com/torkelo)
- **Table:** Add some error-case handling to ImageCell [#110461](https://github.com/grafana/grafana/pull/110461), [@fastfrwrd](https://github.com/fastfrwrd)
- **Table:** Allow FieldType.other containing arrays to use Pills [#111205](https://github.com/grafana/grafana/pull/111205), [@fastfrwrd](https://github.com/fastfrwrd)
- **Table:** Disable virtualization, hover overflow, and scrollbar width resizing on Safari 26 [#111834](https://github.com/grafana/grafana/pull/111834), [@fastfrwrd](https://github.com/fastfrwrd)
- **Table:** Pill and JSON Cells should allow formatting [#111951](https://github.com/grafana/grafana/pull/111951), [@fastfrwrd](https://github.com/fastfrwrd)
- **Table:** Support DataLinks and Actions in SparklineCell [#112244](https://github.com/grafana/grafana/pull/112244), [@fastfrwrd](https://github.com/fastfrwrd)
- **Table:** Update ad-hoc filter to use name instead of displayName [#112815](https://github.com/grafana/grafana/pull/112815), [@fastfrwrd](https://github.com/fastfrwrd)
- **Tempo:** Migrates tags and tag values to datasource backend CallResource requests (Enterprise)
- **Theme:** Changes light theme canvas color a more white shade [#111318](https://github.com/grafana/grafana/pull/111318), [@torkelo](https://github.com/torkelo)
- **Themes:** Update themes border radius [#111478](https://github.com/grafana/grafana/pull/111478), [@torkelo](https://github.com/torkelo)
- **TimeComparison:** Automatically show/hide menu on hover [#112750](https://github.com/grafana/grafana/pull/112750), [@jesdavpet](https://github.com/jesdavpet)
- **TimeSeries:** Allow custom time units on x-axis [#112913](https://github.com/grafana/grafana/pull/112913), [@leeoniya](https://github.com/leeoniya)
- **Timeseries:** Numeric duration values could render as NaN (#73795) [#112076](https://github.com/grafana/grafana/pull/112076), [@fastfrwrd](https://github.com/fastfrwrd)
- **Transformations:** Hide "Match all/any" conditions for less than two filters [#109754](https://github.com/grafana/grafana/pull/109754), [@sudoice](https://github.com/sudoice)
- **UI Extensions:** Remove path validation from link extensions [#112259](https://github.com/grafana/grafana/pull/112259), [@leventebalogh](https://github.com/leventebalogh)
### Bug fixes
- **Access Control:** Fix the permission checks for saving/updating/deleting annotations [#112953](https://github.com/grafana/grafana/pull/112953), [@IevaVasiljeva](https://github.com/IevaVasiljeva)
- **Accessibility:** Improve no-unreduced-motion rule and fix violations [#110304](https://github.com/grafana/grafana/pull/110304), [@tomratcliffe](https://github.com/tomratcliffe)
- **Alerting Provisioning:** Don't error on recording rules without conditions [#109410](https://github.com/grafana/grafana/pull/109410), [@djpnicholls](https://github.com/djpnicholls)
- **Alerting:** Clear outdated settings when switching contact point type [#111869](https://github.com/grafana/grafana/pull/111869), [@konrad147](https://github.com/konrad147)
- **Alerting:** Fix enrichment tab to be rendered only for grafana alerting rules [#113030](https://github.com/grafana/grafana/pull/113030), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **Alerting:** Fix instances matching in notification policies [#112326](https://github.com/grafana/grafana/pull/112326), [@konrad147](https://github.com/konrad147)
- **Alerting:** Fix threshold params [#111645](https://github.com/grafana/grafana/pull/111645), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **Alerting:** Fix unmarshalling of GettableStatus to include time intervals [#112602](https://github.com/grafana/grafana/pull/112602), [@yuri-tceretian](https://github.com/yuri-tceretian)
- **Alerting:** Migrate `spec.title` and `spec.name` fieldSelectors [#111993](https://github.com/grafana/grafana/pull/111993), [@gillesdemey](https://github.com/gillesdemey)
- **Alerting:** Normalize health when filtering rules [#113087](https://github.com/grafana/grafana/pull/113087), [@gillesdemey](https://github.com/gillesdemey)
- **Alerting:** Prohibit receivers with empty name [#113064](https://github.com/grafana/grafana/pull/113064), [@yuri-tceretian](https://github.com/yuri-tceretian)
- **Alerting:** Provisioning to fix contact point type on save [#112246](https://github.com/grafana/grafana/pull/112246), [@yuri-tceretian](https://github.com/yuri-tceretian)
- **Alerting:** Remove \_\_grafana_origin when duplicating rule [#112396](https://github.com/grafana/grafana/pull/112396), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
- **AnnoList:** Fix annotations not loading when in a repeated row [#111540](https://github.com/grafana/grafana/pull/111540), [@joshhunt](https://github.com/joshhunt)
- **Annotations:** Fix issue with transformation logic in scenes [#112288](https://github.com/grafana/grafana/pull/112288), [@fastfrwrd](https://github.com/fastfrwrd)
- **Auth:** Fix render user OAuth passthrough [#111636](https://github.com/grafana/grafana/pull/111636), [@charandas](https://github.com/charandas)
- **ComboBox:** Add loading state to dropdown and prefixIcon [#112967](https://github.com/grafana/grafana/pull/112967), [@tomratcliffe](https://github.com/tomratcliffe)
- **Connections:** Fix connections home page on enterprise [#111751](https://github.com/grafana/grafana/pull/111751), [@oshirohugo](https://github.com/oshirohugo)
- **Dashboard:** Fix editor specific permissions in /api [#113292](https://github.com/grafana/grafana/pull/113292), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
- **Dashboards:** Fix bug with anon users with editor permissions creating dashboards [#113260](https://github.com/grafana/grafana/pull/113260), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
- **Dashboards:** Fix missing Ctrl+O keyboard shortcut for crosshair toggle [#111310](https://github.com/grafana/grafana/pull/111310), [@ivanortegaalba](https://github.com/ivanortegaalba)
- **Dashboards:** Fix moving to root folder [#111515](https://github.com/grafana/grafana/pull/111515), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
- **Dashboards:** Fix preload field not being persisted via /v1beta1 [#112475](https://github.com/grafana/grafana/pull/112475), [@ivanortegaalba](https://github.com/ivanortegaalba)
- **Flame Graph:** Use suffix for values formatted with a short formatter [#110999](https://github.com/grafana/grafana/pull/110999), [@ifrost](https://github.com/ifrost)
- **FlameGraph:** Ensure total is only counted once for recursive function calls [#111548](https://github.com/grafana/grafana/pull/111548), [@simonswine](https://github.com/simonswine)
- **FolderPermissions:** Return 404 error when folder does not exist instead of 500 [#112919](https://github.com/grafana/grafana/pull/112919), [@Jguer](https://github.com/Jguer)
- **FolderPicker:** Fix expand toggle also selecting folder [#111755](https://github.com/grafana/grafana/pull/111755), [@aocenas](https://github.com/aocenas)
- **Graphite:** Fix legacy response unmarshalling [#112968](https://github.com/grafana/grafana/pull/112968), [@aangelisc](https://github.com/aangelisc)
- **Histogram:** Properly handle sparse heatmap-cells frames [#112907](https://github.com/grafana/grafana/pull/112907), [@leeoniya](https://github.com/leeoniya)
- **LDAP Authentication:** Fix URL to propagate username context as parameter [#111723](https://github.com/grafana/grafana/pull/111723), [@bradleypettit](https://github.com/bradleypettit)
- **Node graph:** Fix context menu position after scrolling [#112374](https://github.com/grafana/grafana/pull/112374), [@adrapereira](https://github.com/adrapereira)
- **Playlist:** Fix navigation issues with emoji-titled dashboards during dual-write migration [#111659](https://github.com/grafana/grafana/pull/111659), [@axelavargas](https://github.com/axelavargas)
- **Plugin Details Page:** Fix tabs not loading on hard refresh [#112915](https://github.com/grafana/grafana/pull/112915), [@sunker](https://github.com/sunker)
- **Plugin navigation:** Fix active nav item selection when there are more than 10 items in a group [#112886](https://github.com/grafana/grafana/pull/112886), [@aocenas](https://github.com/aocenas)
- **Plugins:** Dependencies do not inherit parent URL for preinstall [#111762](https://github.com/grafana/grafana/pull/111762), [@wbrowne](https://github.com/wbrowne)
- **Plugins:** Set isProvisioned for local plugins without remote counterpart [#111268](https://github.com/grafana/grafana/pull/111268), [@oshirohugo](https://github.com/oshirohugo)
- **Prometheus:** Fix incremental querying logic for public dashboards [#111642](https://github.com/grafana/grafana/pull/111642), [@jcolladokuri](https://github.com/jcolladokuri)
- **Prometheus:** Fix parsing logic of prometheus expressions to honor the order of binary operations [#112220](https://github.com/grafana/grafana/pull/112220), [@jcolladokuri](https://github.com/jcolladokuri)
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
- **SoloPanel:** Fixes issue with solo route and scopes variable [#112769](https://github.com/grafana/grafana/pull/112769), [@torkelo](https://github.com/torkelo)
- **Stars:** Fix starred state not being updated [#111936](https://github.com/grafana/grafana/pull/111936), [@Clarity-89](https://github.com/Clarity-89)
- **Stat:** Fix math for percent change value heights when sparkline is not rendered [#112599](https://github.com/grafana/grafana/pull/112599), [@fastfrwrd](https://github.com/fastfrwrd)
- **StateTimeline:** Fix color display in tooltip [#112878](https://github.com/grafana/grafana/pull/112878), [@fastfrwrd](https://github.com/fastfrwrd)
- **Table:** Fix cell inspect for Sparkline and inferred JSON cells [#113059](https://github.com/grafana/grafana/pull/113059), [@fastfrwrd](https://github.com/fastfrwrd)
- **TextPanel:** Fix `CodeEditor` not appearing properly [#111937](https://github.com/grafana/grafana/pull/111937), [@ashharrison90](https://github.com/ashharrison90)
- **UnitPicker/Cascader:** Fixes type to search for unit feature [#112614](https://github.com/grafana/grafana/pull/112614), [@torkelo](https://github.com/torkelo)
- **VizTooltip:** Better overflow handling on long series names [#112240](https://github.com/grafana/grafana/pull/112240), [@fastfrwrd](https://github.com/fastfrwrd)
### Breaking changes
- **Faro:** Update configuration with best practices [#112108](https://github.com/grafana/grafana/pull/112108), [@joshhunt](https://github.com/joshhunt)
- **LibraryPanels:** Remove unique name constraints [#113077](https://github.com/grafana/grafana/pull/113077), [@ryantxu](https://github.com/ryantxu)
- **RBAC:** Only write action sets [#112429](https://github.com/grafana/grafana/pull/112429), [@IevaVasiljeva](https://github.com/IevaVasiljeva)
### Plugin development fixes & changes
- **Checkbox:** Improve accessibility of the `indeterminate` state [#112388](https://github.com/grafana/grafana/pull/112388), [@ashharrison90](https://github.com/ashharrison90)
- **Collapse:** Improve layout and deprecate `collapsible` prop [#113164](https://github.com/grafana/grafana/pull/113164), [@ashharrison90](https://github.com/ashharrison90)
- **Docs:** Add storybook links to components [#113102](https://github.com/grafana/grafana/pull/113102), [@samsch](https://github.com/samsch)
- **Modal:** Fix button focus being clipped [#112867](https://github.com/grafana/grafana/pull/112867), [@ashharrison90](https://github.com/ashharrison90)
- **Slider:** Expose prop to control visibility of input [#113084](https://github.com/grafana/grafana/pull/113084), [@ashharrison90](https://github.com/ashharrison90)
- **Slider:** Make `inputId` a required param and fix minor a11y violations [#112006](https://github.com/grafana/grafana/pull/112006), [@ashharrison90](https://github.com/ashharrison90)
<!-- 12.3.0 END -->
<!-- 12.1.4 START -->
# 12.1.4 (2025-11-19)
### Bug fixes
- **Alerting:** Fix unmarshalling of GettableStatus to include time intervals [#112733](https://github.com/grafana/grafana/pull/112733), [@yuri-tceretian](https://github.com/yuri-tceretian)
- **AnalyticsSummaries:** Fix dashboard rollup not resetting "last X days" metrics to zero (Enterprise)
- **AnalyticsSummaries:** Fix dashboard rollup totals resetting incorrectly (Enterprise)
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
<!-- 12.1.4 END -->
<!-- 12.0.7 START -->
# 12.0.7 (2025-11-19)
### Bug fixes
- **Alerting:** Fix unmarshalling of GettableStatus to include time intervals [#112732](https://github.com/grafana/grafana/pull/112732), [@yuri-tceretian](https://github.com/yuri-tceretian)
- **AnalyticsSummaries:** Fix dashboard rollup not resetting "last X days" metrics to zero (Enterprise)
- **AnalyticsSummaries:** Fix dashboard rollup totals resetting incorrectly (Enterprise)
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
<!-- 12.0.7 END -->
<!-- 12.2.2 START -->
# 12.2.2 (2025-11-19)
### Features and enhancements
- **Access control:** Reduce memory usage when fetching user's permissions [#113414](https://github.com/grafana/grafana/pull/113414), [@hairyhenderson](https://github.com/hairyhenderson)
- **Table:** Pill and JSON Cells should allow formatting [#113130](https://github.com/grafana/grafana/pull/113130), [@fastfrwrd](https://github.com/fastfrwrd)
### Bug fixes
- **AnalyticsSummaries:** Fix dashboard rollup not resetting "last X days" metrics to zero (Enterprise)
- **AnalyticsSummaries:** Fix dashboard rollup totals resetting incorrectly (Enterprise)
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
<!-- 12.2.2 END -->
<!-- 11.6.8 START -->
# 11.6.8 (2025-11-19)
### Bug fixes
- **Alerting:** Fix unmarshalling of GettableStatus to include time intervals [#112731](https://github.com/grafana/grafana/pull/112731), [@yuri-tceretian](https://github.com/yuri-tceretian)
- **AnalyticsSummaries:** Fix dashboard rollup not resetting "last X days" metrics to zero (Enterprise)
- **AnalyticsSummaries:** Fix dashboard rollup totals resetting incorrectly (Enterprise)
- **Seeder:** Add check in `filterRemovedPermissions` for already existing new permissions before seeding (Enterprise)
<!-- 11.6.8 END -->
<!-- 12.2.1+security-01 START -->
# 12.2.1+security-01 (2025-11-19)
### Bug fixes
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
<!-- 12.2.1+security-01 END -->
<!-- 12.1.3+security-01 START -->
# 12.1.3+security-01 (2025-11-19)
### Bug fixes
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
<!-- 12.1.3+security-01 END -->
<!-- 12.0.6+security-01 START -->
# 12.0.6+security-01 (2025-11-19)
### Bug fixes
- **Security:** fix for CVE-2025-41115 in SCIM (System for Cross-domain Identity Management) (Enterprise)
<!-- 12.0.6+security-01 END -->
<!-- 12.2.1 START -->
# 12.2.1 (2025-10-21)
### Features and enhancements
- **Go:** Update to 1.25.2 + golangci-lint v2.5.0 + golang.org/x/net v0.45.0 [#112156](https://github.com/grafana/grafana/pull/112156), [@macabu](https://github.com/macabu)
- **Go:** Update to 1.25.3 [#112361](https://github.com/grafana/grafana/pull/112361), [@macabu](https://github.com/macabu)
### Bug fixes
- **Auth:** Fix render user OAuth passthrough [#112092](https://github.com/grafana/grafana/pull/112092), [@mgyongyosi](https://github.com/mgyongyosi)
- **Dashboards:** Fix missing Ctrl+O keyboard shortcut for crosshair toggle [#111402](https://github.com/grafana/grafana/pull/111402), [@ivanortegaalba](https://github.com/ivanortegaalba)
- **Fix:** Fix redirection after login when Grafana is served from subpath [#111069](https://github.com/grafana/grafana/pull/111069), [@mgyongyosi](https://github.com/mgyongyosi)
- **FlameGraph:** Ensure total is only counted once for recursive function calls [#111606](https://github.com/grafana/grafana/pull/111606), [@simonswine](https://github.com/simonswine)
- **LDAP Authentication:** Fix URL to propagate username context as parameter [#111849](https://github.com/grafana/grafana/pull/111849), [@bradleypettit](https://github.com/bradleypettit)
- **Plugins:** Dependencies do not inherit parent URL for preinstall [#111769](https://github.com/grafana/grafana/pull/111769), [@wbrowne](https://github.com/wbrowne)
- **Table:** Backport the Safari 26 fixes to 12.2.1 [#111906](https://github.com/grafana/grafana/pull/111906), [@fastfrwrd](https://github.com/fastfrwrd)
<!-- 12.2.1 END -->
<!-- 12.1.3 START -->
# 12.1.3 (2025-10-21)
### Features and enhancements
- **Go:** Update to 1.25.2 + golangci-lint v2.5.0 + golang.org/x/net v0.45.0 [#112159](https://github.com/grafana/grafana/pull/112159), [@macabu](https://github.com/macabu)
- **Go:** Update to 1.25.3 [#112362](https://github.com/grafana/grafana/pull/112362), [@macabu](https://github.com/macabu)
- **Table:** Avoid thrown error due to internal React issue [#111945](https://github.com/grafana/grafana/pull/111945), [@fastfrwrd](https://github.com/fastfrwrd)
### Bug fixes
- **Auth:** Fix render user OAuth passthrough [#112097](https://github.com/grafana/grafana/pull/112097), [@mgyongyosi](https://github.com/mgyongyosi)
- **FlameGraph:** Ensure total is only counted once for recursive function calls [#111605](https://github.com/grafana/grafana/pull/111605), [@simonswine](https://github.com/simonswine)
- **LDAP Authentication:** Fix URL to propagate username context as parameter [#111848](https://github.com/grafana/grafana/pull/111848), [@bradleypettit](https://github.com/bradleypettit)
- **Plugins:** Dependencies do not inherit parent URL for preinstall [#111767](https://github.com/grafana/grafana/pull/111767), [@wbrowne](https://github.com/wbrowne)
<!-- 12.1.3 END -->
<!-- 12.0.6 START -->
# 12.0.6 (2025-10-21)
### Features and enhancements
- **Go:** Update to 1.25.2 + golangci-lint v2.5.0 + golang.org/x/net v0.45.0 [#112161](https://github.com/grafana/grafana/pull/112161), [@macabu](https://github.com/macabu)
- **Go:** Update to 1.25.3 [#112364](https://github.com/grafana/grafana/pull/112364), [@macabu](https://github.com/macabu)
### Bug fixes
- **Auth:** Fix render user OAuth passthrough [#112096](https://github.com/grafana/grafana/pull/112096), [@mgyongyosi](https://github.com/mgyongyosi)
- **FlameGraph:** Ensure total is only counted once for recursive function calls [#111604](https://github.com/grafana/grafana/pull/111604), [@simonswine](https://github.com/simonswine)
- **LDAP Authentication:** Fix URL to propagate username context as parameter [#111847](https://github.com/grafana/grafana/pull/111847), [@bradleypettit](https://github.com/bradleypettit)
- **Plugins:** Dependencies do not inherit parent URL for preinstall [#111766](https://github.com/grafana/grafana/pull/111766), [@wbrowne](https://github.com/wbrowne)
<!-- 12.0.6 END -->
<!-- 11.6.7 START -->
# 11.6.7 (2025-10-21)
### Features and enhancements
- **Analytics:** Apply proper batching to Loki exports and add configurable settings (Enterprise)
- **Go:** Update to 1.25.2 + golangci-lint v2.5.0 + golang.org/x/net v0.45.0 [#112162](https://github.com/grafana/grafana/pull/112162), [@grambbledook](https://github.com/grambbledook)
- **Go:** Update to 1.25.3 [#112365](https://github.com/grafana/grafana/pull/112365), [@macabu](https://github.com/macabu)
### Bug fixes
- **Auth:** Fix render user OAuth passthrough [#112094](https://github.com/grafana/grafana/pull/112094), [@mgyongyosi](https://github.com/mgyongyosi)
- **LDAP Authentication:** Fix URL to propagate username context as parameter [#111846](https://github.com/grafana/grafana/pull/111846), [@bradleypettit](https://github.com/bradleypettit)
- **Plugins:** Dependencies do not inherit parent URL for preinstall [#111801](https://github.com/grafana/grafana/pull/111801), [@wbrowne](https://github.com/wbrowne)
- **URLParams:** Stringify true values as key=true always (fixes issues with variables with true value) [#112045](https://github.com/grafana/grafana/pull/112045), [@torkelo](https://github.com/torkelo)
<!-- 11.6.7 END -->
<!-- 11.5.10 START -->
# 11.5.10 (2025-10-21)
### Features and enhancements
- **Go:** Update to 1.25.2 + golangci-lint v2.5.0 + golang.org/x/net v0.45.0 [#112163](https://github.com/grafana/grafana/pull/112163), [@macabu](https://github.com/macabu)
- **Go:** Update to 1.25.3 [#112366](https://github.com/grafana/grafana/pull/112366), [@macabu](https://github.com/macabu)
### Bug fixes
- **Auth:** Fix render user OAuth passthrough [#112093](https://github.com/grafana/grafana/pull/112093), [@mgyongyosi](https://github.com/mgyongyosi)
- **LDAP Authentication:** Fix URL to propagate username context as parameter [#111845](https://github.com/grafana/grafana/pull/111845), [@bradleypettit](https://github.com/bradleypettit)
- **Plugins:** Dependencies do not inherit parent URL for preinstall [#111802](https://github.com/grafana/grafana/pull/111802), [@wbrowne](https://github.com/wbrowne)
<!-- 11.5.10 END -->
<!-- 12.2.0 START -->
# 12.2.0 (2025-09-23)

View File

@@ -2,51 +2,84 @@
Thank you for your interest in contributing to Grafana! We welcome all people who want to contribute in a healthy and constructive manner within our community. To help us create a safe and positive community experience for all, we require all participants to adhere to the [Code of Conduct](CODE_OF_CONDUCT.md).
This document is a guide to help you through the process of contributing to Grafana. Be sure to check out the [Grafana Champions program](https://grafana.com/community/champions/?src=github&camp=community-cross-platform-engagement) as you start to contribute- its designed to recognize and empower individuals who are actively contributing to the growth and success of the Grafana ecosystem.
This document is a guide to help you through the process of contributing to Grafana. Be sure to check out the [Grafana Champions program](https://grafana.com/community/champions/?src=github&camp=community-cross-platform-engagement) as you start to contribute. It's designed to recognize and empower individuals who are actively contributing to the growth and success of the Grafana ecosystem.
Whether you're a new contributer or a seasoned veteran we hope these resources help you connect with the community:
> **Help us improve!** We'd love to hear about your contributor experience. Take a moment to share your feedback in our [Open Source Contributor Experience Survey](https://gra.fan/ome). Your input helps us make contributing to Grafana better for everyone.
Interact and be heard:
Whether you're a new contributor or a seasoned veteran, we hope these resources help you connect with the community.
- Forums: Do you have a problem, question, or curiosity? Visit our [forums](https://gra.fan/fromgithubtoforums) for a reservoir of knowledge- submit your own questions and answers!
- Meetups: Craving in-person connections without the long journeys? [Join your local Grafana & Friends meetup group](https://gra.fan/githubtomeetup)!
- Community Slack: Eager for real-time connections with fellow users? Begin a conversation on [Slack](https://gra.fan/githubtoslack).
Learn:
- YouTube: From getting started to exploring newer projects like Pyroscope and Beyla, the [Grafana YouTube channel](https://gra.fan/githubtoyoutube) has what you need to get started!
- Meetups: Join a [group near you](https://gra.fan/githubtomeetup) to learn from local experts and ask questions in real time.
Share your story:
- Meetups and blogs: Wed love to feature your OSS Grafana Labs use case or story at an upcoming Grafana & Friends meetup or on the Grafana blog! Submit your idea [here](https://gra.fan/githubtocca) and well connect with you on next steps if accepted.
#### Interact and be heard
- **Forums:** Do you have a problem, question, or curiosity? Visit our [forums](https://gra.fan/fromgithubtoforums) for a reservoir of knowledge, submit your own questions and answers!
- **Meetups:** Craving in-person connections without the long journeys? [Join your local Grafana & Friends meetup group](https://gra.fan/githubtomeetup)!
- **Community Slack:** Eager for real-time connections with fellow users? Begin a conversation on [Slack](https://gra.fan/githubtoslack).
#### Learn
- **YouTube:** From getting started to exploring newer projects like Pyroscope and Beyla, the [Grafana YouTube channel](https://gra.fan/githubtoyoutube) has what you need to get started!
- **Meetups:** Join a [group near you](https://gra.fan/githubtomeetup) to learn from local experts and ask questions in real time.
#### Make technical contributions
- You can make technical contributions with or without code. Scroll down to see how!
#### Share your story
- **Meetups and blogs:** Wed love to feature your OSS Grafana Labs use case or story at an upcoming Grafana & Friends meetup or on the Grafana blog! Submit your idea [here](https://gra.fan/githubtocca), and well connect with you on next steps if accepted.
## Choose the right channel
Use the right place to ask questions, report problems, and propose changes.
- **[GitHub issues](https://github.com/grafana/grafana/issues) and [pull requests](https://github.com/grafana/grafana/pulls)**: Use for reproducible bugs in core Grafana and maintained plugins, small and actionable feature requests, and code or docs changes via pull requests. Avoid general “how do I” questions. For security issues, follow the [security policy](https://github.com/grafana/grafana/security/policy).
- **Grafana community forums**: Use for questions, troubleshooting, best practices, plugin development Q&A, and early idea discussion. Forums create a searchable public knowledge base that helps others with the same problems and questions. Start here if you are unsure: [Grafana community forums](https://community.grafana.com/).
- **Grafana Community Slack**: Use for quick, time-sensitive chats and networking. Do not rely on Slack for complex troubleshooting or decisions. Share outcomes back to a forum topic or GitHub issue/PR to keep a public record: [Grafana Community Slack](https://slack.grafana.com).
- **Not sure where to start?** Start with a forum topic. Maintainers and community members will redirect you if a GitHub issue or pull request is more appropriate.
## Make technical contributions
We welcome your technical contributions! Here are some examples:
We welcome your technical contributions! You can contribute in several ways:
- Contribute to the Grafana codebase- check out these [help-wanted issues](<(https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22)>)
- Develop community [plugins](https://grafana.com/developers/plugin-tools)
- Report [bugs](https://github.com/grafana/grafana/issues/new?template=0-bug-report.yaml)
- [Triage issues](https://github.com/grafana/grafana/blob/4414b92e93440cc9ed0f281989ee71dc16216a15/contribute/triage-issues.md)
- Report [security vulnerabilities](https://github.com/grafana/grafana/security/policy)
- Submit a [feature request](https://github.com/grafana/grafana/issues/new?template=1-feature_requests.md)
- Write [technical documentation](https://github.com/grafana/grafana/blob/4414b92e93440cc9ed0f281989ee71dc16216a15/contribute/documentation/README.md)
### Contribute Code to Grafana
**Please note:** We do not currently accept contributions for translations. Please do not submit pull requests translating grafana.json files - they will be rejected. We do accept contributions to mark up phrases for translation. See [Internationalization](contribute/internationalization.md).
**What you will need:**
### Your first contribution
- Follow our [developer guide](contribute/developer-guide.md) to set up your environment.
- Adhere to our [frontend](contribute/style-guides/frontend.md) and [backend](contribute/backend/style-guide.md) style guides.
- Write or update tests ([testing guide](contribute/style-guides/testing.md)).
Unsure where to begin contributing to Grafana? Start by browsing issues labeled `beginner friendly` or `help wanted`.
**Step-by-step:**
- [Beginner-friendly](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22) issues are generally straightforward to complete.
- [Help wanted](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) issues are problems we would like the community to help us with regardless of complexity.
1. Browse all [issues](https://github.com/grafana/grafana/issues) to find something to work on. You can also filter by [help wanted](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22).
1. Prepare a clear, descriptive pull request ([how-to guide](contribute/create-pull-request.md)).
1. Ensure you include and run the appropriate tests as part of your pull request.
1. Commit and push your changes. If you encounter merge conflicts, you may rebase your branch onto the main branch.
If you're looking to make a code change, see how to set up your environment for [local development](contribute/developer-guide.md).
### Develop a Plugin
When you're ready to contribute, it's time to [create a pull request](/contribute/create-pull-request.md).
Grafana plugins let you extend the platform with new data sources, panels, and more. This is a great way to share your ideas and make a real impact on the Grafana ecosystem.
### Develop a plugin
**Step-by-step:**
Developing a Grafana plugin is a fantastic way to share your unique ideas with the community, extend the platforms capabilities, and make a real impact on how people visualize and understand their data. Check out our guide to creating [plugins](https://grafana.com/developers/plugin-tools)
1. Read the [plugin development guide](https://grafana.com/developers/plugin-tools) to choose your plugin type and set up your environment.
2. Scaffold your plugin using the recommended tools.
3. Develop and test your plugin locally.
4. Follow best practices for code style, testing, and documentation.
5. Publish your plugin or submit it for review as described in the guide.
### Report bugs
### Contribute without code
You can help even if you don't write code:
- Report a bug with the [bug report template](https://github.com/grafana/grafana/issues/new?template=0-bug-report.yaml) and include steps to reproduce.
- Submit a [feature request](https://github.com/grafana/grafana/issues/new?template=1-feature_requests.md) to propose improvements.
- Improve our docs with the [documentation contribution guide](https://github.com/grafana/grafana/blob/main/contribute/documentation).
- Help with [issue triage](https://github.com/grafana/grafana/blob/main/contribute/triage-issues.md) by reviewing, labeling, and clarifying open issues.
- Report security vulnerabilities following our [security policy](https://github.com/grafana/grafana/security/policy).
**Please note:** We do not currently accept contributions for translations. Please do not submit pull requests translating `grafana.json` files - they will be rejected. We do accept contributions to mark up phrases for translation. See [Internationalization](contribute/internationalization.md).
#### Reporting issues
Before submitting a new issue, try to make sure someone hasn't already reported the problem. Look through the [existing issues](https://github.com/grafana/grafana/issues) for similar issues.
@@ -59,11 +92,11 @@ For data visualization issues:
- Query results from the inspect drawer (data tab & query inspector)
- Panel settings can be extracted in the panel inspect drawer JSON tab
For a dashboard related issues:
For dashboard related issues:
- Dashboard JSON can be found in the dashboard settings JSON model view
- Dashboard JSON can be found in the dashboard settings JSON model view. You can [send the panel JSON model](https://grafana.com/docs/grafana/latest/troubleshooting/send-panel-to-grafana-support/) to Grafana Labs Technical Support and request help with troubleshooting your issue.
For authentication and alerting Grafana server logs are useful.
For authentication and alerting, Grafana server logs are useful.
### Triage issues
@@ -75,7 +108,7 @@ Read more about the ways you can [Triage issues](/contribute/triage-issues.md).
If you believe you've found a security vulnerability, please read our [security policy](https://github.com/grafana/grafana/security/policy) for more details on reporting.
### Suggest enhancements
### Suggest features
If you have an idea of how to improve Grafana, submit a [feature request](https://github.com/grafana/grafana/issues/new?template=1-feature_requests.md).

View File

@@ -17,7 +17,7 @@ ARG JS_SRC=js-builder
FROM alpine:3.22.2 AS alpine-base
FROM ubuntu:22.04 AS ubuntu-base
FROM golang:1.25.3-alpine AS go-builder-base
FROM --platform=${JS_PLATFORM} node:22-alpine AS js-builder-base
FROM --platform=${JS_PLATFORM} node:24-alpine AS js-builder-base
# Javascript build stage
FROM --platform=${JS_PLATFORM} ${JS_IMAGE} AS js-builder
ARG JS_NODE_ENV=production
@@ -95,16 +95,18 @@ COPY pkg/aggregator pkg/aggregator
COPY apps/playlist apps/playlist
COPY apps/plugins apps/plugins
COPY apps/shorturl apps/shorturl
COPY apps/annotation apps/annotation
COPY apps/correlations apps/correlations
COPY apps/preferences apps/preferences
COPY apps/collections apps/collections
COPY apps/provisioning apps/provisioning
COPY apps/secret apps/secret
COPY apps/scope apps/scope
COPY apps/investigations apps/investigations
COPY apps/logsdrilldown apps/logsdrilldown
COPY apps/advisor apps/advisor
COPY apps/dashboard apps/dashboard
COPY apps/folder apps/folder
COPY apps/preferences apps/preferences
COPY apps/iam apps/iam
COPY apps apps
COPY kindsv2 kindsv2
@@ -113,6 +115,7 @@ COPY apps/alerting/notifications apps/alerting/notifications
COPY apps/alerting/rules apps/alerting/rules
COPY pkg/codegen pkg/codegen
COPY pkg/plugins/codegen pkg/plugins/codegen
COPY apps/example apps/example
RUN go mod download

View File

@@ -135,14 +135,14 @@ i18n-extract-enterprise:
@echo "Skipping i18n extract for Enterprise: not enabled"
else
i18n-extract-enterprise:
@echo "Extracting i18n strings for Enterprise"
yarn run i18next --config public/locales/i18next-parser-enterprise.config.cjs
@echo "Extracting i18n strings for Enterprise"
cd public/locales/enterprise && yarn run i18next-cli extract --sync-primary
endif
.PHONY: i18n-extract
i18n-extract: i18n-extract-enterprise
@echo "Extracting i18n strings for OSS"
yarn run i18next --config public/locales/i18next-parser.config.cjs
yarn run i18next-cli extract --sync-primary
@echo "Extracting i18n strings for packages"
yarn run packages:i18n-extract
@echo "Extracting i18n strings for plugins"
@@ -178,7 +178,7 @@ gen-apps: do-gen-apps gofmt ## Generate code for Grafana App SDK apps and run go
@if [ -n "$$CODEGEN_VERIFY" ]; then \
echo "Verifying generated code is up to date..."; \
if ! git diff --quiet; then \
echo "Error: Generated apps code is not up to date. Please run 'make gen-apps' to regenerate."; \
echo "Error: Generated code is not up to date. Please run 'make gen-apps', 'make gen-cue', and 'make gen-jsonnet' to regenerate."; \
git diff --name-only; \
exit 1; \
fi; \

View File

@@ -4,7 +4,6 @@
The open-source platform for monitoring and observability
[![License](https://img.shields.io/github/license/grafana/grafana)](LICENSE)
[![Drone](https://drone.grafana.net/api/badges/grafana/grafana/status.svg)](https://drone.grafana.net/grafana/grafana)
[![Go Report Card](https://goreportcard.com/badge/github.com/grafana/grafana)](https://goreportcard.com/report/github.com/grafana/grafana)
Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture:
@@ -36,6 +35,8 @@ If you're interested in contributing to the Grafana project:
- Explore our [beginner-friendly issues](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3A%22beginner+friendly%22).
- Look through our [style guide and Storybook](https://developers.grafana.com/ui/latest/index.html).
> Share your contributor experience in our [feedback survey](https://gra.fan/ome) to help us improve.
## Get involved
- Follow [@grafana on X (formerly Twitter)](https://x.com/grafana/).

View File

@@ -1,5 +1,34 @@
include ../sdk.mk
.PHONY: generate
.PHONY: etcd
etcd:
@docker run -d --name etcd --env ALLOW_NONE_AUTHENTICATION=yes -p 22379:2379 bitnamilegacy/etcd:latest
.PHONY: generate # Run Grafana App SDK code generation
generate: install-app-sdk update-app-sdk
@$(APP_SDK_BIN) generate -g ./pkg/apis --grouping=group --postprocess --defencoding=none --useoldmanifestkinds
@$(APP_SDK_BIN) generate \
--source=./kinds/ \
--gogenpath=./pkg/apis \
--grouping=group \
--defencoding=none
.PHONY: run
run:
@go run ./pkg/standalone/server.go --etcd-servers=http://127.0.0.1:22379 --secure-port 7445
.PHONY: create-checks
create-checks:
@echo "Creating plugin check..."
@curl -k -X POST https://localhost:7445/apis/advisor.grafana.app/v0alpha1/namespaces/stacks-1/checks \
-H "Content-Type: application/json" \
-d '{"kind":"Check","apiVersion":"advisor.grafana.app/v0alpha1","spec":{"data":{}},"metadata":{"generateName":"check-","labels":{"advisor.grafana.app/type":"plugin"},"namespace":"stacks-1"},"status":{"report":{"count":0,"failures":[]}}}' \
&& echo "Plugin check created successfully"
@echo "Creating datasource check..."
@curl -k -X POST https://localhost:7445/apis/advisor.grafana.app/v0alpha1/namespaces/stacks-1/checks \
-H "Content-Type: application/json" \
-d '{"kind":"Check","apiVersion":"advisor.grafana.app/v0alpha1","spec":{"data":{}},"metadata":{"generateName":"check-","labels":{"advisor.grafana.app/type":"datasource"},"namespace":"stacks-1"},"status":{"report":{"count":0,"failures":[]}}}' \
&& echo "Datasource check created successfully"
delete-checks:
@curl -k -X DELETE https://localhost:7445/apis/advisor.grafana.app/v0alpha1/namespaces/stacks-1/checks \
&& echo "All checks deleted successfully"

View File

@@ -4,34 +4,53 @@ go 1.25.3
require (
github.com/Masterminds/semver/v3 v3.4.0
github.com/google/go-cmp v0.7.0
github.com/google/go-github/v70 v70.0.0
github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43
github.com/grafana/authlib/types v0.0.0-20251119142549-be091cf2f4d4
github.com/grafana/grafana v0.0.0-00010101000000-000000000000
github.com/grafana/grafana-app-sdk v0.40.2
github.com/grafana/grafana-app-sdk/logging v0.40.2
github.com/grafana/grafana-plugin-sdk-go v0.278.0
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250804150913-990f1c69ecc2
github.com/stretchr/testify v1.10.0
k8s.io/apimachinery v0.33.3
k8s.io/apiserver v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
github.com/grafana/grafana-app-sdk v0.48.2
github.com/grafana/grafana-app-sdk/logging v0.48.1
github.com/grafana/grafana-plugin-sdk-go v0.283.0
github.com/grafana/grafana/pkg/apimachinery v0.0.0
github.com/stretchr/testify v1.11.1
k8s.io/apimachinery v0.34.2
k8s.io/apiserver v0.34.2
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912
)
// transitive dependencies that need replaced
// TODO: stop depending on grafana core
replace github.com/grafana/grafana => ../..
replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6
replace github.com/grafana/grafana/apps/provisioning => ../provisioning
replace github.com/grafana/grafana/pkg/apimachinery => ../../pkg/apimachinery
replace github.com/grafana/grafana/pkg/apiserver => ../../pkg/apiserver
replace github.com/grafana/grafana/apps/dashboard => ../dashboard
replace github.com/grafana/grafana/pkg/aggregator => ../../pkg/aggregator
replace github.com/grafana/grafana/apps/folder => ../folder
replace github.com/grafana/grafana/apps/secret => ../secret
replace github.com/grafana/grafana/apps/iam => ../iam
replace github.com/grafana/grafana/apps/plugins => ../plugins
replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250911094103-5456b6e45604
require (
cloud.google.com/go/compute/metadata v0.7.0 // indirect
dario.cat/mergo v1.0.2 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.12.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver v1.5.0 // indirect
@@ -40,19 +59,19 @@ require (
github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f // indirect
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/apache/arrow-go/v18 v18.3.0 // indirect
github.com/apache/arrow-go/v18 v18.4.1 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/at-wat/mqtt-go v0.19.4 // indirect
github.com/at-wat/mqtt-go v0.19.6 // indirect
github.com/aws/aws-sdk-go v1.55.7 // indirect
github.com/aws/aws-sdk-go-v2 v1.36.5 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect
github.com/aws/smithy-go v1.22.4 // indirect
github.com/aws/aws-sdk-go-v2 v1.39.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.18.14 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.8 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.8 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.8 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.38.5 // indirect
github.com/aws/smithy-go v1.23.1 // indirect
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df // indirect
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
@@ -62,13 +81,11 @@ require (
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
github.com/bwmarrin/snowflake v0.3.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cheekybits/genny v1.0.0 // indirect
github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/diegoholiveira/jsonlogic/v3 v3.7.4 // indirect
@@ -78,102 +95,106 @@ require (
github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad // indirect
github.com/dolthub/go-mysql-server v0.19.1-0.20250410182021-5632d67cd46e // indirect
github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 // indirect
github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4 // indirect
github.com/dolthub/vitess v0.0.0-20250930230441-70c2c6a98e33 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/elazarl/goproxy v1.7.2 // indirect
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/gchaincl/sqlhooks v1.3.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
github.com/getkin/kin-openapi v0.133.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
github.com/go-jose/go-jose/v3 v3.0.4 // indirect
github.com/go-jose/go-jose/v4 v4.1.2 // indirect
github.com/go-kit/log v0.2.1 // indirect
github.com/go-ldap/ldap/v3 v3.4.4 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
github.com/go-logfmt/logfmt v0.6.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.23.0 // indirect
github.com/go-openapi/errors v0.22.0 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/loads v0.22.0 // indirect
github.com/go-openapi/analysis v0.24.0 // indirect
github.com/go-openapi/errors v0.22.3 // indirect
github.com/go-openapi/jsonpointer v0.22.1 // indirect
github.com/go-openapi/jsonreference v0.21.2 // indirect
github.com/go-openapi/loads v0.23.1 // indirect
github.com/go-openapi/runtime v0.28.0 // indirect
github.com/go-openapi/spec v0.21.0 // indirect
github.com/go-openapi/strfmt v0.23.0 // indirect
github.com/go-openapi/spec v0.22.0 // indirect
github.com/go-openapi/strfmt v0.24.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-openapi/validate v0.24.0 // indirect
github.com/go-redis/redis/v8 v8.11.5 // indirect
github.com/go-openapi/swag/conv v0.25.1 // indirect
github.com/go-openapi/swag/fileutils v0.25.1 // indirect
github.com/go-openapi/swag/jsonname v0.25.1 // indirect
github.com/go-openapi/swag/jsonutils v0.25.1 // indirect
github.com/go-openapi/swag/loading v0.25.1 // indirect
github.com/go-openapi/swag/mangling v0.25.1 // indirect
github.com/go-openapi/swag/stringutils v0.25.1 // indirect
github.com/go-openapi/swag/typeutils v0.25.1 // indirect
github.com/go-openapi/swag/yamlutils v0.25.1 // indirect
github.com/go-openapi/validate v0.25.0 // indirect
github.com/go-sql-driver/mysql v1.9.3 // indirect
github.com/go-stack/stack v1.8.1 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/gofrs/uuid v4.4.0+incompatible // indirect
github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang-jwt/jwt/v5 v5.2.3 // indirect
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/golang-migrate/migrate/v4 v4.7.0 // indirect
github.com/golang/mock v1.7.0-rc.1 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/google/flatbuffers v25.2.10+incompatible // indirect
github.com/google/gnostic-models v0.6.9 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/google/wire v0.6.0 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/grafana/alerting v0.0.0-20250729175202-b4b881b7b263 // indirect
github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 // indirect
github.com/google/wire v0.7.0 // indirect
github.com/grafana/alerting v0.0.0-20251119204204-77fa75125181 // indirect
github.com/grafana/authlib v0.0.0-20250930082137-a40e2c2b094f // indirect
github.com/grafana/dataplane/sdata v0.0.9 // indirect
github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914 // indirect
github.com/grafana/grafana-aws-sdk v1.1.0 // indirect
github.com/grafana/grafana-azure-sdk-go/v2 v2.2.0 // indirect
github.com/grafana/grafana/apps/provisioning v0.0.0-20250804150913-990f1c69ecc2 // indirect
github.com/grafana/grafana/pkg/apiserver v0.0.0-20250804150913-990f1c69ecc2 // indirect
github.com/grafana/dskit v0.0.0-20250908063411-6b6da59b5cc4 // indirect
github.com/grafana/grafana-aws-sdk v1.3.0 // indirect
github.com/grafana/grafana-azure-sdk-go/v2 v2.3.1 // indirect
github.com/grafana/grafana/apps/plugins v0.0.0 // indirect
github.com/grafana/grafana/apps/provisioning v0.0.0 // indirect
github.com/grafana/grafana/pkg/apiserver v0.0.0 // indirect
github.com/grafana/otel-profiling-go v0.5.1 // indirect
github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect
github.com/grafana/sqlds/v4 v4.2.4 // indirect
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
github.com/grafana/sqlds/v4 v4.2.7 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/go-metrics v0.5.4 // indirect
github.com/hashicorp/go-msgpack/v2 v2.1.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-plugin v1.6.3 // indirect
github.com/hashicorp/go-plugin v1.7.0 // indirect
github.com/hashicorp/go-sockaddr v1.0.7 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/memberlist v0.5.2 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect
github.com/hashicorp/yamux v0.1.2 // indirect
github.com/huandu/xstrings v1.5.0 // indirect
github.com/jaegertracing/jaeger-idl v0.5.0 // indirect
github.com/jessevdk/go-flags v1.6.1 // indirect
github.com/jmespath-community/go-jmespath v1.1.1 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jmoiron/sqlx v1.3.5 // indirect
github.com/jmoiron/sqlx v1.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/magefile/mage v1.15.0 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattetti/filebuffer v1.0.1 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/mattn/go-sqlite3 v1.14.32 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/mdlayher/vsock v1.2.1 // indirect
@@ -188,7 +209,7 @@ require (
github.com/mithrandie/go-text v1.6.0 // indirect
github.com/mithrandie/ternary v1.1.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
@@ -199,9 +220,9 @@ require (
github.com/oklog/run v1.1.0 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/open-feature/go-sdk v1.14.1 // indirect
github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3 // indirect
github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5 // indirect
github.com/open-feature/go-sdk v1.16.0 // indirect
github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.6 // indirect
github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.6 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
github.com/pierrec/lz4/v4 v4.1.22 // indirect
@@ -209,41 +230,38 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/alertmanager v0.28.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/common v0.67.3 // indirect
github.com/prometheus/common/sigv4 v0.1.0 // indirect
github.com/prometheus/exporter-toolkit v0.14.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
github.com/redis/go-redis/v9 v9.14.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rs/cors v1.11.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 // indirect
github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.7 // indirect
github.com/spf13/cast v1.10.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/tetratelabs/wazero v1.8.2 // indirect
github.com/thomaspoignant/go-feature-flag v1.42.0 // indirect
github.com/tjhop/slog-gokit v0.1.3 // indirect
github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect
github.com/unknwon/com v1.0.1 // indirect
github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect
github.com/urfave/cli v1.22.16 // indirect
github.com/tjhop/slog-gokit v0.1.5 // indirect
github.com/woodsbury/decimal128 v1.3.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
go.mongodb.org/mongo-driver v1.17.3 // indirect
go.mongodb.org/mongo-driver v1.17.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // indirect
go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.38.0 // indirect
go.opentelemetry.io/contrib/samplers/jaegerremote v0.32.0 // indirect
go.opentelemetry.io/otel v1.38.0 // indirect
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
@@ -252,48 +270,51 @@ require (
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/term v0.33.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.35.0 // indirect
go.uber.org/mock v0.6.0 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.44.0 // indirect
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 // indirect
golang.org/x/mod v0.30.0 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/oauth2 v0.33.0 // indirect
golang.org/x/sync v0.18.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect
golang.org/x/term v0.37.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/time v0.14.0 // indirect
golang.org/x/tools v0.39.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
gonum.org/v1/gonum v0.16.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.74.2 // indirect
google.golang.org/protobuf v1.36.6 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797 // indirect
google.golang.org/grpc v1.76.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/mail.v2 v2.3.1 // indirect
gopkg.in/src-d/go-errors.v1 v1.0.0 // indirect
gopkg.in/telebot.v3 v3.2.1 // indirect
gopkg.in/telebot.v3 v3.3.8 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.33.3 // indirect
k8s.io/apiextensions-apiserver v0.33.3 // indirect
k8s.io/client-go v0.33.3 // indirect
k8s.io/component-base v0.33.3 // indirect
k8s.io/api v0.34.2 // indirect
k8s.io/apiextensions-apiserver v0.34.2 // indirect
k8s.io/client-go v0.34.2 // indirect
k8s.io/component-base v0.34.2 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
modernc.org/libc v1.65.0 // indirect
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect
modernc.org/libc v1.66.10 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.10.0 // indirect
modernc.org/sqlite v1.38.0 // indirect
modernc.org/memory v1.11.0 // indirect
modernc.org/sqlite v1.39.1 // indirect
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/yaml v1.5.0 // indirect
xorm.io/builder v0.3.6 // indirect
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
sigs.k8s.io/yaml v1.6.0 // indirect
xorm.io/builder v0.3.13 // indirect
)

File diff suppressed because it is too large Load Diff

View File

@@ -1,57 +1,49 @@
package advisor
check: {
kind: "Check"
pluralName: "Checks"
current: "v0alpha1"
checkv0alpha1: {
kind: "Check"
plural: "checks"
scope: "Namespaced"
validation: {
operations: [
"CREATE",
"UPDATE",
]
}
versions: {
"v0alpha1": {
codegen: {
ts: {enabled: false}
go: {enabled: true}
}
schema: {
#Data: {
// Generic data input that a check can receive
data?: [string]: string
}
#ErrorLink: {
// URL to a page with more information about the error
url: string
// Human readable error message
message: string
}
#ReportFailure: {
// Severity of the failure
severity: "high" | "low"
// Step ID that the failure is associated with
stepID: string
// Human readable identifier of the item that failed
item: string
// ID of the item that failed
itemID: string
// Links to actions that can be taken to resolve the failure
links: [...#ErrorLink]
// More information about the failure, not meant to be displayed to the user. Used for LLM suggestions.
moreInfo?: string
}
#Report: {
// Number of elements analyzed
count: int
// List of failures
failures: [...#ReportFailure]
}
spec: #Data
status: {
report: #Report
}
}
schema: {
#Data: {
// Generic data input that a check can receive
data?: [string]: string
}
#ErrorLink: {
// URL to a page with more information about the error
url: string
// Human readable error message
message: string
}
#ReportFailure: {
// Severity of the failure
severity: "high" | "low"
// Step ID that the failure is associated with
stepID: string
// Human readable identifier of the item that failed
item: string
// ID of the item that failed
itemID: string
// Links to actions that can be taken to resolve the failure
links: [...#ErrorLink]
// More information about the failure, not meant to be displayed to the user. Used for LLM suggestions.
moreInfo?: string
}
#Report: {
// Number of elements analyzed
count: int
// List of failures
failures: [...#ReportFailure]
}
spec: #Data
status: {
report: #Report
}
}
}

View File

@@ -1,27 +1,19 @@
package advisor
checktype: {
kind: "CheckType"
pluralName: "CheckTypes"
current: "v0alpha1"
versions: {
"v0alpha1": {
codegen: {
ts: {enabled: false}
go: {enabled: true}
}
schema: {
#Step: {
title: string
description: string
stepID: string
resolution: string
}
spec: {
name: string
steps: [...#Step]
}
}
checktypev0alpha1: {
kind: "CheckType"
plural: "checktypes"
scope: "Namespaced"
schema: {
#Step: {
title: string
description: string
stepID: string
resolution: string
}
spec: {
name: string
steps: [...#Step]
}
}
}

View File

@@ -1,10 +1,29 @@
package advisor
manifest: {
appName: "advisor"
groupOverride: "advisor.grafana.app"
kinds: [
check,
checktype,
]
appName: "advisor"
groupOverride: "advisor.grafana.app"
versions: {
"v0alpha1": {
codegen: {
ts: {enabled: false}
go: {enabled: true}
}
kinds: [
checkv0alpha1,
checktypev0alpha1,
]
routes: {
namespaced: {
"/register": {
"POST": {
response: {
message: string
}
}
}
}
}
}
}
}

View File

@@ -0,0 +1,99 @@
package v0alpha1
import (
"context"
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type CheckClient struct {
client *resource.TypedClient[*Check, *CheckList]
}
func NewCheckClient(client resource.Client) *CheckClient {
return &CheckClient{
client: resource.NewTypedClient[*Check, *CheckList](client, CheckKind()),
}
}
func NewCheckClientFromGenerator(generator resource.ClientGenerator) (*CheckClient, error) {
c, err := generator.ClientFor(CheckKind())
if err != nil {
return nil, err
}
return NewCheckClient(c), nil
}
func (c *CheckClient) Get(ctx context.Context, identifier resource.Identifier) (*Check, error) {
return c.client.Get(ctx, identifier)
}
func (c *CheckClient) List(ctx context.Context, namespace string, opts resource.ListOptions) (*CheckList, error) {
return c.client.List(ctx, namespace, opts)
}
func (c *CheckClient) ListAll(ctx context.Context, namespace string, opts resource.ListOptions) (*CheckList, error) {
resp, err := c.client.List(ctx, namespace, resource.ListOptions{
ResourceVersion: opts.ResourceVersion,
Limit: opts.Limit,
LabelFilters: opts.LabelFilters,
FieldSelectors: opts.FieldSelectors,
})
if err != nil {
return nil, err
}
for resp.GetContinue() != "" {
page, err := c.client.List(ctx, namespace, resource.ListOptions{
Continue: resp.GetContinue(),
ResourceVersion: opts.ResourceVersion,
Limit: opts.Limit,
LabelFilters: opts.LabelFilters,
FieldSelectors: opts.FieldSelectors,
})
if err != nil {
return nil, err
}
resp.SetContinue(page.GetContinue())
resp.SetResourceVersion(page.GetResourceVersion())
resp.SetItems(append(resp.GetItems(), page.GetItems()...))
}
return resp, nil
}
func (c *CheckClient) Create(ctx context.Context, obj *Check, opts resource.CreateOptions) (*Check, error) {
// Make sure apiVersion and kind are set
obj.APIVersion = GroupVersion.Identifier()
obj.Kind = CheckKind().Kind()
return c.client.Create(ctx, obj, opts)
}
func (c *CheckClient) Update(ctx context.Context, obj *Check, opts resource.UpdateOptions) (*Check, error) {
return c.client.Update(ctx, obj, opts)
}
func (c *CheckClient) Patch(ctx context.Context, identifier resource.Identifier, req resource.PatchRequest, opts resource.PatchOptions) (*Check, error) {
return c.client.Patch(ctx, identifier, req, opts)
}
func (c *CheckClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus CheckStatus, opts resource.UpdateOptions) (*Check, error) {
return c.client.Update(ctx, &Check{
TypeMeta: metav1.TypeMeta{
Kind: CheckKind().Kind(),
APIVersion: GroupVersion.Identifier(),
},
ObjectMeta: metav1.ObjectMeta{
ResourceVersion: opts.ResourceVersion,
Namespace: identifier.Namespace,
Name: identifier.Name,
},
Status: newStatus,
}, resource.UpdateOptions{
Subresource: "status",
ResourceVersion: opts.ResourceVersion,
})
}
func (c *CheckClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error {
return c.client.Delete(ctx, identifier, opts)
}

View File

@@ -0,0 +1,99 @@
package v0alpha1
import (
"context"
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type CheckTypeClient struct {
client *resource.TypedClient[*CheckType, *CheckTypeList]
}
func NewCheckTypeClient(client resource.Client) *CheckTypeClient {
return &CheckTypeClient{
client: resource.NewTypedClient[*CheckType, *CheckTypeList](client, CheckTypeKind()),
}
}
func NewCheckTypeClientFromGenerator(generator resource.ClientGenerator) (*CheckTypeClient, error) {
c, err := generator.ClientFor(CheckTypeKind())
if err != nil {
return nil, err
}
return NewCheckTypeClient(c), nil
}
func (c *CheckTypeClient) Get(ctx context.Context, identifier resource.Identifier) (*CheckType, error) {
return c.client.Get(ctx, identifier)
}
func (c *CheckTypeClient) List(ctx context.Context, namespace string, opts resource.ListOptions) (*CheckTypeList, error) {
return c.client.List(ctx, namespace, opts)
}
func (c *CheckTypeClient) ListAll(ctx context.Context, namespace string, opts resource.ListOptions) (*CheckTypeList, error) {
resp, err := c.client.List(ctx, namespace, resource.ListOptions{
ResourceVersion: opts.ResourceVersion,
Limit: opts.Limit,
LabelFilters: opts.LabelFilters,
FieldSelectors: opts.FieldSelectors,
})
if err != nil {
return nil, err
}
for resp.GetContinue() != "" {
page, err := c.client.List(ctx, namespace, resource.ListOptions{
Continue: resp.GetContinue(),
ResourceVersion: opts.ResourceVersion,
Limit: opts.Limit,
LabelFilters: opts.LabelFilters,
FieldSelectors: opts.FieldSelectors,
})
if err != nil {
return nil, err
}
resp.SetContinue(page.GetContinue())
resp.SetResourceVersion(page.GetResourceVersion())
resp.SetItems(append(resp.GetItems(), page.GetItems()...))
}
return resp, nil
}
func (c *CheckTypeClient) Create(ctx context.Context, obj *CheckType, opts resource.CreateOptions) (*CheckType, error) {
// Make sure apiVersion and kind are set
obj.APIVersion = GroupVersion.Identifier()
obj.Kind = CheckTypeKind().Kind()
return c.client.Create(ctx, obj, opts)
}
func (c *CheckTypeClient) Update(ctx context.Context, obj *CheckType, opts resource.UpdateOptions) (*CheckType, error) {
return c.client.Update(ctx, obj, opts)
}
func (c *CheckTypeClient) Patch(ctx context.Context, identifier resource.Identifier, req resource.PatchRequest, opts resource.PatchOptions) (*CheckType, error) {
return c.client.Patch(ctx, identifier, req, opts)
}
func (c *CheckTypeClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus CheckTypeStatus, opts resource.UpdateOptions) (*CheckType, error) {
return c.client.Update(ctx, &CheckType{
TypeMeta: metav1.TypeMeta{
Kind: CheckTypeKind().Kind(),
APIVersion: GroupVersion.Identifier(),
},
ObjectMeta: metav1.ObjectMeta{
ResourceVersion: opts.ResourceVersion,
Namespace: identifier.Namespace,
Name: identifier.Name,
},
Status: newStatus,
}, resource.UpdateOptions{
Subresource: "status",
ResourceVersion: opts.ResourceVersion,
})
}
func (c *CheckTypeClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error {
return c.client.Delete(ctx, identifier, opts)
}

View File

@@ -0,0 +1,13 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
package v0alpha1
// +k8s:openapi-gen=true
type CreateRegisterBody struct {
Message string `json:"message"`
}
// NewCreateRegisterBody creates a new CreateRegisterBody object.
func NewCreateRegisterBody() *CreateRegisterBody {
return &CreateRegisterBody{}
}

View File

@@ -0,0 +1,37 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
package v0alpha1
import (
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
// +k8s:openapi-gen=true
type CreateRegister struct {
metav1.TypeMeta `json:",inline"`
CreateRegisterBody `json:",inline"`
}
func NewCreateRegister() *CreateRegister {
return &CreateRegister{}
}
func (t *CreateRegisterBody) DeepCopyInto(dst *CreateRegisterBody) {
_ = resource.CopyObjectInto(dst, t)
}
func (o *CreateRegister) DeepCopyObject() runtime.Object {
dst := NewCreateRegister()
o.DeepCopyInto(dst)
return dst
}
func (o *CreateRegister) DeepCopyInto(dst *CreateRegister) {
dst.TypeMeta.APIVersion = o.TypeMeta.APIVersion
dst.TypeMeta.Kind = o.TypeMeta.Kind
o.CreateRegisterBody.DeepCopyInto(&dst.CreateRegisterBody)
}
var _ runtime.Object = NewCreateRegister()

View File

@@ -12,22 +12,26 @@ import (
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kube-openapi/pkg/spec3"
"k8s.io/kube-openapi/pkg/validation/spec"
v0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
)
var (
rawSchemaCheckv0alpha1 = []byte(`{"spec":{"properties":{"data":{"additionalProperties":{"type":"string"},"description":"Generic data input that a check can receive","type":"object"}},"type":"object"},"status":{"properties":{"additionalFields":{"description":"additionalFields is reserved for future use","type":"object","x-kubernetes-preserve-unknown-fields":true},"operatorStates":{"additionalProperties":{"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"description":"details contains any extra information that is operator-specific","type":"object","x-kubernetes-preserve-unknown-fields":true},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"},"report":{"properties":{"count":{"description":"Number of elements analyzed","type":"integer"},"failures":{"description":"List of failures","items":{"properties":{"item":{"description":"Human readable identifier of the item that failed","type":"string"},"itemID":{"description":"ID of the item that failed","type":"string"},"links":{"description":"Links to actions that can be taken to resolve the failure","items":{"properties":{"message":{"description":"Human readable error message","type":"string"},"url":{"description":"URL to a page with more information about the error","type":"string"}},"required":["url","message"],"type":"object"},"type":"array"},"moreInfo":{"description":"More information about the failure, not meant to be displayed to the user. Used for LLM suggestions.","type":"string"},"severity":{"description":"Severity of the failure","enum":["high","low"],"type":"string"},"stepID":{"description":"Step ID that the failure is associated with","type":"string"}},"required":["severity","stepID","item","itemID","links"],"type":"object"},"type":"array"}},"required":["count","failures"],"type":"object"}},"required":["report"],"type":"object"}}`)
rawSchemaCheckv0alpha1 = []byte(`{"Check":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"ErrorLink":{"additionalProperties":false,"properties":{"message":{"description":"Human readable error message","type":"string"},"url":{"description":"URL to a page with more information about the error","type":"string"}},"required":["url","message"],"type":"object"},"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"Report":{"additionalProperties":false,"properties":{"count":{"description":"Number of elements analyzed","type":"integer"},"failures":{"description":"List of failures","items":{"$ref":"#/components/schemas/ReportFailure"},"type":"array"}},"required":["count","failures"],"type":"object"},"ReportFailure":{"additionalProperties":false,"properties":{"item":{"description":"Human readable identifier of the item that failed","type":"string"},"itemID":{"description":"ID of the item that failed","type":"string"},"links":{"description":"Links to actions that can be taken to resolve the failure","items":{"$ref":"#/components/schemas/ErrorLink"},"type":"array"},"moreInfo":{"description":"More information about the failure, not meant to be displayed to the user. Used for LLM suggestions.","type":"string"},"severity":{"description":"Severity of the failure","enum":["high","low"],"type":"string"},"stepID":{"description":"Step ID that the failure is associated with","type":"string"}},"required":["severity","stepID","item","itemID","links"],"type":"object"},"spec":{"additionalProperties":false,"properties":{"data":{"additionalProperties":{"type":"string"},"description":"Generic data input that a check can receive","type":"object"}},"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"},"report":{"$ref":"#/components/schemas/Report"}},"required":["report"],"type":"object"}}`)
versionSchemaCheckv0alpha1 app.VersionSchema
_ = json.Unmarshal(rawSchemaCheckv0alpha1, &versionSchemaCheckv0alpha1)
rawSchemaCheckTypev0alpha1 = []byte(`{"spec":{"properties":{"name":{"type":"string"},"steps":{"items":{"properties":{"description":{"type":"string"},"resolution":{"type":"string"},"stepID":{"type":"string"},"title":{"type":"string"}},"required":["title","description","stepID","resolution"],"type":"object"},"type":"array"}},"required":["name","steps"],"type":"object"},"status":{"properties":{"additionalFields":{"description":"additionalFields is reserved for future use","type":"object","x-kubernetes-preserve-unknown-fields":true},"operatorStates":{"additionalProperties":{"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"description":"details contains any extra information that is operator-specific","type":"object","x-kubernetes-preserve-unknown-fields":true},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
rawSchemaCheckTypev0alpha1 = []byte(`{"CheckType":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"Step":{"additionalProperties":false,"properties":{"description":{"type":"string"},"resolution":{"type":"string"},"stepID":{"type":"string"},"title":{"type":"string"}},"required":["title","description","stepID","resolution"],"type":"object"},"spec":{"additionalProperties":false,"properties":{"name":{"type":"string"},"steps":{"items":{"$ref":"#/components/schemas/Step"},"type":"array"}},"required":["name","steps"],"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
versionSchemaCheckTypev0alpha1 app.VersionSchema
_ = json.Unmarshal(rawSchemaCheckTypev0alpha1, &versionSchemaCheckTypev0alpha1)
)
var appManifestData = app.ManifestData{
AppName: "advisor",
Group: "advisor.grafana.app",
AppName: "advisor",
Group: "advisor.grafana.app",
PreferredVersion: "v0alpha1",
Versions: []app.ManifestVersion{
{
Name: "v0alpha1",
@@ -57,6 +61,62 @@ var appManifestData = app.ManifestData{
Schema: &versionSchemaCheckTypev0alpha1,
},
},
Routes: app.ManifestVersionRoutes{
Namespaced: map[string]spec3.PathProps{
"/register": {
Post: &spec3.Operation{
OperationProps: spec3.OperationProps{
OperationId: "createRegister",
Responses: &spec3.Responses{
ResponsesProps: spec3.ResponsesProps{
Default: &spec3.Response{
ResponseProps: spec3.ResponseProps{
Description: "Default OK response",
Content: map[string]*spec3.MediaType{
"application/json": {
MediaTypeProps: spec3.MediaTypeProps{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{"object"},
Properties: map[string]spec.Schema{
"apiVersion": {
SchemaProps: spec.SchemaProps{
Type: []string{"string"},
Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
},
},
"kind": {
SchemaProps: spec.SchemaProps{
Type: []string{"string"},
Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
},
},
"message": {
SchemaProps: spec.SchemaProps{
Type: []string{"string"},
},
},
},
Required: []string{
"message",
"apiVersion",
"kind",
},
}},
}},
},
},
},
}},
},
},
},
},
Cluster: map[string]spec3.PathProps{},
Schemas: map[string]spec.Schema{},
},
},
},
}
@@ -81,11 +141,14 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
return goType, exists
}
var customRouteToGoResponseType = map[string]any{}
var customRouteToGoResponseType = map[string]any{
"v0alpha1||<namespace>/register|POST": v0alpha1.CreateRegister{},
}
// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
// Resource routes (those without a kind) should prefix their route with "<namespace>/" if the route is namespaced (otherwise the route is assumed to be cluster-scope)
func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
if len(path) > 0 && path[0] == '/' {
path = path[1:]
@@ -93,3 +156,42 @@ func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (g
goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
return goType, exists
}
var customRouteToGoParamsType = map[string]runtime.Object{}
func ManifestCustomRouteQueryAssociator(kind, version, path, verb string) (goType runtime.Object, exists bool) {
if len(path) > 0 && path[0] == '/' {
path = path[1:]
}
goType, exists = customRouteToGoParamsType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
return goType, exists
}
var customRouteToGoRequestBodyType = map[string]any{}
func ManifestCustomRouteRequestBodyAssociator(kind, version, path, verb string) (goType any, exists bool) {
if len(path) > 0 && path[0] == '/' {
path = path[1:]
}
goType, exists = customRouteToGoRequestBodyType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
return goType, exists
}
type GoTypeAssociator struct{}
func NewGoTypeAssociator() *GoTypeAssociator {
return &GoTypeAssociator{}
}
func (g *GoTypeAssociator) KindToGoType(kind, version string) (goType resource.Kind, exists bool) {
return ManifestGoTypeAssociator(kind, version)
}
func (g *GoTypeAssociator) CustomRouteReturnGoType(kind, version, path, verb string) (goType any, exists bool) {
return ManifestCustomRouteResponsesAssociator(kind, version, path, verb)
}
func (g *GoTypeAssociator) CustomRouteQueryGoType(kind, version, path, verb string) (goType runtime.Object, exists bool) {
return ManifestCustomRouteQueryAssociator(kind, version, path, verb)
}
func (g *GoTypeAssociator) CustomRouteRequestBodyGoType(kind, version, path, verb string) (goType any, exists bool) {
return ManifestCustomRouteRequestBodyAssociator(kind, version, path, verb)
}

View File

@@ -2,7 +2,9 @@ package app
import (
"context"
"encoding/json"
"fmt"
"net/http"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/k8s"
@@ -16,10 +18,15 @@ import (
"github.com/grafana/grafana/apps/advisor/pkg/app/checkscheduler"
"github.com/grafana/grafana/apps/advisor/pkg/app/checktyperegisterer"
"github.com/grafana/grafana/pkg/apimachinery/identity"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
)
func New(cfg app.Config) (app.App, error) {
// Needed until https://github.com/grafana/grafana-app-sdk/pull/1077
if cfg.KubeConfig.APIPath == "" {
cfg.KubeConfig.APIPath = "apis"
}
// Read config
specificConfig, ok := cfg.SpecificConfig.(checkregistry.AdvisorAppConfig)
if !ok {
@@ -45,6 +52,16 @@ func New(cfg app.Config) (app.App, error) {
checkMap[c.ID()] = c
}
ctr, err := checktyperegisterer.New(cfg, log)
if err != nil {
return nil, err
}
csch, err := checkscheduler.New(cfg, log)
if err != nil {
return nil, err
}
simpleConfig := simple.AppConfig{
Name: "advisor",
KubeConfig: cfg.KubeConfig,
@@ -69,12 +86,12 @@ func New(cfg app.Config) (app.App, error) {
go func() {
logger := log.WithContext(ctx).With("check", check.ID())
logger.Debug("Processing check", "namespace", req.Object.GetNamespace())
requester, err := identity.GetRequester(ctx)
orgID, err := getOrgIDFromNamespace(req.Object.GetNamespace())
if err != nil {
logger.Error("Error getting requester", "error", err)
logger.Error("Error getting org ID from namespace", "error", err)
return
}
ctx = identity.WithServiceIdentityContext(context.WithoutCancel(ctx), requester.GetOrgID())
ctx = identity.WithServiceIdentityContext(context.WithoutCancel(ctx), orgID)
err = processCheck(ctx, logger, client, typesClient, req.Object, check)
if err != nil {
logger.Error("Error processing check", "error", err)
@@ -85,12 +102,12 @@ func New(cfg app.Config) (app.App, error) {
go func() {
logger := log.WithContext(ctx).With("check", check.ID())
logger.Debug("Updating check", "namespace", req.Object.GetNamespace(), "name", req.Object.GetName())
requester, err := identity.GetRequester(ctx)
orgID, err := getOrgIDFromNamespace(req.Object.GetNamespace())
if err != nil {
logger.Error("Error getting requester", "error", err)
logger.Error("Error getting org ID from namespace", "error", err)
return
}
ctx = identity.WithServiceIdentityContext(context.WithoutCancel(ctx), requester.GetOrgID())
ctx = identity.WithServiceIdentityContext(context.WithoutCancel(ctx), orgID)
err = processCheckRetry(ctx, logger, client, typesClient, req.Object, check)
if err != nil {
logger.Error("Error processing check retry", "error", err)
@@ -106,6 +123,37 @@ func New(cfg app.Config) (app.App, error) {
Kind: advisorv0alpha1.CheckTypeKind(),
},
},
VersionedCustomRoutes: map[string]simple.AppVersionRouteHandlers{
"v0alpha1": {
{
Namespaced: true,
Path: "register",
Method: "POST",
}: func(ctx context.Context, w app.CustomRouteResponseWriter, req *app.CustomRouteRequest) error {
logger := log.WithContext(ctx)
namespace := req.ResourceIdentifier.Namespace
// Register check types for the namespace
err := ctr.RegisterCheckTypesInNamespace(ctx, logger, namespace)
if err != nil {
logger.Error("Failed to register check types", "namespace", namespace, "error", err)
w.WriteHeader(http.StatusInternalServerError)
_ = json.NewEncoder(w).Encode(map[string]string{"error": err.Error()})
return err
}
// Return typed response matching the manifest
return json.NewEncoder(w).Encode(advisorv0alpha1.CreateRegister{
TypeMeta: metav1.TypeMeta{
APIVersion: fmt.Sprintf("%s/%s", advisorv0alpha1.APIGroup, advisorv0alpha1.APIVersion),
},
CreateRegisterBody: advisorv0alpha1.CreateRegisterBody{
Message: "Check types registered successfully",
},
})
},
},
},
}
a, err := simple.NewApp(simpleConfig)
@@ -119,17 +167,9 @@ func New(cfg app.Config) (app.App, error) {
}
// Save check types as resources
ctr, err := checktyperegisterer.New(cfg, log)
if err != nil {
return nil, err
}
a.AddRunnable(ctr)
// Start scheduler
csch, err := checkscheduler.New(cfg, log)
if err != nil {
return nil, err
}
a.AddRunnable(csch)
return a, nil

View File

@@ -3,6 +3,7 @@ package app
import (
"context"
claims "github.com/grafana/authlib/types"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"k8s.io/apiserver/pkg/authorization/authorizer"
)
@@ -15,7 +16,22 @@ func GetAuthorizer() authorizer.Authorizer {
return authorizer.DecisionNoOpinion, "", nil
}
// require a user
// Check for service identity
if identity.IsServiceIdentity(ctx) {
return authorizer.DecisionAllow, "", nil
}
// Check for access policy identity
info, ok := claims.AuthInfoFrom(ctx)
if ok && claims.IsIdentityType(info.GetIdentityType(), claims.TypeAccessPolicy) {
// For access policy identities, we need to use ResourceAuthorizer
// This requires an AccessClient, which should be provided by the API server
// For now, we'll use the default ResourceAuthorizer from the API server
// This will be set up by the API server's authorization chain
return authorizer.DecisionNoOpinion, "", nil
}
// For regular Grafana users, check if they are admin
u, err := identity.GetRequester(ctx)
if err != nil {
return authorizer.DecisionDeny, "valid user is required", err

View File

@@ -4,6 +4,7 @@ import (
"context"
"testing"
claims "github.com/grafana/authlib/types"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/stretchr/testify/assert"
"k8s.io/apiserver/pkg/authorization/authorizer"
@@ -79,4 +80,12 @@ func (m *mockUser) HasRole(role identity.RoleType) bool {
return role == identity.RoleAdmin && m.isGrafanaAdmin
}
func (m *mockUser) GetUID() string {
return "test-uid"
}
func (m *mockUser) GetIdentityType() claims.IdentityType {
return claims.TypeUser
}
// Implement other methods of identity.Requester as needed

View File

@@ -10,6 +10,7 @@ import (
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/repo"
"github.com/grafana/grafana/pkg/services/datasources"
"github.com/grafana/grafana/pkg/services/org"
"github.com/grafana/grafana/pkg/services/pluginsintegration/managedplugins"
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginchecker"
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext"
@@ -91,4 +92,5 @@ type AdvisorAppConfig struct {
CheckRegistry CheckService
PluginConfig map[string]string
StackID string
OrgService org.Service
}

View File

@@ -3,6 +3,8 @@ package datasourcecheck
import (
"context"
"errors"
sysruntime "runtime"
"sync"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
@@ -18,37 +20,47 @@ const (
HealthCheckStepID = "health-check"
UIDValidationStepID = "uid-validation"
MissingPluginStepID = "missing-plugin"
PromDepAuthStepID = "prom-dep-auth"
)
type check struct {
DatasourceSvc datasources.DataSourceService
PluginStore pluginstore.Store
PluginContextProvider pluginContextProvider
PluginClient plugins.Client
PluginRepo repo.Service
GrafanaVersion string
DatasourceSvc datasources.DataSourceService
PluginStore pluginstore.Store
PluginContextProvider PluginContextProvider
PluginClient plugins.Client
PluginRepo repo.Service
GrafanaVersion string
pluginCanBeInstalledCache map[string]bool
pluginExistsCacheMu sync.RWMutex
}
func New(
datasourceSvc datasources.DataSourceService,
pluginStore pluginstore.Store,
pluginContextProvider pluginContextProvider,
pluginContextProvider PluginContextProvider,
pluginClient plugins.Client,
pluginRepo repo.Service,
grafanaVersion string,
) checks.Check {
return &check{
DatasourceSvc: datasourceSvc,
PluginStore: pluginStore,
PluginContextProvider: pluginContextProvider,
PluginClient: pluginClient,
PluginRepo: pluginRepo,
GrafanaVersion: grafanaVersion,
DatasourceSvc: datasourceSvc,
PluginStore: pluginStore,
PluginContextProvider: pluginContextProvider,
PluginClient: pluginClient,
PluginRepo: pluginRepo,
GrafanaVersion: grafanaVersion,
pluginCanBeInstalledCache: make(map[string]bool),
}
}
func (c *check) Items(ctx context.Context) ([]any, error) {
dss, err := c.DatasourceSvc.GetAllDataSources(ctx, &datasources.GetAllDataSourcesQuery{})
requester, err := identity.GetRequester(ctx)
if err != nil {
return nil, err
}
dss, err := c.DatasourceSvc.GetDataSources(ctx, &datasources.GetDataSourcesQuery{
OrgID: requester.GetOrgID(),
})
if err != nil {
return nil, err
}
@@ -87,6 +99,7 @@ func (c *check) Name() string {
}
func (c *check) Init(ctx context.Context) error {
c.pluginCanBeInstalledCache = make(map[string]bool)
return nil
}
@@ -102,9 +115,59 @@ func (c *check) Steps() []checks.Step {
PluginRepo: c.PluginRepo,
GrafanaVersion: c.GrafanaVersion,
},
&promDepAuthStep{
canBeInstalled: c.canBeInstalled,
},
}
}
type pluginContextProvider interface {
// canBeInstalled checks if a plugin is already installed or if it's available in the plugin repository.
// Returns true if:
// - The plugin is NOT installed AND it IS available in the repository (can be installed)
// Returns false if:
// - The plugin is already installed, OR
// - The plugin is NOT available in the repository (nothing to install)
func (c *check) canBeInstalled(ctx context.Context, pluginType string) (bool, error) {
// Check cache first with read lock for performance
c.pluginExistsCacheMu.RLock()
if canBeInstalled, found := c.pluginCanBeInstalledCache[pluginType]; found {
c.pluginExistsCacheMu.RUnlock()
return canBeInstalled, nil
}
c.pluginExistsCacheMu.RUnlock()
// Cache miss - acquire write lock and check again (double-checked locking pattern)
c.pluginExistsCacheMu.Lock()
defer c.pluginExistsCacheMu.Unlock()
// Another goroutine may have populated the cache while we waited for the lock
if canBeInstalled, found := c.pluginCanBeInstalledCache[pluginType]; found {
return canBeInstalled, nil
}
// Check if plugin is already installed
if _, isInstalled := c.PluginStore.Plugin(ctx, pluginType); isInstalled {
c.pluginCanBeInstalledCache[pluginType] = false
return false, nil
}
// Plugin is not installed - check if it's available in the repository
availablePlugins, err := c.PluginRepo.GetPluginsInfo(ctx, repo.GetPluginsInfoOptions{
IncludeDeprecated: true,
Plugins: []string{pluginType},
}, repo.NewCompatOpts(c.GrafanaVersion, sysruntime.GOOS, sysruntime.GOARCH))
if err != nil {
// On error, assume plugin is installed/unavailable to avoid showing incorrect install links
return false, err
}
// Plugin is not installed but IS available - return false to show install link
// Plugin is not installed and NOT available in repo - return true (nothing to install)
isAvailableInRepo := len(availablePlugins) > 0
c.pluginCanBeInstalledCache[pluginType] = !isAvailableInRepo
return isAvailableInRepo, nil
}
type PluginContextProvider interface {
GetWithDataSource(ctx context.Context, pluginID string, user identity.Requester, ds *datasources.DataSource) (backend.PluginContext, error)
}

View File

@@ -8,6 +8,7 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend"
advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/pkg/apimachinery/identity"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/repo"
"github.com/grafana/grafana/pkg/services/datasources"
@@ -230,6 +231,101 @@ func TestCheck_Run(t *testing.T) {
assert.Equal(t, MissingPluginStepID, failures[0].StepID)
assert.Len(t, failures[0].Links, 1)
})
t.Run("should return failure when prometheus datasource uses SigV4 auth", func(t *testing.T) {
jsonData := simplejson.New()
jsonData.Set("sigV4Auth", true)
datasources := []*datasources.DataSource{
{UID: "valid-uid-1", Type: "prometheus", Name: "Prometheus", JsonData: jsonData},
}
mockDatasourceSvc := &MockDatasourceSvc{dss: datasources}
mockPluginContextProvider := &MockPluginContextProvider{pCtx: backend.PluginContext{}}
mockPluginClient := &MockPluginClient{res: &backend.CheckHealthResult{Status: backend.HealthStatusOk}}
mockPluginRepo := &MockPluginRepo{plugins: []repo.PluginInfo{
{ID: 1, Slug: "prometheus", Status: "active"},
{ID: 2, Slug: "grafana-amazonprometheus-datasource", Status: "active"},
}}
mockPluginStore := &MockPluginStore{exists: true}
check := &check{
DatasourceSvc: mockDatasourceSvc,
PluginContextProvider: mockPluginContextProvider,
PluginClient: mockPluginClient,
PluginRepo: mockPluginRepo,
PluginStore: mockPluginStore,
GrafanaVersion: "11.0.0",
}
failures, err := runChecks(check)
assert.NoError(t, err)
assert.Len(t, failures, 1)
assert.Equal(t, PromDepAuthStepID, failures[0].StepID)
assert.Contains(t, failures[0].Links, advisor.CheckErrorLink{
Message: "View SigV4 docs",
Url: "https://grafana.com/docs/grafana-cloud/connect-externally-hosted/data-sources/prometheus/configure/aws-authentication/",
})
})
t.Run("should return failure when prometheus datasource uses Azure auth", func(t *testing.T) {
jsonData := simplejson.New()
jsonData.Set("azureCredentials", map[string]interface{}{"authType": "msi"})
datasources := []*datasources.DataSource{
{UID: "valid-uid-1", Type: "prometheus", Name: "Prometheus", JsonData: jsonData},
}
mockDatasourceSvc := &MockDatasourceSvc{dss: datasources}
mockPluginContextProvider := &MockPluginContextProvider{pCtx: backend.PluginContext{}}
mockPluginClient := &MockPluginClient{res: &backend.CheckHealthResult{Status: backend.HealthStatusOk}}
mockPluginRepo := &MockPluginRepo{plugins: []repo.PluginInfo{
{ID: 1, Slug: "prometheus", Status: "active"},
{ID: 2, Slug: "grafana-azureprometheus-datasource", Status: "active"},
}}
mockPluginStore := &MockPluginStore{exists: true}
check := &check{
DatasourceSvc: mockDatasourceSvc,
PluginContextProvider: mockPluginContextProvider,
PluginClient: mockPluginClient,
PluginRepo: mockPluginRepo,
PluginStore: mockPluginStore,
GrafanaVersion: "11.0.0",
}
failures, err := runChecks(check)
assert.NoError(t, err)
assert.Len(t, failures, 1)
assert.Equal(t, PromDepAuthStepID, failures[0].StepID)
assert.Contains(t, failures[0].Links, advisor.CheckErrorLink{
Message: "View Azure auth docs",
Url: "https://grafana.com/docs/grafana-cloud/connect-externally-hosted/data-sources/prometheus/configure/azure-authentication/",
})
})
t.Run("should not return failure when prometheus datasource does not use deprecated auth", func(t *testing.T) {
jsonData := simplejson.New()
datasources := []*datasources.DataSource{
{UID: "valid-uid-1", Type: "prometheus", Name: "Prometheus", JsonData: jsonData},
}
mockDatasourceSvc := &MockDatasourceSvc{dss: datasources}
mockPluginContextProvider := &MockPluginContextProvider{pCtx: backend.PluginContext{}}
mockPluginClient := &MockPluginClient{res: &backend.CheckHealthResult{Status: backend.HealthStatusOk}}
mockPluginRepo := &MockPluginRepo{plugins: []repo.PluginInfo{
{ID: 1, Slug: "prometheus", Status: "active"},
}}
mockPluginStore := &MockPluginStore{exists: true}
check := &check{
DatasourceSvc: mockDatasourceSvc,
PluginContextProvider: mockPluginContextProvider,
PluginClient: mockPluginClient,
PluginRepo: mockPluginRepo,
PluginStore: mockPluginStore,
GrafanaVersion: "11.0.0",
}
failures, err := runChecks(check)
assert.NoError(t, err)
assert.Empty(t, failures)
})
}
func TestCheck_Item(t *testing.T) {
@@ -251,7 +347,7 @@ type MockDatasourceSvc struct {
dss []*datasources.DataSource
}
func (m *MockDatasourceSvc) GetAllDataSources(context.Context, *datasources.GetAllDataSourcesQuery) ([]*datasources.DataSource, error) {
func (m *MockDatasourceSvc) GetDataSources(context.Context, *datasources.GetDataSourcesQuery) ([]*datasources.DataSource, error) {
return m.dss, nil
}

View File

@@ -15,7 +15,7 @@ import (
)
type healthCheckStep struct {
PluginContextProvider pluginContextProvider
PluginContextProvider PluginContextProvider
PluginClient plugins.Client
}

View File

@@ -0,0 +1,147 @@
package datasourcecheck
import (
"context"
"fmt"
"github.com/grafana/grafana-app-sdk/logging"
advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/services/datasources"
)
type promDepAuthStep struct {
canBeInstalled func(ctx context.Context, pluginType string) (bool, error)
}
func (s *promDepAuthStep) Title() string {
return "Prometheus deprecated authentication check"
}
func (s *promDepAuthStep) Description() string {
return "Check if Prometheus data sources are using deprecated authentication methods (Azure auth and SigV4)"
}
func (s *promDepAuthStep) Resolution() string {
return fmt.Sprintf("Enable the feature toggle for 'prometheusTypeMigration'. If this feature toggle is already enabled, make sure that 'Azure Monitor Managed Service for Prometheus' and/or 'Amazon Managed Service for Prometheus' plugins are installed. If the data source is provisioned, edit data source type in the provisioning file to use '%s' or '%s'.", datasources.DS_AMAZON_PROMETHEUS, datasources.DS_AZURE_PROMETHEUS)
}
func (s *promDepAuthStep) ID() string {
return PromDepAuthStepID
}
func (s *promDepAuthStep) Run(ctx context.Context, log logging.Logger, obj *advisor.CheckSpec, item any) ([]advisor.CheckReportFailure, error) {
dataSource, ok := item.(*datasources.DataSource)
if !ok {
return nil, fmt.Errorf("invalid item type %T", item)
}
if dataSource.Type != datasources.DS_PROMETHEUS {
return nil, nil
}
if dataSource.JsonData == nil {
return nil, nil
}
awsAuthLinks, err := s.checkUsingAWSAuth(ctx, dataSource)
if err != nil {
return nil, err
}
azureAuthLinks, err := s.checkUsingAzureAuth(ctx, dataSource)
if err != nil {
return nil, err
}
errorLinks := append(awsAuthLinks, azureAuthLinks...)
if len(errorLinks) == 0 {
return nil, nil
}
return []advisor.CheckReportFailure{checks.NewCheckReportFailureWithMoreInfo(
advisor.CheckReportFailureSeverityHigh,
s.ID(),
dataSource.Name,
dataSource.UID,
errorLinks,
fmt.Sprintf("Datasource %s (UID: %s) is of type %s but it's using a deprecated authentication method so it should be migrated", dataSource.Name, dataSource.UID, dataSource.Type),
)}, nil
}
func (s *promDepAuthStep) checkUsingAWSAuth(ctx context.Context, dataSource *datasources.DataSource) ([]advisor.CheckErrorLink, error) {
var errorLinks []advisor.CheckErrorLink
if sigV4Auth, found := dataSource.JsonData.CheckGet("sigV4Auth"); found {
if enabled, err := sigV4Auth.Bool(); err != nil || !enabled {
// Disabled or not a valid boolean
return nil, nil
}
readOnlyLink := checkReadOnly(dataSource)
if readOnlyLink != nil {
errorLinks = append(errorLinks, *readOnlyLink)
}
errorLinks = append(errorLinks,
advisor.CheckErrorLink{
Message: "View SigV4 docs",
Url: "https://grafana.com/docs/grafana-cloud/connect-externally-hosted/data-sources/prometheus/configure/aws-authentication/",
})
pluginLink := s.linkDataSource(ctx, datasources.DS_AMAZON_PROMETHEUS, "Amazon Managed Service for Prometheus")
if pluginLink != nil {
errorLinks = append(errorLinks, *pluginLink)
}
}
return errorLinks, nil
}
func (s *promDepAuthStep) checkUsingAzureAuth(ctx context.Context, dataSource *datasources.DataSource) ([]advisor.CheckErrorLink, error) {
var errorLinks []advisor.CheckErrorLink
if azureAuth, found := dataSource.JsonData.CheckGet("azureCredentials"); found {
if _, err := azureAuth.Value(); err != nil {
// azureAuth does not have a value
return nil, nil
}
readOnlyLink := checkReadOnly(dataSource)
if readOnlyLink != nil {
errorLinks = append(errorLinks, *readOnlyLink)
}
errorLinks = append(errorLinks,
advisor.CheckErrorLink{
Message: "View Azure auth docs",
Url: "https://grafana.com/docs/grafana-cloud/connect-externally-hosted/data-sources/prometheus/configure/azure-authentication/",
})
pluginLink := s.linkDataSource(ctx, datasources.DS_AZURE_PROMETHEUS, "Azure Monitor Managed Service for Prometheus")
if pluginLink != nil {
errorLinks = append(errorLinks, *pluginLink)
}
}
return errorLinks, nil
}
func checkReadOnly(dataSource *datasources.DataSource) *advisor.CheckErrorLink {
if readOnly, found := dataSource.JsonData.CheckGet("readonly"); found {
if enabled, err := readOnly.Bool(); err != nil || !enabled {
// Disabled or not a valid boolean
return nil
}
return &advisor.CheckErrorLink{
Message: "Change provisioning file",
Url: "https://grafana.com/docs/grafana/latest/administration/provisioning/#data-sources",
}
}
return nil
}
func (s *promDepAuthStep) linkDataSource(ctx context.Context, pluginType string, pluginName string) *advisor.CheckErrorLink {
canBeInstalled, err := s.canBeInstalled(ctx, pluginType)
if err != nil {
return nil
}
if canBeInstalled {
// Plugin is available in the repo
return &advisor.CheckErrorLink{
Message: fmt.Sprintf("Install %s", pluginName),
Url: fmt.Sprintf("/plugins/%s", pluginType),
}
}
return nil
}

View File

@@ -9,7 +9,7 @@ import (
"github.com/grafana/authlib/types"
"github.com/grafana/grafana-app-sdk/resource"
advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/grafana/grafana/pkg/services/org"
)
const (
@@ -57,15 +57,26 @@ func NewCheckReportFailureWithMoreInfo(
}
}
func GetNamespace(stackID string) (string, error) {
if stackID == "" {
return metav1.NamespaceDefault, nil
func GetNamespaces(ctx context.Context, stackID string, orgService org.Service) ([]string, error) {
var namespaces []string
if stackID != "" {
// Single namespace for cloud stack
stackId, err := strconv.ParseInt(stackID, 10, 64)
if err != nil {
return nil, fmt.Errorf("invalid stack id: %s", stackID)
}
namespaces = []string{types.CloudNamespaceFormatter(stackId)}
} else {
// Multiple namespaces for each org
orgs, err := orgService.Search(ctx, &org.SearchOrgsQuery{})
if err != nil {
return nil, fmt.Errorf("failed to fetch orgs: %w", err)
}
for _, o := range orgs {
namespaces = append(namespaces, types.OrgNamespaceFormatter(o.ID))
}
}
stackId, err := strconv.ParseInt(stackID, 10, 64)
if err != nil {
return "", fmt.Errorf("invalid stack id: %s", stackID)
}
return types.CloudNamespaceFormatter(stackId), nil
return namespaces, nil
}
func GetStatusAnnotation(obj resource.Object) string {

View File

@@ -1,40 +1,61 @@
package checks
import (
"context"
"testing"
"github.com/grafana/grafana/pkg/services/org"
"github.com/stretchr/testify/assert"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func TestGetNamespace(t *testing.T) {
func TestGetNamespaces(t *testing.T) {
tests := []struct {
name string
input string
expected string
stackID string
orgs []string
expected []string
expectedErr string
}{
{
name: "empty stack ID",
input: "",
expected: metav1.NamespaceDefault,
stackID: "",
orgs: []string{"default"},
expected: []string{metav1.NamespaceDefault},
},
{
name: "valid stack ID",
input: "1234567890",
expected: "stacks-1234567890",
stackID: "1234567890",
orgs: []string{"default"},
expected: []string{"stacks-1234567890"},
},
{
name: "invalid stack ID",
input: "invalid",
expected: "",
stackID: "invalid",
orgs: []string{"default"},
expected: nil,
expectedErr: "invalid stack id: invalid",
},
{
name: "multiple orgs and no stack ID",
stackID: "",
orgs: []string{"default", "org-2"},
expected: []string{"default", "org-2"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, err := GetNamespace(tt.input)
fakeOrgService := &mockOrgService{
SearchFunc: func(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error) {
orgs := make([]*org.OrgDTO, len(tt.orgs))
for i, o := range tt.orgs {
orgs[i] = &org.OrgDTO{ID: int64(i + 1), Name: o}
}
return orgs, nil
},
}
result, err := GetNamespaces(context.Background(), tt.stackID, fakeOrgService)
if tt.expectedErr != "" {
assert.EqualError(t, err, tt.expectedErr)
} else {
@@ -44,3 +65,12 @@ func TestGetNamespace(t *testing.T) {
})
}
}
type mockOrgService struct {
org.Service
SearchFunc func(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error)
}
func (m *mockOrgService) Search(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error) {
return m.SearchFunc(ctx, query)
}

View File

@@ -16,6 +16,7 @@ import (
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checkregistry"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/services/org"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
@@ -23,21 +24,23 @@ const defaultEvaluationInterval = 7 * 24 * time.Hour // 7 days
const defaultMaxHistory = 10
var (
waitInterval = 5 * time.Second
waitMaxRetries = 3
waitInterval = 5 * time.Second
waitMaxRetries = 3
evalIntervalRandomVariation = 1 * time.Hour
)
// Runner is a "runnable" app used to be able to expose and API endpoint
// with the existing checks types. This does not need to be a CRUD resource, but it is
// the only way existing at the moment to expose the check types.
type Runner struct {
checkRegistry checkregistry.CheckService
client resource.Client
typesClient resource.Client
evaluationInterval time.Duration
maxHistory int
namespace string
log logging.Logger
checkRegistry checkregistry.CheckService
checksClient resource.Client
typesClient resource.Client
defaultEvalInterval time.Duration
maxHistory int
log logging.Logger
orgService org.Service
stackID string
}
// NewRunner creates a new Runner.
@@ -48,6 +51,7 @@ func New(cfg app.Config, log logging.Logger) (app.Runnable, error) {
return nil, fmt.Errorf("invalid config type")
}
checkRegistry := specificConfig.CheckRegistry
orgService := specificConfig.OrgService
evalInterval, err := getEvaluationInterval(specificConfig.PluginConfig)
if err != nil {
return nil, err
@@ -56,10 +60,6 @@ func New(cfg app.Config, log logging.Logger) (app.Runnable, error) {
if err != nil {
return nil, err
}
namespace, err := checks.GetNamespace(specificConfig.StackID)
if err != nil {
return nil, err
}
// Prepare storage client
clientGenerator := k8s.NewClientRegistry(cfg.KubeConfig, k8s.ClientConfig{})
@@ -73,73 +73,112 @@ func New(cfg app.Config, log logging.Logger) (app.Runnable, error) {
}
return &Runner{
checkRegistry: checkRegistry,
client: client,
typesClient: typesClient,
evaluationInterval: evalInterval,
maxHistory: maxHistory,
namespace: namespace,
log: log.With("runner", "advisor.checkscheduler"),
checkRegistry: checkRegistry,
checksClient: client,
typesClient: typesClient,
defaultEvalInterval: evalInterval,
maxHistory: maxHistory,
log: log.With("runner", "advisor.checkscheduler"),
orgService: orgService,
stackID: specificConfig.StackID,
}, nil
}
func (r *Runner) Run(ctx context.Context) error {
logger := r.log.WithContext(ctx)
if r.stackID == "" && r.orgService == nil {
logger.Debug("Check scheduler disabled")
return nil
}
// We still need the context to eventually be cancelled to exit this function
// but we don't want the requests to fail because of it
ctxWithoutCancel := context.WithoutCancel(ctx)
lastCreated, err := r.checkLastCreated(ctxWithoutCancel, logger)
// Determine namespaces based on StackID or OrgID
namespaces, err := checks.GetNamespaces(ctxWithoutCancel, r.stackID, r.orgService)
if err != nil {
return fmt.Errorf("failed to get namespaces: %w", err)
}
logger.Debug("Scheduling checks", "namespaces", len(namespaces))
// Get the last created time for this specific namespace
lastCreatedMap, err := r.checkLastCreated(ctx, logger, namespaces)
if err != nil {
logger.Error("Error getting last check creation time", "error", err)
// Wait for interval to create the next scheduled check
lastCreated = time.Now()
} else {
// do an initial creation if necessary
if lastCreated.IsZero() {
err = r.createChecks(ctxWithoutCancel, logger)
if err != nil {
logger.Error("Error creating new check reports", "error", err)
} else {
lastCreated = time.Now()
}
} else {
// Run an initial cleanup to remove old checks
err = r.cleanupChecks(ctxWithoutCancel, logger)
return err
}
// If there are checks already created, run an initial cleanup
for _, namespace := range namespaces {
logger = logger.With("namespace", namespace)
lastCreated := lastCreatedMap[namespace]
if !lastCreated.IsZero() {
err = r.cleanupChecks(ctx, logger, namespace)
if err != nil {
logger.Error("Error cleaning up old check reports", "error", err)
return err
}
err = r.markUnprocessedChecks(ctx, logger, namespace)
if err != nil {
logger.Error("Error marking unprocessed checks", "error", err)
return err
}
}
}
nextSendInterval := getNextSendInterval(lastCreated, r.evaluationInterval)
ticker := time.NewTicker(nextSendInterval)
nextEvalTime := r.getNextEvalTime(r.defaultEvalInterval, lastCreatedMap)
ticker := time.NewTicker(nextEvalTime)
defer ticker.Stop()
for {
select {
case <-ticker.C:
err = r.createChecks(ctxWithoutCancel, logger)
// Get the current last created time for this namespace
lastCreatedMap, err := r.checkLastCreated(ctx, logger, namespaces)
if err != nil {
logger.Error("Error creating new check reports", "error", err)
logger.Error("Error getting last check creation time", "error", err)
return err
}
err = r.cleanupChecks(ctxWithoutCancel, logger)
if err != nil {
logger.Error("Error cleaning up old check reports", "error", err)
for _, namespace := range namespaces {
logger = logger.With("namespace", namespace)
lastCreated := lastCreatedMap[namespace]
// If there are checks already created and they are older than the evaluation interval
// then we can automatically create more
if !lastCreated.IsZero() && lastCreated.Before(time.Now().Add(-r.defaultEvalInterval)) {
err = r.createChecks(ctx, logger, namespace)
if err != nil {
logger.Error("Error creating new check reports", "error", err)
return err
}
// Clean up old checks to avoid going over the limit
err = r.cleanupChecks(ctx, logger, namespace)
if err != nil {
logger.Error("Error cleaning up old check reports", "error", err)
return err
}
// Update the last created time with the new created checks
lastCreatedMap[namespace] = time.Now()
}
}
if nextSendInterval != r.evaluationInterval {
nextSendInterval = r.evaluationInterval
}
ticker.Reset(nextSendInterval)
// Reset the ticker to the next send interval
nextEvalTime = r.getNextEvalTime(r.defaultEvalInterval, lastCreatedMap)
ticker.Reset(nextEvalTime)
case <-ctx.Done():
return ctx.Err()
}
}
}
func (r *Runner) listChecks(ctx context.Context, logger logging.Logger) ([]resource.Object, error) {
list, err := r.client.List(ctx, r.namespace, resource.ListOptions{
func (r *Runner) listChecks(ctx context.Context, logger logging.Logger, namespace string) ([]resource.Object, error) {
list, err := r.checksClient.List(ctx, namespace, resource.ListOptions{
Limit: 1000, // Avoid pagination for normal uses cases, which is a costly operation
})
if err != nil {
@@ -149,7 +188,7 @@ func (r *Runner) listChecks(ctx context.Context, logger logging.Logger) ([]resou
checks := list.GetItems()
for list.GetContinue() != "" {
logger.Debug("List has continue token, listing next page", "continue", list.GetContinue())
list, err = r.client.List(ctx, r.namespace, resource.ListOptions{Continue: list.GetContinue(), Limit: 1000})
list, err = r.checksClient.List(ctx, namespace, resource.ListOptions{Continue: list.GetContinue(), Limit: 1000})
if err != nil {
return nil, err
}
@@ -158,38 +197,48 @@ func (r *Runner) listChecks(ctx context.Context, logger logging.Logger) ([]resou
return checks, nil
}
// checkLastCreated returns the creation time of the last check created
// regardless of its ID. This assumes that the checks are created in batches
// so a batch will have a similar creation time.
// checkLastCreated returns the creation time of the last check created for a specific namespace.
// This assumes that the checks are created in batches so a batch will have a similar creation time.
// In case it finds an unprocessed check from a previous run, it will set it to error.
func (r *Runner) checkLastCreated(ctx context.Context, log logging.Logger) (time.Time, error) {
checkList, err := r.listChecks(ctx, log)
if err != nil {
return time.Time{}, err
}
lastCreated := time.Time{}
for _, item := range checkList {
itemCreated := item.GetCreationTimestamp().Time
if itemCreated.After(lastCreated) {
lastCreated = itemCreated
func (r *Runner) checkLastCreated(ctx context.Context, log logging.Logger, namespaces []string) (map[string]time.Time, error) {
lastCreated := map[string]time.Time{}
for _, namespace := range namespaces {
checkList, err := r.listChecks(ctx, log, namespace)
if err != nil {
return nil, err
}
// If the check is unprocessed, set it to error
if checks.GetStatusAnnotation(item) == "" {
log.Info("Check is unprocessed, marking as error", "check", item.GetStaticMetadata().Identifier())
err := checks.SetStatusAnnotation(ctx, r.client, item, checks.StatusAnnotationError)
if err != nil {
log.Error("Error setting check status to error", "error", err)
for _, item := range checkList {
itemCreated := item.GetCreationTimestamp().Time
if itemCreated.After(lastCreated[namespace]) {
lastCreated[namespace] = itemCreated
}
}
}
return lastCreated, nil
}
func (r *Runner) markUnprocessedChecks(ctx context.Context, log logging.Logger, namespace string) error {
checkList, err := r.listChecks(ctx, log, namespace)
if err != nil {
return err
}
for _, item := range checkList {
if checks.GetStatusAnnotation(item) == "" {
log.Info("Check is unprocessed, marking as error", "check", item.GetStaticMetadata().Identifier())
err := checks.SetStatusAnnotation(ctx, r.checksClient, item, checks.StatusAnnotationError)
if err != nil {
log.Error("Error setting check status to error", "error", err)
return err
}
}
}
return nil
}
// createChecks creates a new check for each check type in the registry.
func (r *Runner) createChecks(ctx context.Context, logger logging.Logger) error {
func (r *Runner) createChecks(ctx context.Context, logger logging.Logger, namespace string) error {
// List existing CheckType objects
list, err := r.typesClient.List(ctx, r.namespace, resource.ListOptions{})
list, err := r.typesClient.List(ctx, namespace, resource.ListOptions{})
if err != nil {
return fmt.Errorf("error listing check types: %w", err)
}
@@ -199,7 +248,7 @@ func (r *Runner) createChecks(ctx context.Context, logger logging.Logger) error
for !allChecksRegistered && retryCount < waitMaxRetries {
logger.Info("Waiting for all check types to be registered", "retryCount", retryCount, "waitInterval", waitInterval)
time.Sleep(waitInterval)
list, err = r.typesClient.List(ctx, r.namespace, resource.ListOptions{})
list, err = r.typesClient.List(ctx, namespace, resource.ListOptions{})
if err != nil {
return fmt.Errorf("error listing check types: %w", err)
}
@@ -217,7 +266,7 @@ func (r *Runner) createChecks(ctx context.Context, logger logging.Logger) error
obj := &advisorv0alpha1.Check{
ObjectMeta: metav1.ObjectMeta{
GenerateName: "check-",
Namespace: r.namespace,
Namespace: namespace,
Labels: map[string]string{
checks.TypeLabel: checkType.Spec.Name,
},
@@ -225,7 +274,7 @@ func (r *Runner) createChecks(ctx context.Context, logger logging.Logger) error
Spec: advisorv0alpha1.CheckSpec{},
}
id := obj.GetStaticMetadata().Identifier()
_, err := r.client.Create(ctx, id, obj, resource.CreateOptions{})
_, err := r.checksClient.Create(ctx, id, obj, resource.CreateOptions{})
if err != nil {
return fmt.Errorf("error creating check: %w", err)
}
@@ -234,13 +283,13 @@ func (r *Runner) createChecks(ctx context.Context, logger logging.Logger) error
}
// cleanupChecks deletes the olders checks if the number of checks exceeds the limit.
func (r *Runner) cleanupChecks(ctx context.Context, logger logging.Logger) error {
checkList, err := r.listChecks(ctx, logger)
func (r *Runner) cleanupChecks(ctx context.Context, logger logging.Logger, namespace string) error {
checkList, err := r.listChecks(ctx, logger, namespace)
if err != nil {
return err
}
logger.Debug("Cleaning up checks", "numChecks", len(checkList))
logger.Debug("Cleaning up checks", "namespace", namespace, "numChecks", len(checkList))
// organize checks by type
checksByType := map[string][]resource.Object{}
@@ -268,7 +317,7 @@ func (r *Runner) cleanupChecks(ctx context.Context, logger logging.Logger) error
for i := 0; i < len(checks)-r.maxHistory; i++ {
check := checks[i]
id := check.GetStaticMetadata().Identifier()
err := r.client.Delete(ctx, id, resource.DeleteOptions{})
err := r.checksClient.Delete(ctx, id, resource.DeleteOptions{})
if err != nil {
return fmt.Errorf("error deleting check: %w", err)
}
@@ -293,15 +342,28 @@ func getEvaluationInterval(pluginConfig map[string]string) (time.Duration, error
return evaluationInterval, nil
}
func getNextSendInterval(lastCreated time.Time, evaluationInterval time.Duration) time.Duration {
nextSendInterval := time.Until(lastCreated.Add(evaluationInterval))
// Add random variation of one hour
randomVariation := time.Duration(rand.Int63n(time.Hour.Nanoseconds()))
nextSendInterval += randomVariation
if nextSendInterval < time.Minute {
nextSendInterval = 1 * time.Minute
func (r *Runner) getNextEvalTime(defaultEvaluationInterval time.Duration, lastCreated map[string]time.Time) time.Duration {
nextEvalTime := defaultEvaluationInterval
// Get the oldest last created time
baseTime := time.Now()
for _, lastNamespacedCreated := range lastCreated {
if !lastNamespacedCreated.IsZero() && lastNamespacedCreated.Before(baseTime) {
baseTime = lastNamespacedCreated
}
}
return nextSendInterval
// Calculate the next evaluation time and add random variation
nextEvalTime = time.Until(baseTime.Add(nextEvalTime))
randomVariation := time.Duration(rand.Int63n(evalIntervalRandomVariation.Nanoseconds()))
nextEvalTime += randomVariation
// Ensure we always return a positive duration to avoid ticker panics
if nextEvalTime <= 0 {
nextEvalTime = 1 * time.Millisecond
}
return nextEvalTime
}
func getMaxHistory(pluginConfig map[string]string) (int, error) {

View File

@@ -4,26 +4,50 @@ import (
"context"
"errors"
"fmt"
"math/rand/v2"
"testing"
"time"
"github.com/grafana/grafana-app-sdk/logging"
"github.com/grafana/grafana-app-sdk/resource"
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checkregistry"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/services/org"
"github.com/stretchr/testify/assert"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func init() {
waitInterval = 1 * time.Millisecond
evalIntervalRandomVariation = 1 * time.Millisecond
}
// TestRunner_Run tests the main Run function with various scenarios
func TestRunner_Run(t *testing.T) {
t.Run("does not crash when error on list", func(t *testing.T) {
t.Run("handles context cancellation gracefully", func(t *testing.T) {
runner := createTestRunner(&MockClient{}, &MockClient{})
ctx, cancel := context.WithCancel(context.Background())
cancel() // Cancel immediately
err := runner.Run(ctx)
assert.ErrorAs(t, err, &context.Canceled)
})
t.Run("handles timeout gracefully", func(t *testing.T) {
runner := createTestRunner(&MockClient{}, &MockClient{})
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
defer cancel()
err := runner.Run(ctx)
assert.ErrorAs(t, err, &context.DeadlineExceeded)
})
t.Run("handles check list error gracefully", func(t *testing.T) {
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return nil, errors.New("list error")
},
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
return &advisorv0alpha1.Check{}, nil
return nil, errors.New("list checks error")
},
}
@@ -33,352 +57,289 @@ func TestRunner_Run(t *testing.T) {
},
}
runner := &Runner{
client: mockClient,
typesClient: mockTypesClient,
log: &logging.NoOpLogger{},
evaluationInterval: 1 * time.Hour,
}
ctx, cancel := context.WithCancel(context.Background())
cancel()
err := runner.Run(ctx)
assert.ErrorAs(t, err, &context.Canceled)
runner := createTestRunner(mockClient, mockTypesClient)
err := runner.Run(context.Background())
assert.ErrorContains(t, err, "list checks error")
})
}
func TestRunner_checkLastCreated_ErrorOnList(t *testing.T) {
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return nil, errors.New("list error")
},
}
// TestRunner_Run_CheckCreation tests check creation scenarios
func TestRunner_Run_CheckCreation(t *testing.T) {
t.Run("does not create checks on first run when no previous checks exist", func(t *testing.T) {
checksCreated := []string{}
runner := &Runner{
client: mockClient,
log: &logging.NoOpLogger{},
}
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
// Return empty list - no previous checks
return &advisorv0alpha1.CheckList{Items: []advisorv0alpha1.Check{}}, nil
},
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
checksCreated = append(checksCreated, id.Name)
return obj, nil
},
}
lastCreated, err := runner.checkLastCreated(context.Background(), &logging.NoOpLogger{})
assert.Error(t, err)
assert.True(t, lastCreated.IsZero())
}
func TestRunner_checkLastCreated_UnprocessedCheck(t *testing.T) {
patchOperation := resource.PatchOperation{}
identifier := resource.Identifier{}
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckList{
Items: []advisorv0alpha1.Check{
{
ObjectMeta: metav1.ObjectMeta{
Name: "check-1",
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckTypeList{
Items: []advisorv0alpha1.CheckType{
{
ObjectMeta: metav1.ObjectMeta{
Name: "test-check",
},
Spec: advisorv0alpha1.CheckTypeSpec{
Name: "test-check",
},
},
},
},
}, nil
},
patchFunc: func(ctx context.Context, id resource.Identifier, patch resource.PatchRequest, options resource.PatchOptions, into resource.Object) error {
patchOperation = patch.Operations[0]
identifier = id
return nil
},
}
}, nil
},
}
runner := &Runner{
client: mockClient,
log: &logging.NoOpLogger{},
}
// Create a mock check service with one check to match the check type
mockCheckService := &MockCheckService{checks: []checks.Check{&mockCheck{id: "test-check"}}}
runner := createTestRunnerWithRegistry(mockClient, mockTypesClient, mockCheckService)
lastCreated, err := runner.checkLastCreated(context.Background(), &logging.NoOpLogger{})
assert.NoError(t, err)
assert.True(t, lastCreated.IsZero())
assert.Equal(t, "check-1", identifier.Name)
assert.Equal(t, "/metadata/annotations", patchOperation.Path)
expectedAnnotations := map[string]string{
checks.StatusAnnotation: "error",
}
assert.Equal(t, expectedAnnotations, patchOperation.Value)
}
err := runAndTimeout(runner)
assert.ErrorAs(t, err, &context.DeadlineExceeded)
// Should not create checks on first run when no previous checks exist
assert.Empty(t, checksCreated, "Should not create checks on first run when no previous checks exist")
})
func TestRunner_checkLastCreated_PaginatedResponse(t *testing.T) {
// Create checks with different creation times
past := time.Now().Add(-1 * time.Hour)
now := time.Now()
t.Run("creates checks when evaluation interval has passed", func(t *testing.T) {
checksCreated := []string{}
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
if options.Continue == "" {
// First page - return oldest and middle checks with continue token
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
// Return a check that was created long ago (past the evaluation interval)
return &advisorv0alpha1.CheckList{
ListMeta: metav1.ListMeta{
Continue: "continue-token-123",
},
Items: []advisorv0alpha1.Check{
{
ObjectMeta: metav1.ObjectMeta{
Name: "check-1",
CreationTimestamp: metav1.NewTime(past),
Name: "old-check",
CreationTimestamp: metav1.NewTime(time.Now().Add(-15 * 24 * time.Hour)), // 15 days ago
Annotations: map[string]string{
checks.StatusAnnotation: "completed",
},
},
},
{
ObjectMeta: metav1.ObjectMeta{
Name: "check-2",
CreationTimestamp: metav1.NewTime(past),
Annotations: map[string]string{
checks.StatusAnnotation: "completed",
checks.StatusAnnotation: checks.StatusAnnotationProcessed,
},
},
},
},
}, nil
}
// Second page - verify continue token is passed and return newest check
assert.Equal(t, "continue-token-123", options.Continue)
return &advisorv0alpha1.CheckList{
Items: []advisorv0alpha1.Check{
{
ObjectMeta: metav1.ObjectMeta{
Name: "check-3",
CreationTimestamp: metav1.NewTime(now),
Annotations: map[string]string{
checks.StatusAnnotation: "completed",
},
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
checksCreated = append(checksCreated, id.Name)
return obj, nil
},
}
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckTypeList{
Items: []advisorv0alpha1.CheckType{
{
ObjectMeta: metav1.ObjectMeta{
Name: "test-check",
},
Spec: advisorv0alpha1.CheckTypeSpec{
Name: "test-check",
},
},
},
},
}, nil
},
}
}, nil
},
}
runner := &Runner{
client: mockClient,
log: &logging.NoOpLogger{},
}
// Create a mock check service with one check to match the check type
mockCheckService := &MockCheckService{checks: []checks.Check{&mockCheck{id: "test-check"}}}
runner := createTestRunnerWithRegistry(mockClient, mockTypesClient, mockCheckService)
lastCreated, err := runner.checkLastCreated(context.Background(), &logging.NoOpLogger{})
assert.NoError(t, err)
assert.Equal(t, now.Truncate(time.Second), lastCreated.Truncate(time.Second))
err := runAndTimeout(runner)
assert.ErrorAs(t, err, &context.DeadlineExceeded)
// Should create checks when the evaluation interval has passed
assert.Greater(t, len(checksCreated), 0, "Should create checks when evaluation interval has passed")
})
}
func TestRunner_createChecks_ErrorOnCreate(t *testing.T) {
mockCheckService := &MockCheckService{checks: []checks.Check{&mockCheck{id: "check-1"}}}
// TestRunner_Run_CheckCleanup tests check cleanup scenarios
func TestRunner_Run_CheckCleanup(t *testing.T) {
t.Run("cleans up old checks when limit exceeded", func(t *testing.T) {
checksDeleted := []string{}
mockClient := &MockClient{
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
return nil, errors.New("create error")
},
}
// Create checks that exceed the max history limit
items := make([]advisorv0alpha1.Check, 0, defaultMaxHistory+2)
for i := 0; i < defaultMaxHistory+2; i++ {
item := advisorv0alpha1.Check{}
item.SetName(fmt.Sprintf("check-%d", i))
item.SetLabels(map[string]string{
checks.TypeLabel: "test-type",
})
item.SetCreationTimestamp(metav1.NewTime(time.Now().Add(-time.Duration(i) * time.Hour)))
items = append(items, item)
}
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
checkType := &advisorv0alpha1.CheckType{}
checkType.Spec.Name = "check-1"
return &advisorv0alpha1.CheckTypeList{
Items: []advisorv0alpha1.CheckType{*checkType},
}, nil
},
}
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckList{Items: items}, nil
},
deleteFunc: func(ctx context.Context, id resource.Identifier, opts resource.DeleteOptions) error {
checksDeleted = append(checksDeleted, id.Name)
return nil
},
}
runner := &Runner{
checkRegistry: mockCheckService,
client: mockClient,
typesClient: mockTypesClient,
log: &logging.NoOpLogger{},
}
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckTypeList{Items: []advisorv0alpha1.CheckType{}}, nil
},
}
err := runner.createChecks(context.Background(), &logging.NoOpLogger{})
assert.Error(t, err)
runner := createTestRunner(mockClient, mockTypesClient)
err := runAndTimeout(runner)
assert.ErrorAs(t, err, &context.DeadlineExceeded)
// Should delete some checks due to cleanup
assert.Greater(t, len(checksDeleted), 0)
})
}
func TestRunner_createChecks_Success(t *testing.T) {
mockCheckService := &MockCheckService{checks: []checks.Check{&mockCheck{id: "check-1"}}}
// TestRunner_Run_UnprocessedChecks tests handling of unprocessed checks
func TestRunner_Run_UnprocessedChecks(t *testing.T) {
t.Run("marks unprocessed checks as error", func(t *testing.T) {
patchOperations := []resource.PatchOperation{}
mockClient := &MockClient{
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
return &advisorv0alpha1.Check{}, nil
},
}
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckList{
Items: []advisorv0alpha1.Check{
{
ObjectMeta: metav1.ObjectMeta{
Name: "unprocessed-check",
CreationTimestamp: metav1.NewTime(time.Now().Add(-1 * time.Hour)),
// No status annotation - unprocessed
},
},
},
}, nil
},
patchFunc: func(ctx context.Context, id resource.Identifier, patch resource.PatchRequest, options resource.PatchOptions, into resource.Object) error {
patchOperations = append(patchOperations, patch.Operations...)
return nil
},
}
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
checkType := &advisorv0alpha1.CheckType{}
checkType.Spec.Name = "check-1"
return &advisorv0alpha1.CheckTypeList{
Items: []advisorv0alpha1.CheckType{*checkType},
}, nil
},
}
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckTypeList{Items: []advisorv0alpha1.CheckType{}}, nil
},
}
runner := &Runner{
checkRegistry: mockCheckService,
client: mockClient,
typesClient: mockTypesClient,
log: &logging.NoOpLogger{},
}
runner := createTestRunner(mockClient, mockTypesClient)
err := runner.createChecks(context.Background(), &logging.NoOpLogger{})
assert.NoError(t, err)
err := runAndTimeout(runner)
assert.ErrorAs(t, err, &context.DeadlineExceeded)
// Should patch unprocessed check with error status
assert.Greater(t, len(patchOperations), 0)
})
}
func TestRunner_cleanupChecks_ErrorOnList(t *testing.T) {
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return nil, errors.New("list error")
},
}
// TestRunner_Run_Pagination tests pagination handling
func TestRunner_Run_Pagination(t *testing.T) {
t.Run("handles paginated check lists", func(t *testing.T) {
callCount := 0
runner := &Runner{
client: mockClient,
log: &logging.NoOpLogger{},
}
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
callCount++
if callCount == 1 {
return &advisorv0alpha1.CheckList{
ListMeta: metav1.ListMeta{Continue: "continue-token"},
Items: []advisorv0alpha1.Check{
{ObjectMeta: metav1.ObjectMeta{Name: "check-1"}},
},
}, nil
}
return &advisorv0alpha1.CheckList{
Items: []advisorv0alpha1.Check{
{ObjectMeta: metav1.ObjectMeta{Name: "check-2"}},
},
}, nil
},
}
err := runner.cleanupChecks(context.Background(), &logging.NoOpLogger{})
assert.Error(t, err)
mockTypesClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckTypeList{Items: []advisorv0alpha1.CheckType{}}, nil
},
}
runner := createTestRunner(mockClient, mockTypesClient)
err := runAndTimeout(runner)
assert.ErrorAs(t, err, &context.DeadlineExceeded)
// Should handle pagination correctly
assert.GreaterOrEqual(t, callCount, 2)
})
}
func TestRunner_cleanupChecks_WithinMax(t *testing.T) {
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckList{
Items: []advisorv0alpha1.Check{{}, {}},
}, nil
},
deleteFunc: func(ctx context.Context, identifier resource.Identifier, options resource.DeleteOptions) error {
return fmt.Errorf("shouldn't be called")
},
}
// Helper functions
runner := &Runner{
client: mockClient,
log: &logging.NoOpLogger{},
}
err := runner.cleanupChecks(context.Background(), &logging.NoOpLogger{})
assert.NoError(t, err)
// runAndTimeout runs a runner with a short timeout for testing purposes.
// This is used to terminate the runner's infinite loop in tests that don't specifically test timeout behavior.
func runAndTimeout(runner *Runner) error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Millisecond)
defer cancel()
return runner.Run(ctx)
}
func TestRunner_cleanupChecks_ErrorOnDelete(t *testing.T) {
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
items := make([]advisorv0alpha1.Check, 0, defaultMaxHistory+1)
for i := 0; i < defaultMaxHistory+1; i++ {
item := advisorv0alpha1.Check{}
item.SetLabels(map[string]string{
checks.TypeLabel: "mock",
})
items = append(items, item)
}
return &advisorv0alpha1.CheckList{
Items: items,
}, nil
},
deleteFunc: func(ctx context.Context, identifier resource.Identifier, options resource.DeleteOptions) error {
return errors.New("delete error")
},
}
runner := &Runner{
client: mockClient,
maxHistory: defaultMaxHistory,
log: &logging.NoOpLogger{},
}
err := runner.cleanupChecks(context.Background(), &logging.NoOpLogger{})
assert.ErrorContains(t, err, "delete error")
// createTestRunner creates a test runner with mock clients
func createTestRunner(checkClient, typesClient *MockClient) *Runner {
return createTestRunnerWithRegistry(checkClient, typesClient, &MockCheckService{checks: []checks.Check{}})
}
func TestRunner_cleanupChecks_Success(t *testing.T) {
itemsDeleted := []string{}
items := make([]advisorv0alpha1.Check, 0, defaultMaxHistory+1)
for i := 0; i < defaultMaxHistory+1; i++ {
item := advisorv0alpha1.Check{}
item.SetName(fmt.Sprintf("check-%d", i))
item.SetLabels(map[string]string{
checks.TypeLabel: "mock",
})
item.SetCreationTimestamp(metav1.NewTime(time.Time{}.Add(time.Duration(i) * time.Hour)))
items = append(items, item)
// createTestRunnerWithRegistry creates a test runner with mock clients and custom registry
func createTestRunnerWithRegistry(checkClient, typesClient *MockClient, checkRegistry checkregistry.CheckService) *Runner {
// Ensure mock clients have default implementations
if checkClient.listFunc == nil {
checkClient.listFunc = func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckList{Items: []advisorv0alpha1.Check{}}, nil
}
}
// shuffle the items to ensure the oldest are deleted
rand.Shuffle(len(items), func(i, j int) { items[i], items[j] = items[j], items[i] })
mockClient := &MockClient{
listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
return &advisorv0alpha1.CheckList{
Items: items,
}, nil
},
deleteFunc: func(ctx context.Context, identifier resource.Identifier, options resource.DeleteOptions) error {
itemsDeleted = append(itemsDeleted, identifier.Name)
if checkClient.createFunc == nil {
checkClient.createFunc = func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
return obj, nil
}
}
if checkClient.deleteFunc == nil {
checkClient.deleteFunc = func(ctx context.Context, id resource.Identifier, opts resource.DeleteOptions) error {
return nil
},
}
}
if checkClient.patchFunc == nil {
checkClient.patchFunc = func(ctx context.Context, id resource.Identifier, patch resource.PatchRequest, opts resource.PatchOptions, into resource.Object) error {
return nil
}
}
runner := &Runner{
client: mockClient,
maxHistory: defaultMaxHistory,
log: &logging.NoOpLogger{},
if typesClient.listFunc == nil {
typesClient.listFunc = func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
// Return empty list to match the empty MockCheckService
return &advisorv0alpha1.CheckTypeList{Items: []advisorv0alpha1.CheckType{}}, nil
}
}
return &Runner{
checkRegistry: checkRegistry,
checksClient: checkClient,
typesClient: typesClient,
defaultEvalInterval: 5 * time.Millisecond,
maxHistory: defaultMaxHistory,
log: &logging.NoOpLogger{},
orgService: &mockOrgService{orgs: []*org.OrgDTO{{ID: 1}}},
stackID: "",
}
err := runner.cleanupChecks(context.Background(), &logging.NoOpLogger{})
assert.NoError(t, err)
assert.Equal(t, []string{"check-0"}, itemsDeleted)
}
func Test_getEvaluationInterval(t *testing.T) {
t.Run("default", func(t *testing.T) {
interval, err := getEvaluationInterval(map[string]string{})
assert.NoError(t, err)
assert.Equal(t, 7*24*time.Hour, interval)
})
t.Run("invalid", func(t *testing.T) {
interval, err := getEvaluationInterval(map[string]string{"evaluation_interval": "invalid"})
assert.Error(t, err)
assert.Zero(t, interval)
})
t.Run("custom", func(t *testing.T) {
interval, err := getEvaluationInterval(map[string]string{"evaluation_interval": "1h"})
assert.NoError(t, err)
assert.Equal(t, time.Hour, interval)
})
}
func Test_getMaxHistory(t *testing.T) {
t.Run("default", func(t *testing.T) {
history, err := getMaxHistory(map[string]string{})
assert.NoError(t, err)
assert.Equal(t, 10, history)
})
t.Run("invalid", func(t *testing.T) {
history, err := getMaxHistory(map[string]string{"max_history": "invalid"})
assert.Error(t, err)
assert.Zero(t, history)
})
t.Run("custom", func(t *testing.T) {
history, err := getMaxHistory(map[string]string{"max_history": "5"})
assert.NoError(t, err)
assert.Equal(t, 5, history)
})
}
func Test_getNextSendInterval(t *testing.T) {
lastCreated := time.Now().Add(-7 * 24 * time.Hour)
evaluationInterval := 7 * 24 * time.Hour
nextSendInterval := getNextSendInterval(lastCreated, evaluationInterval)
// The next send interval should be in < 1 hour
assert.True(t, nextSendInterval < time.Hour)
// Calculate the next send interval again and it should be different
nextSendInterval2 := getNextSendInterval(lastCreated, evaluationInterval)
assert.NotEqual(t, nextSendInterval, nextSendInterval2)
}
// Mock implementations
type MockClient struct {
resource.Client
@@ -414,7 +375,6 @@ func (m *MockCheckService) Checks() []checks.Check {
type mockCheck struct {
checks.Check
id string
steps []checks.Step
}
@@ -426,3 +386,12 @@ func (m *mockCheck) ID() string {
func (m *mockCheck) Steps() []checks.Step {
return m.steps
}
type mockOrgService struct {
org.Service
orgs []*org.OrgDTO
}
func (m *mockOrgService) Search(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error) {
return m.orgs, nil
}

View File

@@ -16,6 +16,7 @@ import (
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checkregistry"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/services/org"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
@@ -26,24 +27,24 @@ import (
type Runner struct {
checkRegistry checkregistry.CheckService
client resource.Client
namespace string
orgService org.Service
stackID string
log logging.Logger
retryAttempts int
retryDelay time.Duration
}
var _ app.Runnable = (*Runner)(nil)
// NewRunner creates a new Runner.
func New(cfg app.Config, log logging.Logger) (app.Runnable, error) {
func New(cfg app.Config, log logging.Logger) (*Runner, error) {
// Read config
specificConfig, ok := cfg.SpecificConfig.(checkregistry.AdvisorAppConfig)
if !ok {
return nil, fmt.Errorf("invalid config type")
}
checkRegistry := specificConfig.CheckRegistry
namespace, err := checks.GetNamespace(specificConfig.StackID)
if err != nil {
return nil, err
}
orgService := specificConfig.OrgService
// Prepare storage client
clientGenerator := k8s.NewClientRegistry(cfg.KubeConfig, k8s.ClientConfig{})
@@ -55,7 +56,8 @@ func New(cfg app.Config, log logging.Logger) (app.Runnable, error) {
return &Runner{
checkRegistry: checkRegistry,
client: client,
namespace: namespace,
orgService: orgService,
stackID: specificConfig.StackID,
log: log.With("runner", "advisor.checktyperegisterer"),
retryAttempts: 5,
retryDelay: time.Second * 10,
@@ -64,36 +66,24 @@ func New(cfg app.Config, log logging.Logger) (app.Runnable, error) {
func (r *Runner) Run(ctx context.Context) error {
logger := r.log.WithContext(ctx)
for _, t := range r.checkRegistry.Checks() {
steps := t.Steps()
stepTypes := make([]advisorv0alpha1.CheckTypeStep, len(steps))
for i, s := range steps {
stepTypes[i] = advisorv0alpha1.CheckTypeStep{
Title: s.Title(),
Description: s.Description(),
StepID: s.ID(),
Resolution: s.Resolution(),
}
}
obj := &advisorv0alpha1.CheckType{
ObjectMeta: metav1.ObjectMeta{
Name: t.ID(),
Namespace: r.namespace,
Annotations: map[string]string{
checks.NameAnnotation: t.Name(),
// Flag to indicate feature availability
checks.RetryAnnotation: "1",
checks.IgnoreStepsAnnotation: "1",
},
},
Spec: advisorv0alpha1.CheckTypeSpec{
Name: t.ID(),
Steps: stepTypes,
},
}
err := r.registerCheckType(ctx, logger, t.ID(), obj)
// If stackID is empty and OrgService is nil, do nothing (on-demand registration only)
if r.stackID == "" && r.orgService == nil {
logger.Debug("Auto-registration of checktypes disabled")
return nil
}
// Determine namespaces based on StackID or OrgID
namespaces, err := checks.GetNamespaces(ctx, r.stackID, r.orgService)
if err != nil {
return fmt.Errorf("failed to get namespaces: %w", err)
}
logger.Debug("Registering check types", "namespaces", len(namespaces))
// Register check types in each namespace
for _, namespace := range namespaces {
err := r.RegisterCheckTypesInNamespace(ctx, logger, namespace)
if err != nil {
return err
return fmt.Errorf("failed to register check types in namespace %s: %w", namespace, err)
}
}
return nil
@@ -227,3 +217,38 @@ func isAPIServerShuttingDown(err error, logger logging.Logger) bool {
}
return false
}
func (r *Runner) RegisterCheckTypesInNamespace(ctx context.Context, logger logging.Logger, namespace string) error {
for _, t := range r.checkRegistry.Checks() {
steps := t.Steps()
stepTypes := make([]advisorv0alpha1.CheckTypeStep, len(steps))
for i, s := range steps {
stepTypes[i] = advisorv0alpha1.CheckTypeStep{
Title: s.Title(),
Description: s.Description(),
StepID: s.ID(),
Resolution: s.Resolution(),
}
}
obj := &advisorv0alpha1.CheckType{
ObjectMeta: metav1.ObjectMeta{
Name: t.ID(),
Namespace: namespace,
Annotations: map[string]string{
checks.NameAnnotation: t.Name(),
// Flag to indicate feature availability
checks.RetryAnnotation: "1",
checks.IgnoreStepsAnnotation: "1",
},
},
Spec: advisorv0alpha1.CheckTypeSpec{
Name: t.ID(),
Steps: stepTypes,
},
}
if err := r.registerCheckType(ctx, logger, t.ID(), obj); err != nil {
return fmt.Errorf("failed to register check type %s: %w", t.ID(), err)
}
}
return nil
}

View File

@@ -10,6 +10,7 @@ import (
"github.com/grafana/grafana-app-sdk/resource"
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/services/org"
k8sErrs "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -67,14 +68,17 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
tests := []struct {
name string
checks []checks.Check
stackID string
orgService org.Service
getFunc func(ctx context.Context, id resource.Identifier) (resource.Object, error)
createFunc func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error)
updateFunc func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.UpdateOptions) (resource.Object, error)
expectedErr error
}{
{
name: "successful create",
checks: []checks.Check{newMockCheck},
name: "successful create",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return nil, k8sErrs.NewNotFound(schema.GroupResource{}, id.Name)
},
@@ -85,8 +89,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: nil,
},
{
name: "resource exists with different annotations, should update",
checks: []checks.Check{newMockCheck},
name: "resource exists with different annotations, should update",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectDifferentAnnotations, nil
},
@@ -96,8 +101,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: nil,
},
{
name: "resource exists with different steps, should update",
checks: []checks.Check{newMockCheck},
name: "resource exists with different steps, should update",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectDifferentSteps, nil
},
@@ -107,8 +113,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: nil,
},
{
name: "resource exists with same annotations and steps, should not update",
checks: []checks.Check{newMockCheck},
name: "resource exists with same annotations and steps, should not update",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectSameContent, nil
},
@@ -118,8 +125,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: nil,
},
{
name: "resource exists, with custom annotations preserved",
checks: []checks.Check{newMockCheck},
name: "resource exists, with custom annotations preserved",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectDifferentAnnotations, nil
},
@@ -132,8 +140,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: nil,
},
{
name: "create error",
checks: []checks.Check{newMockCheck},
name: "create error",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return nil, k8sErrs.NewNotFound(schema.GroupResource{}, id.Name)
},
@@ -144,8 +153,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: errors.New("create error"),
},
{
name: "update error",
checks: []checks.Check{newMockCheck},
name: "update error",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectDifferentAnnotations, nil
},
@@ -155,8 +165,9 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: errors.New("update error"),
},
{
name: "shutting down error",
checks: []checks.Check{newMockCheck},
name: "shutting down error",
checks: []checks.Check{newMockCheck},
stackID: "123",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectDifferentAnnotations, nil
},
@@ -166,14 +177,33 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
expectedErr: nil,
},
{
name: "custom namespace",
checks: []checks.Check{newMockCheck},
name: "cloud stack namespace",
checks: []checks.Check{newMockCheck},
stackID: "456",
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return existingObjectDifferentAnnotations, nil
return nil, k8sErrs.NewNotFound(schema.GroupResource{}, id.Name)
},
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
if obj.GetNamespace() != "custom-namespace" {
return nil, fmt.Errorf("expected namespace %s, got %s", "custom-namespace", obj.GetNamespace())
if obj.GetNamespace() != "stack-456" {
return nil, fmt.Errorf("expected namespace %s, got %s", "stack-456", obj.GetNamespace())
}
return obj, nil
},
expectedErr: nil,
},
{
name: "multiple orgs",
checks: []checks.Check{newMockCheck},
stackID: "",
orgService: &mockOrgService{orgs: []*org.OrgDTO{{ID: 1, Name: "Org1"}, {ID: 2, Name: "Org2"}}},
getFunc: func(ctx context.Context, id resource.Identifier) (resource.Object, error) {
return nil, k8sErrs.NewNotFound(schema.GroupResource{}, id.Name)
},
createFunc: func(ctx context.Context, id resource.Identifier, obj resource.Object, opts resource.CreateOptions) (resource.Object, error) {
// Should create in both org-1 and org-2 namespaces
ns := obj.GetNamespace()
if ns != "org-1" && ns != "org-2" {
return nil, fmt.Errorf("expected namespace org-1 or org-2, got %s", ns)
}
return obj, nil
},
@@ -183,6 +213,10 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
orgSvc := tt.orgService
if orgSvc == nil {
orgSvc = &mockOrgService{orgs: []*org.OrgDTO{}}
}
r := &Runner{
checkRegistry: &mockCheckRegistry{checks: tt.checks},
client: &mockClient{
@@ -190,7 +224,8 @@ func TestCheckTypesRegisterer_Run(t *testing.T) {
createFunc: tt.createFunc,
updateFunc: tt.updateFunc,
},
namespace: "custom-namespace",
orgService: orgSvc,
stackID: tt.stackID,
log: logging.DefaultLogger,
retryAttempts: 1,
retryDelay: 0,
@@ -298,3 +333,12 @@ func (m *mockClient) Update(ctx context.Context, id resource.Identifier, obj res
}
return nil, errors.New("not implemented")
}
type mockOrgService struct {
org.Service
orgs []*org.OrgDTO
}
func (m *mockOrgService) Search(ctx context.Context, query *org.SearchOrgsQuery) ([]*org.OrgDTO, error) {
return m.orgs, nil
}

View File

@@ -9,6 +9,7 @@ import (
"sync"
"time"
"github.com/grafana/authlib/types"
"github.com/grafana/grafana-app-sdk/logging"
"github.com/grafana/grafana-app-sdk/resource"
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
@@ -317,3 +318,12 @@ func waitForRetryAnnotation(ctx context.Context, log logging.Logger, client reso
log.Debug("Retry annotation persisted", "check", obj.GetName(), "item", itemToRetry)
return nil
}
// getOrgIDFromNamespace extracts the org ID from a namespace using the standard authlib parser.
func getOrgIDFromNamespace(namespace string) (int64, error) {
info, err := types.ParseNamespace(namespace)
if err != nil {
return 0, fmt.Errorf("failed to parse namespace %s: %w", namespace, err)
}
return info.OrgID, nil
}

View File

@@ -3,19 +3,20 @@ module github.com/grafana/grafana/apps/alerting/alertenrichment
go 1.25.3
require (
github.com/grafana/grafana-app-sdk v0.46.0
github.com/grafana/grafana-app-sdk v0.48.2
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250901080157-a0280d701b28
k8s.io/apimachinery v0.34.1
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b
k8s.io/apimachinery v0.34.2
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912
)
require (
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/jsonpointer v0.22.1 // indirect
github.com/go-openapi/jsonreference v0.21.2 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-openapi/swag/jsonname v0.25.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gnostic-models v0.7.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
@@ -24,11 +25,11 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/net v0.45.0 // indirect
golang.org/x/text v0.30.0 // indirect
google.golang.org/protobuf v1.36.9 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/text v0.31.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/klog/v2 v2.130.1 // indirect

View File

@@ -8,12 +8,14 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk=
github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM=
github.com/go-openapi/jsonreference v0.21.2 h1:Wxjda4M/BBQllegefXrY/9aq1fxBA8sI5M/lFU6tSWU=
github.com/go-openapi/jsonreference v0.21.2/go.mod h1:pp3PEjIsJ9CZDGCNOyXIQxsNuroxm8FAJ/+quA0yKzQ=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU=
github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
@@ -21,8 +23,8 @@ github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7O
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/grafana/grafana-app-sdk v0.46.0 h1:gvzQvCQgZJ/73BfAcbDt/6TAMhnVikVPxZt/UwDl+oc=
github.com/grafana/grafana-app-sdk v0.46.0/go.mod h1:LCTrqR1SwBS13XGVYveBmM7giJDDjzuXK+M9VzPuPWc=
github.com/grafana/grafana-app-sdk v0.48.2 h1:CQQDhwo1fWaXQVKvxxOcK6azbuY3E2TgJHNAZlYYn7U=
github.com/grafana/grafana-app-sdk v0.48.2/go.mod h1:LDOvQ7OOyHLcXdSa0InATCa5OMoYAd6E1+rGLrMgHuk=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250901080157-a0280d701b28 h1:PgMfX4OPENz/iXmtDDIW9+poZY4UD0hhmXm7flVclDo=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250901080157-a0280d701b28/go.mod h1:av5N0Naq+8VV9MLF7zAkihy/mVq5UbS2EvRSJukDHlY=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -58,8 +60,8 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -71,8 +73,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM=
golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -81,8 +83,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -91,8 +93,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -100,12 +102,12 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4=
k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4=
k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE=
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=

View File

@@ -1,8 +1,11 @@
include ../../sdk.mk
.PHONY: generate
generate: do-generate ## Run Grafana App SDK code generation
.PHONY: do-generate
do-generate: install-app-sdk update-app-sdk
@$(APP_SDK_BIN) generate --grouping=group --gogenpath=./pkg/apis --defencoding=yaml --postprocess
.PHONY: generate # Run Grafana App SDK code generation
generate: install-app-sdk update-app-sdk
@$(APP_SDK_BIN) generate \
--source=./kinds/ \
--gogenpath=./pkg/apis \
--grouping=group \
--genoperatorstate=false \
--defencoding=none

View File

@@ -3,11 +3,11 @@ module github.com/grafana/grafana/apps/alerting/notifications
go 1.25.3
require (
github.com/grafana/grafana-app-sdk v0.46.0
github.com/grafana/grafana-app-sdk/logging v0.45.0
k8s.io/apimachinery v0.34.1
k8s.io/apiserver v0.34.1
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b
github.com/grafana/grafana-app-sdk v0.48.2
github.com/grafana/grafana-app-sdk/logging v0.48.1
k8s.io/apimachinery v0.34.2
k8s.io/apiserver v0.34.2
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912
)
require (
@@ -26,17 +26,18 @@ require (
github.com/getkin/kin-openapi v0.133.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/jsonpointer v0.22.1 // indirect
github.com/go-openapi/jsonreference v0.21.2 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-openapi/swag/jsonname v0.25.1 // indirect
github.com/go-test/deep v1.1.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/google/gnostic-models v0.7.0 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
@@ -58,7 +59,7 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.66.1 // indirect
github.com/prometheus/common v0.67.3 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
@@ -81,27 +82,27 @@ require (
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v2 v2.4.3 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/net v0.45.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.36.0 // indirect
golang.org/x/term v0.35.0 // indirect
golang.org/x/text v0.30.0 // indirect
golang.org/x/time v0.13.0 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/oauth2 v0.33.0 // indirect
golang.org/x/sync v0.18.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/term v0.37.0 // indirect
golang.org/x/text v0.31.0 // indirect
golang.org/x/time v0.14.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 // indirect
google.golang.org/grpc v1.75.1 // indirect
google.golang.org/protobuf v1.36.9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797 // indirect
google.golang.org/grpc v1.76.0 // indirect
google.golang.org/protobuf v1.36.10 // indirect
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.34.1 // indirect
k8s.io/apiextensions-apiserver v0.34.1 // indirect
k8s.io/client-go v0.34.1 // indirect
k8s.io/component-base v0.34.1 // indirect
k8s.io/api v0.34.2 // indirect
k8s.io/apiextensions-apiserver v0.34.2 // indirect
k8s.io/client-go v0.34.2 // indirect
k8s.io/component-base v0.34.2 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect

View File

@@ -36,12 +36,14 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk=
github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM=
github.com/go-openapi/jsonreference v0.21.2 h1:Wxjda4M/BBQllegefXrY/9aq1fxBA8sI5M/lFU6tSWU=
github.com/go-openapi/jsonreference v0.21.2/go.mod h1:pp3PEjIsJ9CZDGCNOyXIQxsNuroxm8FAJ/+quA0yKzQ=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU=
github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
@@ -69,14 +71,14 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
github.com/grafana/grafana-app-sdk v0.46.0 h1:gvzQvCQgZJ/73BfAcbDt/6TAMhnVikVPxZt/UwDl+oc=
github.com/grafana/grafana-app-sdk v0.46.0/go.mod h1:LCTrqR1SwBS13XGVYveBmM7giJDDjzuXK+M9VzPuPWc=
github.com/grafana/grafana-app-sdk/logging v0.45.0 h1:0SH6nYZpiLBZRwUq4J6+1vo8xuHKJjnO95/2pGOoA8w=
github.com/grafana/grafana-app-sdk/logging v0.45.0/go.mod h1:Gh/nBWnspK3oDNWtiM5qUF/fardHzOIEez+SPI3JeHA=
github.com/grafana/grafana-app-sdk v0.48.2 h1:CQQDhwo1fWaXQVKvxxOcK6azbuY3E2TgJHNAZlYYn7U=
github.com/grafana/grafana-app-sdk v0.48.2/go.mod h1:LDOvQ7OOyHLcXdSa0InATCa5OMoYAd6E1+rGLrMgHuk=
github.com/grafana/grafana-app-sdk/logging v0.48.1 h1:veM0X5LAPyN3KsDLglWjIofndbGuf7MqnrDuDN+F/Ng=
github.com/grafana/grafana-app-sdk/logging v0.48.1/go.mod h1:Gh/nBWnspK3oDNWtiM5qUF/fardHzOIEez+SPI3JeHA=
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o=
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 h1:uGoIog/wiQHI9GAxXO5TJbT0wWKH3O9HhOJW1F9c3fY=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
@@ -138,8 +140,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
github.com/prometheus/common v0.67.3 h1:shd26MlnwTw5jksTDhC7rTQIteBxy+ZZDr3t7F2xN2Q=
github.com/prometheus/common v0.67.3/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
@@ -215,15 +217,15 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU=
golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -234,39 +236,39 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM=
golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo=
golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI=
golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -279,13 +281,13 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 h1:d8Nakh1G+ur7+P3GcMjpRDEkoLUcLW2iU92XVqR+XMQ=
google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090/go.mod h1:U8EXRNSd8sUYyDfs/It7KVWodQr+Hf9xtxyxWudSwEw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797 h1:CirRxTOwnRWVLKzDNrs0CXAaVozJoR4G9xvdRecrdpk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251002232023-7c0ddcbb5797/go.mod h1:HSkG/KdJWusxU1F6CNrwNDjBMgisKxGnc5dAZfT0mjQ=
google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -298,22 +300,22 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYs
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM=
k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk=
k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI=
k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc=
k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4=
k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
k8s.io/apiserver v0.34.1 h1:U3JBGdgANK3dfFcyknWde1G6X1F4bg7PXuvlqt8lITA=
k8s.io/apiserver v0.34.1/go.mod h1:eOOc9nrVqlBI1AFCvVzsob0OxtPZUCPiUJL45JOTBG0=
k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY=
k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8=
k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A=
k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0=
k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY=
k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw=
k8s.io/apiextensions-apiserver v0.34.2 h1:WStKftnGeoKP4AZRz/BaAAEJvYp4mlZGN0UCv+uvsqo=
k8s.io/apiextensions-apiserver v0.34.2/go.mod h1:398CJrsgXF1wytdaanynDpJ67zG4Xq7yj91GrmYN2SE=
k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4=
k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw=
k8s.io/apiserver v0.34.2 h1:2/yu8suwkmES7IzwlehAovo8dDE07cFRC7KMDb1+MAE=
k8s.io/apiserver v0.34.2/go.mod h1:gqJQy2yDOB50R3JUReHSFr+cwJnL8G1dzTA0YLEqAPI=
k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M=
k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE=
k8s.io/component-base v0.34.2 h1:HQRqK9x2sSAsd8+R4xxRirlTjowsg6fWCPwWYeSvogQ=
k8s.io/component-base v0.34.2/go.mod h1:9xw2FHJavUHBFpiGkZoKuYZ5pdtLKe97DEByaA+hHbM=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA=
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE=
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=

View File

@@ -4,7 +4,6 @@ import (
"context"
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type ReceiverClient struct {
@@ -76,24 +75,6 @@ func (c *ReceiverClient) Patch(ctx context.Context, identifier resource.Identifi
return c.client.Patch(ctx, identifier, req, opts)
}
func (c *ReceiverClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus ReceiverStatus, opts resource.UpdateOptions) (*Receiver, error) {
return c.client.Update(ctx, &Receiver{
TypeMeta: metav1.TypeMeta{
Kind: ReceiverKind().Kind(),
APIVersion: GroupVersion.Identifier(),
},
ObjectMeta: metav1.ObjectMeta{
ResourceVersion: opts.ResourceVersion,
Namespace: identifier.Namespace,
Name: identifier.Name,
},
Status: newStatus,
}, resource.UpdateOptions{
Subresource: "status",
ResourceVersion: opts.ResourceVersion,
})
}
func (c *ReceiverClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error {
return c.client.Delete(ctx, identifier, opts)
}

View File

@@ -21,8 +21,6 @@ type Receiver struct {
// Spec is the spec of the Receiver
Spec ReceiverSpec `json:"spec" yaml:"spec"`
Status ReceiverStatus `json:"status" yaml:"status"`
}
func (o *Receiver) GetSpec() any {
@@ -39,15 +37,11 @@ func (o *Receiver) SetSpec(spec any) error {
}
func (o *Receiver) GetSubresources() map[string]any {
return map[string]any{
"status": o.Status,
}
return map[string]any{}
}
func (o *Receiver) GetSubresource(name string) (any, bool) {
switch name {
case "status":
return o.Status, true
default:
return nil, false
}
@@ -55,13 +49,6 @@ func (o *Receiver) GetSubresource(name string) (any, bool) {
func (o *Receiver) SetSubresource(name string, value any) error {
switch name {
case "status":
cast, ok := value.(ReceiverStatus)
if !ok {
return fmt.Errorf("cannot set status type %#v, not of type ReceiverStatus", value)
}
o.Status = cast
return nil
default:
return fmt.Errorf("subresource '%s' does not exist", name)
}
@@ -233,7 +220,6 @@ func (o *Receiver) DeepCopyInto(dst *Receiver) {
dst.TypeMeta.Kind = o.TypeMeta.Kind
o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta)
o.Spec.DeepCopyInto(&dst.Spec)
o.Status.DeepCopyInto(&dst.Status)
}
// Interface compliance compile-time check
@@ -305,15 +291,3 @@ func (s *ReceiverSpec) DeepCopy() *ReceiverSpec {
func (s *ReceiverSpec) DeepCopyInto(dst *ReceiverSpec) {
resource.CopyObjectInto(dst, s)
}
// DeepCopy creates a full deep copy of ReceiverStatus
func (s *ReceiverStatus) DeepCopy() *ReceiverStatus {
cpy := &ReceiverStatus{}
s.DeepCopyInto(cpy)
return cpy
}
// DeepCopyInto deep copies ReceiverStatus into another ReceiverStatus object
func (s *ReceiverStatus) DeepCopyInto(dst *ReceiverStatus) {
resource.CopyObjectInto(dst, s)
}

View File

@@ -4,7 +4,6 @@ import (
"context"
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type RoutingTreeClient struct {
@@ -76,24 +75,6 @@ func (c *RoutingTreeClient) Patch(ctx context.Context, identifier resource.Ident
return c.client.Patch(ctx, identifier, req, opts)
}
func (c *RoutingTreeClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus RoutingTreeStatus, opts resource.UpdateOptions) (*RoutingTree, error) {
return c.client.Update(ctx, &RoutingTree{
TypeMeta: metav1.TypeMeta{
Kind: RoutingTreeKind().Kind(),
APIVersion: GroupVersion.Identifier(),
},
ObjectMeta: metav1.ObjectMeta{
ResourceVersion: opts.ResourceVersion,
Namespace: identifier.Namespace,
Name: identifier.Name,
},
Status: newStatus,
}, resource.UpdateOptions{
Subresource: "status",
ResourceVersion: opts.ResourceVersion,
})
}
func (c *RoutingTreeClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error {
return c.client.Delete(ctx, identifier, opts)
}

View File

@@ -21,8 +21,6 @@ type RoutingTree struct {
// Spec is the spec of the RoutingTree
Spec RoutingTreeSpec `json:"spec" yaml:"spec"`
Status RoutingTreeStatus `json:"status" yaml:"status"`
}
func (o *RoutingTree) GetSpec() any {
@@ -39,15 +37,11 @@ func (o *RoutingTree) SetSpec(spec any) error {
}
func (o *RoutingTree) GetSubresources() map[string]any {
return map[string]any{
"status": o.Status,
}
return map[string]any{}
}
func (o *RoutingTree) GetSubresource(name string) (any, bool) {
switch name {
case "status":
return o.Status, true
default:
return nil, false
}
@@ -55,13 +49,6 @@ func (o *RoutingTree) GetSubresource(name string) (any, bool) {
func (o *RoutingTree) SetSubresource(name string, value any) error {
switch name {
case "status":
cast, ok := value.(RoutingTreeStatus)
if !ok {
return fmt.Errorf("cannot set status type %#v, not of type RoutingTreeStatus", value)
}
o.Status = cast
return nil
default:
return fmt.Errorf("subresource '%s' does not exist", name)
}
@@ -233,7 +220,6 @@ func (o *RoutingTree) DeepCopyInto(dst *RoutingTree) {
dst.TypeMeta.Kind = o.TypeMeta.Kind
o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta)
o.Spec.DeepCopyInto(&dst.Spec)
o.Status.DeepCopyInto(&dst.Status)
}
// Interface compliance compile-time check
@@ -305,15 +291,3 @@ func (s *RoutingTreeSpec) DeepCopy() *RoutingTreeSpec {
func (s *RoutingTreeSpec) DeepCopyInto(dst *RoutingTreeSpec) {
resource.CopyObjectInto(dst, s)
}
// DeepCopy creates a full deep copy of RoutingTreeStatus
func (s *RoutingTreeStatus) DeepCopy() *RoutingTreeStatus {
cpy := &RoutingTreeStatus{}
s.DeepCopyInto(cpy)
return cpy
}
// DeepCopyInto deep copies RoutingTreeStatus into another RoutingTreeStatus object
func (s *RoutingTreeStatus) DeepCopyInto(dst *RoutingTreeStatus) {
resource.CopyObjectInto(dst, s)
}

View File

@@ -4,7 +4,6 @@ import (
"context"
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type TemplateGroupClient struct {
@@ -76,24 +75,6 @@ func (c *TemplateGroupClient) Patch(ctx context.Context, identifier resource.Ide
return c.client.Patch(ctx, identifier, req, opts)
}
func (c *TemplateGroupClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus TemplateGroupStatus, opts resource.UpdateOptions) (*TemplateGroup, error) {
return c.client.Update(ctx, &TemplateGroup{
TypeMeta: metav1.TypeMeta{
Kind: TemplateGroupKind().Kind(),
APIVersion: GroupVersion.Identifier(),
},
ObjectMeta: metav1.ObjectMeta{
ResourceVersion: opts.ResourceVersion,
Namespace: identifier.Namespace,
Name: identifier.Name,
},
Status: newStatus,
}, resource.UpdateOptions{
Subresource: "status",
ResourceVersion: opts.ResourceVersion,
})
}
func (c *TemplateGroupClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error {
return c.client.Delete(ctx, identifier, opts)
}

View File

@@ -21,8 +21,6 @@ type TemplateGroup struct {
// Spec is the spec of the TemplateGroup
Spec TemplateGroupSpec `json:"spec" yaml:"spec"`
Status TemplateGroupStatus `json:"status" yaml:"status"`
}
func (o *TemplateGroup) GetSpec() any {
@@ -39,15 +37,11 @@ func (o *TemplateGroup) SetSpec(spec any) error {
}
func (o *TemplateGroup) GetSubresources() map[string]any {
return map[string]any{
"status": o.Status,
}
return map[string]any{}
}
func (o *TemplateGroup) GetSubresource(name string) (any, bool) {
switch name {
case "status":
return o.Status, true
default:
return nil, false
}
@@ -55,13 +49,6 @@ func (o *TemplateGroup) GetSubresource(name string) (any, bool) {
func (o *TemplateGroup) SetSubresource(name string, value any) error {
switch name {
case "status":
cast, ok := value.(TemplateGroupStatus)
if !ok {
return fmt.Errorf("cannot set status type %#v, not of type TemplateGroupStatus", value)
}
o.Status = cast
return nil
default:
return fmt.Errorf("subresource '%s' does not exist", name)
}
@@ -233,7 +220,6 @@ func (o *TemplateGroup) DeepCopyInto(dst *TemplateGroup) {
dst.TypeMeta.Kind = o.TypeMeta.Kind
o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta)
o.Spec.DeepCopyInto(&dst.Spec)
o.Status.DeepCopyInto(&dst.Status)
}
// Interface compliance compile-time check
@@ -305,15 +291,3 @@ func (s *TemplateGroupSpec) DeepCopy() *TemplateGroupSpec {
func (s *TemplateGroupSpec) DeepCopyInto(dst *TemplateGroupSpec) {
resource.CopyObjectInto(dst, s)
}
// DeepCopy creates a full deep copy of TemplateGroupStatus
func (s *TemplateGroupStatus) DeepCopy() *TemplateGroupStatus {
cpy := &TemplateGroupStatus{}
s.DeepCopyInto(cpy)
return cpy
}
// DeepCopyInto deep copies TemplateGroupStatus into another TemplateGroupStatus object
func (s *TemplateGroupStatus) DeepCopyInto(dst *TemplateGroupStatus) {
resource.CopyObjectInto(dst, s)
}

View File

@@ -1,44 +0,0 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
package v0alpha1
// +k8s:openapi-gen=true
type TemplateGroupstatusOperatorState struct {
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State TemplateGroupStatusOperatorStateState `json:"state"`
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
}
// NewTemplateGroupstatusOperatorState creates a new TemplateGroupstatusOperatorState object.
func NewTemplateGroupstatusOperatorState() *TemplateGroupstatusOperatorState {
return &TemplateGroupstatusOperatorState{}
}
// +k8s:openapi-gen=true
type TemplateGroupStatus struct {
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]TemplateGroupstatusOperatorState `json:"operatorStates,omitempty"`
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields,omitempty"`
}
// NewTemplateGroupStatus creates a new TemplateGroupStatus object.
func NewTemplateGroupStatus() *TemplateGroupStatus {
return &TemplateGroupStatus{}
}
// +k8s:openapi-gen=true
type TemplateGroupStatusOperatorStateState string
const (
TemplateGroupStatusOperatorStateStateSuccess TemplateGroupStatusOperatorStateState = "success"
TemplateGroupStatusOperatorStateStateInProgress TemplateGroupStatusOperatorStateState = "in_progress"
TemplateGroupStatusOperatorStateStateFailed TemplateGroupStatusOperatorStateState = "failed"
)

View File

@@ -4,7 +4,6 @@ import (
"context"
"github.com/grafana/grafana-app-sdk/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type TimeIntervalClient struct {
@@ -76,24 +75,6 @@ func (c *TimeIntervalClient) Patch(ctx context.Context, identifier resource.Iden
return c.client.Patch(ctx, identifier, req, opts)
}
func (c *TimeIntervalClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus TimeIntervalStatus, opts resource.UpdateOptions) (*TimeInterval, error) {
return c.client.Update(ctx, &TimeInterval{
TypeMeta: metav1.TypeMeta{
Kind: TimeIntervalKind().Kind(),
APIVersion: GroupVersion.Identifier(),
},
ObjectMeta: metav1.ObjectMeta{
ResourceVersion: opts.ResourceVersion,
Namespace: identifier.Namespace,
Name: identifier.Name,
},
Status: newStatus,
}, resource.UpdateOptions{
Subresource: "status",
ResourceVersion: opts.ResourceVersion,
})
}
func (c *TimeIntervalClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error {
return c.client.Delete(ctx, identifier, opts)
}

View File

@@ -21,8 +21,6 @@ type TimeInterval struct {
// Spec is the spec of the TimeInterval
Spec TimeIntervalSpec `json:"spec" yaml:"spec"`
Status TimeIntervalStatus `json:"status" yaml:"status"`
}
func (o *TimeInterval) GetSpec() any {
@@ -39,15 +37,11 @@ func (o *TimeInterval) SetSpec(spec any) error {
}
func (o *TimeInterval) GetSubresources() map[string]any {
return map[string]any{
"status": o.Status,
}
return map[string]any{}
}
func (o *TimeInterval) GetSubresource(name string) (any, bool) {
switch name {
case "status":
return o.Status, true
default:
return nil, false
}
@@ -55,13 +49,6 @@ func (o *TimeInterval) GetSubresource(name string) (any, bool) {
func (o *TimeInterval) SetSubresource(name string, value any) error {
switch name {
case "status":
cast, ok := value.(TimeIntervalStatus)
if !ok {
return fmt.Errorf("cannot set status type %#v, not of type TimeIntervalStatus", value)
}
o.Status = cast
return nil
default:
return fmt.Errorf("subresource '%s' does not exist", name)
}
@@ -233,7 +220,6 @@ func (o *TimeInterval) DeepCopyInto(dst *TimeInterval) {
dst.TypeMeta.Kind = o.TypeMeta.Kind
o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta)
o.Spec.DeepCopyInto(&dst.Spec)
o.Status.DeepCopyInto(&dst.Status)
}
// Interface compliance compile-time check
@@ -305,15 +291,3 @@ func (s *TimeIntervalSpec) DeepCopy() *TimeIntervalSpec {
func (s *TimeIntervalSpec) DeepCopyInto(dst *TimeIntervalSpec) {
resource.CopyObjectInto(dst, s)
}
// DeepCopy creates a full deep copy of TimeIntervalStatus
func (s *TimeIntervalStatus) DeepCopy() *TimeIntervalStatus {
cpy := &TimeIntervalStatus{}
s.DeepCopyInto(cpy)
return cpy
}
// DeepCopyInto deep copies TimeIntervalStatus into another TimeIntervalStatus object
func (s *TimeIntervalStatus) DeepCopyInto(dst *TimeIntervalStatus) {
resource.CopyObjectInto(dst, s)
}

View File

@@ -1,44 +0,0 @@
// Code generated - EDITING IS FUTILE. DO NOT EDIT.
package v0alpha1
// +k8s:openapi-gen=true
type TimeIntervalstatusOperatorState struct {
// lastEvaluation is the ResourceVersion last evaluated
LastEvaluation string `json:"lastEvaluation"`
// state describes the state of the lastEvaluation.
// It is limited to three possible states for machine evaluation.
State TimeIntervalStatusOperatorStateState `json:"state"`
// descriptiveState is an optional more descriptive state field which has no requirements on format
DescriptiveState *string `json:"descriptiveState,omitempty"`
// details contains any extra information that is operator-specific
Details map[string]interface{} `json:"details,omitempty"`
}
// NewTimeIntervalstatusOperatorState creates a new TimeIntervalstatusOperatorState object.
func NewTimeIntervalstatusOperatorState() *TimeIntervalstatusOperatorState {
return &TimeIntervalstatusOperatorState{}
}
// +k8s:openapi-gen=true
type TimeIntervalStatus struct {
// operatorStates is a map of operator ID to operator state evaluations.
// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
OperatorStates map[string]TimeIntervalstatusOperatorState `json:"operatorStates,omitempty"`
// additionalFields is reserved for future use
AdditionalFields map[string]interface{} `json:"additionalFields,omitempty"`
}
// NewTimeIntervalStatus creates a new TimeIntervalStatus object.
func NewTimeIntervalStatus() *TimeIntervalStatus {
return &TimeIntervalStatus{}
}
// +k8s:openapi-gen=true
type TimeIntervalStatusOperatorStateState string
const (
TimeIntervalStatusOperatorStateStateSuccess TimeIntervalStatusOperatorStateState = "success"
TimeIntervalStatusOperatorStateStateInProgress TimeIntervalStatusOperatorStateState = "in_progress"
TimeIntervalStatusOperatorStateStateFailed TimeIntervalStatusOperatorStateState = "failed"
)

View File

@@ -14,21 +14,22 @@ import (
"github.com/grafana/grafana-app-sdk/resource"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kube-openapi/pkg/spec3"
"k8s.io/kube-openapi/pkg/validation/spec"
v0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/alertingnotifications/v0alpha1"
)
var (
rawSchemaReceiverv0alpha1 = []byte(`{"Integration":{"additionalProperties":false,"properties":{"disableResolveMessage":{"type":"boolean"},"secureFields":{"additionalProperties":{"type":"boolean"},"type":"object"},"settings":{"additionalProperties":{"additionalProperties":{},"type":"object"},"type":"object"},"type":{"type":"string"},"uid":{"type":"string"},"version":{"type":"string"}},"required":["type","version","settings"],"type":"object"},"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"Receiver":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"integrations":{"items":{"$ref":"#/components/schemas/Integration"},"type":"array"},"title":{"type":"string"}},"required":["title","integrations"],"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
rawSchemaReceiverv0alpha1 = []byte(`{"Integration":{"additionalProperties":false,"properties":{"disableResolveMessage":{"type":"boolean"},"secureFields":{"additionalProperties":{"type":"boolean"},"type":"object"},"settings":{"additionalProperties":{"additionalProperties":{},"type":"object"},"type":"object"},"type":{"type":"string"},"uid":{"type":"string"},"version":{"type":"string"}},"required":["type","version","settings"],"type":"object"},"Receiver":{"properties":{"spec":{"$ref":"#/components/schemas/spec"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"integrations":{"items":{"$ref":"#/components/schemas/Integration"},"type":"array"},"title":{"type":"string"}},"required":["title","integrations"],"type":"object"}}`)
versionSchemaReceiverv0alpha1 app.VersionSchema
_ = json.Unmarshal(rawSchemaReceiverv0alpha1, &versionSchemaReceiverv0alpha1)
rawSchemaRoutingTreev0alpha1 = []byte(`{"Matcher":{"additionalProperties":false,"properties":{"label":{"type":"string"},"type":{"enum":["=","!=","=~","!~"],"type":"string"},"value":{"type":"string"}},"required":["type","label","value"],"type":"object"},"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"Route":{"additionalProperties":false,"properties":{"active_time_intervals":{"items":{"type":"string"},"type":"array"},"continue":{"type":"boolean"},"group_by":{"items":{"type":"string"},"type":"array"},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"matchers":{"items":{"$ref":"#/components/schemas/Matcher"},"type":"array"},"mute_time_intervals":{"items":{"type":"string"},"type":"array"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"},"routes":{"items":{"$ref":"#/components/schemas/Route"},"type":"array"}},"required":["continue"],"type":"object"},"RouteDefaults":{"additionalProperties":false,"properties":{"group_by":{"items":{"type":"string"},"type":"array"},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"}},"required":["receiver"],"type":"object"},"RoutingTree":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"defaults":{"$ref":"#/components/schemas/RouteDefaults"},"routes":{"items":{"$ref":"#/components/schemas/Route"},"type":"array"}},"required":["defaults","routes"],"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
rawSchemaRoutingTreev0alpha1 = []byte(`{"Matcher":{"additionalProperties":false,"properties":{"label":{"type":"string"},"type":{"enum":["=","!=","=~","!~"],"type":"string"},"value":{"type":"string"}},"required":["type","label","value"],"type":"object"},"Route":{"additionalProperties":false,"properties":{"active_time_intervals":{"items":{"type":"string"},"type":"array"},"continue":{"type":"boolean"},"group_by":{"items":{"type":"string"},"type":"array"},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"matchers":{"items":{"$ref":"#/components/schemas/Matcher"},"type":"array"},"mute_time_intervals":{"items":{"type":"string"},"type":"array"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"},"routes":{"items":{"$ref":"#/components/schemas/Route"},"type":"array"}},"required":["continue"],"type":"object"},"RouteDefaults":{"additionalProperties":false,"properties":{"group_by":{"items":{"type":"string"},"type":"array"},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"}},"required":["receiver"],"type":"object"},"RoutingTree":{"properties":{"spec":{"$ref":"#/components/schemas/spec"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"defaults":{"$ref":"#/components/schemas/RouteDefaults"},"routes":{"items":{"$ref":"#/components/schemas/Route"},"type":"array"}},"required":["defaults","routes"],"type":"object"}}`)
versionSchemaRoutingTreev0alpha1 app.VersionSchema
_ = json.Unmarshal(rawSchemaRoutingTreev0alpha1, &versionSchemaRoutingTreev0alpha1)
rawSchemaTemplateGroupv0alpha1 = []byte(`{"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"TemplateGroup":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"content":{"type":"string"},"title":{"type":"string"}},"required":["title","content"],"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
rawSchemaTemplateGroupv0alpha1 = []byte(`{"TemplateGroup":{"properties":{"spec":{"$ref":"#/components/schemas/spec"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"content":{"type":"string"},"title":{"type":"string"}},"required":["title","content"],"type":"object"}}`)
versionSchemaTemplateGroupv0alpha1 app.VersionSchema
_ = json.Unmarshal(rawSchemaTemplateGroupv0alpha1, &versionSchemaTemplateGroupv0alpha1)
rawSchemaTimeIntervalv0alpha1 = []byte(`{"Interval":{"additionalProperties":false,"properties":{"days_of_month":{"items":{"type":"string"},"type":"array"},"location":{"type":"string"},"months":{"items":{"type":"string"},"type":"array"},"times":{"items":{"$ref":"#/components/schemas/TimeRange"},"type":"array"},"weekdays":{"items":{"type":"string"},"type":"array"},"years":{"items":{"type":"string"},"type":"array"}},"type":"object"},"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"TimeInterval":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"TimeRange":{"additionalProperties":false,"properties":{"end_time":{"type":"string"},"start_time":{"type":"string"}},"required":["start_time","end_time"],"type":"object"},"spec":{"additionalProperties":false,"properties":{"name":{"type":"string"},"time_intervals":{"items":{"$ref":"#/components/schemas/Interval"},"type":"array"}},"required":["name","time_intervals"],"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
rawSchemaTimeIntervalv0alpha1 = []byte(`{"Interval":{"additionalProperties":false,"properties":{"days_of_month":{"items":{"type":"string"},"type":"array"},"location":{"type":"string"},"months":{"items":{"type":"string"},"type":"array"},"times":{"items":{"$ref":"#/components/schemas/TimeRange"},"type":"array"},"weekdays":{"items":{"type":"string"},"type":"array"},"years":{"items":{"type":"string"},"type":"array"}},"type":"object"},"TimeInterval":{"properties":{"spec":{"$ref":"#/components/schemas/spec"}},"required":["spec"]},"TimeRange":{"additionalProperties":false,"properties":{"end_time":{"type":"string"},"start_time":{"type":"string"}},"required":["start_time","end_time"],"type":"object"},"spec":{"additionalProperties":false,"properties":{"name":{"type":"string"},"time_intervals":{"items":{"$ref":"#/components/schemas/Interval"},"type":"array"}},"required":["name","time_intervals"],"type":"object"}}`)
versionSchemaTimeIntervalv0alpha1 app.VersionSchema
_ = json.Unmarshal(rawSchemaTimeIntervalv0alpha1, &versionSchemaTimeIntervalv0alpha1)
)
@@ -77,6 +78,7 @@ var appManifestData = app.ManifestData{
Routes: app.ManifestVersionRoutes{
Namespaced: map[string]spec3.PathProps{},
Cluster: map[string]spec3.PathProps{},
Schemas: map[string]spec.Schema{},
},
},
},

Some files were not shown because too many files have changed in this diff Show More