Compare commits

..

19 Commits

Author SHA1 Message Date
github-actions[bot]
696f41a7c2 Release: 11.4.2 (#100918)
* Update changelog

* Update version to 11.4.2

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-18 17:11:54 -07:00
Kevin Minehart
c8f8c81e1c [release-11.4.2] CI: Post-release process branch / PR migration (#100935)
CI: Post-release process branch / PR migration (#100930)

* update output for token in release-comms

* use token from needs

* generate token in individual workflows

* Set secrets

* define secrest in referenced workflows

* wrong secret lol

* oops

* grafana/grafana -> grafana/grafana-enterprise

(cherry picked from commit 75189de4f7)
2025-02-19 01:52:25 +02:00
github-actions[bot]
13945ba51b apply security patch: release-11.4.2/318-202502130514.patch
commit a9340d4a6e697441c1bf8353b81c273b48bf3916
Author: AgnesToulet <35176601+AgnesToulet@users.noreply.github.com>
Date:   Tue Feb 11 10:57:05 2025 +0100

    Dashboards: Prevent title longer than 5 000 characters

    (cherry picked from commit f9e0789210004b0bd7902255644ef348ae7b3aa8)
2025-02-18 21:10:03 +00:00
Kevin Minehart
8229a4c073 [release-11.4.2] CI: release comms should trigger on merges to release- branches (#100910)
CI: release comms should trigger on merges to release- branches (#100901)

release comms should trigger on merges to release- branches

(cherry picked from commit 14477a7fe9)
2025-02-18 23:08:40 +02:00
Matheus Macabu
bf3be6309a [release-11.4.2] Chore: Update alpine docker image (minor) - 3.20.5 to 3.20.6 [security] (#100828)
Chore: Update alpine docker image (minor) - 3.20.5 to 3.20.6 [security] (#100791)

* Chore: Update alpine docker image (minor) - 3.20.5 to 3.20.6 [sec-fixes]

* Chore: Regenerate .drone.yml

---------

Co-authored-by: Matheus Macabu <macabu.matheus@gmail.com>
(cherry picked from commit 27837ee937)

Co-authored-by: Robert Goltz <github@rgoltz.de>
2025-02-18 10:10:03 +01:00
Kevin Minehart
5c316a5113 [release-11.4.2] Docker: Missing libresolv.so.2 from glibc (#100745)
Docker: Missing libresolv.so.2 from glibc (#100729)

* Docker: Missing libresolv.so.2 from glibc

* Misplaced &&

(cherry picked from commit 3a8a24e662)
2025-02-14 17:22:01 +02:00
Kevin Minehart
0c2af5a880 [release-11.4.2] CI: Backport to release branches (#100694)
* CI: Backport to release branches (#100067)

* update backport and release comms

* Backport to release branches and change docs source branch for publishing

* Add new workflows to CODEOWNERS

* Re-add removed line oops

* backport-testing -> grafana

* checkout grafana repo in backport action, reference repo / branch in reusable action

* generate -> create

(cherry picked from commit 6787cdccb9)

* remove v
2025-02-14 07:56:15 -06:00
Todd Treece
a3a4c2565a [release-11.4.2] Metrics: Use correct gatherer in graphite bridge (#100677)
Metrics: Use correct gatherer in graphite bridge (#100624)

(cherry picked from commit 5a74a1a0f6)
2025-02-13 23:33:51 +02:00
Misi
2451837fb8 [release-11.4.2] IAM: log error when malformed json arrays are found in SSO configs (#100651)
IAM: Log error when malformed json arrays are found in SSO configs (#99896)

(cherry picked from commit eeadb7e771)

Co-authored-by: xavi <114113189+volcanonoodle@users.noreply.github.com>
2025-02-13 18:36:43 +01:00
Dominik Prokop
27251b44fc [release-11.4.2] Dashboards: Bring back scripted dashboards (#100629)
Dashboards: Bring back scripted dashboards (#100575)

* Dashboards: Bring back scripted dashboards

* Fix scripted dashboard examples

* Fix dashboard-solo page not respecnig scripted dashboards

(cherry picked from commit 7edcde6365)
2025-02-13 17:48:36 +01:00
Oscar Kilhed
38ae17fbc3 [release-11.4.2] Dashboards: Fix repeats not being added on refresh when using searchLayout (#100635)
Dashboards: Fix repeats not being added on refresh when using searchLayout (#100621)

Fix repeats not being added

(cherry picked from commit 1018aec6bc)
2025-02-13 18:48:18 +02:00
Karl Persson
bc6beda11e [release-11.4.2] AuthN: Refetch user on "ErrUserAlreadyExists" (#100585)
* AuthN: Refetch user on "ErrUserAlreadyExists" (#100346)

* AuthN: Refetch user on "ErrUserAlreadyExists"

(cherry picked from commit 0b4c622df8)

* Fix test
2025-02-13 13:30:20 +01:00
Misi
dff8f508d5 [release-11.4.2] Auth: Add early return if auth_token is in the URL for JWT auth (#100580)
Auth: Add early return if `auth_token` is in the URL for JWT auth (#100539)

* Add early return

* Update public/app/app.ts

Co-authored-by: Victor Cinaglia <victor@grafana.com>

---------

Co-authored-by: Victor Cinaglia <victor@grafana.com>
(cherry picked from commit 5a6d2f2e49)
2025-02-13 12:13:29 +01:00
Misi
08f66dd50c [release-11.4.2] Auth: Fix redirect with JWT auth URL login (#100494)
Auth: Fix redirect with JWT auth URL login (#100295)

fix

(cherry picked from commit acc1521929)
2025-02-12 18:16:02 +01:00
Kevin Minehart
e9f564277f [release-11.4.2] CI: Add release branches to patch automation (#100530)
CI: Add release branches to patch automation (#100442)

* CI: Add release branches to patch automation

* Update .github/workflows/create-security-patch-from-security-mirror.yml

Co-authored-by: Agnès Toulet <35176601+AgnesToulet@users.noreply.github.com>

---------

Co-authored-by: Agnès Toulet <35176601+AgnesToulet@users.noreply.github.com>
(cherry picked from commit a8b98ded66)
2025-02-12 11:05:26 -06:00
Josh Hunt
ef65865de0 [release-11.4.2] Chore: pin tonistiigi/binfmt version (#100521)
Chore: pin tonistiigi/binfmt version (#100510)

* Chore: pin tonistiigi/binfmt version

* change version to qemu-v7.0.0-28

* uninstall first, log version

* uninstall first, log version

* uninstall first, log version

(cherry picked from commit a9b4b1e5be)
2025-02-12 16:03:06 +00:00
Jacob Valdez
33cf9d6cd4 [release-11.4.2] Docs: Updating manual installation instructions (#100454)
Docs: Updating manual installation instructions (#98834)

* Docs: adding additional installation steps to Grafana on openSUSE docs

* Docs: Adding systemd service info for grafana manual install

* Finalizing first edit with tested steps

* spacing adjustment and adding steps to RHEL/Fedora

* Adding a note based on Marins feedback

* A slight adjustment based on feedback from Marin and adding steps to Debian installation

* adjusting some wording

* adjusting naming conventions for Debian instructions

* changing "open-source" to "open source"

* vale and review edits

* deleting erroneous character in shortcode

* updating some shortcodes

---------

Co-authored-by: Isabel Matwawana <76437239+imatwawana@users.noreply.github.com>
(cherry picked from commit b6ea06f259)
2025-02-11 15:00:50 -06:00
Jev Forsberg
10b95276ae [release-11.4.2] Chore: Update grabpl version to v3.1.2 (#100242)
Chore: Update grabpl version to v3.1.2 (#100157)

baldm0mma/ update grabpl version

(cherry picked from commit 8e3327a446)
2025-02-07 08:29:23 -07:00
Jacob Valdez
54db7b0992 [v11.4.x] Docs: Adding info on decrypting encrypted certificates (#100155) 2025-02-07 08:57:27 -06:00
100 changed files with 959 additions and 394 deletions

View File

@@ -18,7 +18,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
@@ -69,7 +69,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- go install github.com/bazelbuild/buildtools/buildifier@latest
@@ -112,7 +112,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -170,7 +170,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -307,7 +307,7 @@ steps:
path: /github-app
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -414,7 +414,7 @@ steps:
path: /github-app
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -503,7 +503,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
@@ -625,11 +625,11 @@ steps:
path: /github-app
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -689,12 +689,14 @@ steps:
token:
from_secret: drone_token
- commands:
- docker run --privileged --rm tonistiigi/binfmt --install all
- docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --version
- docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --uninstall 'qemu-*'
- docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --install all
- /src/grafana-build artifacts -a targz:grafana:linux/amd64 -a targz:grafana:linux/arm64
-a targz:grafana:linux/arm/v7 -a docker:grafana:linux/amd64 -a docker:grafana:linux/amd64:ubuntu
-a docker:grafana:linux/arm64 -a docker:grafana:linux/arm64:ubuntu -a docker:grafana:linux/arm/v7
-a docker:grafana:linux/arm/v7:ubuntu --go-version=1.23.5 --yarn-cache=$$YARN_CACHE_FOLDER
--build-id=$$DRONE_BUILD_NUMBER --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.20.5
--build-id=$$DRONE_BUILD_NUMBER --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.20.6
--tag-format='{{ .version_base }}-{{ .buildID }}-{{ .arch }}' --ubuntu-tag-format='{{
.version_base }}-{{ .buildID }}-ubuntu-{{ .arch }}' --verify='false' --grafana-dir=$$PWD
> packages.txt
@@ -751,7 +753,7 @@ steps:
GF_APP_MODE: development
GF_SERVER_HTTP_PORT: "3001"
GF_SERVER_ROUTER_LOGGING: "1"
image: alpine:3.20.5
image: alpine:3.20.6
name: grafana-server
- commands:
- ./bin/build e2e-tests --port 3001 --suite dashboards-suite
@@ -1092,7 +1094,7 @@ steps:
path: /github-app
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -1105,7 +1107,7 @@ steps:
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -1296,7 +1298,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1676,7 +1678,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1747,7 +1749,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1805,7 +1807,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1871,7 +1873,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -1951,7 +1953,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
@@ -2017,7 +2019,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -2091,11 +2093,11 @@ steps:
path: /github-app
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -2154,12 +2156,14 @@ steps:
image: node:20.9.0-alpine
name: build-frontend-packages
- commands:
- docker run --privileged --rm tonistiigi/binfmt --install all
- docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --version
- docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --uninstall 'qemu-*'
- docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --install all
- /src/grafana-build artifacts -a targz:grafana:linux/amd64 -a targz:grafana:linux/arm64
-a targz:grafana:linux/arm/v7 -a docker:grafana:linux/amd64 -a docker:grafana:linux/amd64:ubuntu
-a docker:grafana:linux/arm64 -a docker:grafana:linux/arm64:ubuntu -a docker:grafana:linux/arm/v7
-a docker:grafana:linux/arm/v7:ubuntu --go-version=1.23.5 --yarn-cache=$$YARN_CACHE_FOLDER
--build-id=$$DRONE_BUILD_NUMBER --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.20.5
--build-id=$$DRONE_BUILD_NUMBER --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.20.6
--tag-format='{{ .version_base }}-{{ .buildID }}-{{ .arch }}' --ubuntu-tag-format='{{
.version_base }}-{{ .buildID }}-ubuntu-{{ .arch }}' --verify='false' --grafana-dir=$$PWD
> packages.txt
@@ -2220,7 +2224,7 @@ steps:
GF_APP_MODE: development
GF_SERVER_HTTP_PORT: "3001"
GF_SERVER_ROUTER_LOGGING: "1"
image: alpine:3.20.5
image: alpine:3.20.6
name: grafana-server
- commands:
- ./bin/build e2e-tests --port 3001 --suite dashboards-suite
@@ -2635,7 +2639,7 @@ services:
steps:
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -2648,7 +2652,7 @@ steps:
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -2918,7 +2922,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -2974,7 +2978,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -3038,7 +3042,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -3116,7 +3120,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
@@ -3219,7 +3223,7 @@ services:
steps:
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -3232,7 +3236,7 @@ steps:
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -3460,11 +3464,11 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -3592,11 +3596,11 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -4081,7 +4085,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
ALPINE_BASE: alpine:3.20.5
ALPINE_BASE: alpine:3.20.6
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4156,7 +4160,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
ALPINE_BASE: alpine:3.20.5
ALPINE_BASE: alpine:3.20.6
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4318,7 +4322,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
ALPINE_BASE: alpine:3.20.5
ALPINE_BASE: alpine:3.20.6
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4420,7 +4424,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -4474,7 +4478,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -4555,7 +4559,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
ALPINE_BASE: alpine:3.20.5
ALPINE_BASE: alpine:3.20.6
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4699,7 +4703,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
ALPINE_BASE: alpine:3.20.5
ALPINE_BASE: alpine:3.20.6
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4826,7 +4830,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
ALPINE_BASE: alpine:3.20.5
ALPINE_BASE: alpine:3.20.6
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4970,13 +4974,13 @@ services:
steps:
- commands:
- mkdir -p bin
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.1/grabpl
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.1.2/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
- commands:
- echo $DRONE_RUNNER_NAME
image: alpine:3.20.5
image: alpine:3.20.6
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -5425,7 +5429,7 @@ steps:
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM node:20-bookworm
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM google/cloud-sdk:431.0.0
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana-ci-deploy:1.3.3
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine:3.20.5
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine:3.20.6
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM ubuntu:22.04
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM byrnedo/alpine-curl:0.1.8
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM plugins/slack
@@ -5464,7 +5468,7 @@ steps:
- trivy --exit-code 1 --severity HIGH,CRITICAL node:20-bookworm
- trivy --exit-code 1 --severity HIGH,CRITICAL google/cloud-sdk:431.0.0
- trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana-ci-deploy:1.3.3
- trivy --exit-code 1 --severity HIGH,CRITICAL alpine:3.20.5
- trivy --exit-code 1 --severity HIGH,CRITICAL alpine:3.20.6
- trivy --exit-code 1 --severity HIGH,CRITICAL ubuntu:22.04
- trivy --exit-code 1 --severity HIGH,CRITICAL byrnedo/alpine-curl:0.1.8
- trivy --exit-code 1 --severity HIGH,CRITICAL plugins/slack
@@ -5729,6 +5733,6 @@ kind: secret
name: gcr_credentials
---
kind: signature
hmac: 16489caa870a3645e21569481281c5d114af0c5ff48b519e86da36189bd57606
hmac: 7210382290a72f0ce411fd3f463d72c2dd9a1b062c7238cad35908bf2cca1794
...

14
.github/CODEOWNERS vendored
View File

@@ -695,12 +695,14 @@ embed.go @grafana/grafana-as-code
/.github/renovate.json5 @grafana/frontend-ops
/.github/teams.yml @armandgrillet
/.github/workflows/alerting-swagger-gen.yml @grafana/alerting-backend
/.github/workflows/auto-milestone.yml @grafana/grafana-release-guild
/.github/workflows/backport.yml @grafana/grafana-release-guild
/.github/workflows/bump-version.yml @grafana/grafana-release-guild
/.github/workflows/close-milestone.yml @grafana/grafana-release-guild
/.github/workflows/release-pr.yml @grafana/grafana-release-guild
/.github/workflows/release-comms.yml @grafana/grafana-release-guild
/.github/workflows/auto-milestone.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/backport.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/bump-version.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/close-milestone.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/release-pr.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/release-comms.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/migrate-prs.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/create-next-release-branch.yml @grafana/grafana-developer-enablement-squad
/.github/workflows/codeowners-validator.yml @tolzhabayev
/.github/workflows/codeql-analysis.yml @DanCech
/.github/workflows/commands.yml @torkelo

View File

@@ -10,24 +10,19 @@ jobs:
if: github.repository == 'grafana/grafana'
runs-on: ubuntu-latest
steps:
- name: Checkout Actions
- name: Checkout
uses: actions/checkout@v4
with:
repository: "grafana/grafana-github-actions"
path: ./actions
ref: main
- name: Install Actions
run: npm install --production --prefix ./actions
- name: "Generate token"
id: generate_token
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
with:
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
- run: git config --global user.email '132647405+grafana-delivery-bot[bot]@users.noreply.github.com'
- run: git config --global user.name 'grafana-delivery-bot[bot]'
- run: git remote set-url origin "https://grafana-delivery-bot:${{ steps.generate_token.outputs.token }}@github.com/grafana/grafana.git"
- name: Run backport
uses: ./actions/backport
uses: grafana/grafana-github-actions-go/backport@main
with:
metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}}
token: ${{ steps.generate_token.outputs.token }}
labelsToAdd: "backport"
title: "[{{base}}] {{originalTitle}}"

View File

@@ -0,0 +1,53 @@
name: Create next release branch
on:
workflow_call:
inputs:
ownerRepo:
type: string
description: Owner/repo of the repository where the branch is created (e.g. 'grafana/grafana')
required: true
source:
description: The release branch to increment (eg providing `release-11.2.3` will result in `release-11.2.4` being created)
type: string
required: true
secrets:
GRAFANA_DELIVERY_BOT_APP_ID:
required: true
GRAFANA_DELIVERY_BOT_APP_PEM:
required: true
outputs:
branch:
description: The new branch that was created
value: ${{ jobs.main.outputs.branch }}
workflow_dispatch:
inputs:
ownerRepo:
description: Owner/repo of the repository where the branch is created (e.g. 'grafana/grafana')
source:
description: The release branch to increment (eg providing `release-11.2.3` will result in `release-11.2.4` being created)
type: string
required: true
secrets:
GRAFANA_DELIVERY_BOT_APP_ID:
required: true
GRAFANA_DELIVERY_BOT_APP_PEM:
required: true
jobs:
main:
runs-on: ubuntu-latest
outputs:
branch: ${{ steps.branch.outputs.branch }}
steps:
- name: "Generate token"
id: generate_token
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
with:
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
- name: Create release branch
id: branch
uses: grafana/grafana-github-actions-go/bump-release@main
with:
ownerRepo: ${{ inputs.ownerRepo }}
source: ${{ inputs.source }}
token: ${{ steps.generate_token.outputs.token }}

View File

@@ -11,6 +11,7 @@ on:
branches:
- "main"
- "v*.*.*"
- "release-*.*.*"
# This is run before the pull request has been merged, so we'll run against the src branch
jobs:

60
.github/workflows/migrate-prs.yml vendored Normal file
View File

@@ -0,0 +1,60 @@
name: Migrate open PRs
# Migrate open PRs from a superseded release branch to the current release branch and notify authors
on:
workflow_call:
inputs:
from:
description: 'The base branch to check for open PRs'
required: true
type: string
to:
description: 'The base branch to migrate open PRs to'
required: true
type: string
ownerRepo:
description: Owner/repo of the repository where the branch is created (e.g. 'grafana/grafana')
required: true
type: string
secrets:
GRAFANA_DELIVERY_BOT_APP_ID:
required: true
GRAFANA_DELIVERY_BOT_APP_PEM:
required: true
workflow_dispatch:
inputs:
from:
description: 'The base branch to check for open PRs'
required: true
type: string
to:
description: 'The base branch to migrate open PRs to'
required: true
type: string
ownerRepo:
description: Owner/repo of the repository where the branch is created (e.g. 'grafana/grafana')
required: true
type: string
secrets:
GRAFANA_DELIVERY_BOT_APP_ID:
required: true
GRAFANA_DELIVERY_BOT_APP_PEM:
required: true
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: "Generate token"
id: generate_token
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
with:
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
- name: Migrate PRs
uses: grafana/grafana-github-actions-go/migrate-open-prs@main
with:
token: ${{ steps.generate_token.outputs.token }}
ownerRepo: ${{ inputs.ownerRepo }}
from: ${{ inputs.from }}
to: ${{ inputs.to }}
binary_release_tag: 'dev'

View File

@@ -3,7 +3,7 @@ name: publish-technical-documentation-release
on:
push:
branches:
- v[0-9]+.[0-9]+.x
- release-[0-9]+.[0-9]+.[0-9]+
tags:
- v[0-9]+.[0-9]+.[0-9]+
paths:
@@ -23,7 +23,7 @@ jobs:
- uses: grafana/writers-toolkit/publish-technical-documentation-release@publish-technical-documentation-release/v2
with:
release_tag_regexp: "^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
release_branch_regexp: "^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.x$"
release_branch_with_patch_regexp: "^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
release_branch_regexp: "^release-(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
release_branch_with_patch_regexp: "^release-(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
website_directory: content/docs/grafana
version_suffix: ""

View File

@@ -19,7 +19,7 @@ on:
- closed
branches:
- 'main'
- 'v*.*.*'
- 'release-*.*.*'
jobs:
setup:
@@ -27,6 +27,7 @@ jobs:
name: Setup and establish latest
outputs:
version: ${{ steps.output.outputs.version }}
release_branch: ${{ steps.output.outputs.release_branch }}
dry_run: ${{ steps.output.outputs.dry_run }}
latest: ${{ steps.output.outputs.latest }}
runs-on: ubuntu-latest
@@ -49,9 +50,54 @@ jobs:
echo "latest: $LATEST"
echo "version: $VERSION"
echo "release_branch=$(echo $VERSION | sed -s 's/^v/release-/g')" >> "$GITHUB_OUTPUT"
echo "dry_run=$DRY_RUN" >> "$GITHUB_OUTPUT"
echo "latest=$LATEST" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
create_next_release_branch_grafana:
name: Create next release branch (Grafana)
needs: setup
uses: ./.github/workflows/create-next-release-branch.yml
secrets:
GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
with:
ownerRepo: 'grafana/grafana'
source: ${{ needs.setup.outputs.release_branch }}
create_next_release_branch_enterprise:
name: Create next release branch (Grafana Enterprise)
needs: setup
uses: ./.github/workflows/create-next-release-branch.yml
secrets:
GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
with:
ownerRepo: 'grafana/grafana-enterprise'
source: ${{ needs.setup.outputs.release_branch }}
migrate_prs_grafana:
needs:
- setup
- create_next_release_branch_grafana
uses: ./.github/workflows/migrate-prs.yml
secrets:
GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
with:
ownerRepo: 'grafana/grafana'
from: ${{ needs.setup.outputs.release_branch }}
to: ${{ needs.create_next_release_branch_grafana.outputs.branch }}
migrate_prs_enterprise:
needs:
- setup
- create_next_release_branch_enterprise
uses: ./.github/workflows/migrate-prs.yml
secrets:
GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
with:
ownerRepo: 'grafana/grafana-enterprise'
from: ${{ needs.setup.outputs.release_branch }}
to: ${{ needs.create_next_release_branch_enterprise.outputs.branch }}
post_changelog_on_forum:
needs: setup
uses: ./.github/workflows/community-release.yml

View File

@@ -4,7 +4,7 @@
# Please refrain from including any processes that do not result in code changes in this workflow. Instead, they should
# either be triggered in the release promotion process or in the release comms process (that is triggered by merging
# this PR).
name: Complete a Grafana release
name: Grafana Release PR
on:
workflow_dispatch:
inputs:
@@ -19,7 +19,7 @@ on:
target:
required: true
type: string
description: The base branch that these changes are being merged into
description: The release branch pattern (eg v9.5.x) that these changes are being merged into
backport:
required: false
type: string
@@ -61,10 +61,17 @@ jobs:
with:
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
- name: Get release branch
id: branch
uses: grafana/grafana-github-actions-go/latest-release-branch@main
with:
token: ${{ steps.generate_token.outputs.token }}
ownerRepo: 'grafana/grafana'
pattern: ${{ inputs.target }}
- name: Checkout Grafana
uses: actions/checkout@v4
with:
ref: ${{ inputs.target }}
ref: ${{ steps.branch.outputs.branch }}
fetch-depth: 0
fetch-tags: true
- name: Checkout Grafana (main)
@@ -124,7 +131,6 @@ jobs:
rm -f CHANGELOG.part changelog_items.md
git diff CHANGELOG.md
- name: "Prettify CHANGELOG.md"
run: npx prettier --write CHANGELOG.md
- name: Commit CHANGELOG.md changes
@@ -151,7 +157,7 @@ jobs:
$( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \
-l "no-changelog" \
--dry-run=${{ inputs.dry_run }} \
-B "${{ inputs.target }}" \
-B "${{ steps.branch.outputs.branch }}" \
--title "Release: ${{ inputs.version }}" \
--body "These code changes must be merged after a release is complete"
env:
@@ -165,7 +171,7 @@ jobs:
-l "product-approved" \
-l "no-changelog" \
--dry-run=${{ inputs.dry_run }} \
-B "${{ inputs.target }}" \
-B "${{ steps.branch.outputs.branch }}" \
--title "Release: ${{ inputs.version }}" \
--body "These code changes must be merged after a release is complete"
env:

View File

@@ -1,3 +1,21 @@
<!-- 11.4.2 START -->
# 11.4.2 (2025-02-18)
### Features and enhancements
- **Docker:** Use our own glibc 2.40 binaries [#99924](https://github.com/grafana/grafana/pull/99924), [@DanCech](https://github.com/DanCech)
### Bug fixes
- **Auth:** Fix redirect with JWT auth URL login [#100494](https://github.com/grafana/grafana/pull/100494), [@mgyongyosi](https://github.com/mgyongyosi)
- **AuthN:** Refetch user on "ErrUserAlreadyExists" [#100585](https://github.com/grafana/grafana/pull/100585), [@kalleep](https://github.com/kalleep)
- **Azure:** Correctly set application insights resource values [#99598](https://github.com/grafana/grafana/pull/99598), [@aangelisc](https://github.com/aangelisc)
- **Dashboards:** Bring back scripted dashboards [#100629](https://github.com/grafana/grafana/pull/100629), [@dprokop](https://github.com/dprokop)
- **Plugin Metrics:** Eliminate data race in plugin metrics middleware [#100077](https://github.com/grafana/grafana/pull/100077), [@clord](https://github.com/clord)
- **RBAC:** Don't check folder access if `annotationPermissionUpdate` FT is enabled [#100116](https://github.com/grafana/grafana/pull/100116), [@IevaVasiljeva](https://github.com/IevaVasiljeva)
<!-- 11.4.2 END -->
<!-- 11.4.1 START -->
# 11.4.1 (2025-01-28)

View File

@@ -156,7 +156,8 @@ RUN if grep -i -q alpine /etc/issue && [ `arch` = "x86_64" ]; then \
usr/glibc-compat/lib/libdl.so.2 \
usr/glibc-compat/lib/libm.so.6 \
usr/glibc-compat/lib/libpthread.so.0 \
usr/glibc-compat/lib/librt.so.1 && \
usr/glibc-compat/lib/librt.so.1 \
usr/glibc-compat/lib/libresolv.so.2 && \
mkdir /lib64 && \
ln -s /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64; \
fi

View File

@@ -272,6 +272,10 @@ Path to the certificate file (if `protocol` is set to `https` or `h2`).
Path to the certificate key file (if `protocol` is set to `https` or `h2`).
### cert_pass
Optional. Password to decrypt encrypted certificates.
### certs_watch_interval
Controls whether `cert_key` and `cert_file` are periodically watched for changes.

View File

@@ -18,9 +18,9 @@ This topic explains how to install Grafana dependencies, install Grafana on Linu
There are multiple ways to install Grafana: using the Grafana Labs APT repository, by downloading a `.deb` package, or by downloading a binary `.tar.gz` file. Choose only one of the methods below that best suits your needs.
{{% admonition type="note" %}}
{{< admonition type="note" >}}
If you install via the `.deb` package or `.tar.gz` file, then you must manually update Grafana for each new version.
{{% /admonition %}}
{{< /admonition >}}
The following video demonstrates how to install Grafana on Debian and Ubuntu as outlined in this document:
@@ -37,9 +37,9 @@ If you install from the APT repository, Grafana automatically updates when you r
| Grafana OSS | grafana | `https://apt.grafana.com stable main` |
| Grafana OSS (Beta) | grafana | `https://apt.grafana.com beta main` |
{{% admonition type="note" %}}
{{< admonition type="note" >}}
Grafana Enterprise is the recommended and default edition. It is available for free and includes all the features of the OSS edition. You can also upgrade to the [full Enterprise feature set](/products/enterprise/?utm_source=grafana-install-page), which has support for [Enterprise plugins](/grafana/plugins/?enterprise=1&utcm_source=grafana-install-page).
{{% /admonition %}}
{{< /admonition >}}
Complete the following steps to install Grafana from the APT repository:
@@ -89,11 +89,11 @@ Complete the following steps to install Grafana from the APT repository:
sudo apt-get install grafana-enterprise
```
## Install Grafana using a deb package or as a standalone binary
## Install Grafana using a deb package
If you choose not to install Grafana using APT, you can download and install Grafana using the deb package or as a standalone binary.
If you install Grafana manually using the deb package, then you must manually update Grafana for each new version.
Complete the following steps to install Grafana using DEB or the standalone binaries:
Complete the following steps to install Grafana using a deb package:
1. Navigate to the [Grafana download page](/grafana/download).
1. Select the Grafana version you want to install.
@@ -105,6 +105,80 @@ Complete the following steps to install Grafana using DEB or the standalone bina
1. Depending on which system you are running, click the **Linux** or **ARM** tab on the [download page](/grafana/download).
1. Copy and paste the code from the [download page](/grafana/download) into your command line and run.
## Install Grafana as a standalone binary
Complete the following steps to install Grafana using the standalone binaries:
1. Navigate to the [Grafana download page](/grafana/download).
1. Select the Grafana version you want to install.
- The most recent Grafana version is selected by default.
- The **Version** field displays only tagged releases. If you want to install a nightly build, click **Nightly Builds** and then select a version.
1. Select an **Edition**.
- **Enterprise:** This is the recommended version. It is functionally identical to the open source version but includes features you can unlock with a license if you so choose.
- **Open Source:** This version is functionally identical to the Enterprise version, but you will need to download the Enterprise version if you want Enterprise features.
1. Depending on which system you are running, click the **Linux** or **ARM** tab on the [download page](/grafana/download).
1. Copy and paste the code from the [download page](/grafana/download) page into your command line and run.
1. Create a user account for Grafana on your system:
```shell
sudo useradd -r -s /bin/false grafana
```
1. Move the unpacked binary to `/usr/local/grafana`:
```shell
sudo mv <DOWNLOAD PATH> /usr/local/grafana
```
1. Change the owner of `/usr/local/grafana` to Grafana users:
```shell
sudo chown -R grafana:users /usr/local/grafana
```
1. Create a Grafana server systemd unit file:
```shell
sudo touch /etc/systemd/system/grafana-server.service
```
1. Add the following to the unit file in a text editor of your choice:
```ini
[Unit]
Description=Grafana Server
After=network.target
[Service]
Type=simple
User=grafana
Group=users
ExecStart=/usr/local/grafana/bin/grafana server --config=/usr/local/grafana/conf/grafana.ini --homepath=/usr/local/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
1. Use the binary to manually start the Grafana server:
```shell
/usr/local/grafana/bin/grafana-server --homepath /usr/local/grafana
```
{{< admonition type="note" >}}
Manually invoking the binary in this step automatically creates the `/usr/local/grafana/data` directory, which needs to be created and configured before the installation can be considered complete.
{{< /admonition >}}
1. Press `CTRL+C` to stop the Grafana server.
1. Change the owner of `/usr/local/grafana` to Grafana users again to apply the ownership to the newly created `/usr/local/grafana/data` directory:
```shell
sudo chown -R grafana:users /usr/local/grafana
```
1. [Configure the Grafana server to start at boot time using systemd](https://grafana.com/docs/grafana/latest/setup-grafana/start-restart-grafana/#configure-the-grafana-server-to-start-at-boot-using-systemd).
## Uninstall on Debian or Ubuntu
Complete any of the following steps to uninstall Grafana.

View File

@@ -32,15 +32,15 @@ If you install from the RPM repository, then Grafana is automatically updated ev
| Grafana OSS | grafana | `https://rpm.grafana.com` |
| Grafana OSS (Beta) | grafana | `https://rpm-beta.grafana.com` |
{{% admonition type="note" %}}
{{< admonition type="note" >}}
Grafana Enterprise is the recommended and default edition. It is available for free and includes all the features of the OSS edition. You can also upgrade to the [full Enterprise feature set](/products/enterprise/?utm_source=grafana-install-page), which has support for [Enterprise plugins](/grafana/plugins/?enterprise=1&utcm_source=grafana-install-page).
{{% /admonition %}}
{{< /admonition >}}
To install Grafana from the RPM repository, complete the following steps:
{{% admonition type="note" %}}
{{< admonition type="note" >}}
If you wish to install beta versions of Grafana, substitute the repository URL for the beta URL listed above.
{{% /admonition %}}
{{< /admonition >}}
1. Import the GPG key:
@@ -96,6 +96,8 @@ If you install Grafana manually using YUM or RPM, then you must manually update
## Install Grafana as a standalone binary
If you install Grafana manually using the standalone binaries, then you must manually update Grafana for each new version.
Complete the following steps to install Grafana using the standalone binaries:
1. Navigate to the [Grafana download page](/grafana/download).
@@ -103,10 +105,70 @@ Complete the following steps to install Grafana using the standalone binaries:
- The most recent Grafana version is selected by default.
- The **Version** field displays only tagged releases. If you want to install a nightly build, click **Nightly Builds** and then select a version.
1. Select an **Edition**.
- **Enterprise:** This is the recommended version. It is functionally identical to the open-source version but includes features you can unlock with a license if you so choose.
- **Enterprise:** This is the recommended version. It is functionally identical to the open source version but includes features you can unlock with a license if you so choose.
- **Open Source:** This version is functionally identical to the Enterprise version, but you will need to download the Enterprise version if you want Enterprise features.
1. Depending on which system you are running, click the **Linux** or **ARM** tab on the [download page](/grafana/download).
1. Copy and paste the code from the [download page](/grafana/download) page into your command line and run.
1. Create a user account for Grafana on your system:
```shell
sudo useradd -r -s /bin/false grafana
```
1. Move the unpacked binary to `/usr/local/grafana`:
```shell
sudo mv <DOWNLOAD PATH> /usr/local/grafana
```
1. Change the owner of `/usr/local/grafana` to Grafana users:
```shell
sudo chown -R grafana:users /usr/local/grafana
```
1. Create a Grafana server systemd unit file:
```shell
sudo touch /etc/systemd/system/grafana-server.service
```
1. Add the following to the unit file in a text editor of your choice:
```ini
[Unit]
Description=Grafana Server
After=network.target
[Service]
Type=simple
User=grafana
Group=users
ExecStart=/usr/local/grafana/bin/grafana server --config=/usr/local/grafana/conf/grafana.ini --homepath=/usr/local/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
1. Use the binary to manually start the Grafana server:
```shell
/usr/local/grafana/bin/grafana-server --homepath /usr/local/grafana
```
{{< admonition type="note" >}}
Manually invoking the binary in this step automatically creates the `/usr/local/grafana/data` directory, which needs to be created and configured before the installation can be considered complete.
{{< /admonition >}}
1. Press `CTRL+C` to stop the Grafana server.
1. Change the owner of `/usr/local/grafana` to Grafana users again to apply the ownership to the newly created `/usr/local/grafana/data` directory:
```shell
sudo chown -R grafana:users /usr/local/grafana
```
1. [Configure the Grafana server to start at boot time using systemd]({{< relref "../../start-restart-grafana#configure-the-grafana-server-to-start-at-boot-using-systemd" >}}).
## Uninstall on RHEL or Fedora

View File

@@ -30,9 +30,9 @@ If you install from the RPM repository, then Grafana is automatically updated ev
| Grafana Enterprise | grafana-enterprise | `https://rpm.grafana.com` |
| Grafana OSS | grafana | `https://rpm.grafana.com` |
{{% admonition type="note" %}}
{{< admonition type="note" >}}
Grafana Enterprise is the recommended and default edition. It is available for free and includes all the features of the OSS edition. You can also upgrade to the [full Enterprise feature set](/products/enterprise/?utm_source=grafana-install-page), which has support for [Enterprise plugins](/grafana/plugins/?enterprise=1&utcm_source=grafana-install-page).
{{% /admonition %}}
{{< /admonition >}}
To install Grafana using the RPM repository, complete the following steps:
@@ -84,6 +84,8 @@ If you install Grafana manually using RPM, then you must manually update Grafana
## Install Grafana as a standalone binary
If you install Grafana manually using the standalone binaries, then you must manually update Grafana for each new version.
Complete the following steps to install Grafana using the standalone binaries:
1. Navigate to the [Grafana download page](/grafana/download).
@@ -91,10 +93,70 @@ Complete the following steps to install Grafana using the standalone binaries:
- The most recent Grafana version is selected by default.
- The **Version** field displays only tagged releases. If you want to install a nightly build, click **Nightly Builds** and then select a version.
1. Select an **Edition**.
- **Enterprise:** This is the recommended version. It is functionally identical to the open-source version but includes features you can unlock with a license if you so choose.
- **Enterprise:** This is the recommended version. It is functionally identical to the open source version but includes features you can unlock with a license if you so choose.
- **Open Source:** This version is functionally identical to the Enterprise version, but you will need to download the Enterprise version if you want Enterprise features.
1. Depending on which system you are running, click the **Linux** or **ARM** tab on the [download page](/grafana/download).
1. Copy and paste the code from the [download page](/grafana/download) into your command line and run.
1. Create a user account for Grafana on your system:
```shell
sudo useradd -r -s /bin/false grafana
```
1. Move the unpacked binary to `/usr/local/grafana`:
```shell
sudo mv <DOWNLOAD PATH> /usr/local/grafana
```
1. Change the owner of `/usr/local/grafana` to Grafana users:
```shell
sudo chown -R grafana:users /usr/local/grafana
```
1. Create a Grafana server systemd unit file:
```shell
sudo touch /etc/systemd/system/grafana-server.service
```
1. Add the following to the unit file in a text editor of your choice:
```ini
[Unit]
Description=Grafana Server
After=network.target
[Service]
Type=simple
User=grafana
Group=users
ExecStart=/usr/local/grafana/bin/grafana server --config=/usr/local/grafana/conf/grafana.ini --homepath=/usr/local/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
1. Use the binary to manually start the Grafana server:
```shell
/usr/local/grafana/bin/grafana-server --homepath /usr/local/grafana
```
{{< admonition type="note" >}}
Manually invoking the binary in this step automatically creates the `/usr/local/grafana/data` directory, which needs to be created and configured before the installation can be considered complete.
{{< /admonition >}}
1. Press `CTRL+C` to stop the Grafana server.
1. Change the owner of `/usr/local/grafana` to Grafana users again to apply the ownership to the newly created `/usr/local/grafana/data` directory:
```shell
sudo chown -R grafana:users /usr/local/grafana
```
1. [Configure the Grafana server to start at boot time using systemd](https://grafana.com/docs/grafana/latest/setup-grafana/start-restart-grafana/#configure-the-grafana-server-to-start-at-boot-using-systemd).
## Uninstall on SUSE or openSUSE

View File

@@ -244,6 +244,8 @@ To configure Grafana HTTPS and restart Grafana, complete the following steps.
> **Note**: The standard port for SSL traffic is 443, which you can use instead of Grafana's default port 3000. This change might require additional operating system privileges or configuration to bind to lower-numbered privileged ports.
1. Optional. From Grafana v11.2, edit the `cert_pass` configuration option with the decryption password if you are using encrypted certificates.
1. [Restart the Grafana server]({{< relref "./start-restart-grafana#linux" >}}) using `systemd`, `init.d`, or the binary as appropriate for your environment.
## Troubleshooting

View File

@@ -1,6 +1,6 @@
{
"name": "@test-plugins/extensions-test-app",
"version": "1.0.0",
"version": "11.4.3",
"private": true,
"scripts": {
"build": "webpack -c ./webpack.config.ts --env production",

View File

@@ -1,5 +1,5 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"npmClient": "yarn",
"version": "11.4.2"
"version": "11.4.3"
}

View File

@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "grafana",
"version": "11.4.2",
"version": "11.4.3",
"repository": "github:grafana/grafana",
"scripts": {
"build": "NODE_ENV=production nx exec --verbose -- webpack --config scripts/webpack/webpack.prod.js",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/data",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana Data Library",
"keywords": [
"typescript"
@@ -36,7 +36,7 @@
},
"dependencies": {
"@braintree/sanitize-url": "7.0.1",
"@grafana/schema": "11.4.2",
"@grafana/schema": "11.4.3",
"@types/d3-interpolate": "^3.0.0",
"@types/string-hash": "1.1.3",
"d3-interpolate": "3.0.1",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/e2e-selectors",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana End-to-End Test Selectors Library",
"keywords": [
"cli",

View File

@@ -1,7 +1,7 @@
{
"name": "@grafana/eslint-plugin",
"description": "ESLint rules for use within the Grafana repo. Not suitable (or supported) for external use.",
"version": "11.4.2",
"version": "11.4.3",
"main": "./index.cjs",
"author": "Grafana Labs",
"license": "Apache-2.0",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/flamegraph",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana flamegraph visualization component",
"keywords": [
"grafana",
@@ -44,8 +44,8 @@
],
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/ui": "11.4.3",
"@leeoniya/ufuzzy": "1.0.14",
"d3": "^7.8.5",
"lodash": "4.17.21",

View File

@@ -1,6 +1,6 @@
{
"name": "@grafana/saga-icons",
"version": "11.4.2",
"version": "11.4.3",
"private": true,
"description": "Icons for Grafana",
"author": "Grafana Labs",

View File

@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"name": "@grafana/o11y-ds-frontend",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"description": "Library to manage traces in Grafana.",
"sideEffects": false,
"repository": {
@@ -18,12 +18,12 @@
},
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/e2e-selectors": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"react-select": "5.8.1",
"react-use": "17.5.1",
"rxjs": "7.8.1",

View File

@@ -2,7 +2,7 @@
"name": "@grafana/plugin-configs",
"description": "Shared dependencies and files for core plugins",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"tslib": "2.7.0"
},

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "AGPL-3.0-only",
"name": "@grafana/prometheus",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana Prometheus Library",
"keywords": [
"typescript"
@@ -38,12 +38,12 @@
"dependencies": {
"@emotion/css": "11.13.4",
"@floating-ui/react": "0.26.24",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/faro-web-sdk": "1.10.2",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"@hello-pangea/dnd": "16.6.0",
"@leeoniya/ufuzzy": "1.0.14",
"@lezer/common": "1.2.2",
@@ -76,7 +76,7 @@
},
"devDependencies": {
"@emotion/eslint-plugin": "11.12.0",
"@grafana/e2e-selectors": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/tsconfig": "^2.0.0",
"@rollup/plugin-image": "3.0.3",
"@rollup/plugin-node-resolve": "15.3.0",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/runtime",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana Runtime Library",
"keywords": [
"grafana",
@@ -37,11 +37,11 @@
"postpack": "mv package.json.bak package.json"
},
"dependencies": {
"@grafana/data": "11.4.2",
"@grafana/e2e-selectors": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/faro-web-sdk": "^1.3.6",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"history": "4.10.1",
"lodash": "4.17.21",
"rxjs": "7.8.1",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/schema",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana Schema Library",
"keywords": [
"typescript"

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
limit: number;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip, common.OptionsWithTextFormatting {
/**

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends common.OptionsWithLegend, common.SingleStatBaseOptions {
displayMode: common.BarGaugeDisplayMode;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export enum VizDisplayMode {
Candles = 'candles',

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export enum HorizontalConstraint {
Center = 'center',

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface MetricStat {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
selectedSeries: number;

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export type UpdateConfig = {
render: boolean,

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export type BucketAggregation = (DateHistogram | Histogram | Terms | Filters | GeoHashGrid | Nested);

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends common.SingleStatBaseOptions {
minVizHeight: number;

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
basemap: ui.MapLayerOptions;

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
/**
* Controls the color mode of the heatmap

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip {
/**

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
dedupStrategy: common.LogsDedupStrategy;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export enum QueryEditorMode {
Builder = 'builder',

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface ArcOption {
/**

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
/**
* Select the pie chart display style.

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends common.SingleStatBaseOptions {
colorMode: common.BigValueColorMode;

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
/**

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
/**

View File

@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options {
/**

View File

@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export enum TextMode {
Code = 'code',

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
export interface Options extends common.OptionsWithTimezones {
legend: common.VizLegendOptions;

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
/**
* Identical to timeseries... except it does not have timezone settings

View File

@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.4.2";
export const pluginVersion = "11.4.3";
/**
* Auto is "table" in the UI

View File

@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "@grafana/sql",
"version": "11.4.2",
"version": "11.4.3",
"repository": {
"type": "git",
"url": "http://github.com/grafana/grafana.git",
@@ -15,11 +15,11 @@
},
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/e2e-selectors": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/ui": "11.4.3",
"@react-awesome-query-builder/ui": "6.6.3",
"immutable": "4.3.7",
"lodash": "4.17.21",

View File

@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/ui",
"version": "11.4.2",
"version": "11.4.3",
"description": "Grafana Components Library",
"keywords": [
"grafana",
@@ -51,10 +51,10 @@
"@emotion/react": "11.13.3",
"@emotion/serialize": "1.3.2",
"@floating-ui/react": "0.26.24",
"@grafana/data": "11.4.2",
"@grafana/e2e-selectors": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/faro-web-sdk": "^1.3.6",
"@grafana/schema": "11.4.2",
"@grafana/schema": "11.4.3",
"@hello-pangea/dnd": "16.6.0",
"@leeoniya/ufuzzy": "1.0.14",
"@monaco-editor/react": "4.6.0",

View File

@@ -26,12 +26,13 @@ func (lw *logWrapper) Println(v ...any) {
lw.logger.Info("graphite metric bridge", v...)
}
func ProvideService(cfg *setting.Cfg, reg prometheus.Registerer) (*InternalMetricsService, error) {
func ProvideService(cfg *setting.Cfg, reg prometheus.Registerer, gatherer prometheus.Gatherer) (*InternalMetricsService, error) {
initMetricVars(reg)
initFrontendMetrics(reg)
s := &InternalMetricsService{
Cfg: cfg,
Cfg: cfg,
gatherer: gatherer,
}
return s, s.readSettings()
}
@@ -41,6 +42,7 @@ type InternalMetricsService struct {
intervalSeconds int64
graphiteCfg *graphitebridge.Config
gatherer prometheus.Gatherer
}
func (im *InternalMetricsService) Run(ctx context.Context) error {

View File

@@ -5,8 +5,6 @@ import (
"strings"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/grafana/grafana/pkg/infra/metrics/graphitebridge"
)
@@ -40,7 +38,7 @@ func (im *InternalMetricsService) parseGraphiteSettings() error {
URL: address,
Prefix: graphiteSection.Key("prefix").MustString("prod.grafana.%(instance_name)s"),
CountersAsDelta: true,
Gatherer: prometheus.DefaultGatherer,
Gatherer: im.gatherer,
Interval: time.Duration(im.intervalSeconds) * time.Second,
Timeout: 10 * time.Second,
Logger: &logWrapper{logger: metricsLogger},

View File

@@ -78,10 +78,17 @@ type keySetJWKS struct {
}
func NewAzureADProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper *OrgRoleMapper, ssoSettings ssosettings.Service, features featuremgmt.FeatureToggles, cache remotecache.CacheStorage) *SocialAzureAD {
s := newSocialBase(social.AzureADProviderName, orgRoleMapper, info, features, cfg)
allowedOrganizations, err := util.SplitStringWithError(info.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.AzureADProviderName, "error", err)
}
provider := &SocialAzureAD{
SocialBase: newSocialBase(social.AzureADProviderName, orgRoleMapper, info, features, cfg),
SocialBase: s,
cache: cache,
allowedOrganizations: util.SplitString(info.Extra[allowedOrganizationsKey]),
allowedOrganizations: allowedOrganizations,
forceUseGraphAPI: MustBool(info.Extra[forceUseGraphAPIKey], ExtraAzureADSettingKeys[forceUseGraphAPIKey].DefaultValue.(bool)),
}
@@ -169,7 +176,7 @@ func (s *SocialAzureAD) UserInfo(ctx context.Context, client *http.Client, token
}
func (s *SocialAzureAD) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.AzureADProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}
@@ -183,7 +190,12 @@ func (s *SocialAzureAD) Reload(ctx context.Context, settings ssoModels.SSOSettin
appendUniqueScope(s.Config, social.OfflineAccessScope)
}
s.allowedOrganizations = util.SplitString(newInfo.Extra[allowedOrganizationsKey])
allowedOrganizations, err := util.SplitStringWithError(newInfo.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.AzureADProviderName, "error", err)
}
s.allowedOrganizations = allowedOrganizations
s.forceUseGraphAPI = MustBool(newInfo.Extra[forceUseGraphAPIKey], false)
return nil

View File

@@ -2,6 +2,7 @@ package connectors
import (
"context"
"errors"
"fmt"
"io"
"net/http"
@@ -13,6 +14,7 @@ import (
"github.com/mitchellh/mapstructure"
"golang.org/x/oauth2"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/login/social"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/util"
@@ -155,9 +157,25 @@ func MustBool(value any, defaultValue bool) bool {
return result
}
// CreateOAuthInfoFromKeyValuesWithLogging creates an OAuthInfo struct from a map[string]any using mapstructure
// it puts all extra key values into OAuthInfo's Extra map.
// It logs as errors any parsing errors that are not critical
func CreateOAuthInfoFromKeyValuesWithLogging(l log.Logger, provider string, settingsKV map[string]any) (*social.OAuthInfo, error) {
parsingWarns := []error{}
info, err := createOAuthInfoFromKeyValues(settingsKV, &parsingWarns)
if len(parsingWarns) > 0 {
l.Error("Invalid auth configuration setting", "error", errors.Join(parsingWarns...), "provider", provider)
}
return info, err
}
// CreateOAuthInfoFromKeyValues creates an OAuthInfo struct from a map[string]any using mapstructure
// it puts all extra key values into OAuthInfo's Extra map
func CreateOAuthInfoFromKeyValues(settingsKV map[string]any) (*social.OAuthInfo, error) {
return createOAuthInfoFromKeyValues(settingsKV, nil)
}
func createOAuthInfoFromKeyValues(settingsKV map[string]any, parsingWarns *[]error) (*social.OAuthInfo, error) {
emptyStrToSliceDecodeHook := func(from reflect.Type, to reflect.Type, data any) (any, error) {
if from.Kind() == reflect.String && to.Kind() == reflect.Slice {
strData, ok := data.(string)
@@ -168,7 +186,12 @@ func CreateOAuthInfoFromKeyValues(settingsKV map[string]any) (*social.OAuthInfo,
if strData == "" {
return []string{}, nil
}
return util.SplitString(strData), nil
splitStr, err := util.SplitStringWithError(strData)
if err != nil && parsingWarns != nil {
*parsingWarns = append(*parsingWarns, err)
}
return splitStr, nil
}
return data, nil
}

View File

@@ -53,6 +53,18 @@ type SocialGenericOAuth struct {
}
func NewGenericOAuthProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper *OrgRoleMapper, ssoSettings ssosettings.Service, features featuremgmt.FeatureToggles) *SocialGenericOAuth {
s := newSocialBase(social.GenericOAuthProviderName, orgRoleMapper, info, features, cfg)
teamIds, err := util.SplitStringWithError(info.Extra[teamIdsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", teamIdsKey, "provider", social.GenericOAuthProviderName, "error", err)
}
allowedOrganizations, err := util.SplitStringWithError(info.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.GenericOAuthProviderName, "error", err)
}
provider := &SocialGenericOAuth{
SocialBase: newSocialBase(social.GenericOAuthProviderName, orgRoleMapper, info, features, cfg),
teamsUrl: info.TeamsUrl,
@@ -63,8 +75,8 @@ func NewGenericOAuthProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMa
loginAttributePath: info.Extra[loginAttributePathKey],
idTokenAttributeName: info.Extra[idTokenAttributeNameKey],
teamIdsAttributePath: info.TeamIdsAttributePath,
teamIds: util.SplitString(info.Extra[teamIdsKey]),
allowedOrganizations: util.SplitString(info.Extra[allowedOrganizationsKey]),
teamIds: teamIds,
allowedOrganizations: allowedOrganizations,
}
if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) {
@@ -118,7 +130,7 @@ func validateTeamsUrlWhenNotEmpty(info *social.OAuthInfo, requester identity.Req
}
func (s *SocialGenericOAuth) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.GenericOAuthProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}
@@ -128,6 +140,15 @@ func (s *SocialGenericOAuth) Reload(ctx context.Context, settings ssoModels.SSOS
s.updateInfo(ctx, social.GenericOAuthProviderName, newInfo)
teamIds, err := util.SplitStringWithError(newInfo.Extra[teamIdsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", teamIdsKey, "provider", social.GenericOAuthProviderName, "error", err)
}
allowedOrganizations, err := util.SplitStringWithError(newInfo.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.GenericOAuthProviderName, "error", err)
}
s.teamsUrl = newInfo.TeamsUrl
s.emailAttributeName = newInfo.EmailAttributeName
s.emailAttributePath = newInfo.EmailAttributePath
@@ -136,8 +157,8 @@ func (s *SocialGenericOAuth) Reload(ctx context.Context, settings ssoModels.SSOS
s.loginAttributePath = newInfo.Extra[loginAttributePathKey]
s.idTokenAttributeName = newInfo.Extra[idTokenAttributeNameKey]
s.teamIdsAttributePath = newInfo.TeamIdsAttributePath
s.teamIds = util.SplitString(newInfo.Extra[teamIdsKey])
s.allowedOrganizations = util.SplitString(newInfo.Extra[allowedOrganizationsKey])
s.teamIds = teamIds
s.allowedOrganizations = allowedOrganizations
return nil
}

View File

@@ -62,13 +62,23 @@ var (
)
func NewGitHubProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper *OrgRoleMapper, ssoSettings ssosettings.Service, features featuremgmt.FeatureToggles) *SocialGithub {
teamIdsSplitted := util.SplitString(info.Extra[teamIdsKey])
s := newSocialBase(social.GitHubProviderName, orgRoleMapper, info, features, cfg)
teamIdsSplitted, err := util.SplitStringWithError(info.Extra[teamIdsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", teamIdsKey, "provider", social.GitHubProviderName, "error", err)
}
teamIds := mustInts(teamIdsSplitted)
allowedOrganizations, err := util.SplitStringWithError(info.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.GitHubProviderName, "error", err)
}
provider := &SocialGithub{
SocialBase: newSocialBase(social.GitHubProviderName, orgRoleMapper, info, features, cfg),
SocialBase: s,
teamIds: teamIds,
allowedOrganizations: util.SplitString(info.Extra[allowedOrganizationsKey]),
allowedOrganizations: allowedOrganizations,
}
if len(teamIdsSplitted) != len(teamIds) {
@@ -117,14 +127,22 @@ func teamIdsNumbersValidator(info *social.OAuthInfo, requester identity.Requeste
}
func (s *SocialGithub) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.GitHubProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}
teamIdsSplitted := util.SplitString(newInfo.Extra[teamIdsKey])
teamIdsSplitted, err := util.SplitStringWithError(newInfo.Extra[teamIdsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", teamIdsKey, "provider", social.GitHubProviderName, "error", err)
}
teamIds := mustInts(teamIdsSplitted)
allowedOrganizations, err := util.SplitStringWithError(newInfo.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.GitHubProviderName, "error", err)
}
if len(teamIdsSplitted) != len(teamIds) {
s.log.Warn("Failed to parse team ids. Team ids must be a list of numbers.", "teamIds", teamIdsSplitted)
}
@@ -135,7 +153,7 @@ func (s *SocialGithub) Reload(ctx context.Context, settings ssoModels.SSOSetting
s.updateInfo(ctx, social.GitHubProviderName, newInfo)
s.teamIds = teamIds
s.allowedOrganizations = util.SplitString(newInfo.Extra[allowedOrganizationsKey])
s.allowedOrganizations = allowedOrganizations
return nil
}

View File

@@ -87,7 +87,7 @@ func (s *SocialGitlab) Validate(ctx context.Context, newSettings ssoModels.SSOSe
}
func (s *SocialGitlab) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.GitlabProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}

View File

@@ -87,7 +87,7 @@ func (s *SocialGoogle) Validate(ctx context.Context, newSettings ssoModels.SSOSe
}
func (s *SocialGoogle) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.GoogleProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}

View File

@@ -36,15 +36,22 @@ type OrgRecord struct {
}
func NewGrafanaComProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper *OrgRoleMapper, ssoSettings ssosettings.Service, features featuremgmt.FeatureToggles) *SocialGrafanaCom {
s := newSocialBase(social.GrafanaComProviderName, orgRoleMapper, info, features, cfg)
// Override necessary settings
info.AuthUrl = cfg.GrafanaComURL + "/oauth2/authorize"
info.TokenUrl = cfg.GrafanaComURL + "/api/oauth2/token"
info.AuthStyle = "inheader"
allowedOrganizations, err := util.SplitStringWithError(info.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.GrafanaComProviderName, "error", err)
}
provider := &SocialGrafanaCom{
SocialBase: newSocialBase(social.GrafanaComProviderName, orgRoleMapper, info, features, cfg),
SocialBase: s,
url: cfg.GrafanaComURL,
allowedOrganizations: util.SplitString(info.Extra[allowedOrganizationsKey]),
allowedOrganizations: allowedOrganizations,
}
if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) {
@@ -77,11 +84,16 @@ func (s *SocialGrafanaCom) Validate(ctx context.Context, newSettings ssoModels.S
}
func (s *SocialGrafanaCom) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.GrafanaComProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}
allowedOrganizations, err := util.SplitStringWithError(newInfo.Extra[allowedOrganizationsKey])
if err != nil {
s.log.Error("Invalid auth configuration setting", "config", allowedOrganizationsKey, "provider", social.GrafanaComProviderName, "error", err)
}
// Override necessary settings
newInfo.AuthUrl = s.cfg.GrafanaComURL + "/oauth2/authorize"
newInfo.TokenUrl = s.cfg.GrafanaComURL + "/api/oauth2/token"
@@ -93,7 +105,7 @@ func (s *SocialGrafanaCom) Reload(ctx context.Context, settings ssoModels.SSOSet
s.updateInfo(ctx, social.GrafanaComProviderName, newInfo)
s.url = s.cfg.GrafanaComURL
s.allowedOrganizations = util.SplitString(newInfo.Extra[allowedOrganizationsKey])
s.allowedOrganizations = allowedOrganizations
return nil
}

View File

@@ -84,7 +84,7 @@ func (s *SocialOkta) Validate(ctx context.Context, newSettings ssoModels.SSOSett
}
func (s *SocialOkta) Reload(ctx context.Context, settings ssoModels.SSOSettings) error {
newInfo, err := CreateOAuthInfoFromKeyValues(settings.Settings)
newInfo, err := CreateOAuthInfoFromKeyValuesWithLogging(s.log, social.OktaProviderName, settings.Settings)
if err != nil {
return ssosettings.ErrInvalidSettings.Errorf("SSO settings map cannot be converted to OAuthInfo: %v", err)
}

View File

@@ -65,7 +65,7 @@ func ProvideService(cfg *setting.Cfg,
continue
}
info, err := connectors.CreateOAuthInfoFromKeyValues(ssoSetting.Settings)
info, err := connectors.CreateOAuthInfoFromKeyValuesWithLogging(ss.log, ssoSetting.Provider, ssoSetting.Settings)
if err != nil {
ss.log.Error("Failed to create OAuthInfo for provider", "error", err, "provider", ssoSetting.Provider)
continue
@@ -85,7 +85,7 @@ func ProvideService(cfg *setting.Cfg,
settingsKVs := convertIniSectionToMap(sec)
info, err := connectors.CreateOAuthInfoFromKeyValues(settingsKVs)
info, err := connectors.CreateOAuthInfoFromKeyValuesWithLogging(ss.log, name, settingsKVs)
if err != nil {
ss.log.Error("Failed to create OAuthInfo for provider", "error", err, "provider", name)
continue

View File

@@ -81,29 +81,38 @@ func (s *UserSync) SyncUserHook(ctx context.Context, id *authn.Identity, _ *auth
}
// Does user exist in the database?
usr, userAuth, errUserInDB := s.getUser(ctx, id)
if errUserInDB != nil && !errors.Is(errUserInDB, user.ErrUserNotFound) {
s.log.FromContext(ctx).Error("Failed to fetch user", "error", errUserInDB, "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
usr, userAuth, err := s.getUser(ctx, id)
if err != nil && !errors.Is(err, user.ErrUserNotFound) {
s.log.FromContext(ctx).Error("Failed to fetch user", "error", err, "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
return errSyncUserInternal.Errorf("unable to retrieve user")
}
if errors.Is(errUserInDB, user.ErrUserNotFound) {
if errors.Is(err, user.ErrUserNotFound) {
if !id.ClientParams.AllowSignUp {
s.log.FromContext(ctx).Warn("Failed to create user, signup is not allowed for module", "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
return errUserSignupDisabled.Errorf("%w", errSignupNotAllowed)
}
// create user
var errCreate error
usr, errCreate = s.createUser(ctx, id)
if errCreate != nil {
s.log.FromContext(ctx).Error("Failed to create user", "error", errCreate, "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
return errSyncUserInternal.Errorf("unable to create user: %w", errCreate)
usr, err = s.createUser(ctx, id)
// There is a possibility for a race condition when creating a user. Most clients will probably not hit this
// case but others will. The one we have seen this issue for is auth proxy. First time a new user loads grafana
// several requests can get "user.ErrUserNotFound" at the same time but only one of the request will be allowed
// to actually create the user, resulting in all other requests getting "user.ErrUserAlreadyExists". So we can
// just try to fetch the user one more to make the other request work.
if errors.Is(err, user.ErrUserAlreadyExists) {
usr, _, err = s.getUser(ctx, id)
}
if err != nil {
s.log.FromContext(ctx).Error("Failed to create user", "error", err, "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
return errSyncUserInternal.Errorf("unable to create user: %w", err)
}
} else {
// update user
if errUpdate := s.updateUserAttributes(ctx, usr, id, userAuth); errUpdate != nil {
s.log.FromContext(ctx).Error("Failed to update user", "error", errUpdate, "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
if err := s.updateUserAttributes(ctx, usr, id, userAuth); err != nil {
s.log.FromContext(ctx).Error("Failed to update user", "error", err, "auth_module", id.AuthenticatedBy, "auth_id", id.AuthID)
return errSyncUserInternal.Errorf("unable to update user")
}
}
@@ -297,6 +306,7 @@ func (s *UserSync) updateUserAttributes(ctx context.Context, usr *user.User, id
func (s *UserSync) createUser(ctx context.Context, id *authn.Identity) (*user.User, error) {
ctx, span := s.tracer.Start(ctx, "user.sync.createUser")
defer span.End()
// FIXME(jguer): this should be done in the user service
// quota check: we can have quotas on both global and org level
// therefore we need to query check quota for both user and org services
@@ -316,19 +326,18 @@ func (s *UserSync) createUser(ctx context.Context, id *authn.Identity) (*user.Us
isAdmin = *id.IsGrafanaAdmin
}
usr, errCreateUser := s.userService.Create(ctx, &user.CreateUserCommand{
usr, err := s.userService.Create(ctx, &user.CreateUserCommand{
Login: id.Login,
Email: id.Email,
Name: id.Name,
IsAdmin: isAdmin,
SkipOrgSetup: len(id.OrgRoles) > 0,
})
if errCreateUser != nil {
return nil, errCreateUser
if err != nil {
return nil, err
}
err := s.upsertAuthConnection(ctx, usr.ID, id, true)
if err != nil {
if err := s.upsertAuthConnection(ctx, usr.ID, id, true); err != nil {
return nil, err
}

View File

@@ -6,6 +6,7 @@ import (
"github.com/grafana/authlib/claims"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/tracing"
@@ -447,6 +448,34 @@ func TestUserSync_SyncUserHook(t *testing.T) {
}
}
func TestUserSync_SyncUserRetryFetch(t *testing.T) {
userSrv := usertest.NewMockService(t)
userSrv.On("GetByEmail", mock.Anything, mock.Anything).Return(nil, user.ErrUserNotFound).Once()
userSrv.On("Create", mock.Anything, mock.Anything).Return(nil, user.ErrUserAlreadyExists).Once()
userSrv.On("GetByEmail", mock.Anything, mock.Anything).Return(&user.User{ID: 1}, nil).Once()
s := ProvideUserSync(
userSrv,
authinfoimpl.ProvideOSSUserProtectionService(),
&authinfotest.FakeService{},
&quotatest.FakeQuotaService{},
tracing.NewNoopTracerService(),
)
email := "test@test.com"
err := s.SyncUserHook(context.Background(), &authn.Identity{
ClientParams: authn.ClientParams{
SyncUser: true,
AllowSignUp: true,
LookUpParams: login.UserLookupParams{
Email: &email,
},
},
}, nil)
require.NoError(t, err)
}
func TestUserSync_FetchSyncedUserHook(t *testing.T) {
type testCase struct {
desc string

View File

@@ -47,6 +47,11 @@ var (
StatusCode: 400,
Status: "empty-name",
}
ErrDashboardTitleTooLong = DashboardErr{
Reason: "Dashboard title cannot contain more than 5 000 characters",
StatusCode: 400,
Status: "title-too-long",
}
ErrDashboardFolderCannotHaveParent = DashboardErr{
Reason: "A Dashboard Folder cannot be added to another folder",
StatusCode: 400,

View File

@@ -121,6 +121,10 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
return nil, dashboards.ErrDashboardTitleEmpty
}
if len(dash.Title) > 5000 {
return nil, dashboards.ErrDashboardTitleTooLong
}
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
// nolint:staticcheck
if dash.IsFolder && dash.FolderID > 0 {

View File

@@ -33,9 +33,18 @@ func stringsFallback(vals ...string) string {
// SplitString splits a string and returns a list of strings. It supports JSON list syntax and strings separated by commas or spaces.
// It supports quoted strings with spaces, e.g. "foo bar", "baz".
// It will return an empty list if it fails to parse the string.
func SplitString(str string) []string {
result, _ := SplitStringWithError(str)
return result
}
// SplitStringWithError splits a string and returns a list of strings. It supports JSON list syntax and strings separated by commas or spaces.
// It supports quoted strings with spaces, e.g. "foo bar", "baz".
// It returns an error if it cannot parse the string.
func SplitStringWithError(str string) ([]string, error) {
if len(str) == 0 {
return []string{}
return []string{}, nil
}
// JSON list syntax support
@@ -43,9 +52,9 @@ func SplitString(str string) []string {
var res []string
err := json.Unmarshal([]byte(str), &res)
if err != nil {
return []string{}
return []string{}, fmt.Errorf("incorrect format: %s", str)
}
return res
return res, nil
}
matches := stringListItemMatcher.FindAllString(str, -1)
@@ -55,7 +64,7 @@ func SplitString(str string) []string {
result[i] = strings.Trim(match, "\"")
}
return result
return result, nil
}
// GetAgeString returns a string representing certain time from years to minutes.

View File

@@ -390,6 +390,12 @@ function handleRedirectTo(): void {
const queryParams = locationService.getSearch();
const redirectToParamKey = 'redirectTo';
if (queryParams.has('auth_token')) {
// URL Login should not be redirected
window.sessionStorage.removeItem(RedirectToUrlKey);
return;
}
if (queryParams.has(redirectToParamKey) && window.location.pathname !== '/') {
const rawRedirectTo = queryParams.get(redirectToParamKey)!;
window.sessionStorage.setItem(RedirectToUrlKey, encodeURIComponent(rawRedirectTo));

View File

@@ -53,7 +53,10 @@ const strToValue = (val: string | string[]): SelectableValue[] => {
}
// Stored as JSON Array
if (val.startsWith('[') && val.endsWith(']')) {
return JSON.parse(val).map((v: string) => ({ label: v, value: v }));
// Fallback to parsing it like a non-json string if it is not valid json, instead of crashing.
try {
return JSON.parse(val).map((v: string) => ({ label: v, value: v }));
} catch {}
}
return val.split(/[\s,]/).map((s) => ({ label: s, value: s }));

View File

@@ -41,6 +41,8 @@ export function DashboardScenePage({ route, queryParams, history }: Props) {
stateManager.loadSnapshot(slug!);
} else {
stateManager.loadDashboard({
type,
slug,
uid: uid ?? '',
route: route.routeName as DashboardRoutes,
urlFolderUid: queryParams.folderUid,

View File

@@ -46,6 +46,8 @@ interface DashboardCacheEntry {
export interface LoadDashboardOptions {
uid: string;
route: DashboardRoutes;
type?: string;
slug?: string;
urlFolderUid?: string;
// A temporary approach not to clean the dashboard from local storage when navigating from Explore to Dashboard
// We currently need it as there are two flows of fetching dashboard. The legacy one (initDashboard), uses the new one(DashboardScenePageStateManager.fetch) where the
@@ -64,6 +66,8 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
// To eventualy replace the fetchDashboard function from Dashboard redux state management.
// For now it's a simplistic version to support Home and Normal dashboard routes.
public async fetchDashboard({
type,
slug,
uid,
route,
urlFolderUid,
@@ -111,7 +115,7 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
return await dashboardLoaderSrv.loadDashboard('public', '', uid);
}
default:
rsp = await dashboardLoaderSrv.loadDashboard('db', '', uid);
rsp = await dashboardLoaderSrv.loadDashboard(type || 'db', slug || '', uid);
if (route === DashboardRoutes.Embedded) {
rsp.meta.isEmbedded = true;

View File

@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import classNames from 'classnames';
import { useEffect } from 'react';
import { useEffect, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { SceneGridRow, VizPanel, sceneGraph } from '@grafana/scenes';
@@ -12,6 +12,7 @@ import { forceActivateFullSceneObjectTree } from '../utils/utils';
import { DashboardGridItem } from './DashboardGridItem';
import { DashboardScene } from './DashboardScene';
import { DefaultGridLayoutManager } from './layout-default/DefaultGridLayoutManager';
import { DashboardRepeatsProcessedEvent } from './types';
export interface Props {
dashboard: DashboardScene;
@@ -25,6 +26,7 @@ export function PanelSearchLayout({ dashboard, panelSearch = '', panelsPerRow }:
const { body } = dashboard.state;
const filteredPanels: VizPanel[] = [];
const styles = useStyles2(getStyles);
const [_, setRepeatsUpdated] = useState('');
const bodyGrid = body instanceof DefaultGridLayoutManager ? body.state.grid : null;
@@ -34,11 +36,11 @@ export function PanelSearchLayout({ dashboard, panelSearch = '', panelsPerRow }:
for (const gridItem of bodyGrid.state.children) {
if (gridItem instanceof DashboardGridItem) {
filterPanels(gridItem, dashboard, panelSearch, filteredPanels);
filterPanels(gridItem, dashboard, panelSearch, filteredPanels, setRepeatsUpdated);
} else if (gridItem instanceof SceneGridRow) {
for (const rowItem of gridItem.state.children) {
if (rowItem instanceof DashboardGridItem) {
filterPanels(rowItem, dashboard, panelSearch, filteredPanels);
filterPanels(rowItem, dashboard, panelSearch, filteredPanels, setRepeatsUpdated);
}
}
}
@@ -98,7 +100,8 @@ function filterPanels(
gridItem: DashboardGridItem,
dashboard: DashboardScene,
searchString: string,
filteredPanels: VizPanel[]
filteredPanels: VizPanel[],
setRepeatsUpdated: (updated: string) => void
) {
const interpolatedSearchString = sceneGraph.interpolate(dashboard, searchString).toLowerCase();
@@ -107,6 +110,12 @@ function filterPanels(
const panel = gridItem.state.body;
const interpolatedTitle = panel.interpolate(panel.state.title, undefined, 'text').toLowerCase();
if (interpolatedTitle.includes(interpolatedSearchString)) {
gridItem.subscribeToEvent(DashboardRepeatsProcessedEvent, (event) => {
const source = event.payload.source;
if (source instanceof DashboardGridItem) {
setRepeatsUpdated(event.payload.source.state.key ?? '');
}
});
gridItem.activate();
}
}

View File

@@ -24,12 +24,12 @@ export interface Props extends GrafanaRouteComponentProps<DashboardPageRoutePara
export function SoloPanelPage({ queryParams }: Props) {
const stateManager = getDashboardScenePageStateManager();
const { dashboard } = stateManager.useState();
const { uid = '' } = useParams();
const { uid = '', type, slug } = useParams();
useEffect(() => {
stateManager.loadDashboard({ uid, route: DashboardRoutes.Embedded });
stateManager.loadDashboard({ uid, type, slug, route: DashboardRoutes.Embedded });
return () => stateManager.clearState();
}, [stateManager, queryParams, uid]);
}, [stateManager, queryParams, uid, type, slug]);
if (!queryParams.panelId) {
return <EntityNotFound entity="Panel" />;

View File

@@ -44,6 +44,8 @@ function DashboardPageProxy(props: DashboardPageProxyProps) {
route: props.route.routeName as DashboardRoutes,
uid: params.uid ?? '',
keepDashboardFromExploreInLocalStorage: true,
type: params.type,
slug: params.slug,
});
}, [params.uid, props.route.routeName]);

View File

@@ -2,14 +2,14 @@
"name": "@grafana-plugins/grafana-azure-monitor-datasource",
"description": "Grafana data source for Azure Monitor",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"@kusto/monaco-kusto": "^10.0.0",
"fast-deep-equal": "^3.1.3",
"i18next": "^23.0.0",
@@ -25,8 +25,8 @@
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.4.2",
"@grafana/plugin-configs": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/dom": "10.0.0",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",

View File

@@ -2,15 +2,15 @@
"name": "@grafana-plugins/stackdriver",
"description": "Grafana data source for Google Cloud Monitoring",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/google-sdk": "0.1.2",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"debounce-promise": "3.1.2",
"fast-deep-equal": "^3.1.3",
"i18next": "^23.0.0",
@@ -26,8 +26,8 @@
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.4.2",
"@grafana/plugin-configs": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/dom": "10.0.0",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",

View File

@@ -2,22 +2,22 @@
"name": "@grafana-plugins/grafana-postgresql-datasource",
"description": "PostgreSQL data source plugin",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/sql": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/sql": "11.4.3",
"@grafana/ui": "11.4.3",
"lodash": "4.17.21",
"react": "18.2.0",
"rxjs": "7.8.1",
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.4.2",
"@grafana/plugin-configs": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",
"@types/jest": "29.5.13",

View File

@@ -2,13 +2,13 @@
"name": "@grafana-plugins/grafana-pyroscope-datasource",
"description": "Continuous profiling for analysis of CPU and memory usage, down to the line number and throughout time. Saving infrastructure cost, improving performance, and increasing reliability.",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"fast-deep-equal": "^3.1.3",
"lodash": "4.17.21",
"monaco-editor": "0.34.1",
@@ -20,7 +20,7 @@
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/plugin-configs": "11.4.2",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/dom": "10.0.0",
"@testing-library/jest-dom": "6.4.2",
"@testing-library/react": "15.0.2",

View File

@@ -2,14 +2,14 @@
"name": "@grafana-plugins/grafana-testdata-datasource",
"description": "Generates test data in different forms",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"d3-random": "^3.0.1",
"lodash": "4.17.21",
"micro-memoize": "^4.1.2",
@@ -22,8 +22,8 @@
"uuid": "9.0.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.4.2",
"@grafana/plugin-configs": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/dom": "10.0.0",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",

View File

@@ -2,7 +2,7 @@
"name": "@grafana-plugins/jaeger",
"description": "Jaeger plugin for Grafana",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "workspace:*",

View File

@@ -2,22 +2,22 @@
"name": "@grafana-plugins/mssql",
"description": "MSSQL data source plugin",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/sql": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/sql": "11.4.3",
"@grafana/ui": "11.4.3",
"lodash": "4.17.21",
"react": "18.2.0",
"rxjs": "7.8.1",
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.4.2",
"@grafana/plugin-configs": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",
"@types/jest": "29.5.13",

View File

@@ -2,22 +2,22 @@
"name": "@grafana-plugins/mysql",
"description": "MySQL data source plugin",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/experimental": "2.1.1",
"@grafana/runtime": "11.4.2",
"@grafana/sql": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/runtime": "11.4.3",
"@grafana/sql": "11.4.3",
"@grafana/ui": "11.4.3",
"lodash": "4.17.21",
"react": "18.2.0",
"rxjs": "7.8.1",
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.4.2",
"@grafana/plugin-configs": "11.4.2",
"@grafana/e2e-selectors": "11.4.3",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",
"@types/jest": "29.5.13",

View File

@@ -2,13 +2,13 @@
"name": "@grafana-plugins/parca",
"description": "Continuous profiling for analysis of CPU and memory usage, down to the line number and throughout time. Saving infrastructure cost, improving performance, and increasing reliability.",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "11.4.2",
"@grafana/runtime": "11.4.2",
"@grafana/schema": "11.4.2",
"@grafana/ui": "11.4.2",
"@grafana/data": "11.4.3",
"@grafana/runtime": "11.4.3",
"@grafana/schema": "11.4.3",
"@grafana/ui": "11.4.3",
"lodash": "4.17.21",
"monaco-editor": "0.34.1",
"react": "18.2.0",
@@ -18,7 +18,7 @@
"tslib": "2.7.0"
},
"devDependencies": {
"@grafana/plugin-configs": "11.4.2",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/dom": "10.0.0",
"@testing-library/react": "15.0.2",
"@testing-library/user-event": "14.5.2",

View File

@@ -2,7 +2,7 @@
"name": "@grafana-plugins/tempo",
"description": "Grafana plugin for the Tempo data source.",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "workspace:*",
@@ -39,7 +39,7 @@
"uuid": "9.0.1"
},
"devDependencies": {
"@grafana/plugin-configs": "11.4.2",
"@grafana/plugin-configs": "11.4.3",
"@testing-library/dom": "10.0.0",
"@testing-library/jest-dom": "6.4.2",
"@testing-library/react": "15.0.2",

View File

@@ -2,7 +2,7 @@
"name": "@grafana-plugins/zipkin",
"description": "Zipkin plugin for Grafana",
"private": true,
"version": "11.4.2",
"version": "11.4.3",
"dependencies": {
"@emotion/css": "11.13.4",
"@grafana/data": "workspace:*",

View File

@@ -95,8 +95,10 @@ export function getAppRoutes(): RouteDescriptor[] {
path: '/dashboard-solo/:type/:slug',
routeName: DashboardRoutes.Normal,
chromeless: true,
component: SafeDynamicImport(
() => import(/* webpackChunkName: "SoloPanelPage" */ '../features/dashboard/containers/SoloPanelPage')
component: SafeDynamicImport(() =>
config.featureToggles.dashboardSceneSolo
? import(/* webpackChunkName: "SoloPanelPage" */ '../features/dashboard-scene/solo/SoloPanelPage')
: import(/* webpackChunkName: "SoloPanelPageOld" */ '../features/dashboard/containers/SoloPanelPage')
),
},
{

View File

@@ -13,16 +13,11 @@
'use strict';
// accessible variables in this scope
let window, document, $, jQuery, moment, kbn;
// accessible variables in this scope: window, document, $, jQuery, moment, kbn;
// Setup some variables
let dashboard;
// All url parameters are available via the ARGS object
// eslint-disable-next-line no-redeclare
let ARGS;
// Initialize a skeleton with nothing but a rows array and service object
dashboard = {
rows: [],
@@ -56,6 +51,7 @@ for (let i = 0; i < rows; i++) {
height: '300px',
panels: [
{
id: 1,
title: 'Events',
type: 'graph',
span: 12,
@@ -63,23 +59,17 @@ for (let i = 0; i < rows; i++) {
linewidth: 2,
targets: [
{
target: "randomWalk('" + seriesName + "')",
scenarioId: 'random_walk',
refId: 'A',
seriesCount: 1,
alias: seriesName,
},
{
target: "randomWalk('random walk2')",
scenarioId: 'random_walk',
refId: 'B',
seriesCount: 1,
},
],
seriesOverrides: [
{
alias: '/random/',
yaxis: 2,
fill: 0,
linewidth: 5,
},
],
tooltip: {
shared: true,
},
},
],
});

View File

@@ -17,7 +17,7 @@
'use strict';
// accessible variables in this scope
let window, document, ARGS, $, jQuery, moment, kbn;
// let window, document, ARGS, $, jQuery, moment, kbn;
return function (callback) {
// Setup some variables
@@ -60,6 +60,7 @@ return function (callback) {
height: '300px',
panels: [
{
id: 1,
title: 'Async dashboard test',
type: 'text',
span: 12,

View File

@@ -14,14 +14,14 @@
'use strict';
// accessible variables in this scope
let window, document, $, jQuery, moment, kbn;
// let window, document, $, jQuery, moment, kbn;
// Setup some variables
let dashboard;
// All url parameters are available via the ARGS object
// eslint-disable-next-line no-redeclare
let ARGS;
// let ARGS;
// Initialize a skeleton with nothing but a rows array and service object
dashboard = {
@@ -44,19 +44,22 @@ dashboard.templating = {
list: [
{
name: 'test',
query: 'apps.backend.*',
refresh: 1,
type: 'query',
datasource: null,
hide: 2,
includeAll: false,
multi: false,
query: 'a,b,c\n',
skipUrlSync: false,
type: 'custom',
},
{
name: 'test2',
query: '*',
refresh: 1,
type: 'query',
datasource: null,
hide: 2,
name: 'seriesName',
label: 'Series name',
hide: 0,
includeAll: false,
multi: false,
query: 'series1,series2,series3\n',
skipUrlSync: false,
type: 'custom',
},
],
};
@@ -78,6 +81,7 @@ for (let i = 0; i < rows; i++) {
height: '300px',
panels: [
{
id: 1,
title: 'Events',
type: 'graph',
span: 12,
@@ -85,10 +89,16 @@ for (let i = 0; i < rows; i++) {
linewidth: 2,
targets: [
{
target: "randomWalk('" + seriesName + "')",
scenarioId: 'random_walk',
refId: 'A',
seriesCount: 1,
alias: seriesName,
},
{
target: "randomWalk('[[test2]]')",
scenarioId: 'random_walk',
refId: 'B',
seriesCount: 1,
alias: '${seriesName}',
},
],
},

View File

@@ -47,7 +47,9 @@ def rgm_artifacts_step(
"_EXPERIMENTAL_DAGGER_CLOUD_TOKEN": from_secret(rgm_dagger_token),
},
"commands": [
"docker run --privileged --rm tonistiigi/binfmt --install all",
"docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --version",
"docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --uninstall 'qemu-*'",
"docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --install all",
cmd +
"--go-version={} ".format(golang_version) +
"--yarn-cache=$$YARN_CACHE_FOLDER " +
@@ -78,7 +80,9 @@ def rgm_build_docker_step(ubuntu, alpine, depends_on = ["yarn-install"], file =
"_EXPERIMENTAL_DAGGER_CLOUD_TOKEN": from_secret(rgm_dagger_token),
},
"commands": [
"docker run --privileged --rm tonistiigi/binfmt --install all",
"docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --version",
"docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --uninstall 'qemu-*'",
"docker run --privileged --rm tonistiigi/binfmt:qemu-v7.0.0-28 --install all",
"/src/grafana-build artifacts " +
"-a docker:grafana:linux/amd64 " +
"-a docker:grafana:linux/amd64:ubuntu " +

View File

@@ -16,7 +16,7 @@ images = {
"node_deb": "node:{}-bookworm".format(nodejs_version[:2]),
"cloudsdk": "google/cloud-sdk:431.0.0",
"publish": "grafana/grafana-ci-deploy:1.3.3",
"alpine": "alpine:3.20.5",
"alpine": "alpine:3.20.6",
"ubuntu": "ubuntu:22.04",
"curl": "byrnedo/alpine-curl:0.1.8",
"plugins_slack": "plugins/slack",

View File

@@ -2,7 +2,7 @@
global variables
"""
grabpl_version = "v3.1.1"
grabpl_version = "v3.1.2"
golang_version = "1.23.5"
# nodejs_version should match what's in ".nvmrc", but without the v prefix.

156
yarn.lock
View File

@@ -3133,13 +3133,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-azure-monitor-datasource@workspace:public/app/plugins/datasource/azuremonitor"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@kusto/monaco-kusto": "npm:^10.0.0"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/react": "npm:15.0.2"
@@ -3177,13 +3177,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-postgresql-datasource@workspace:public/app/plugins/datasource/grafana-postgresql-datasource"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/sql": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/sql": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/react": "npm:15.0.2"
"@testing-library/user-event": "npm:14.5.2"
"@types/jest": "npm:29.5.13"
@@ -3208,11 +3208,11 @@ __metadata:
resolution: "@grafana-plugins/grafana-pyroscope-datasource@workspace:public/app/plugins/datasource/grafana-pyroscope-datasource"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/jest-dom": "npm:6.4.2"
"@testing-library/react": "npm:15.0.2"
@@ -3249,13 +3249,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-testdata-datasource@workspace:public/app/plugins/datasource/grafana-testdata-datasource"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/react": "npm:15.0.2"
"@testing-library/user-event": "npm:14.5.2"
@@ -3332,13 +3332,13 @@ __metadata:
resolution: "@grafana-plugins/mssql@workspace:public/app/plugins/datasource/mssql"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/sql": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/sql": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/react": "npm:15.0.2"
"@testing-library/user-event": "npm:14.5.2"
"@types/jest": "npm:29.5.13"
@@ -3363,13 +3363,13 @@ __metadata:
resolution: "@grafana-plugins/mysql@workspace:public/app/plugins/datasource/mysql"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/sql": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/sql": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/react": "npm:15.0.2"
"@testing-library/user-event": "npm:14.5.2"
"@types/jest": "npm:29.5.13"
@@ -3394,11 +3394,11 @@ __metadata:
resolution: "@grafana-plugins/parca@workspace:public/app/plugins/datasource/parca"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/react": "npm:15.0.2"
"@testing-library/user-event": "npm:14.5.2"
@@ -3426,14 +3426,14 @@ __metadata:
resolution: "@grafana-plugins/stackdriver@workspace:public/app/plugins/datasource/cloud-monitoring"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/google-sdk": "npm:0.1.2"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/ui": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/ui": "npm:11.4.3"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/react": "npm:15.0.2"
"@testing-library/user-event": "npm:14.5.2"
@@ -3481,7 +3481,7 @@ __metadata:
"@grafana/lezer-traceql": "npm:0.0.19"
"@grafana/monaco-logql": "npm:^0.0.7"
"@grafana/o11y-ds-frontend": "workspace:*"
"@grafana/plugin-configs": "npm:11.4.2"
"@grafana/plugin-configs": "npm:11.4.3"
"@grafana/runtime": "workspace:*"
"@grafana/schema": "workspace:*"
"@grafana/ui": "workspace:*"
@@ -3591,12 +3591,12 @@ __metadata:
languageName: node
linkType: hard
"@grafana/data@npm:11.4.2, @grafana/data@workspace:*, @grafana/data@workspace:packages/grafana-data":
"@grafana/data@npm:11.4.3, @grafana/data@workspace:*, @grafana/data@workspace:packages/grafana-data":
version: 0.0.0-use.local
resolution: "@grafana/data@workspace:packages/grafana-data"
dependencies:
"@braintree/sanitize-url": "npm:7.0.1"
"@grafana/schema": "npm:11.4.2"
"@grafana/schema": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@rollup/plugin-node-resolve": "npm:15.3.0"
"@types/d3-interpolate": "npm:^3.0.0"
@@ -3644,7 +3644,7 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/e2e-selectors@npm:11.4.2, @grafana/e2e-selectors@workspace:*, @grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors":
"@grafana/e2e-selectors@npm:11.4.3, @grafana/e2e-selectors@workspace:*, @grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors":
version: 0.0.0-use.local
resolution: "@grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors"
dependencies:
@@ -3770,9 +3770,9 @@ __metadata:
"@babel/preset-env": "npm:7.25.7"
"@babel/preset-react": "npm:7.25.7"
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.4.2"
"@grafana/ui": "npm:11.4.3"
"@leeoniya/ufuzzy": "npm:1.0.14"
"@rollup/plugin-node-resolve": "npm:15.3.0"
"@testing-library/dom": "npm:10.0.0"
@@ -3854,13 +3854,13 @@ __metadata:
resolution: "@grafana/o11y-ds-frontend@workspace:packages/grafana-o11y-ds-frontend"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.4.2"
"@grafana/ui": "npm:11.4.3"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/jest-dom": "npm:^6.1.2"
"@testing-library/react": "npm:15.0.2"
@@ -3885,7 +3885,7 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/plugin-configs@npm:11.4.2, @grafana/plugin-configs@workspace:*, @grafana/plugin-configs@workspace:packages/grafana-plugin-configs":
"@grafana/plugin-configs@npm:11.4.3, @grafana/plugin-configs@workspace:*, @grafana/plugin-configs@workspace:packages/grafana-plugin-configs":
version: 0.0.0-use.local
resolution: "@grafana/plugin-configs@workspace:packages/grafana-plugin-configs"
dependencies:
@@ -3925,14 +3925,14 @@ __metadata:
"@emotion/css": "npm:11.13.4"
"@emotion/eslint-plugin": "npm:11.12.0"
"@floating-ui/react": "npm:0.26.24"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/faro-web-sdk": "npm:1.10.2"
"@grafana/runtime": "npm:11.4.2"
"@grafana/schema": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.3"
"@grafana/schema": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.4.2"
"@grafana/ui": "npm:11.4.3"
"@hello-pangea/dnd": "npm:16.6.0"
"@leeoniya/ufuzzy": "npm:1.0.14"
"@lezer/common": "npm:1.2.2"
@@ -4029,16 +4029,16 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/runtime@npm:11.4.2, @grafana/runtime@workspace:*, @grafana/runtime@workspace:packages/grafana-runtime":
"@grafana/runtime@npm:11.4.3, @grafana/runtime@workspace:*, @grafana/runtime@workspace:packages/grafana-runtime":
version: 0.0.0-use.local
resolution: "@grafana/runtime@workspace:packages/grafana-runtime"
dependencies:
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/faro-web-sdk": "npm:^1.3.6"
"@grafana/schema": "npm:11.4.2"
"@grafana/schema": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.4.2"
"@grafana/ui": "npm:11.4.3"
"@rollup/plugin-node-resolve": "npm:15.3.0"
"@rollup/plugin-terser": "npm:0.4.4"
"@testing-library/dom": "npm:10.0.0"
@@ -4129,7 +4129,7 @@ __metadata:
languageName: node
linkType: hard
"@grafana/schema@npm:11.4.2, @grafana/schema@workspace:*, @grafana/schema@workspace:packages/grafana-schema":
"@grafana/schema@npm:11.4.3, @grafana/schema@workspace:*, @grafana/schema@workspace:packages/grafana-schema":
version: 0.0.0-use.local
resolution: "@grafana/schema@workspace:packages/grafana-schema"
dependencies:
@@ -4147,17 +4147,17 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/sql@npm:11.4.2, @grafana/sql@workspace:*, @grafana/sql@workspace:packages/grafana-sql":
"@grafana/sql@npm:11.4.3, @grafana/sql@workspace:*, @grafana/sql@workspace:packages/grafana-sql":
version: 0.0.0-use.local
resolution: "@grafana/sql@workspace:packages/grafana-sql"
dependencies:
"@emotion/css": "npm:11.13.4"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/experimental": "npm:2.1.1"
"@grafana/runtime": "npm:11.4.2"
"@grafana/runtime": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.4.2"
"@grafana/ui": "npm:11.4.3"
"@react-awesome-query-builder/ui": "npm:6.6.3"
"@testing-library/dom": "npm:10.0.0"
"@testing-library/jest-dom": "npm:^6.1.2"
@@ -4200,7 +4200,7 @@ __metadata:
languageName: node
linkType: hard
"@grafana/ui@npm:11.4.2, @grafana/ui@workspace:*, @grafana/ui@workspace:packages/grafana-ui":
"@grafana/ui@npm:11.4.3, @grafana/ui@workspace:*, @grafana/ui@workspace:packages/grafana-ui":
version: 0.0.0-use.local
resolution: "@grafana/ui@workspace:packages/grafana-ui"
dependencies:
@@ -4210,10 +4210,10 @@ __metadata:
"@emotion/serialize": "npm:1.3.2"
"@faker-js/faker": "npm:^9.0.0"
"@floating-ui/react": "npm:0.26.24"
"@grafana/data": "npm:11.4.2"
"@grafana/e2e-selectors": "npm:11.4.2"
"@grafana/data": "npm:11.4.3"
"@grafana/e2e-selectors": "npm:11.4.3"
"@grafana/faro-web-sdk": "npm:^1.3.6"
"@grafana/schema": "npm:11.4.2"
"@grafana/schema": "npm:11.4.3"
"@grafana/tsconfig": "npm:^2.0.0"
"@hello-pangea/dnd": "npm:16.6.0"
"@leeoniya/ufuzzy": "npm:1.0.14"