diff --git a/.drone.yml b/.drone.yml
index 2358391285dcb..0593379f84d57 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -18,14 +18,14 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- ./bin/build verify-drone
@@ -69,21 +69,13 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
-- commands:
- - go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
- depends_on: []
- environment:
- CGO_ENABLED: 0
- image: golang:1.22.4-alpine
- name: compile-build-cmd
- commands:
- go install github.com/bazelbuild/buildtools/buildifier@latest
- buildifier --lint=warn -mode=check -r .
- depends_on:
- - compile-build-cmd
- image: golang:1.22.4-alpine
+ depends_on: []
+ image: golang:1.22.7-alpine
name: lint-starlark
trigger:
event:
@@ -120,7 +112,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -222,7 +214,7 @@ steps:
name: clone-enterprise
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -311,7 +303,7 @@ steps:
name: clone-enterprise
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -321,7 +313,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -330,14 +322,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
@@ -345,7 +337,7 @@ steps:
-timeout=5m
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -354,7 +346,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: test-backend-integration
trigger:
event:
@@ -399,14 +391,14 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- apk add --update curl jq bash
@@ -433,16 +425,16 @@ steps:
- apk add --update make
- make gen-go
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- go run scripts/modowners/modowners.go check go.mod
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: validate-modfile
- commands:
- apk add --update make
- make swagger-validate
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: validate-openapi-spec
trigger:
event:
@@ -488,11 +480,11 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -501,7 +493,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -511,7 +503,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -520,14 +512,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- yarn install --immutable || yarn install --immutable
@@ -560,7 +552,7 @@ steps:
from_secret: drone_token
- commands:
- /src/grafana-build artifacts -a targz:grafana:linux/amd64 -a targz:grafana:linux/arm64
- -a targz:grafana:linux/arm/v7 --go-version=1.22.4 --yarn-cache=$$YARN_CACHE_FOLDER
+ -a targz:grafana:linux/arm/v7 --go-version=1.22.7 --yarn-cache=$$YARN_CACHE_FOLDER
--build-id=$$DRONE_BUILD_NUMBER --grafana-dir=$$PWD > packages.txt
depends_on:
- compile-build-cmd
@@ -586,7 +578,7 @@ steps:
GF_APP_MODE: development
GF_SERVER_HTTP_PORT: "3001"
GF_SERVER_ROUTER_LOGGING: "1"
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: grafana-server
- commands:
- ./bin/build e2e-tests --port 3001 --suite dashboards-suite
@@ -765,7 +757,7 @@ steps:
- /src/grafana-build artifacts -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 --yarn-cache=$$YARN_CACHE_FOLDER --build-id=$$DRONE_BUILD_NUMBER
- --go-version=1.22.4 --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.19.1 --tag-format='{{
+ --go-version=1.22.7 --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.20.3 --tag-format='{{
.version_base }}-{{ .buildID }}-{{ .arch }}' --grafana-dir=$$PWD --ubuntu-tag-format='{{
.version_base }}-{{ .buildID }}-ubuntu-{{ .arch }}' > docker.txt
- find ./dist -name '*docker*.tar.gz' -type f | xargs -n1 docker load -i
@@ -935,7 +927,7 @@ steps:
name: clone-enterprise
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -944,11 +936,11 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -958,7 +950,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -967,14 +959,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -995,7 +987,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql57:3306 -timeout 120s
@@ -1016,7 +1008,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql57
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-5.7-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -1037,7 +1029,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -1053,7 +1045,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -1069,7 +1061,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -1085,7 +1077,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: remote-alertmanager-integration-tests
trigger:
event:
@@ -1136,7 +1128,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1173,7 +1165,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
trigger:
event:
@@ -1209,13 +1201,6 @@ platform:
os: linux
services: []
steps:
-- commands:
- - go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
- depends_on: []
- environment:
- CGO_ENABLED: 0
- image: golang:1.22.4-alpine
- name: compile-build-cmd
- commands:
- apt-get update -yq && apt-get install shellcheck
- shellcheck -e SC1071 -e SC2162 scripts/**/*.sh
@@ -1286,7 +1271,7 @@ steps:
environment:
GITHUB_TOKEN:
from_secret: github_token
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: swagger-gen
trigger:
event:
@@ -1382,7 +1367,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -1393,7 +1378,7 @@ steps:
- CODEGEN_VERIFY=1 make gen-cue
depends_on:
- clone-enterprise
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -1403,14 +1388,14 @@ steps:
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on:
- clone-enterprise
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- apk add --update build-base
@@ -1418,7 +1403,7 @@ steps:
- go test -v -run=^$ -benchmem -timeout=1h -count=8 -bench=. ${GO_PACKAGES}
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: sqlite-benchmark-integration-tests
- commands:
- apk add --update build-base
@@ -1430,7 +1415,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: postgres-benchmark-integration-tests
- commands:
- apk add --update build-base
@@ -1441,7 +1426,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql57
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-5.7-benchmark-integration-tests
- commands:
- apk add --update build-base
@@ -1452,7 +1437,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-8.0-benchmark-integration-tests
trigger:
event:
@@ -1493,7 +1478,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1530,7 +1515,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
trigger:
branch: main
@@ -1569,7 +1554,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1627,7 +1612,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1693,7 +1678,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -1703,7 +1688,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -1712,14 +1697,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
@@ -1727,7 +1712,7 @@ steps:
-timeout=5m
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -1736,7 +1721,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: test-backend-integration
trigger:
branch: main
@@ -1774,29 +1759,29 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- go build -o ./bin/build -ldflags '-extldflags -static' ./pkg/build/cmd
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- apk add --update make
- make gen-go
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- go run scripts/modowners/modowners.go check go.mod
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: validate-modfile
- commands:
- apk add --update make
- make swagger-validate
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: validate-openapi-spec
- commands:
- ./bin/build verify-drone
@@ -1840,11 +1825,11 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -1853,7 +1838,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -1863,7 +1848,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -1872,14 +1857,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1912,7 +1897,7 @@ steps:
name: build-frontend-packages
- commands:
- /src/grafana-build artifacts -a targz:grafana:linux/amd64 -a targz:grafana:linux/arm64
- -a targz:grafana:linux/arm/v7 --go-version=1.22.4 --yarn-cache=$$YARN_CACHE_FOLDER
+ -a targz:grafana:linux/arm/v7 --go-version=1.22.7 --yarn-cache=$$YARN_CACHE_FOLDER
--build-id=$$DRONE_BUILD_NUMBER --grafana-dir=$$PWD > packages.txt
depends_on:
- update-package-json-version
@@ -1937,7 +1922,7 @@ steps:
GF_APP_MODE: development
GF_SERVER_HTTP_PORT: "3001"
GF_SERVER_ROUTER_LOGGING: "1"
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: grafana-server
- commands:
- ./bin/build e2e-tests --port 3001 --suite dashboards-suite
@@ -2152,7 +2137,7 @@ steps:
- /src/grafana-build artifacts -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 --yarn-cache=$$YARN_CACHE_FOLDER --build-id=$$DRONE_BUILD_NUMBER
- --go-version=1.22.4 --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.19.1 --tag-format='{{
+ --go-version=1.22.7 --ubuntu-base=ubuntu:22.04 --alpine-base=alpine:3.20.3 --tag-format='{{
.version_base }}-{{ .buildID }}-{{ .arch }}' --grafana-dir=$$PWD --ubuntu-tag-format='{{
.version_base }}-{{ .buildID }}-ubuntu-{{ .arch }}' > docker.txt
- find ./dist -name '*docker*.tar.gz' -type f | xargs -n1 docker load -i
@@ -2349,7 +2334,7 @@ services:
steps:
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -2358,11 +2343,11 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -2372,7 +2357,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -2381,14 +2366,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -2409,7 +2394,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql57:3306 -timeout 120s
@@ -2430,7 +2415,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql57
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-5.7-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -2451,7 +2436,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -2467,7 +2452,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -2483,7 +2468,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -2499,7 +2484,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: remote-alertmanager-integration-tests
trigger:
branch: main
@@ -2553,7 +2538,7 @@ steps:
name: identify-runner
- commands:
- $$ProgressPreference = "SilentlyContinue"
- - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/windows/grabpl.exe
+ - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/windows/grabpl.exe
-OutFile grabpl.exe
image: grafana/ci-wix:0.1.1
name: windows-init
@@ -2679,11 +2664,11 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -2692,7 +2677,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts docker fetch --edition oss
@@ -2717,31 +2702,32 @@ steps:
- |2-
bash -c '
+ IMAGE_TAG=$(echo "$${TAG}" | sed -e "s/+/-/g")
debug=
if [[ -n $${DRY_RUN} ]]; then debug=echo; fi
docker login -u $${DOCKER_USER} -p $${DOCKER_PASSWORD}
# Push the grafana-image-tags images
- $$debug docker push grafana/grafana-image-tags:$${TAG}-amd64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-arm64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-armv7
- $$debug docker push grafana/grafana-image-tags:$${TAG}-ubuntu-amd64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-ubuntu-arm64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-amd64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-arm64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-armv7
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-amd64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-arm64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-armv7
# Create the grafana manifests
- $$debug docker manifest create grafana/grafana:${TAG} grafana/grafana-image-tags:$${TAG}-amd64 grafana/grafana-image-tags:$${TAG}-arm64 grafana/grafana-image-tags:$${TAG}-armv7
+ $$debug docker manifest create grafana/grafana:$${IMAGE_TAG} grafana/grafana-image-tags:$${IMAGE_TAG}-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-armv7
- $$debug docker manifest create grafana/grafana:${TAG}-ubuntu grafana/grafana-image-tags:$${TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
+ $$debug docker manifest create grafana/grafana:$${IMAGE_TAG}-ubuntu grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-armv7
# Push the grafana manifests
- $$debug docker manifest push grafana/grafana:$${TAG}
- $$debug docker manifest push grafana/grafana:$${TAG}-ubuntu
+ $$debug docker manifest push grafana/grafana:$${IMAGE_TAG}
+ $$debug docker manifest push grafana/grafana:$${IMAGE_TAG}-ubuntu
# if LATEST is set, then also create & push latest
if [[ -n $${LATEST} ]]; then
- $$debug docker manifest create grafana/grafana:latest grafana/grafana-image-tags:$${TAG}-amd64 grafana/grafana-image-tags:$${TAG}-arm64 grafana/grafana-image-tags:$${TAG}-armv7
- $$debug docker manifest create grafana/grafana:latest-ubuntu grafana/grafana-image-tags:$${TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
+ $$debug docker manifest create grafana/grafana:latest grafana/grafana-image-tags:$${IMAGE_TAG}-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-armv7
+ $$debug docker manifest create grafana/grafana:latest-ubuntu grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-armv7
$$debug docker manifest push grafana/grafana:latest
$$debug docker manifest push grafana/grafana:latest-ubuntu
@@ -2812,11 +2798,11 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
@@ -2825,7 +2811,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts docker fetch --edition oss
@@ -2848,31 +2834,32 @@ steps:
- |2-
bash -c '
+ IMAGE_TAG=$(echo "$${TAG}" | sed -e "s/+/-/g")
debug=
if [[ -n $${DRY_RUN} ]]; then debug=echo; fi
docker login -u $${DOCKER_USER} -p $${DOCKER_PASSWORD}
# Push the grafana-image-tags images
- $$debug docker push grafana/grafana-image-tags:$${TAG}-amd64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-arm64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-armv7
- $$debug docker push grafana/grafana-image-tags:$${TAG}-ubuntu-amd64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-ubuntu-arm64
- $$debug docker push grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-amd64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-arm64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-armv7
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-amd64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-arm64
+ $$debug docker push grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-armv7
# Create the grafana manifests
- $$debug docker manifest create grafana/grafana:${TAG} grafana/grafana-image-tags:$${TAG}-amd64 grafana/grafana-image-tags:$${TAG}-arm64 grafana/grafana-image-tags:$${TAG}-armv7
+ $$debug docker manifest create grafana/grafana:$${IMAGE_TAG} grafana/grafana-image-tags:$${IMAGE_TAG}-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-armv7
- $$debug docker manifest create grafana/grafana:${TAG}-ubuntu grafana/grafana-image-tags:$${TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
+ $$debug docker manifest create grafana/grafana:$${IMAGE_TAG}-ubuntu grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-armv7
# Push the grafana manifests
- $$debug docker manifest push grafana/grafana:$${TAG}
- $$debug docker manifest push grafana/grafana:$${TAG}-ubuntu
+ $$debug docker manifest push grafana/grafana:$${IMAGE_TAG}
+ $$debug docker manifest push grafana/grafana:$${IMAGE_TAG}-ubuntu
# if LATEST is set, then also create & push latest
if [[ -n $${LATEST} ]]; then
- $$debug docker manifest create grafana/grafana:latest grafana/grafana-image-tags:$${TAG}-amd64 grafana/grafana-image-tags:$${TAG}-arm64 grafana/grafana-image-tags:$${TAG}-armv7
- $$debug docker manifest create grafana/grafana:latest-ubuntu grafana/grafana-image-tags:$${TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
+ $$debug docker manifest create grafana/grafana:latest grafana/grafana-image-tags:$${IMAGE_TAG}-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-armv7
+ $$debug docker manifest create grafana/grafana:latest-ubuntu grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${IMAGE_TAG}-ubuntu-armv7
$$debug docker manifest push grafana/grafana:latest
$$debug docker manifest push grafana/grafana:latest-ubuntu
@@ -2961,10 +2948,11 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- - ./bin/build artifacts packages --tag $${DRONE_TAG} --src-bucket $${PRERELEASE_BUCKET}
+ - ./bin/build artifacts packages --artifacts-editions=oss --tag $${DRONE_TAG} --src-bucket
+ $${PRERELEASE_BUCKET}
depends_on:
- compile-build-cmd
environment:
@@ -2974,19 +2962,6 @@ steps:
from_secret: prerelease_bucket
image: grafana/grafana-ci-deploy:1.3.3
name: publish-artifacts
-- commands:
- - ./bin/build artifacts static-assets --tag ${DRONE_TAG} --static-asset-editions=grafana-oss
- depends_on:
- - compile-build-cmd
- environment:
- GCP_KEY:
- from_secret: gcp_grafanauploads_base64
- PRERELEASE_BUCKET:
- from_secret: prerelease_bucket
- STATIC_ASSET_EDITIONS:
- from_secret: static_asset_editions
- image: grafana/grafana-ci-deploy:1.3.3
- name: publish-static-assets
- commands:
- ./bin/build artifacts storybook --tag ${DRONE_TAG}
depends_on:
@@ -3006,7 +2981,6 @@ steps:
-f latest=$${LATEST} --repo=grafana/grafana release-pr.yml
depends_on:
- publish-artifacts
- - publish-static-assets
environment:
GH_CLI_URL: https://github.com/cli/cli/releases/download/v2.50.0/gh_2.50.0_linux_amd64.tar.gz
GITHUB_TOKEN:
@@ -3046,7 +3020,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- yarn install --immutable || yarn install --immutable
@@ -3138,6 +3112,7 @@ platform:
services: []
steps:
- commands:
+ - export version=$(echo ${TAG} | sed -e "s/+security-/-/g")
- 'echo "Step 1: Updating package lists..."'
- apt-get update >/dev/null 2>&1
- 'echo "Step 2: Installing prerequisites..."'
@@ -3151,26 +3126,26 @@ steps:
- echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable
main" | tee -a /etc/apt/sources.list.d/grafana.list
- 'echo "Step 5: Installing Grafana..."'
- - for i in $(seq 1 10); do
+ - for i in $(seq 1 60); do
- ' if apt-get update >/dev/null 2>&1 && DEBIAN_FRONTEND=noninteractive apt-get
- install -yq grafana=${TAG} >/dev/null 2>&1; then'
+ install -yq grafana=$version >/dev/null 2>&1; then'
- ' echo "Command succeeded on attempt $i"'
- ' break'
- ' else'
- ' echo "Attempt $i failed"'
- - ' if [ $i -eq 10 ]; then'
+ - ' if [ $i -eq 60 ]; then'
- ' echo ''All attempts failed'''
- ' exit 1'
- ' fi'
- - ' echo "Waiting 60 seconds before next attempt..."'
- - ' sleep 60'
+ - ' echo "Waiting 30 seconds before next attempt..."'
+ - ' sleep 30'
- ' fi'
- done
- 'echo "Step 6: Verifying Grafana installation..."'
- - 'if dpkg -s grafana | grep -q "Version: ${TAG}"; then'
- - ' echo "Successfully verified Grafana version ${TAG}"'
+ - 'if dpkg -s grafana | grep -q "Version: $version"; then'
+ - ' echo "Successfully verified Grafana version $version"'
- else
- - ' echo "Failed to verify Grafana version ${TAG}"'
+ - ' echo "Failed to verify Grafana version $version"'
- ' exit 1'
- fi
- echo "Verification complete."
@@ -3198,37 +3173,38 @@ steps:
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
' > /etc/yum.repos.d/grafana.repo
- 'echo "Step 5: Checking RPM repository..."'
- - dnf list available grafana-${TAG}
+ - export version=$(echo "${TAG}" | sed -e "s/+security-/^security_/g")
+ - dnf list available grafana-$version
- if [ $? -eq 0 ]; then
- ' echo "Grafana package found in repository. Installing from repo..."'
- - for i in $(seq 1 5); do
- - ' if dnf install -y --nogpgcheck grafana-${TAG} >/dev/null 2>&1; then'
+ - for i in $(seq 1 60); do
+ - ' if dnf install -y --nogpgcheck grafana-$version >/dev/null 2>&1; then'
- ' echo "Command succeeded on attempt $i"'
- ' break'
- ' else'
- ' echo "Attempt $i failed"'
- - ' if [ $i -eq 5 ]; then'
+ - ' if [ $i -eq 60 ]; then'
- ' echo ''All attempts failed'''
- ' exit 1'
- ' fi'
- - ' echo "Waiting 60 seconds before next attempt..."'
- - ' sleep 60'
+ - ' echo "Waiting 30 seconds before next attempt..."'
+ - ' sleep 30'
- ' fi'
- done
- ' echo "Verifying GPG key..."'
- ' rpm --import https://rpm.grafana.com/gpg.key'
- ' rpm -qa gpg-pubkey* | xargs rpm -qi | grep -i grafana'
- else
- - ' echo "Grafana package version ${TAG} not found in repository."'
+ - ' echo "Grafana package version $version not found in repository."'
- ' dnf repolist'
- ' dnf list available grafana*'
- ' exit 1'
- fi
- 'echo "Step 6: Verifying Grafana installation..."'
- - if rpm -q grafana | grep -q "${TAG}"; then
- - ' echo "Successfully verified Grafana version ${TAG}"'
+ - if rpm -q grafana | grep -q "$verison"; then
+ - ' echo "Successfully verified Grafana version $version"'
- else
- - ' echo "Failed to verify Grafana version ${TAG}"'
+ - ' echo "Failed to verify Grafana version $version"'
- ' exit 1'
- fi
- echo "Verification complete."
@@ -3270,7 +3246,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- depends_on:
- compile-build-cmd
@@ -3315,6 +3291,7 @@ steps:
from_secret: packages_service_account
target_bucket: grafana-packages
- commands:
+ - export version=$(echo ${TAG} | sed -e "s/+security-/-/g")
- 'echo "Step 1: Updating package lists..."'
- apt-get update >/dev/null 2>&1
- 'echo "Step 2: Installing prerequisites..."'
@@ -3328,26 +3305,26 @@ steps:
- echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable
main" | tee -a /etc/apt/sources.list.d/grafana.list
- 'echo "Step 5: Installing Grafana..."'
- - for i in $(seq 1 10); do
+ - for i in $(seq 1 60); do
- ' if apt-get update >/dev/null 2>&1 && DEBIAN_FRONTEND=noninteractive apt-get
- install -yq grafana=${TAG} >/dev/null 2>&1; then'
+ install -yq grafana=$version >/dev/null 2>&1; then'
- ' echo "Command succeeded on attempt $i"'
- ' break'
- ' else'
- ' echo "Attempt $i failed"'
- - ' if [ $i -eq 10 ]; then'
+ - ' if [ $i -eq 60 ]; then'
- ' echo ''All attempts failed'''
- ' exit 1'
- ' fi'
- - ' echo "Waiting 60 seconds before next attempt..."'
- - ' sleep 60'
+ - ' echo "Waiting 30 seconds before next attempt..."'
+ - ' sleep 30'
- ' fi'
- done
- 'echo "Step 6: Verifying Grafana installation..."'
- - 'if dpkg -s grafana | grep -q "Version: ${TAG}"; then'
- - ' echo "Successfully verified Grafana version ${TAG}"'
+ - 'if dpkg -s grafana | grep -q "Version: $version"; then'
+ - ' echo "Successfully verified Grafana version $version"'
- else
- - ' echo "Failed to verify Grafana version ${TAG}"'
+ - ' echo "Failed to verify Grafana version $version"'
- ' exit 1'
- fi
- echo "Verification complete."
@@ -3376,37 +3353,38 @@ steps:
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
' > /etc/yum.repos.d/grafana.repo
- 'echo "Step 5: Checking RPM repository..."'
- - dnf list available grafana-${TAG}
+ - export version=$(echo "${TAG}" | sed -e "s/+security-/^security_/g")
+ - dnf list available grafana-$version
- if [ $? -eq 0 ]; then
- ' echo "Grafana package found in repository. Installing from repo..."'
- - for i in $(seq 1 5); do
- - ' if dnf install -y --nogpgcheck grafana-${TAG} >/dev/null 2>&1; then'
+ - for i in $(seq 1 60); do
+ - ' if dnf install -y --nogpgcheck grafana-$version >/dev/null 2>&1; then'
- ' echo "Command succeeded on attempt $i"'
- ' break'
- ' else'
- ' echo "Attempt $i failed"'
- - ' if [ $i -eq 5 ]; then'
+ - ' if [ $i -eq 60 ]; then'
- ' echo ''All attempts failed'''
- ' exit 1'
- ' fi'
- - ' echo "Waiting 60 seconds before next attempt..."'
- - ' sleep 60'
+ - ' echo "Waiting 30 seconds before next attempt..."'
+ - ' sleep 30'
- ' fi'
- done
- ' echo "Verifying GPG key..."'
- ' rpm --import https://rpm.grafana.com/gpg.key'
- ' rpm -qa gpg-pubkey* | xargs rpm -qi | grep -i grafana'
- else
- - ' echo "Grafana package version ${TAG} not found in repository."'
+ - ' echo "Grafana package version $version not found in repository."'
- ' dnf repolist'
- ' dnf list available grafana*'
- ' exit 1'
- fi
- 'echo "Step 6: Verifying Grafana installation..."'
- - if rpm -q grafana | grep -q "${TAG}"; then
- - ' echo "Successfully verified Grafana version ${TAG}"'
+ - if rpm -q grafana | grep -q "$verison"; then
+ - ' echo "Successfully verified Grafana version $version"'
- else
- - ' echo "Failed to verify Grafana version ${TAG}"'
+ - ' echo "Failed to verify Grafana version $version"'
- ' exit 1'
- fi
- echo "Verification complete."
@@ -3471,7 +3449,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- ALPINE_BASE: alpine:3.19.1
+ ALPINE_BASE: alpine:3.20.3
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -3488,7 +3466,7 @@ steps:
from_secret: gcp_key_base64
GITHUB_TOKEN:
from_secret: github_token
- GO_VERSION: 1.22.4
+ GO_VERSION: 1.22.7
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -3546,13 +3524,13 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: compile-build-cmd
- commands:
- ./bin/build whatsnew-checker
depends_on:
- compile-build-cmd
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: whats-new-checker
trigger:
event:
@@ -3572,143 +3550,6 @@ volumes:
clone:
retries: 3
depends_on: []
-environment:
- EDITION: oss
-image_pull_secrets:
-- gcr
-- gar
-kind: pipeline
-name: release-test-frontend
-node:
- type: no-parallel
-platform:
- arch: amd64
- os: linux
-services: []
-steps:
-- commands:
- - echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
- name: identify-runner
-- commands:
- - yarn install --immutable || yarn install --immutable
- depends_on: []
- image: node:20.9.0-alpine
- name: yarn-install
-- commands:
- - apk add --update git bash
- - yarn betterer ci
- depends_on:
- - yarn-install
- image: node:20.9.0-alpine
- name: betterer-frontend
-- commands:
- - yarn run ci:test-frontend
- depends_on:
- - yarn-install
- environment:
- TEST_MAX_WORKERS: 50%
- image: node:20.9.0-alpine
- name: test-frontend
-trigger:
- event:
- exclude:
- - promote
- ref:
- exclude:
- - refs/tags/*-cloud*
- include:
- - refs/tags/v*
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
----
-clone:
- retries: 3
-depends_on: []
-environment:
- EDITION: oss
-image_pull_secrets:
-- gcr
-- gar
-kind: pipeline
-name: release-test-backend
-node:
- type: no-parallel
-platform:
- arch: amd64
- os: linux
-services: []
-steps:
-- commands:
- - echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
- name: identify-runner
-- commands:
- - '# It is required that code generated from Thema/CUE be committed and in sync
- with its inputs.'
- - '# The following command will fail if running code generators produces any diff
- in output.'
- - apk add --update make
- - CODEGEN_VERIFY=1 make gen-cue
- depends_on: []
- image: golang:1.22.4-alpine
- name: verify-gen-cue
-- commands:
- - '# It is required that generated jsonnet is committed and in sync with its inputs.'
- - '# The following command will fail if running code generators produces any diff
- in output.'
- - apk add --update make
- - CODEGEN_VERIFY=1 make gen-jsonnet
- depends_on: []
- image: golang:1.22.4-alpine
- name: verify-gen-jsonnet
-- commands:
- - apk add --update make
- - make gen-go
- depends_on:
- - verify-gen-cue
- image: golang:1.22.4-alpine
- name: wire-install
-- commands:
- - apk add --update build-base shared-mime-info shared-mime-info-lang
- - go list -f '{{.Dir}}/...' -m | xargs go test -tags requires_buildifer -short -covermode=atomic
- -timeout=5m
- depends_on:
- - wire-install
- image: golang:1.22.4-alpine
- name: test-backend
-- commands:
- - apk add --update build-base
- - go test -count=1 -covermode=atomic -timeout=5m -run '^TestIntegration' $(find
- ./pkg -type f -name '*_test.go' -exec grep -l '^func TestIntegration' '{}' '+'
- | grep -o '\(.*\)/' | sort -u)
- depends_on:
- - wire-install
- image: golang:1.22.4-alpine
- name: test-backend-integration
-trigger:
- event:
- exclude:
- - promote
- ref:
- exclude:
- - refs/tags/*-cloud*
- include:
- - refs/tags/v*
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
----
-clone:
- retries: 3
-depends_on:
-- release-test-backend
-- release-test-frontend
image_pull_secrets:
- gcr
- gar
@@ -3727,7 +3568,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- ALPINE_BASE: alpine:3.19.1
+ ALPINE_BASE: alpine:3.20.3
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -3744,7 +3585,7 @@ steps:
from_secret: gcp_key_base64
GITHUB_TOKEN:
from_secret: github_token
- GO_VERSION: 1.22.4
+ GO_VERSION: 1.22.7
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -3798,7 +3639,7 @@ steps:
name: identify-runner
- commands:
- $$ProgressPreference = "SilentlyContinue"
- - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/windows/grabpl.exe
+ - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/windows/grabpl.exe
-OutFile grabpl.exe
image: grafana/ci-wix:0.1.1
name: windows-init
@@ -3889,9 +3730,7 @@ volumes:
---
clone:
retries: 3
-depends_on:
-- release-test-backend
-- release-test-frontend
+depends_on: []
image_pull_secrets:
- gcr
- gar
@@ -3910,7 +3749,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- ALPINE_BASE: alpine:3.19.1
+ ALPINE_BASE: alpine:3.20.3
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -3927,7 +3766,7 @@ steps:
from_secret: gcp_key_base64
GITHUB_TOKEN:
from_secret: github_token
- GO_VERSION: 1.22.4
+ GO_VERSION: 1.22.7
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4012,7 +3851,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- yarn install --immutable || yarn install --immutable
@@ -4067,7 +3906,7 @@ services: []
steps:
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -4077,7 +3916,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -4086,14 +3925,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- apk add --update build-base shared-mime-info shared-mime-info-lang
@@ -4101,7 +3940,7 @@ steps:
-timeout=5m
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: test-backend
- commands:
- apk add --update build-base
@@ -4110,7 +3949,7 @@ steps:
| grep -o '\(.*\)/' | sort -u)
depends_on:
- wire-install
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: test-backend-integration
trigger:
cron:
@@ -4148,7 +3987,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- ALPINE_BASE: alpine:3.19.1
+ ALPINE_BASE: alpine:3.20.3
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4165,7 +4004,7 @@ steps:
from_secret: gcp_key_base64
GITHUB_TOKEN:
from_secret: github_token
- GO_VERSION: 1.22.4
+ GO_VERSION: 1.22.7
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4295,7 +4134,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- ALPINE_BASE: alpine:3.19.1
+ ALPINE_BASE: alpine:3.20.3
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4312,7 +4151,7 @@ steps:
from_secret: gcp_key_base64
GITHUB_TOKEN:
from_secret: github_token
- GO_VERSION: 1.22.4
+ GO_VERSION: 1.22.7
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4401,11 +4240,11 @@ steps:
- commands:
- 'dagger run --silent /src/grafana-build artifacts -a $${ARTIFACTS} --grafana-ref=$${GRAFANA_REF}
--enterprise-ref=$${ENTERPRISE_REF} --grafana-repo=$${GRAFANA_REPO} --version=$${VERSION} '
- - --go-version=1.22.4
+ - --go-version=1.22.7
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- ALPINE_BASE: alpine:3.19.1
+ ALPINE_BASE: alpine:3.20.3
CDN_DESTINATION:
from_secret: rgm_cdn_destination
DESTINATION:
@@ -4422,7 +4261,7 @@ steps:
from_secret: gcp_key_base64
GITHUB_TOKEN:
from_secret: github_token
- GO_VERSION: 1.22.4
+ GO_VERSION: 1.22.7
GPG_PASSPHRASE:
from_secret: packages_gpg_passphrase
GPG_PRIVATE_KEY:
@@ -4512,20 +4351,20 @@ steps:
- commands: []
depends_on:
- clone
- image: golang:1.22.4-windowsservercore-1809
+ image: golang:1.22.7-windowsservercore-1809
name: windows-init
- commands:
- go install github.com/google/wire/cmd/wire@v0.5.0
- wire gen -tags oss ./pkg/server
depends_on:
- windows-init
- image: golang:1.22.4-windowsservercore-1809
+ image: golang:1.22.7-windowsservercore-1809
name: wire-install
- commands:
- go test -tags requires_buildifer -short -covermode=atomic -timeout=5m ./pkg/...
depends_on:
- wire-install
- image: golang:1.22.4-windowsservercore-1809
+ image: golang:1.22.7-windowsservercore-1809
name: test-backend
trigger:
event:
@@ -4602,13 +4441,13 @@ services:
steps:
- commands:
- mkdir -p bin
- - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
+ - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.56/grabpl
- chmod +x bin/grabpl
image: byrnedo/alpine-curl:0.1.8
name: grabpl
- commands:
- echo $DRONE_RUNNER_NAME
- image: alpine:3.19.1
+ image: alpine:3.20.3
name: identify-runner
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -4618,7 +4457,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -4627,14 +4466,14 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: verify-gen-jsonnet
- commands:
- apk add --update make
- make gen-go
depends_on:
- verify-gen-cue
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: wire-install
- commands:
- dockerize -wait tcp://postgres:5432 -timeout 120s
@@ -4655,7 +4494,7 @@ steps:
GRAFANA_TEST_DB: postgres
PGPASSWORD: grafanatest
POSTGRES_HOST: postgres
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: postgres-integration-tests
- commands:
- dockerize -wait tcp://mysql57:3306 -timeout 120s
@@ -4676,7 +4515,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql57
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-5.7-integration-tests
- commands:
- dockerize -wait tcp://mysql80:3306 -timeout 120s
@@ -4697,7 +4536,7 @@ steps:
environment:
GRAFANA_TEST_DB: mysql
MYSQL_HOST: mysql80
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: mysql-8.0-integration-tests
- commands:
- dockerize -wait tcp://redis:6379 -timeout 120s
@@ -4713,7 +4552,7 @@ steps:
- wait-for-redis
environment:
REDIS_URL: redis://redis:6379/0
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: redis-integration-tests
- commands:
- dockerize -wait tcp://memcached:11211 -timeout 120s
@@ -4729,7 +4568,7 @@ steps:
- wait-for-memcached
environment:
MEMCACHED_HOSTS: memcached:11211
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: memcached-integration-tests
- commands:
- dockerize -wait tcp://mimir_backend:8080 -timeout 120s
@@ -4745,7 +4584,7 @@ steps:
environment:
AM_TENANT_ID: test
AM_URL: http://mimir_backend:8080
- image: golang:1.22.4-alpine
+ image: golang:1.22.7-alpine
name: remote-alertmanager-integration-tests
trigger:
event:
@@ -5100,12 +4939,12 @@ steps:
- commands:
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM docker:27-cli
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine/git:2.40.1
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM golang:1.22.4-alpine
+ - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM golang:1.22.7-alpine
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM node:20.9.0-alpine
- 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.19.1
+ - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine:3.20.3
- 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
@@ -5137,12 +4976,12 @@ steps:
- commands:
- trivy --exit-code 1 --severity HIGH,CRITICAL docker:27-cli
- trivy --exit-code 1 --severity HIGH,CRITICAL alpine/git:2.40.1
- - trivy --exit-code 1 --severity HIGH,CRITICAL golang:1.22.4-alpine
+ - trivy --exit-code 1 --severity HIGH,CRITICAL golang:1.22.7-alpine
- trivy --exit-code 1 --severity HIGH,CRITICAL node:20.9.0-alpine
- 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.19.1
+ - trivy --exit-code 1 --severity HIGH,CRITICAL alpine:3.20.3
- 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
@@ -5257,7 +5096,7 @@ name: gar
---
get:
name: pat
- path: infra/data/ci/github/grafanabot
+ path: ci/data/repo/grafana/grafana/grafanabot
kind: secret
name: github_token
---
@@ -5424,6 +5263,6 @@ kind: secret
name: gcr_credentials
---
kind: signature
-hmac: faa6a717a8a8140633e39cefbd43432d1121392ac118cefb3985395857868889
+hmac: ec762bbe26644048a3c3b06db1da7a391b8ab9cd3d88607a86d0795af6d6158b
...
\ No newline at end of file
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 3758fd58fb92e..b137ac052cb9f 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -43,12 +43,12 @@
/docs/sources/dashboards/ @imatwawana
/docs/sources/datasources/ @jdbaldry
/docs/sources/explore/ @grafana/explore-squad @lwandz13
-/docs/sources/fundamentals @chri2547
-/docs/sources/getting-started/ @chri2547
-/docs/sources/introduction/ @chri2547
+/docs/sources/fundamentals @irenerl24
+/docs/sources/getting-started/ @irenerl24
+/docs/sources/introduction/ @irenerl24
/docs/sources/panels-visualizations/ @imatwawana
/docs/sources/release-notes/ @Eve832 @GrafanaWriter
-/docs/sources/setup-grafana/ @chri2547
+/docs/sources/setup-grafana/ @irenerl24
/docs/sources/upgrade-guide/ @imatwawana
/docs/sources/whatsnew/ @imatwawana
diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml
index 48246cc7f425a..bf378c4ad4558 100644
--- a/.github/workflows/changelog.yml
+++ b/.github/workflows/changelog.yml
@@ -66,8 +66,15 @@ jobs:
sparse-checkout: |
.github/workflows
CHANGELOG.md
+ .nvmrc
+ .prettierignore
+ .prettierrc.js
fetch-depth: 0
fetch-tags: true
+ - name: Setup nodejs environment
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: .nvmrc
- name: "Configure git user"
run: |
git config --local user.name "github-actions[bot]"
@@ -111,9 +118,11 @@ jobs:
fi
git diff CHANGELOG.md
- git add CHANGELOG.md
+
+ - name: "Prettify CHANGELOG.md"
+ run: npx prettier --write CHANGELOG.md
- name: "Commit changelog changes"
- run: git commit --allow-empty -m "Update changelog" CHANGELOG.md
+ run: git add CHANGELOG.md && git commit --allow-empty -m "Update changelog" CHANGELOG.md
- name: "git push"
if: ${{ inputs.dry_run }} != true
run: git push
diff --git a/.github/workflows/publish-technical-documentation-next.yml b/.github/workflows/publish-technical-documentation-next.yml
index 56fc984700e91..6b2cd7489b385 100644
--- a/.github/workflows/publish-technical-documentation-next.yml
+++ b/.github/workflows/publish-technical-documentation-next.yml
@@ -1,38 +1,21 @@
-name: "publish-technical-documentation-next"
+name: publish-technical-documentation-next
on:
push:
branches:
- - "main"
+ - main
paths:
- "docs/sources/**"
workflow_dispatch:
jobs:
sync:
if: github.repository == 'grafana/grafana'
- runs-on: "ubuntu-latest"
+ permissions:
+ contents: read
+ id-token: write
+ runs-on: ubuntu-latest
steps:
- - name: "Checkout Grafana repo"
- uses: "actions/checkout@v4"
-
- - name: "Clone website-sync Action"
- # WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires.
- # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
- # GitHub administrator to update the organization secret.
- # The IT helpdesk can update the organization secret.
- run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync"
-
- - name: "Publish to website repository (next)"
- uses: "./.github/actions/website-sync"
- id: "publish-next"
+ - uses: actions/checkout@v4
+ - uses: grafana/writers-toolkit/publish-technical-documentation@publish-technical-documentation/v1
with:
- repository: "grafana/website"
- branch: "master"
- host: "github.com"
- # PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires.
- # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
- # GitHub administrator to update the organization secret.
- # The IT helpdesk can update the organization secret.
- github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}"
- source_folder: "docs/sources"
- target_folder: "content/docs/grafana/next"
+ website_directory: content/docs/grafana/next
diff --git a/.github/workflows/publish-technical-documentation-release.yml b/.github/workflows/publish-technical-documentation-release.yml
index c22bb41cb4897..13f7c93df59fa 100644
--- a/.github/workflows/publish-technical-documentation-release.yml
+++ b/.github/workflows/publish-technical-documentation-release.yml
@@ -1,4 +1,4 @@
-name: "publish-technical-documentation-release"
+name: publish-technical-documentation-release
on:
push:
@@ -12,63 +12,18 @@ on:
jobs:
sync:
if: github.repository == 'grafana/grafana'
- runs-on: "ubuntu-latest"
+ permissions:
+ contents: read
+ id-token: write
+ runs-on: ubuntu-latest
steps:
- - name: "Checkout Grafana repo"
- uses: "actions/checkout@v4"
+ - uses: actions/checkout@v4
with:
fetch-depth: 0
-
- - name: "Checkout Actions library"
- uses: "actions/checkout@v4"
+ - uses: grafana/writers-toolkit/publish-technical-documentation-release@publish-technical-documentation-release/v1
with:
- repository: "grafana/grafana-github-actions"
- path: "./actions"
-
- - name: "Install Actions from library"
- run: "npm install --production --prefix ./actions"
-
- - name: "Determine if there is a matching release tag"
- id: "has-matching-release-tag"
- uses: "./actions/has-matching-release-tag"
- with:
- ref_name: "${{ github.ref_name }}"
release_tag_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
release_branch_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.x$"
-
- - name: "Determine technical documentation version"
- if: "steps.has-matching-release-tag.outputs.bool == 'true'"
- uses: "./actions/docs-target"
- id: "target"
- with:
- ref_name: "${{ github.ref_name }}"
-
- - name: "Clone website-sync Action"
- if: "steps.has-matching-release-tag.outputs.bool == 'true'"
- # WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires.
- # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
- # GitHub administrator to update the organization secret.
- # The IT helpdesk can update the organization secret.
- run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync"
-
- - name: "Switch to HEAD of version branch for tags"
- # Tags aren't necessarily made to the HEAD of the version branch.
- # The documentation to be published is always on the HEAD of the version branch.
- if: "steps.has-matching-release-tag.outputs.bool == 'true' && github.ref_type == 'tag'"
- run: "git switch --detach origin/${{ steps.target.outputs.target }}.x"
-
- - name: "Publish to website repository (release)"
- if: "steps.has-matching-release-tag.outputs.bool == 'true'"
- uses: "./.github/actions/website-sync"
- id: "publish-release"
- with:
- repository: "grafana/website"
- branch: "master"
- host: "github.com"
- # PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires.
- # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
- # GitHub administrator to update the organization secret.
- # The IT helpdesk can update the organization secret.
- github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}"
- source_folder: "docs/sources"
- target_folder: "content/docs/grafana/${{ steps.target.outputs.target }}"
+ release_branch_with_patch_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
+ website_directory: content/docs/grafana
+ version_suffix: ""
diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml
index f960bb5ca745e..476a1447201bf 100644
--- a/.github/workflows/release-pr.yml
+++ b/.github/workflows/release-pr.yml
@@ -69,6 +69,10 @@ jobs:
fetch-depth: '0'
fetch-tags: 'false'
path: .grafana-main
+ - name: Setup nodejs environment
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: .nvmrc
- name: Configure git user
run: |
git config --local user.name "github-actions[bot]"
@@ -115,7 +119,9 @@ 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
run: git add CHANGELOG.md && git commit --allow-empty -m "Update changelog" CHANGELOG.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f9823cdeeff8f..628358117bff2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,80 @@
+
+
+# 11.1.7+security-01 (2024-10-17)
+
+### Bug fixes
+
+- **SQL Expressions**: Fixes CVE-2024-9264
+
+
+
+
+# 11.1.7 (2024-10-01)
+
+### Features and enhancements
+
+- **Chore:** Bump Go to 1.22.7 [#93355](https://github.com/grafana/grafana/pull/93355), [@hairyhenderson](https://github.com/hairyhenderson)
+- **Chore:** Bump Go to 1.22.7 (Enterprise)
+
+### Bug fixes
+
+- **Alerting:** Fix preview of silences when label name contains spaces [#93050](https://github.com/grafana/grafana/pull/93050), [@tomratcliffe](https://github.com/tomratcliffe)
+- **Alerting:** Make query wrapper match up datasource UIDs if necessary [#93115](https://github.com/grafana/grafana/pull/93115), [@tomratcliffe](https://github.com/tomratcliffe)
+- **AzureMonitor:** Deduplicate resource picker rows [#93704](https://github.com/grafana/grafana/pull/93704), [@aangelisc](https://github.com/aangelisc)
+- **AzureMonitor:** Improve resource picker efficiency [#93439](https://github.com/grafana/grafana/pull/93439), [@aangelisc](https://github.com/aangelisc)
+- **AzureMonitor:** Remove Basic Logs retention warning [#93122](https://github.com/grafana/grafana/pull/93122), [@aangelisc](https://github.com/aangelisc)
+- **Correlations:** Limit access to correlations page to users who can access Explore [#93675](https://github.com/grafana/grafana/pull/93675), [@ifrost](https://github.com/ifrost)
+- **Plugins:** Avoid returning 404 for `AutoEnabled` apps [#93487](https://github.com/grafana/grafana/pull/93487), [@wbrowne](https://github.com/wbrowne)
+
+
+
+
+# 11.1.6+security-01 (2024-10-17)
+
+### Bug fixes
+
+- **SQL Expressions**: Fixes CVE-2024-9264
+
+
+
+
+# 11.1.6 (2024-09-26)
+
+### Features and enhancements
+
+- **Chore:** Update swagger ui (4.3.0 to 5.17.14) [#92341](https://github.com/grafana/grafana/pull/92341), [@ryantxu](https://github.com/ryantxu)
+
+### Bug fixes
+
+- **Templating:** Fix searching non-latin template variables [#92892](https://github.com/grafana/grafana/pull/92892), [@leeoniya](https://github.com/leeoniya)
+- **TutorialCard:** Fix link to tutorial not opening [#92646](https://github.com/grafana/grafana/pull/92646), [@eledobleefe](https://github.com/eledobleefe)
+- **Alerting:** Fixed CVE-2024-8118.
+
+### Plugin development fixes & changes
+
+- **Bugfix:** QueryField typeahead missing background color [#92316](https://github.com/grafana/grafana/pull/92316), [@mckn](https://github.com/mckn)
+
+
+
+
+# 11.1.5 (2024-08-27)
+
+### Bug fixes
+
+- **Alerting:** Fix permissions for prometheus rule endpoints [#91414](https://github.com/grafana/grafana/pull/91414), [@yuri-tceretian](https://github.com/yuri-tceretian)
+- **Alerting:** Fix persisting result fingerprint that is used by recovery threshold [#91290](https://github.com/grafana/grafana/pull/91290), [@yuri-tceretian](https://github.com/yuri-tceretian)
+- **Auditing:** Fix a possible crash when audit logger parses responses for failed requests (Enterprise)
+- **RBAC:** Fix an issue with server admins not being able to manage users in orgs that they don't belong to [#92273](https://github.com/grafana/grafana/pull/92273), [@IevaVasiljeva](https://github.com/IevaVasiljeva)
+- **RBAC:** Fix an issue with server admins not being able to manage users in orgs that they dont belong to (Enterprise)
+- **RBAC:** Fix seeder failures when inserting duplicated permissions (Enterprise)
+- **Snapshots:** Fix panic when snapshot_remove_expired is true [#91232](https://github.com/grafana/grafana/pull/91232), [@ryantxu](https://github.com/ryantxu)
+- **VizTooltip:** Fix positioning at bottom and right edges on mobile [#92137](https://github.com/grafana/grafana/pull/92137), [@leeoniya](https://github.com/leeoniya)
+
+### Plugin development fixes & changes
+
+- **Bugfix:** QueryField typeahead missing background color [#92316](https://github.com/grafana/grafana/pull/92316), [@mckn](https://github.com/mckn)
+
+
# 11.1.4 (2024-08-14)
diff --git a/Dockerfile b/Dockerfile
index 35111861e33f5..506f8308cd14f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,7 +3,7 @@
ARG BASE_IMAGE=alpine:3.19.1
ARG JS_IMAGE=node:20-alpine
ARG JS_PLATFORM=linux/amd64
-ARG GO_IMAGE=golang:1.22.4-alpine
+ARG GO_IMAGE=golang:1.22.7-alpine
ARG GO_SRC=go-builder
ARG JS_SRC=js-builder
diff --git a/Makefile b/Makefile
index fdc1037664c72..762e0e56be2df 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ include .bingo/Variables.mk
GO = go
-GO_VERSION = 1.22.4
+GO_VERSION = 1.22.7
GO_FILES ?= ./pkg/... ./pkg/apiserver/... ./pkg/apimachinery/... ./pkg/promlib/...
SH_FILES ?= $(shell find ./scripts -name *.sh)
GO_RACE := $(shell [ -n "$(GO_RACE)" -o -e ".go-race-enabled-locally" ] && echo 1 )
diff --git a/apps/.gitkeep b/apps/.gitkeep
new file mode 100644
index 0000000000000..d5e8e8f26a041
--- /dev/null
+++ b/apps/.gitkeep
@@ -0,0 +1 @@
+# workaround for grafana-build quirk
diff --git a/conf/defaults.ini b/conf/defaults.ini
index 9a5d332dba0f3..ebaa160ecaf00 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -1689,6 +1689,9 @@ ha_engine_address = "127.0.0.1:6379"
# ha_engine_password allows setting an optional password to authenticate with the engine
ha_engine_password = ""
+# ha_prefix is a prefix for keys in the HA engine. It's used to separate keys for different Grafana instances.
+ha_prefix =
+
#################################### Grafana Image Renderer Plugin ##########################
[plugin.grafana-image-renderer]
# Instruct headless browser instance to use a default timezone when not provided by Grafana, e.g. when rendering panel image of alert.
diff --git a/conf/sample.ini b/conf/sample.ini
index fc54e3d0a716f..5f086e544cd44 100644
--- a/conf/sample.ini
+++ b/conf/sample.ini
@@ -1546,6 +1546,9 @@ max_annotations_to_keep =
# ha_engine_password allows setting an optional password to authenticate with the engine
;ha_engine_password = ""
+# ha_prefix is a prefix for keys in the HA engine. It's used to separate keys for different Grafana instances.
+;ha_prefix =
+
#################################### Grafana Image Renderer Plugin ##########################
[plugin.grafana-image-renderer]
# Instruct headless browser instance to use a default timezone when not provided by Grafana, e.g. when rendering panel image of alert.
diff --git a/docs/make-docs b/docs/make-docs
index 170e361431ac7..2dc6726d9198c 100755
--- a/docs/make-docs
+++ b/docs/make-docs
@@ -6,6 +6,15 @@
# [Semantic versioning](https://semver.org/) is used to help the reader identify the significance of changes.
# Changes are relevant to this script and the support docs.mk GNU Make interface.
#
+# ## 8.1.0 (2024-08-22)
+#
+# ### Added
+#
+# - Additional website mounts for projects that use the website repository.
+#
+# Mounts are required for `make docs` to work in the website repository or with the website project.
+# The Makefile is also mounted for convenient development of the procedure that repository.
+#
# ## 8.0.1 (2024-07-01)
#
# ### Fixed
@@ -727,6 +736,9 @@ POSIX_HERESTRING
_repo="$(repo_path website)"
volumes="--volume=${_repo}/config:/hugo/config:z"
+ volumes="${volumes} --volume=${_repo}/content/guides:/hugo/content/guides:z"
+ volumes="${volumes} --volume=${_repo}/content/whats-new:/hugo/content/whats-new:z"
+ volumes="${volumes} --volume=${_repo}/Makefile:/hugo/Makefile:z"
volumes="${volumes} --volume=${_repo}/layouts:/hugo/layouts:z"
volumes="${volumes} --volume=${_repo}/scripts:/hugo/scripts:z"
fi
diff --git a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
index ff5156f3df9cb..b125829db887a 100644
--- a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
+++ b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
@@ -253,7 +253,7 @@ You can configure the alert instance state when its evaluation returns no data:
| No Data configuration | Description |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| No Data | The default option. Sets alert instance state to `No data`. The alert rule also creates a new alert instance `DatasourceNoData` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. |
-| Alerting | Sets alert instance state to `Alerting`. It transitions from `Pending` to `Alerting` after the [pending period](ref:pending-period) has finished. |
+| Alerting | Sets the alert instance state to `Pending` and then transitions to `Alerting` once the [pending period](ref:pending-period) ends. If you sent the pending period to 0, the alert instance state is immediately set to `Alerting`. |
| Normal | Sets alert instance state to `Normal`. |
| Keep Last State | Maintains the alert instance in its last state. Useful for mitigating temporary issues, refer to [Keep last state](ref:keep-last-state). |
diff --git a/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md b/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md
index c21dc2e9fa737..cb1677d5eb84e 100644
--- a/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md
+++ b/docs/sources/alerting/alerting-rules/create-mimir-loki-managed-rule.md
@@ -43,33 +43,35 @@ refs:
# Configure data source-managed alert rules
-Create alert rules for an external Grafana Mimir or Loki instance that has ruler API enabled; these are called data source-managed alert rules.
+Create data source-managed alert rules for Grafana Mimir or Grafana Loki data sources, which have been configured to support rule creation.
+
+To configure your Grafana Mimir or Loki data source for alert rule creation, enable either the Loki Ruler API or the Mimir Ruler API.
+
+For more information, refer to [Loki Ruler API](/docs/loki//api/#ruler) or [Mimir Ruler API](/docs/mimir//references/http-api/#ruler).
**Note**:
-Alert rules for an external Grafana Mimir or Loki instance can be edited or deleted by users with Editor or Admin roles.
+Alert rules for a Grafana Mimir or Loki instance can be edited or deleted by users with Editor or Admin roles.
If you delete an alerting resource created in the UI, you can no longer retrieve it.
To make a backup of your configuration and to be able to restore deleted alerting resources, create your alerting resources using file provisioning, Terraform, or the Alerting API.
## Before you begin
-- Verify that you have write permission to the Prometheus or Loki data source. Otherwise, you will not be able to create or update Grafana Mimir managed alert rules.
+- Verify that you have write permission to the Mimir or Loki data source. Otherwise, you cannot create or update Grafana Mimir or Loki-managed alert rules.
-- For Grafana Mimir and Loki data sources, enable the Ruler API by configuring their respective services.
+- Enable the Mimir or Loki Ruler API.
- **Loki** - The `local` rule storage type, default for the Loki data source, supports only viewing of rules. To edit rules, configure one of the other rule storage types.
- **Grafana Mimir** - use the `/prometheus` prefix. The Prometheus data source supports both Grafana Mimir and Prometheus, and Grafana expects that both the [Query API](/docs/mimir/latest/operators-guide/reference-http-api/#querier--query-frontend) and [Ruler API](/docs/mimir/latest/operators-guide/reference-http-api/#ruler) are under the same URL. You cannot provide a separate URL for the Ruler API.
-Watch this video to learn more about how to create a Mimir managed alert rule: {{< vimeo 720001865 >}}
+Watch this video to learn more about how to create a Mimir-managed alert rule: {{< vimeo 720001865 >}}
{{% admonition type="note" %}}
-If you do not want to manage alert rules for a particular Loki or Prometheus data source, go to its settings and clear the **Manage alerts via Alerting UI** checkbox.
+If you do not want to manage alert rules for a particular Loki or Mimir data source, go to its settings and clear the **Manage alerts via Alerting UI** checkbox.
{{% /admonition %}}
-In the following sections, we’ll guide you through the process of creating your data source-managed alert rules.
-
To create a data source-managed alert rule, use the in-product alert creation flow and follow these steps to help you.
## Set alert rule name
diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md
index 8295288797b94..81b6ccac4d8e2 100644
--- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md
+++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md
@@ -75,6 +75,9 @@ To set up email integration, complete the following steps.
1. Enter a contact point name.
1. From the Integration list, select **Email**.
1. Enter the email addresses you want to send notifications to.
+
+ E-mail addresses are case sensitive. Ensure that the e-mail address entered is correct.
+
1. Click **Test** to check that your integration works.
1. Click **Save contact point**.
diff --git a/docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md b/docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md
index 42c39fcda40fe..0e6d8a78eb30a 100644
--- a/docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md
+++ b/docs/sources/alerting/configure-notifications/template-notifications/create-notification-templates.md
@@ -53,7 +53,7 @@ To create a notification template that contains more than one template:
## Preview notification templates
-Preview how your notification templates will look before using them in your contact points, helping you understand the result of the template you are creating as well as enabling you to fix any errors before saving it.
+Preview how your notification templates should look before using them in your contact points, helping you understand the result of the template you are creating as well as enabling you to fix any errors before saving it.
**Note:** This feature is only for Grafana Alertmanager.
@@ -81,7 +81,7 @@ To preview your notification templates:
c. Click **Add alert data**.
- d. Click **Refresh preview** to see what your template content will look like and the corresponding payload data.
+ d. Click **Refresh preview** to see what your template content should look like and the corresponding payload data.
If there are any errors in your template, they are displayed in the Preview and you can correct them before saving.
@@ -162,6 +162,86 @@ Resolved alerts:
{{ template "email.message" . }}
```
+## Group multiple alert instances into one email notification
+
+To make alerts more concise, you can group multiple instances of a firing alert into a single email notification in a table format. This way, you avoid long, repetitive emails and make alerts easier to digest.
+
+Follow these steps to create a custom notification template that consolidates alert instances into a table.
+
+1. Modify the alert rule to include an annotation that is referenced in the notification template later on.
+1. Enter a name for the **custom annotation**: In this example, _ServerInfo_.
+1. Enter the following code as the value for the annotation. It retrieves the server's instance name and a corresponding metric value, formatted as a table row:
+
+ ```
+ {{ index $labels "instance" }}{{- "\t" -}}{{ index $values "A"}}{{- "\n" -}}
+ ```
+
+ This line of code returns the labels and their values in the form of a table. Assuming $labels has `{"instance": "node1"}` and $values has `{"A": "123"}`, the output would be:
+
+ ```
+ node1 123
+ ```
+
+1. Create a notification template that references the _ServerInfo_ annotation.
+
+ ```go
+ {{ define "Table" }}
+ {{- "\nHost\t\tValue\n" -}}
+ {{ range .Alerts -}}
+ {{ range .Annotations.SortedPairs -}}
+ {{ if (eq .Name "ServerInfo") -}}
+ {{ .Value -}}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{ end }}
+ ```
+
+ The notification template outputs a list of server information from the "ServerInfo" annotation for each alert instance.
+
+1. Navigate to your contact point in Grafana
+1. In the **Message** field, reference the template by name (see **Optional Email settings** section):
+
+ ```
+ {{ template "Table" . }}
+ ```
+
+ This generates a neatly formatted table in the email, grouping information for all affected servers into a single notification.
+
+## Conditional notification template
+
+Template alert notifications based on a label. In this example the label represents a namespace.
+
+1. Use the following code in your notification template to display different messages based on the namespace:
+
+ ```go
+ {{ define "my_conditional_notification" }}
+ {{ if eq .CommonLabels.namespace "namespace-a" }}
+ Alert: CPU limits have reached 80% in namespace-a.
+ {{ else if eq .CommonLabels.namespace "namespace-b" }}
+ Alert: CPU limits have reached 80% in namespace-b.
+ {{ else if eq .CommonLabels.namespace "namespace-c" }}
+ Alert: CPU limits have reached 80% in namespace-c.
+ {{ else }}
+ Alert: CPU limits have reached 80% for {{ .CommonLabels.namespace }} namespace.
+ {{ end }}
+ {{ end }}
+ ```
+
+ `.CommonLabels` is a map containing the labels that are common to all the alerts firing.
+
+ Make sure to replace the `.namespace` label with a label that exists in your alert rule.
+
+1. Replace `namespace-a`, `namespace-b`, and `namespace-c` with your specific namespace values.
+1. Navigate to your contact point in Grafana
+1. In the **Message** field, reference the template by name (see **Optional settings** section):
+
+ ```
+ {{ template "my_conditional_notification" . }}
+ ```
+
+ This template alters the content of alert notifications depending on the namespace value.
+
## Template the title of a Slack message
Template the title of a Slack message to contain the number of firing and resolved alerts:
diff --git a/docs/sources/alerting/fundamentals/_index.md b/docs/sources/alerting/fundamentals/_index.md
index 3ef02d5c1b5a1..d8ec2362cbdeb 100644
--- a/docs/sources/alerting/fundamentals/_index.md
+++ b/docs/sources/alerting/fundamentals/_index.md
@@ -57,7 +57,11 @@ refs:
# Introduction to Alerting
-Whether you’re just starting out or you're a more experienced user of Grafana Alerting, learn more about the fundamentals and available features that help you create, manage, and respond to alerts; and improve your team’s ability to resolve issues quickly. For a hands-on introduction, refer to our [tutorial to get started with Grafana Alerting](http://grafana.com/tutorials/alerting-get-started/).
+Whether you’re just starting out or you're a more experienced user of Grafana Alerting, learn more about the fundamentals and available features that help you create, manage, and respond to alerts; and improve your team’s ability to resolve issues quickly.
+
+{{< admonition type="tip" >}}
+For a hands-on introduction, refer to our [tutorial to get started with Grafana Alerting](http://grafana.com/tutorials/alerting-get-started/).
+{{< /admonition >}}
The following diagram gives you an overview of Grafana Alerting and introduces you to some of the fundamental features that are the principles of how Grafana Alerting works.
diff --git a/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md b/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md
index 6b516e80a92ff..4ea464f6eed89 100644
--- a/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md
+++ b/docs/sources/alerting/fundamentals/alert-rule-evaluation/state-and-health.md
@@ -72,6 +72,15 @@ In [Configure no data and error handling](ref:no-data-and-error-handling), you c
{{< figure src="/media/docs/alerting/alert-rule-configure-no-data-and-error.png" alt="A screenshot of the `Configure no data and error handling` option in Grafana Alerting." max-width="500px" >}}
+To reduce the number of **No Data** or **Error** state alerts received, try the following.
+
+1. Use the **Keep last state** option. For more information, refer to the section below. This option allows the alert to retain its last known state when there is no data available, rather than switching to a **No Data** state.
+1. For **No Data** alerts, you can optimize your alert rule by expanding the time range of the query. However, if the time range is too big, it affects the performance of the query and can lead to errors due to timeout.
+
+ To minimize timeouts resulting in the **Error** state, reduce the time range to request less data every evaluation cycle.
+
+1. Change the default [evaluation time out](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#evaluation_timeout). The default is set at 30 seconds. To increase the default evaluation timeout, open a support ticket from the [Cloud Portal](https://grafana.com/docs/grafana-cloud/account-management/support/#grafana-cloud-support-options). Note that this should be a last resort, because it may affect the performance of all alert rules and cause missed evaluations if the timeout is too long.
+
#### Keep last state
The "Keep Last State" option helps mitigate temporary data source issues, preventing alerts from unintentionally firing, resolving, and re-firing.
diff --git a/docs/sources/alerting/fundamentals/alert-rules/_index.md b/docs/sources/alerting/fundamentals/alert-rules/_index.md
index 5cdc3b5442aac..204eab737dea5 100644
--- a/docs/sources/alerting/fundamentals/alert-rules/_index.md
+++ b/docs/sources/alerting/fundamentals/alert-rules/_index.md
@@ -69,7 +69,7 @@ Grafana supports two different alert rule types: Grafana-managed alert rules and
## Grafana-managed alert rules
-Grafana-managed alert rules are the most flexible alert rule type. They allow you to create alerts that can act on data from any of the [supported data sources](#supported-data-sources), and use multiple data sources in a single alert rule.
+Grafana-managed alert rules are the most flexible alert rule type. They allow you to create alert rules that can act on data from any of the [supported data sources](#supported-data-sources), and use multiple data sources in a single alert rule. You can also add expressions to transform your data and set alert conditions. Using images in alert notifications is also supported.
Additionally, you can also add [expressions to transform your data](ref:expression-queries), set custom alert conditions, and include [images in alert notifications](ref:notification-images).
@@ -87,9 +87,11 @@ Find the public data sources supporting Alerting in the [Grafana Plugins directo
## Data source-managed alert rules
-Data source-managed alert rules can improve query performance via [recording rules](#recording-rules) and ensure high-availability and fault tolerance when implementing a distributed architecture.
+Data source-managed alert rules can be used for Grafana Mimir or Grafana Loki data sources which have been configured to support rule creation.
-They are only supported for Prometheus-based or Loki data sources with the Ruler API enabled. For more information, refer to the [Loki Ruler API](/docs/loki//api/#ruler) or [Mimir Ruler API](/docs/mimir//references/http-api/#ruler).
+They can improve query performance via [recording rules](#recording-rules) and ensure high-availability and fault tolerance when implementing a distributed architecture.
+
+They are only supported for Grafana Mimir or Grafana Loki data sources with the Ruler API enabled. For more information, refer to the [Loki Ruler API](/docs/loki//api/#ruler) or [Mimir Ruler API](/docs/mimir//references/http-api/#ruler).
{{< figure src="/media/docs/alerting/mimir-managed-alerting-architecture-v2.png" max-width="750px" caption="Mimir-managed alerting architecture" >}}
diff --git a/docs/sources/alerting/set-up/configure-high-availability/_index.md b/docs/sources/alerting/set-up/configure-high-availability/_index.md
index 539b4c1fc9bad..0c9e15c23b464 100644
--- a/docs/sources/alerting/set-up/configure-high-availability/_index.md
+++ b/docs/sources/alerting/set-up/configure-high-availability/_index.md
@@ -18,6 +18,17 @@ labels:
- oss
title: Configure high availability
weight: 600
+refs:
+ state-history:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//alerting/manage-notifications/view-state-health/
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/alerting-and-irm/alerting/manage-notifications/view-state-health/
+ meta-monitoring:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//alerting/monitor/
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/alerting-and-irm/alerting/monitor/
---
# Configure high availability
@@ -28,18 +39,13 @@ Grafana Alerting uses the Prometheus model of separating the evaluation of alert
When running multiple instances of Grafana, all alert rules are evaluated on all instances. You can think of the evaluation of alert rules as being duplicated by the number of running Grafana instances. This is how Grafana Alerting makes sure that as long as at least one Grafana instance is working, alert rules are still be evaluated and notifications for alerts are still sent.
-You can find this duplication in state history and it is a good way to confirm if you are using high availability.
+You can find this duplication in state history and it is a good way to [verify your high availability setup](#verify-your-high-availability-setup).
-While the alert generator evaluates all alert rules on all instances, the alert receiver makes a best-effort attempt to avoid sending duplicate notifications. Alertmanager chooses availability over consistency, which may result in occasional duplicated or out-of-order notifications. It takes the opinion that duplicate or out-of-order notifications are better than no notifications.
+While the alert generator evaluates all alert rules on all instances, the alert receiver makes a best-effort attempt to avoid duplicate notifications. The alertmanagers use a gossip protocol to share information between them to prevent sending duplicated notifications.
-The Alertmanager uses a gossip protocol to share information about notifications between Grafana instances. It also gossips silences, which means a silence created on one Grafana instance is replicated to all other Grafana instances. Both notifications and silences are persisted to the database periodically, and during graceful shut down.
+Alertmanager chooses availability over consistency, which may result in occasional duplicated or out-of-order notifications. It takes the opinion that duplicate or out-of-order notifications are better than no notifications.
-{{% admonition type="note" %}}
-
-If using a mix of `execute_alerts=false` and `execute_alerts=true` on the HA nodes, since the alert state is not shared amongst the Grafana instances, the instances with `execute_alerts=false` do not show any alert status.
-This is because the HA settings (`ha_peers`, etc) only apply to the alert notification delivery (i.e. de-duplication of alert notifications, and silences, as mentioned above).
-
-{{% /admonition %}}
+Alertmanagers also gossip silences, which means a silence created on one Grafana instance is replicated to all other Grafana instances. Both notifications and silences are persisted to the database periodically, and during graceful shut down.
## Enable alerting high availability using Memberlist
@@ -54,8 +60,11 @@ Since gossiping of notifications and silences uses both TCP and UDP port `9094`,
You must have at least one (1) Grafana instance added to the `ha_peers` section.
1. Set `[ha_listen_address]` to the instance IP address using a format of `host:port` (or the [Pod's](https://kubernetes.io/docs/concepts/workloads/pods/) IP in the case of using Kubernetes).
By default, it is set to listen to all interfaces (`0.0.0.0`).
+1. Set `[ha_advertise_address]` to the instance's hostname or IP address in the format "host:port". Use this setting when the instance is behind NAT (Network Address Translation), such as in Docker Swarm or Kubernetes service, where external and internal addresses differ. This address helps other cluster instances communicate with it. The setting is optional.
1. Set `[ha_peer_timeout]` in the `[unified_alerting]` section of the custom.ini to specify the time to wait for an instance to send a notification via the Alertmanager. The default value is 15s, but it may increase if Grafana servers are located in different geographic regions or if the network latency between them is high.
+For a demo, see this [example using Docker Compose](https://github.com/grafana/alerting-ha-docker-examples/tree/main/memberlist).
+
## Enable alerting high availability using Redis
As an alternative to Memberlist, you can use Redis for high availability. This is useful if you want to have a central
@@ -67,20 +76,9 @@ database for HA and cannot support the meshing of all Grafana servers.
1. Optional: Set the username and password if authentication is enabled on the Redis server using `ha_redis_username` and `ha_redis_password`.
1. Optional: Set `ha_redis_prefix` to something unique if you plan to share the Redis server with multiple Grafana instances.
1. Optional: Set `ha_redis_tls_enabled` to `true` and configure the corresponding `ha_redis_tls_*` fields to secure communications between Grafana and Redis with Transport Layer Security (TLS).
+1. Set `[ha_advertise_address]` to `ha_advertise_address = "${POD_IP}:9094"` This is required if the instance doesn't have an IP address that is part of RFC 6890 with a default route.
-The following metrics can be used for meta monitoring, exposed by the `/metrics` endpoint in Grafana:
-
-| Metric | Description |
-| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
-| alertmanager_cluster_messages_received_total | Total number of cluster messages received. |
-| alertmanager_cluster_messages_received_size_total | Total size of cluster messages received. |
-| alertmanager_cluster_messages_sent_total | Total number of cluster messages sent. |
-| alertmanager_cluster_messages_sent_size_total | Total number of cluster messages received. |
-| alertmanager_cluster_messages_publish_failures_total | Total number of messages that failed to be published. |
-| alertmanager_cluster_members | Number indicating current number of members in cluster. |
-| alertmanager_peer_position | Position the Alertmanager instance believes it's in. The position determines a peer's behavior in the cluster. |
-| alertmanager_cluster_pings_seconds | Histogram of latencies for ping messages. |
-| alertmanager_cluster_pings_failures_total | Total number of failed pings. |
+For a demo, see this [example using Docker Compose](https://github.com/grafana/alerting-ha-docker-examples/tree/main/redis).
## Enable alerting high availability using Kubernetes
@@ -148,3 +146,58 @@ The following metrics can be used for meta monitoring, exposed by the `/metrics`
ha_advertise_address = "${POD_IP}:9094"
ha_peer_timeout = 15s
```
+
+## Verify your high availability setup
+
+When running multiple Grafana instances, all alert rules are evaluated on every instance. This multiple evaluation of alert rules is visible in the [state history](ref:state-history) and provides a straightforward way to verify that your high availability configuration is working correctly.
+
+{{% admonition type="note" %}}
+
+If using a mix of `execute_alerts=false` and `execute_alerts=true` on the HA nodes, since the alert state is not shared amongst the Grafana instances, the instances with `execute_alerts=false` do not show any alert status.
+
+The HA settings (`ha_peers`, etc.) apply only to communication between alertmanagers, synchronizing silences and attempting to avoid duplicate notifications, as described in the introduction.
+
+{{% /admonition %}}
+
+You can also confirm your high availability setup by monitoring Alertmanager metrics exposed by Grafana.
+
+| Metric | Description |
+| ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| alertmanager_cluster_members | Number indicating current number of members in cluster. |
+| alertmanager_cluster_messages_received_total | Total number of cluster messages received. |
+| alertmanager_cluster_messages_received_size_total | Total size of cluster messages received. |
+| alertmanager_cluster_messages_sent_total | Total number of cluster messages sent. |
+| alertmanager_cluster_messages_sent_size_total | Total number of cluster messages received. |
+| alertmanager_cluster_messages_publish_failures_total | Total number of messages that failed to be published. |
+| alertmanager_cluster_pings_seconds | Histogram of latencies for ping messages. |
+| alertmanager_cluster_pings_failures_total | Total number of failed pings. |
+| alertmanager_peer_position | The position an Alertmanager instance believes it holds, which defines its role in the cluster. Peers should be numbered sequentially, starting from zero. |
+
+You can confirm the number of Grafana instances in your alerting high availability setup by querying the `alertmanager_cluster_members` and `alertmanager_peer_position` metrics.
+
+Note that these alerting high availability metrics are exposed via the `/metrics` endpoint in Grafana, and are not automatically collected or displayed. If you have a Prometheus instance connected to Grafana, add a `scrape_config` to scrape Grafana metrics and then query these metrics in Explore.
+
+```yaml
+- job_name: grafana
+ honor_timestamps: true
+ scrape_interval: 15s
+ scrape_timeout: 10s
+ metrics_path: /metrics
+ scheme: http
+ follow_redirects: true
+ static_configs:
+ - targets:
+ - grafana:3000
+```
+
+For more information on monitoring alerting metrics, refer to [Alerting meta-monitoring](ref:meta-monitoring). For a demo, see [alerting high availability examples using Docker Compose](https://github.com/grafana/alerting-ha-docker-examples/).
+
+## Prevent duplicate notifications
+
+In high-availability mode, each Grafana instance runs its own pre-configured alertmanager to handle alert notifications.
+
+When multiple Grafana instances are running, all alert rules are evaluated on each instance. By default, each instance sends firing alerts to its respective alertmanager. This results in notification handling being duplicated across all running Grafana instances.
+
+Alertmanagers in HA mode communicate with each other to coordinate notification delivery. However, this setup can sometimes lead to duplicated or out-of-order notifications. By design, HA prioritizes sending duplicate notifications over the risk of missing notifications.
+
+To avoid duplicate notifications, you can configure a shared alertmanager to manage notifications for all Grafana instances. For more information, refer to [add an external alertmanager](/docs/grafana//alerting/set-up/configure-alertmanager/).
diff --git a/docs/sources/alerting/set-up/configure-rbac/access-roles/index.md b/docs/sources/alerting/set-up/configure-rbac/access-roles/index.md
index c841f96f5a6ee..0b06882eb3d9f 100644
--- a/docs/sources/alerting/set-up/configure-rbac/access-roles/index.md
+++ b/docs/sources/alerting/set-up/configure-rbac/access-roles/index.md
@@ -43,19 +43,19 @@ Fixed roles provide users more granular access to create, view, and update Alert
Details of the fixed roles and the access they provide for Grafana Alerting are below.
-| Fixed role | Permissions | Description |
-| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
-| `fixed:alerting.instances:writer` | All permissions from `fixed:alerting.instances:reader` and `alert.instances:create` `alert.instances:write` for organization scope `alert.instances.external:write` for scope `datasources:*` | Create, update and expire all silences. |
-| `fixed:alerting.instances:reader` | `alert.instances:read` for organization scope `alert.instances.external:read` for scope `datasources:*` | Read all alerts and silences. |
-| `fixed:alerting.notifications:writer` | All permissions from `fixed:alerting.notifications:reader` and `alert.notifications:write`for organization scope `alert.notifications.external:read` for scope `datasources:*` | Create, update, and delete contact points, templates, mute timings and notification policies for Grafana and external Alertmanager. |
-| `fixed:alerting.notifications:reader` | `alert.notifications:read` for organization scope `alert.notifications.external:read` for scope `datasources:*` | Read all Grafana and Alertmanager contact points, templates, and notification policies. |
-| `fixed:alerting.rules:writer` | All permissions from `fixed:alerting.rules:reader` and `alert.rule:create` `alert.rule:write` `alert.rule:delete` `alert.silences:create` `alert.silences:write` for scope `folders:*` `alert.rules.external:write` for scope `datasources:*` | Create, update, and delete all alert rules and manage rule-specific silences. |
-| `fixed:alerting.rules:reader` | `alert.rule:read`, `alert.silences:read` for scope `folders:*` `alert.rules.external:read` for scope `datasources:*` `alert.notifications.time-intervals:read` `alert.notifications.receivers:list` | Read all alert rules and read rule-specific silences. |
-| `fixed:alerting:writer` | All permissions from `fixed:alerting.rules:writer` `fixed:alerting.instances:writer` `fixed:alerting.notifications:writer` | Create, update, and delete all alert rules, silences, contact points, templates, mute timings, and notification policies. |
-| `fixed:alerting:reader` | All permissions from `fixed:alerting.rules:reader` `fixed:alerting.instances:reader` `fixed:alerting.notifications:reader` | Read-only permissions for all alert rules, alerts, contact points, and notification policies. |
-| `fixed:alerting.provisioning.secrets:reader` | `alert.provisioning:read` and `alert.provisioning.secrets:read` | Read-only permissions for Provisioning API and let export resources with decrypted secrets. |
-| `fixed:alerting.provisioning:writer` | `alert.provisioning:read` and `alert.provisioning:write` | Create, update and delete Grafana alert rules, notification policies, contact points, templates, etc via provisioning API. |
-| `fixed:alerting.provisioning.status:writer` | `alert.provisioning.provenance:write` | Set provenance status to alert rules, notification policies, contact points, etc. Should be used together with regular writer roles. |
+| Display name in UI / Fixed role | Permissions | Description |
+| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Silences Writer: `fixed:alerting.instances:writer` | All permissions from `fixed:alerting.instances:reader` and `alert.instances:create` `alert.instances:write` for organization scope `alert.instances.external:write` for scope `datasources:*` | Add and update silences in Grafana and external providers. |
+| Instances and Silences Reader: `fixed:alerting.instances:reader` | `alert.instances:read` for organization scope `alert.instances.external:read` for scope `datasources:*` | Read alert instances and silences in Grafana and external providers. |
+| Notifications Writer: `fixed:alerting.notifications:writer` | All permissions from `fixed:alerting.notifications:reader` and `alert.notifications:write`for organization scope `alert.notifications.external:read` for scope `datasources:*` | Add, update, and delete notification policies and contact points in Grafana and external providers. |
+| Notifications Reader: `fixed:alerting.notifications:reader` | `alert.notifications:read` for organization scope `alert.notifications.external:read` for scope `datasources:*` | Read notification policies and contact points in Grafana and external providers. |
+| Rules Writer: `fixed:alerting.rules:writer` | All permissions from `fixed:alerting.rules:reader` and `alert.rule:create` `alert.rule:write` `alert.rule:delete` `alert.silences:create` `alert.silences:write` for scope `folders:*` `alert.rules.external:write` for scope `datasources:*` | Create, update, and delete all alert rules and manage rule-specific silences. |
+| Rules Reader: `fixed:alerting.rules:reader` | `alert.rule:read`, `alert.silences:read` for scope `folders:*` `alert.rules.external:read` for scope `datasources:*` `alert.notifications.time-intervals:read` `alert.notifications.receivers:list` | Read all alert rules and rule-specific silences in Grafana and external providers. |
+| Full access: `fixed:alerting:writer` | All permissions from `fixed:alerting.rules:writer` `fixed:alerting.instances:writer` `fixed:alerting.notifications:writer` | Add, update, and delete alert rules, silences, contact points, and notification policies in Grafana and external providers. |
+| Full read-only access: `fixed:alerting:reader` | All permissions from `fixed:alerting.rules:reader` `fixed:alerting.instances:reader` `fixed:alerting.notifications:reader` | Read alert rules, alert instances, silences, contact points, and notification policies in Grafana and external providers. |
+| Read via Provisioning API + Export Secrets: `fixed:alerting.provisioning.secrets:reader` | `alert.provisioning:read` and `alert.provisioning.secrets:read` | Read alert rules, alert instances, silences, contact points, and notification policies using the provisioning API and use export with decrypted secrets. |
+| Access to alert rules provisioning API: `fixed:alerting.provisioning:writer` | `alert.provisioning:read` and `alert.provisioning:write` | Manage all alert rules, notification policies, contact points, templates, in the organization using the provisioning API. |
+| Set provisioning status: `fixed:alerting.provisioning.status:writer` | `alert.provisioning.provenance:write` | Set provisioning rules for Alerting resources. Should be used together with other regular roles (Notifications Writer and/or Rules Writer.) |
## Create custom roles
diff --git a/docs/sources/dashboards/build-dashboards/view-dashboard-json-model/index.md b/docs/sources/dashboards/build-dashboards/view-dashboard-json-model/index.md
index e639d4d54a7ea..762da8a801c9a 100644
--- a/docs/sources/dashboards/build-dashboards/view-dashboard-json-model/index.md
+++ b/docs/sources/dashboards/build-dashboards/view-dashboard-json-model/index.md
@@ -57,7 +57,6 @@ In the following JSON, id is shown as null which is the default value assigned t
"to": "now"
},
"timepicker": {
- "time_options": [],
"refresh_intervals": []
},
"templating": {
@@ -136,17 +135,6 @@ The grid has a negative gravity that moves panels up if there is empty space abo
"now": true,
"hidden": false,
"nowDelay": "",
- "time_options": [
- "5m",
- "15m",
- "1h",
- "6h",
- "12h",
- "24h",
- "2d",
- "7d",
- "30d"
- ],
"refresh_intervals": [
"5s",
"10s",
@@ -174,7 +162,6 @@ Usage of the fields is explained below:
| **now** | |
| **hidden** | whether timepicker is hidden or not |
| **nowDelay** | override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values. |
-| **time_options** | options available in the time picker dropdown |
| **refresh_intervals** | interval options available in the refresh picker dropdown |
| **status** | |
| **type** | |
diff --git a/docs/sources/dashboards/create-reports/index.md b/docs/sources/dashboards/create-reports/index.md
index 425070ce01647..ae06d3becc9ce 100644
--- a/docs/sources/dashboards/create-reports/index.md
+++ b/docs/sources/dashboards/create-reports/index.md
@@ -335,11 +335,11 @@ You can customize the branding options.
Report branding:
-- **Company logo:** Company logo displayed in the report PDF. It can be configured by specifying a URL, or by uploading a file. Defaults to the Grafana logo.
+- **Company logo:** Company logo displayed in the report PDF. It can be configured by specifying a URL, or by uploading a file. The maximum file size is 16 MB. Defaults to the Grafana logo.
Email branding:
-- **Company logo:** Company logo displayed in the report email. It can be configured by specifying a URL, or by uploading a file. Defaults to the Grafana logo.
+- **Company logo:** Company logo displayed in the report email. It can be configured by specifying a URL, or by uploading a file. The maximum file size is 16 MB. Defaults to the Grafana logo.
- **Email footer:** Toggle to enable the report email footer. Select **Sent by** or **None**.
- **Footer link text:** Text of the link in the report email footer. Defaults to `Grafana`.
- **Footer link URL:** Link of the report email footer.
diff --git a/docs/sources/datasources/loki/query-editor/index.md b/docs/sources/datasources/loki/query-editor/index.md
index 3ff47a25215fd..37750aadd1044 100644
--- a/docs/sources/datasources/loki/query-editor/index.md
+++ b/docs/sources/datasources/loki/query-editor/index.md
@@ -171,6 +171,8 @@ The following options are the same for both **Builder** and **Code** mode:
- **Line limit** -Defines the upper limit for the number of log lines returned by a query. The default is `1000`
+- **Direction** - Determines the search order. **Backward** is a backward search starting at the end of the time range. **Forward** is a forward search starting at the beginning of the time range. The default is **Backward**
+
- **Step** Sets the step parameter of Loki metrics queries. The default value equals to the value of `$__interval` variable, which is calculated using the time range and the width of the graph (the number of pixels).
- **Resolution** Deprecated. Sets the step parameter of Loki metrics range queries. With a resolution of `1/1`, each pixel corresponds to one data point. `1/2` retrieves one data point for every other pixel, `1/10` retrieves one data point per 10 pixels, and so on. Lower resolutions perform better.
diff --git a/docs/sources/datasources/mysql/_index.md b/docs/sources/datasources/mysql/_index.md
index 9a538f06ebb4f..8148733ef3f3e 100644
--- a/docs/sources/datasources/mysql/_index.md
+++ b/docs/sources/datasources/mysql/_index.md
@@ -73,7 +73,7 @@ For instructions on how to add a data source to Grafana, refer to the [administr
Only users with the organization administrator role can add data sources.
Administrators can also [configure the data source via YAML](#provision-the-data-source) with Grafana's provisioning system.
-{{< docs/play title="MySQL: Cities of the World Sample Data Set" url="https://play.grafana.org/d/8JOvPQr7k/" >}}
+{{< docs/play title="MySQL Overview" url="https://play.grafana.org/d/edyh1ib7db6rkb/mysql-overview" >}}
## Configure the data source
diff --git a/docs/sources/datasources/prometheus/_index.md b/docs/sources/datasources/prometheus/_index.md
index e5fa61ef1d618..433e14aedf8cc 100644
--- a/docs/sources/datasources/prometheus/_index.md
+++ b/docs/sources/datasources/prometheus/_index.md
@@ -155,7 +155,7 @@ We also bundle a dashboard within Grafana so you can start viewing your metrics
1. Navigate to the data source's [configuration page](ref:configure-prometheus-data-source).
1. Select the **Dashboards** tab.
-This displays dashboards for Grafana and Prometheus.
+ This displays dashboards for Grafana and Prometheus.
1. Select **Import** for the dashboard to import.
diff --git a/docs/sources/developers/http_api/_index.md b/docs/sources/developers/http_api/_index.md
index 806ab1f865051..28ec50df49242 100644
--- a/docs/sources/developers/http_api/_index.md
+++ b/docs/sources/developers/http_api/_index.md
@@ -80,40 +80,41 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk
- [Admin API]({{< relref "admin/" >}})
- [Alerting API (unstable)](https://editor.swagger.io/?url=https://raw.githubusercontent.com/grafana/grafana/main/pkg/services/ngalert/api/tooling/post.json)
-- [Alerting Provisioning API]({{< relref "alerting_provisioning/" >}})
+- [Alerting provisioning API]({{< relref "alerting_provisioning/" >}})
- [Annotations API]({{< relref "annotations/" >}})
- [Correlations API]({{< relref "correlations/" >}})
- [Dashboard API]({{< relref "dashboard/" >}})
-- [Dashboard Permissions API]({{< relref "dashboard_permissions/" >}})
-- [Dashboard Versions API]({{< relref "dashboard_versions/" >}})
+- [Dashboard permissions API]({{< relref "dashboard_permissions/" >}})
+- [Dashboard versions API]({{< relref "dashboard_versions/" >}})
- [Data source API]({{< relref "data_source/" >}})
- [Folder API]({{< relref "folder/" >}})
-- [Folder Permissions API]({{< relref "folder_permissions/" >}})
-- [Folder/Dashboard Search API]({{< relref "folder_dashboard_search/" >}})
-- [Library Element API]({{< relref "library_element/" >}})
+- [Folder permissions API]({{< relref "folder_permissions/" >}})
+- [Folder/Dashboard search API]({{< relref "folder_dashboard_search/" >}})
+- [Library element API]({{< relref "library_element/" >}})
- [Organization API]({{< relref "org/" >}})
- [Other API]({{< relref "other/" >}})
- [Playlists API]({{< relref "playlist/" >}})
- [Preferences API]({{< relref "preferences/" >}})
-- [Short URL API]({{< relref "short_url/" >}})
+- [Public dashboard API]({{< relref "dashboard_public/" >}})
- [Query history API]({{< relref "query_history/" >}})
+- [Service account API]({{< relref "serviceaccount/" >}})
+- [Short URL API]({{< relref "short_url/" >}})
- [Snapshot API]({{< relref "snapshot/" >}})
+- [SSO settings API]({{< relref "sso-settings/" >}})
- [Team API]({{< relref "team/" >}})
- [User API]({{< relref "user/" >}})
## Deprecated HTTP APIs
-- [Alerting Notification Channels API]({{< relref "alerting_notification_channels/" >}})
-- [Alerting API]({{< relref "alerting/" >}})
- [Authentication API]({{< relref "auth/" >}})
## Grafana Enterprise HTTP APIs
Grafana Enterprise includes all of the Grafana OSS APIs as well as those that follow:
-- [Role-based access control API]({{< relref "access_control/" >}})
- [Data source permissions API]({{< relref "datasource_permissions/" >}})
-- [Team sync API]({{< relref "team_sync/" >}})
- [License API]({{< relref "licensing/" >}})
-- [Reporting API]({{< relref "reporting/" >}})
- [Query and resource caching API]({{< relref "query_and_resource_caching/" >}})
+- [Reporting API]({{< relref "reporting/" >}})
+- [Role-based access control API]({{< relref "access_control/" >}})
+- [Team sync API]({{< relref "team_sync/" >}})
diff --git a/docs/sources/developers/http_api/dashboard_versions.md b/docs/sources/developers/http_api/dashboard_versions.md
index 5e0621433590e..fc98f7fe5e836 100644
--- a/docs/sources/developers/http_api/dashboard_versions.md
+++ b/docs/sources/developers/http_api/dashboard_versions.md
@@ -217,31 +217,7 @@ Content-Length: 1300
"from": "now-6h",
"to": "now"
},
- "timepicker": {
- "refresh_intervals": [
- "5s",
- "10s",
- "30s",
- "1m",
- "5m",
- "15m",
- "30m",
- "1h",
- "2h",
- "1d"
- ],
- "time_options": [
- "5m",
- "15m",
- "1h",
- "6h",
- "12h",
- "24h",
- "2d",
- "7d",
- "30d"
- ]
- },
+ "timepicker": {},
"timezone": "browser",
"title": "test",
"version": 1
@@ -328,31 +304,7 @@ Content-Length: 1300
"from": "now-6h",
"to": "now"
},
- "timepicker": {
- "refresh_intervals": [
- "5s",
- "10s",
- "30s",
- "1m",
- "5m",
- "15m",
- "30m",
- "1h",
- "2h",
- "1d"
- ],
- "time_options": [
- "5m",
- "15m",
- "1h",
- "6h",
- "12h",
- "24h",
- "2d",
- "7d",
- "30d"
- ]
- },
+ "timepicker": {},
"timezone": "browser",
"title": "test",
"version": 1
diff --git a/docs/sources/developers/http_api/preferences.md b/docs/sources/developers/http_api/preferences.md
index a3f5b6b1afd25..cfcc79fdab9a4 100644
--- a/docs/sources/developers/http_api/preferences.md
+++ b/docs/sources/developers/http_api/preferences.md
@@ -13,7 +13,7 @@ labels:
products:
- enterprise
- oss
-title: 'HTTP Preferences API '
+title: 'Preferences API'
---
# User and Org Preferences API
diff --git a/docs/sources/developers/http_api/snapshot.md b/docs/sources/developers/http_api/snapshot.md
index 54360b768ddd9..8329d4b62b25f 100644
--- a/docs/sources/developers/http_api/snapshot.md
+++ b/docs/sources/developers/http_api/snapshot.md
@@ -13,7 +13,7 @@ labels:
products:
- enterprise
- oss
-title: 'HTTP Snapshot API '
+title: 'Snapshot API'
---
# Snapshot API
diff --git a/docs/sources/explore/correlations-editor-in-explore.md b/docs/sources/explore/correlations-editor-in-explore.md
index 04ba3c709c831..500532261580b 100644
--- a/docs/sources/explore/correlations-editor-in-explore.md
+++ b/docs/sources/explore/correlations-editor-in-explore.md
@@ -4,7 +4,7 @@ labels:
- enterprise
- oss
title: Correlations Editor in Explore
-weight: 400
+weight: 20
---
# Correlations Editor in Explore
diff --git a/docs/sources/explore/explore-inspector.md b/docs/sources/explore/explore-inspector.md
index fe685328f9884..6880f292e8236 100644
--- a/docs/sources/explore/explore-inspector.md
+++ b/docs/sources/explore/explore-inspector.md
@@ -8,7 +8,7 @@ labels:
keywords:
- Explore
title: Query inspector in Explore
-weight: 40
+weight: 15
---
# Query inspector in Explore
diff --git a/docs/sources/explore/logs-integration.md b/docs/sources/explore/logs-integration.md
index 3e8372e67c36b..11caec96f2f88 100644
--- a/docs/sources/explore/logs-integration.md
+++ b/docs/sources/explore/logs-integration.md
@@ -9,7 +9,7 @@ labels:
- enterprise
- oss
title: Logs in Explore
-weight: 15
+weight: 25
---
# Logs in Explore
diff --git a/docs/sources/explore/simplified-exploration/_index.md b/docs/sources/explore/simplified-exploration/_index.md
new file mode 100644
index 0000000000000..b778b3b346350
--- /dev/null
+++ b/docs/sources/explore/simplified-exploration/_index.md
@@ -0,0 +1,18 @@
+---
+description: Use your telemetry data to explore and determine the root cause of issues without performing queries.
+keywords:
+ - Simplified exploration
+ - queryless
+ - Explore apps
+title: Simplified exploration
+menuTitle: Simplified exploration
+weight: 100
+---
+
+# Simplified exploration
+
+Introducing the Grafana Explore apps, designed for effortless data exploration through intuitive, queryless interactions.
+
+Easily explore telemetry signals with these specialized tools, tailored specifically for the Grafana databases to provide quick and accurate insights.
+
+{{< section >}}
diff --git a/docs/sources/explore/explore-metrics.md b/docs/sources/explore/simplified-exploration/metrics/index.md
similarity index 83%
rename from docs/sources/explore/explore-metrics.md
rename to docs/sources/explore/simplified-exploration/metrics/index.md
index be3fc570f6cd7..127dd6cb2651e 100644
--- a/docs/sources/explore/explore-metrics.md
+++ b/docs/sources/explore/simplified-exploration/metrics/index.md
@@ -6,7 +6,8 @@ labels:
- oss
title: Explore Metrics
aliases:
-canonical: https://grafana.com/docs/grafana/latest/explore/explore-metrics/
+ - ../explore-metrics/ # /docs/grafana/latest/explore/explore-metrics/
+canonical: https://grafana.com/docs/grafana/latest/explore/simplified-exploration/metrics/
description: Explore Metrics lets you browse Prometheus-compatible metrics using an intuitive, queryless experience.
weight: 200
---
@@ -15,18 +16,14 @@ weight: 200
Grafana Explore Metrics is a query-less experience for browsing **Prometheus-compatible** metrics. Quickly find related metrics with just a few simple clicks, without needing to write PromQL queries to retrieve metrics.
-{{% admonition type="caution" %}}
-Explore Metrics is currently in [public preview](/docs/release-life-cycle/). Grafana Labs offers limited support, and breaking changes might occur prior to the feature being made generally available.
-{{% /admonition %}}
-
With Explore Metrics, you can:
-- Easily slice and dice metrics based on their labels, so you can immediately see anomalies and identify issues
-- See the right visualization for your metric based on its type (gauge vs. counter, for example) without building it yourself
-- Surface other metrics relevant to the current metric
-- “Explore in a drawer” - expand a drawer over a dashboard with more content so you don’t lose your place
-- View a history of user steps when navigating through metrics and their filters
-
+- Easily segment metrics based on their labels, so you can immediately spot anomalies and identify issues.
+- Automatically display the optimal visualization for each metric type (gauge vs. counter, for example) without manual setup.
+- Uncover related metrics relevant to the one you're viewing.
+- “Explore in a drawer” - overlay additional content on your dashboard without losing your current view.
+- View a history of user steps when navigating through metrics and their filters.
+- Seamlessly pivot to related telemetry, including log data.
{{< docs/play title="Explore Metrics" url="https://play.grafana.org/explore/metrics/trail?from=now-1h&to=now&var-ds=grafanacloud-demoinfra-prom&var-filters=&refresh=&metricPrefix=all" >}}
diff --git a/docs/sources/explore/trace-integration.md b/docs/sources/explore/trace-integration.md
index da14c571cbc6a..f9b0779b12d37 100644
--- a/docs/sources/explore/trace-integration.md
+++ b/docs/sources/explore/trace-integration.md
@@ -8,7 +8,7 @@ labels:
- enterprise
- oss
title: Traces in Explore
-weight: 20
+weight: 40
---
# Traces in Explore
diff --git a/docs/sources/panels-visualizations/visualizations/alert-list/index.md b/docs/sources/panels-visualizations/visualizations/alert-list/index.md
index d40d3acf325d5..e0bcecfcc9ab9 100644
--- a/docs/sources/panels-visualizations/visualizations/alert-list/index.md
+++ b/docs/sources/panels-visualizations/visualizations/alert-list/index.md
@@ -50,6 +50,10 @@ Once you’ve created a [dashboard](https://grafana.com/docs/grafana/}}
+{{< figure src="/static/img/docs/bar-chart-panel/barchart_small_example.png" max-width="1000px" alt="Bar chart" >}}
+
+You can use the bar chart visualization if you need to show:
+
+- Population distribution by age or location
+- CPU usage per application
+- Sales per division
+- Server cost distribution
+
+## Configure a bar chart
+
+The following video shows you how to create and configure a bar chart visualization:
+
+{{< youtube id="qyKE9-71KkE" >}}
{{< docs/play title="Grafana Bar Charts and Pie Charts" url="https://play.grafana.org/d/ktMs4D6Mk/" >}}
## Supported data formats
-Only one data frame is supported and it must have at least one string field that will be used as the category for an X or Y axis and one or more numerical fields.
+To create a bar chart visualization, you need a dataset containing one string or time field (or column) and at least one numeric field, though preferably more than one to make best use of the visualization.
+
+The text or time field is used to label the bars or values in each row of data and the numeric fields are represented by proportionally sized bars.
-Example:
+### Example 1
-| Browser | Market share |
-| ------- | ------------ |
-| Chrome | 50 |
-| IE | 17.5 |
+| Group | Value1 | Value2 | Value3 |
+| ----- | ------ | ------ | ------ |
+| uno | 5 | 3 | 2 |
-If you have more than one numerical field the visualization will show grouped bars.
+![Bar chart single row example](/media/docs/grafana/panels-visualizations/screenshot-grafana-11.1-barchart-example1.png 'Bar chart single row example')
-### Visualizing time series or multiple result sets
+If you have more than one text or time field, by default, the visualization uses the first one, but you can change this in the x-axis option as described in the [Bar chart options](#bar-chart-options) section.
-If you have multiple time series or tables you first need to join them using a join or reduce transform. For example if you
-have multiple time series and you want to compare their last and max value add the **Reduce** transform and specify **Max** and **Last** as options under **Calculations**.
+### Example 2
-{{< figure src="/static/img/docs/bar-chart-panel/bar-chart-time-series-v8-0.png" max-width="1025px" caption="Bar chart time series example" >}}
+If your dataset contains multiple rows, the visualization displays multiple bar chart groups where each group contains multiple bars representing all the numeric values for a row.
+
+| Group | Value1 | Value2 | Value3 |
+| ----- | ------ | ------ | ------ |
+| uno | 5 | 3 | 2 |
+| dos | 10 | 6 | 4 |
+| tres | 20 | 8 | 2 |
+
+![Bar chart multiple row example](/media/docs/grafana/panels-visualizations/screenshot-grafana-11.1-barchart-example2.png 'Bar chart multiple row example')
+
+While the first field can be time-based and you can use a bar chart to plot time-series data, for large amounts of time-series data, we recommend that you use the [time series visualization](https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/time-series/) and configure it to be displayed as bars.
+
+We recommend that you only use one dataset in a bar chart because using multiple datasets can result in unexpected behavior.
## Panel options
@@ -75,6 +101,10 @@ have multiple time series and you want to compare their last and max value add t
Use these options to refine your visualization.
+### X Axis
+
+Specify which field is used for the x-axis.
+
### Orientation
- **Auto** - Grafana decides the bar orientation based on what the panel dimensions.
diff --git a/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md b/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md
index 3e08403717374..59111ee41a7ee 100644
--- a/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md
+++ b/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md
@@ -25,14 +25,76 @@ refs:
# Bar gauge
-Bar gauges simplify your data by reducing every field to a single value. You choose how Grafana calculates the reduction.
-
-This panel can show one or more bar gauges depending on how many series, rows, or columns your query returns.
+Bar gauges simplify your data by reducing every field to a single value. You choose how Grafana calculates the reduction. This visualization can show one or more bar gauges depending on how many series, rows, or columns your query returns.
{{< figure src="/static/img/docs/v66/bar_gauge_cover.png" max-width="1025px" alt="Bar gauge panel" >}}
+The bar gauge visualization displays values as bars with various lengths or fills proportional to the values they represent. They differ from traditional bar charts in that they act as gauges displaying metrics between ranges. One example is a thermometer displaying body temperature in a bar filling up.
+
+You can use a bar gauge visualization when you need to show:
+
+- Key performance indicators (KPIs)
+- System health
+- Savings goals
+- Attendance
+- Process completion rates
+
+## Configure a bar gauge visualization
+
+The following video shows you how to create and configure a bar gauge visualization:
+
+{{< youtube id="7PhDysObEXA" >}}
+
{{< docs/play title="Bar Gauge" url="https://play.grafana.org/d/vmie2cmWz/" >}}
+## Supported data formats
+
+To create a bar gauge visualization, you need a dataset querying at least one numeric field. Every numeric field in the dataset is displayed as a bar gauge. Text or time fields aren't required but if they're present, they're used for labeling.
+
+### Example 1
+
+| Label | Value1 | Value2 | Value3 |
+| ----- | ------ | ------ | ------ |
+| Row1 | 5 | 3 | 2 |
+
+![Bar gauge with single row of data](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-bargauge-example1.png)
+
+The minimum and maximum range for the bar gauges is automatically pulled from the largest and smallest numeric values in the dataset. You can also manually define the minimum and maximum values as indicated in the [Standard options](#standard-options) section.
+
+You can also define the minimum and maximum from the dataset provided.
+
+### Example 2
+
+| Label | Value | Max | Min |
+| ----- | ----- | --- | --- |
+| Row1 | 3 | 6 | 1 |
+
+![Bar gauge with single row of data including maximum and minimum](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-bargauge-example2.png)
+
+If you don’t want to show gauges for the min and max values, you can configure only one field to be displayed as described in the [Value options](#value-options) section.
+
+![Bar gauge, single row of data with max and min displaying value](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-bargauge-example3.png)
+
+Even if the min and max aren’t displayed, the visualization still pulls the range from the data set.
+
+### Example 3
+
+The bar gauge visualization also supports multiple records (rows) in the dataset.
+
+| Label | Value1 | Value2 | Value3 |
+| ----- | ------ | ------ | ------ |
+| Row1 | 5 | 3 | 2 |
+| Row2 | 10 | 6 | 4 |
+| Row3 | 20 | 8 | 2 |
+
+![Bar gauge with multiple rows of data displaying last row](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-bargauge-example4.png)
+
+By default, the visualization is configured to [calculate](#value-options) a single value per column or series and to display only the last set of data. However, it derives the minimum and maximum from the full dataset even if those values aren’t visible. In this example, that means only the last row of data is displayed in the gauges and the minimum and maximum values are defined as 2 and 20, pulled from the whole dataset.
+
+If you want to show one gauge per cell you can change the [Show](#show) setting from [Calculate](#calculate) to [All values](#all-values) and each bar is labeled by concatenating the text column with each value's column name.
+
+![Bar gauge with multiple rows of data displaying all the values](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-bargauge-example5.png)
+
## Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
@@ -156,6 +218,10 @@ This option only applies when bar size is set to manual.
{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}}
+Last, colors of the bar gauge thresholds can be configured as described above.
+
+![Bar gauge with colored thresholds configured](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-bargauge-example6.png)
+
## Field overrides
{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/canvas/index.md b/docs/sources/panels-visualizations/visualizations/canvas/index.md
index 943281c9ad675..18ae79749aa8f 100644
--- a/docs/sources/panels-visualizations/visualizations/canvas/index.md
+++ b/docs/sources/panels-visualizations/visualizations/canvas/index.md
@@ -30,11 +30,26 @@ refs:
# Canvas
-Canvases combine the power of Grafana with the flexibility of custom elements. Canvases are extensible form-built visualizations that allow you to explicitly place elements within static and dynamic layouts. This empowers you to design custom visualizations and overlay data in ways that aren't possible with standard Grafana panels, all within Grafana's UI. If you've used popular UI and web design tools, then designing canvases will feel very familiar.
+Canvases combine the power of Grafana with the flexibility of custom elements.
+They are extensible visualizations that allow you to add and arrange elements wherever you want within unstructured static and dynamic layouts.
+This lets you design custom visualizations and overlay data in ways that aren't possible with standard Grafana visualizations, all within the Grafana UI.
-> We would love your feedback on Canvas. Please check out the [open Github issues](https://github.com/grafana/grafana/issues?page=1&q=is%3Aopen+is%3Aissue+label%3Aarea%2Fpanel%2Fcanvas) and [submit a new feature request](https://github.com/grafana/grafana/issues/new?assignees=&labels=type%2Ffeature-request,area%2Fpanel%2Fcanvas&title=Canvas:&projects=grafana-dataviz&template=1-feature_requests.md) as needed.
+{{< video-embed src="/static/img/docs/canvas-panel/canvas-beta-overview-9-2-0.mp4" max-width="750px" alt="Canvas beta overview" >}}
-{{< video-embed src="/static/img/docs/canvas-panel/canvas-beta-overview-9-2-0.mp4" max-width="750px" caption="Canvas beta overview" >}}
+If you've used popular UI and web design tools, then designing canvases will feel very familiar.
+With all of these dynamic elements, there's almost no limit to what a canvas can display.
+
+{{< admonition type="note" >}}
+We'd love your feedback on the canvas visualization. Please check out the [open Github issues](https://github.com/grafana/grafana/issues?page=1&q=is%3Aopen+is%3Aissue+label%3Aarea%2Fpanel%2Fcanvas) and [submit a new feature request](https://github.com/grafana/grafana/issues/new?assignees=&labels=type%2Ffeature-request,area%2Fpanel%2Fcanvas&title=Canvas:&projects=grafana-dataviz&template=1-feature_requests.md) as needed.
+{{< /admonition >}}
+
+## Supported data formats
+
+The canvas visualization is unique in that it doesn't have any specific data requirements. You can even start adding and configuring visual elements without providing any data. However, any data you plan to consume should be accessible through supported Grafana data sources and structured in a way that ensures smooth integration with your custom elements.
+
+If your canvas is going to update in real time, your data should support refreshes at your desired intervals without degrading the user experience.
+
+You can tie [Elements](#elements) and [Connections](#connections) to data through options like text, colors, and background pattern images, etc. available in the canvas visualization.
## Elements
diff --git a/docs/sources/panels-visualizations/visualizations/gauge/index.md b/docs/sources/panels-visualizations/visualizations/gauge/index.md
index d9528a6b42710..0c8553138d913 100644
--- a/docs/sources/panels-visualizations/visualizations/gauge/index.md
+++ b/docs/sources/panels-visualizations/visualizations/gauge/index.md
@@ -25,16 +25,94 @@ refs:
# Gauge
-Gauges are single-value visualizations that can repeat a gauge for every series, column or row.
+Gauges are single-value visualizations that allow you to quickly visualize where a value falls within a defined or calculated min and max range. With repeat options, you can display multiple gauges, each corresponding to a different series, column, or row.
{{< figure src="/static/img/docs/v66/gauge_panel_cover.png" max-width="1025px" alt="A gauge visualization">}}
-{{< docs/play title="Grafana Gauge Visualization" url="https://play.grafana.org/d/KIhkVD6Gk/" >}}
+You can use gauges if you need to track:
+
+- Service level objectives (SLOs)
+- How full a piece of equipment is
+- How fast a vehicle is moving within a set of limits
+- Network latency
+- Equipment state with setpoint and alarm thresholds
+- CPU consumption (0-100%)
+- RAM availability
+
+## Configure a time series visualization
The following video provides beginner steps for creating gauge panels. You'll learn the data requirements and caveats, special customizations, and much more:
{{< youtube id="QwXj3y_YpnE" >}}
+{{< docs/play title="Grafana Gauge Visualization" url="https://play.grafana.org/d/KIhkVD6Gk/" >}}
+
+## Supported data formats
+
+To create a gauge visualization you need a dataset containing at least one numeric field. These values are identified by the field name. Additional text fields aren’t required but can be used for identification and labeling.
+
+### Example - One value
+
+| GaugeName | GaugeValue |
+| --------- | ---------- |
+| MyGauge | 5 |
+
+![Gauge with single numeric value](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example1.png 'Gauge with single numeric value')
+
+This dataset generates a visualization with one empty gauge showing the numeric value. This is because the gauge visualization automatically defines the upper and lower range from the minimum and maximum values in the dataset. This dataset has only one value, so it’s set as both minimum and maximum.
+
+If you only have one value, but you want to define a different minimum and maximum, you can set them manually in the [Standard options](#standard-options) settings to generate a more typical looking gauge.
+
+![Gauge with single numeric value and hardcoded max and min](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example2.png 'Gauge with single numeric value and hardcoded max-min')
+
+### Example - One row, multiple values
+
+The gauge visualization can support multiple fields in a dataset.
+
+| Identifier | value1 | value2 | value3 |
+| ---------- | ------ | ------ | ------ |
+| Gauges | 5 | 3 | 10 |
+
+![Gauge visualization with multiple numeric values in a single row](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example3.png 'Gauge with multiple numeric values in a single row')
+
+When there are multiple values in the dataset, the visualization displays multiple gauges and automatically defines the minimum and maximum. In this case, those are 3 and 10. Because the minimum and maximum values are defined, each gauge is shaded in to show that value in relation to the minimum and maximum.
+
+### Example - Multiple rows and values
+
+The gauge visualization can display datasets with multiple rows of data or even multiple datasets.
+
+| Identifier | value1 | value2 | value3 |
+| ---------- | ------ | ------ | ------ |
+| Gauges | 5 | 3 | 10 |
+| Indicators | 6 | 9 | 15 |
+| Defaults | 1 | 4 | 8 |
+
+![Gauge visualization with multiple rows and columns of numeric values showing the last row](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example6.png 'Gauge viz with multiple rows and columns of numeric values showing the last row')
+
+By default, the visualization is configured to [calculate](#value-options) a single value per column or series and to display only the last row of data. However, it derives the minimum and maximum from the full dataset, even if those values aren’t visible.
+
+In this example, that means only the last row of data is displayed in the gauges and the minimum and maximum values are 1 and 10. The value 1 is displayed because it’s in the last row, while 10 is not.
+
+If you want to show one gauge per table cell, you can change the **Show** setting from **Calculate** to **All values**, and each gauge is labeled by concatenating the text column with each value's column name.
+
+![Gauge visualization with multiple rows and columns of numeric values showing all the values](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example7.png 'Gauge viz with multiple rows and columns of numeric values showing all the values')
+
+### Example - Defined min and max
+
+You can also define minimum and maximum values as part of the dataset.
+
+| Identifier | value | max | min |
+| ---------- | ----- | --- | --- |
+| Gauges | 5 | 10 | 2 |
+
+![Gauge visualization with numeric values defining max and minimum](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example4.png 'Gauge with numeric values defining max and minimum')
+
+If you don’t want to display gauges for the `min` and `max` values, you can configure only one field to be displayed as described in the [value options](#value-options) section.
+
+![Gauge visualization with numeric values defining max and minimum but hidden](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example5.png 'Gauge with numeric values defining max and minimum but hidden')
+
+Even when minimum and maximum values aren’t displayed, the visualization still pulls the range from them.
+
## Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
@@ -135,6 +213,10 @@ Adjust the sizes of the gauge text.
{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}}
+Last, gauge colors and thresholds (the outer bar markers) of the gauge can be configured as described above.
+
+![Gauge viz with multiple rows and columns of numeric values showing all the values and thresholds defined for 0-6-11](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.2-gauge-example8.png 'Gauge viz with multiple rows and columns of numeric values showing all the values and thresholds defined for 0-6-11')
+
## Field overrides
{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/geomap/index.md b/docs/sources/panels-visualizations/visualizations/geomap/index.md
index d64d6bda9697d..b42d1f78a6c9f 100644
--- a/docs/sources/panels-visualizations/visualizations/geomap/index.md
+++ b/docs/sources/panels-visualizations/visualizations/geomap/index.md
@@ -49,13 +49,28 @@ refs:
# Geomap
-Geomaps allow you to view and customize the world map using geospatial data. You can configure various overlay styles and map view settings to easily focus on the important location-based characteristics of the data.
+Geomaps allow you to view and customize the world map using geospatial data. It's the ideal visualization if you have data that includes location information and you want to see it displayed in a map.
-> We would love your feedback on geomaps. Please check out the [open Github issues](https://github.com/grafana/grafana/issues?page=1&q=is%3Aopen+is%3Aissue+label%3Aarea%2Fpanel%2Fgeomap) and [submit a new feature request](https://github.com/grafana/grafana/issues/new?assignees=&labels=type%2Ffeature-request,area%2Fpanel%2Fgeomap&title=Geomap:&projects=grafana-dataviz&template=1-feature_requests.md) as needed.
+You can configure and overlay [map layers](#layer-type), like heatmaps and networks, and blend included basemaps or your own custom maps. This helps you to easily focus on the important location-based characteristics of the data.
-{{< figure src="/static/img/docs/geomap-panel/geomap-example-8-1-0.png" max-width="1200px" caption="Geomap panel" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-example-8-1-0.png" max-width="1200px" alt="Geomap visualization" >}}
-Pan the map, while it's in focus, by using the arrow keys. Zoom in and out by using the `+` and `-` keys.
+When a geomap is in focus, in addition to typical mouse controls, you can pan around using the arrow keys or zoom in and out using the plus (`+`) and minus (`-`) keys or icons.
+
+Geomaps are also useful when you have location data that’s changing in real time and you want to visualize where an element is moving, using auto-refresh.
+
+You can use a geomap visualization if you need to:
+
+- Track your fleet of vehicles and associated metrics
+- Show the locations and statuses of data centers or other connected assets in a network
+- Display geographic trends in a heatmap
+- Visualize the relationship of your locations' HVAC consumption or solar production with the sun's location
+
+{{< admonition type="note" >}}
+We'd love your feedback on the geomap visualization. Please check out the [open Github issues](https://github.com/grafana/grafana/issues?page=1&q=is%3Aopen+is%3Aissue+label%3Aarea%2Fpanel%2Fgeomap) and [submit a new feature request](https://github.com/grafana/grafana/issues/new?assignees=&labels=type%2Ffeature-request,area%2Fpanel%2Fgeomap&title=Geomap:&projects=grafana-dataviz&template=1-feature_requests.md) as needed.
+{{< /admonition >}}
+
+## Configure a geomap visualization
The following video provides beginner steps for creating geomap visualizations. You'll learn the data requirements and caveats, special customizations, preconfigured displays and much more:
@@ -63,42 +78,105 @@ The following video provides beginner steps for creating geomap visualizations.
{{< docs/play title="Geomap Examples" url="https://play.grafana.org/d/panel-geomap/" >}}
-## Panel options
+## Supported data formats
+
+To create a geomap visualization, you need datasets containing fields with location information.
+
+The supported location formats are:
+
+- Latitude and longitude
+- Geohash
+- Lookup codes: country, US states, or airports
+
+To learn more, refer to [Location mode](#location-mode).
+
+Geomaps also support additional fields with various data types to define things like labels, numbers, heat sizes, and colors.
+
+### Example - Latitude and longitude
+
+If you plan to use latitude and longitude coordinates, the dataset must include at least two fields (or columns): one called `latitude` (you can also use`lat`), and one called `longitude` (also `lon` or `lng`). When you use this naming convention, the visualization automatically detects the fields and displays the elements. The order of the fields doesn't matter as long as there is one latitude and one longitude.
+
+| Name | latitude | longitude | value |
+| --------------- | --------- | --------- | ----- |
+| Disneyland | 33.8121 | -117.9190 | 4 |
+| DisneyWorld | 28.3772 | -81.5707 | 10 |
+| EuroDisney | 48.867374 | 2.784018 | 3 |
+| Tokyo Disney | 35.6329 | 139.8804 | 70 |
+| Shanghai Disney | 31.1414 | 121.6682 | 1 |
+
+If your latitude and longitude fields are named differently, you can specify them, as indicated in the [Location mode](#location-mode) section.
+
+### Example - Geohash
+
+If your location data is in geohash format, the visualization requires at least one field (or column) containing location data.
+
+If the field is named `geohash`, the visualization automatically detects the location and displays the elements. The order of the fields doesn't matter and the data set can have multiple other numeric, text, and time fields.
+
+| Name | geohash | trips |
+| --------- | ------------ | ----- |
+| Cancun | d5f21 | 8 |
+| Honolulu | 87z9ps | 0 |
+| Palm Cove | rhzxudynb014 | 1 |
+| Mykonos | swdj02ey9gyx | 3 |
+
+If your field containing geohash location data is not named as above, you can configure the visualization to use geohash and specify which field to use, as explained in the [Location mode](#location-mode) section.
+
+### Example - Lookup codes
+
+The geomap visualization can identify locations based on country, airport, or US state codes.
+
+For this configuration, the dataset must contain at least one field (or column) containing the location code.
+
+If the field is named `lookup`, the visualization automatically detects it and displays points based on country codes.
+
+| Year | lookup | gdp |
+| ---- | ------ | --------- |
+| 2016 | MEX | 104171935 |
+| 2016 | DEU | 94393454 |
+| 2016 | FRA | 83654250 |
+| 2016 | BRA | 80921527 |
+| 2016 | CAN | 79699762 |
+
+The other location types— airport codes or US state codes—aren't automatically detected.
+
+If you want to use other codes or give the field a custom name, you can follow the steps in the [Location mode](#location-mode) section.
+
+## Configuration options
+
+### Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
-## Map View
+### Map view options
The map view controls the initial view of the map when the dashboard loads.
-### Initial View
+#### Initial View
The initial view configures how the geomap renders when the panel is first loaded.
-- **View** sets the center for the map when the panel first loads.
- - **Fit to data** fits the map view based on the data extents of Map layers and updates when data changes.
- - **Data** option allows selection of extent based on data from "All layers", a single "Layer", or the "Last value" from a selected layer.
- - **Layer** can be selected if fitting data from a single "Layer" or the "Last value" of a layer.
- - **Padding** sets padding in relative percent beyond data extent (not available when looking at "Last value" only).
- - **Max Zoom** sets the maximum zoom level when fitting data.
- - **Coordinates** sets the map view based on:
- - **Latitude**
- - **Longitude**
- - Default Views are also available including:
- - **(0°, 0°)**
- - **North America**
- - **South America**
- - **Europe**
- - **Africa**
- - **West Asia**
- - **South Asia**
- - **South-East Asia**
- - **East Asia**
- - **Australia**
- - **Oceania**
-- **Zoom** sets the initial zoom level.
-
-### Share view
+- **View** - Sets the center for the map when the panel first loads. Refer to the table following this list for view selections.
+- **Zoom** - Sets the initial zoom level.
+- **Use current map settings** - Use the settings of the current map to set the center.
+
+
+| View selection | Description |
+|---|---|
+| Fit to data | fits the map view based on the data extents of Map layers and updates when data changes.
**Data** - option allows selection of extent based on data from "All layers", a single "Layer", or the "Last value" from a selected layer.
**Layer** - can be selected if fitting data from a single "Layer" or the "Last value" of a layer.
**Padding** - sets padding in relative percent beyond data extent (not available when looking at "Last value" only).
**Max zoom** - sets the maximum zoom level when fitting data.
|
+| (0°, 0°) | |
+| Coordinates | sets the map view based on: **Latitude** and **Longitude**. |
+
+
+Default Views are also available including:
+
+
+| | | | | |
+| ------------- | ------------- | ------ | ------ | --------- |
+| North America | South America | Europe | Africa | West Asia |
+| South Asia | South-East Asia | East Asia | Australia | Oceania |
+
+
+#### Share view
The **Share view** option allows you to link the movement and zoom actions of multiple map visualizations within the same dashboard. The map visualizations that have this option enabled act in tandem when one of them is moved or zoomed, leaving the other ones independent.
@@ -106,11 +184,28 @@ The **Share view** option allows you to link the movement and zoom actions of mu
You might need to reload the dashboard for this feature to work.
{{< /admonition >}}
-## Map layers
+### Map layers options
Geomaps support showing multiple layers. Each layer determines how you visualize geospatial data on top of the base map.
-### Types
+There are three options that you need to set for all maps:
+
+- [Layer type](#layer-type)
+- [Data](#data)
+- [Location mode](#location-mode)
+
+Other options are dependent on your map layer type and are described within the layer type section.
+
+The layer controls allow you to create layers, change their name, reorder and delete layers.
+
+- **Add layer** creates an additional, configurable data layer for the geomap. When you add a layer, you are prompted to select a layer type. You can change the layer type at any point during panel configuration. See the **Layer Types** section above for details on each layer type.
+- **Edit layer name (pencil icon)** renames the layer.
+- **Trash Bin** deletes the layer.
+- **Reorder (six dots/grab handle)** allows you to change the layer order. Data on higher layers will appear above data on lower layers. The visualization will update the layer order as you drag and drop to help simplify choosing a layer order.
+
+You can add multiple layers of data to a single geomap in order to create rich, detailed visualizations.
+
+#### Layer type
There are seven map layer types to choose from in a geomap.
@@ -121,6 +216,10 @@ There are seven map layer types to choose from in a geomap.
- [Route (Beta)](#route-layer-beta) render data points as a route.
- [Photos (Beta)](#photos-layer-beta) renders a photo at each data point.
- [Network (Beta)](#network-layer-beta) visualizes a network graph from the data.
+- [Open Street Map](#open-street-map-layer) adds a map from a collaborative free geographic world database.
+- [CARTO basemap](#carto-basemap-layer) adds a layer from CARTO Raster basemaps.
+- [ArcGIS MapServer](#arcgis-mapserver-layer) adds a layer from an ESRI ArcGIS MapServer.
+- [XYZ Tile layer](#xyz-tile-layer) adds a map from a generic tile layer.
{{% admonition type="note" %}}
Beta is equivalent to the [public preview](/docs/release-life-cycle/) release stage.
@@ -131,9 +230,7 @@ There are also two experimental (or alpha) layer types.
- **Icon at last point (alpha)** renders an icon at the last data point.
- **Dynamic GeoJSON (alpha)** styles a GeoJSON file based on query results.
-{{% admonition type="note" %}}
-To enable experimental layers:
-Set `enable_alpha` to `true` in your configuration file:
+To enable experimental layers. Set `enable_alpha` to `true` in your configuration file:
```
[panels]
@@ -146,29 +243,11 @@ To enable the experimental layers using Docker, run the following command:
docker run -p 3000:3000 -e "GF_PANELS_ENABLE_ALPHA=true" grafana/grafana:
```
-{{% /admonition %}}
-
-{{% admonition type="note" %}}
-[Basemap layer types](#types-1) can also be added as layers. You can specify an opacity.
-{{% /admonition %}}
-
-### Layer Controls
-
-The layer controls allow you to create layers, change their name, reorder and delete layers.
-
-- **Add layer** creates an additional, configurable data layer for the geomap. When you add a layer, you are prompted to select a layer type. You can change the layer type at any point during panel configuration. See the **Layer Types** section above for details on each layer type.
-- The layer controls allow you to rename, delete, and reorder the layers of the visualization.
- - **Edit layer name (pencil icon)** renames the layer.
- - **Trash Bin** deletes the layer.
- - **Reorder (six dots/grab handle)** allows you to change the layer order. Data on higher layers will appear above data on lower layers. The visualization will update the layer order as you drag and drop to help simplify choosing a layer order.
-
-You can add multiple layers of data to a single geomap in order to create rich, detailed visualizations.
-
-### Data
+#### Data
Geomaps need a source of geographical data gathered from a data source query which can return multiple datasets. By default Grafana picks the first dataset, but this drop-down allows you to pick other datasets if the query returns more than one.
-### Location mode
+#### Location mode
There are four options to map the data returned by the selected query:
@@ -181,110 +260,30 @@ There are four options to map the data returned by the selected query:
- **Geohash** specifies that your query holds geohash data. You will be prompted to select a string data field for the geohash from your database query.
- **Lookup** specifies that your query holds location name data that needs to be mapped to a value. You will be prompted to select the lookup field from your database query and a gazetteer. The gazetteer is the directory that is used to map your queried data to a geographical point.
-## Basemap layer
-
-A basemap layer provides the visual foundation for a mapping application. It typically contains data with global coverage. Several base layer options
-are available each with specific configuration options to style the base map.
-
-### Types
-
-There are four basemap layer types to choose from in a geomap.
-
-- [Open Street Map](#open-street-map-layer) adds a map from a collaborative free geographic world database.
-- [CARTO](#carto-layer) adds a layer from CARTO Raster basemaps.
-- [ArcGIS](#arcgis-layer) adds a layer from an ESRI ArcGIS MapServer.
-- [XYZ](#xyz-tile-layer) adds a map from a generic tile layer.
-
-### Default
-
-The default base layer uses the [CARTO](#carto-layer) map. You can define custom default base layers in the `.ini` configuration file.
-
-![Basemap layer options](/static/img/docs/geomap-panel/geomap-baselayer-8-1-0.png)
-
-#### Configure the default base layer with provisioning
-
-You can configure the default base map using config files with Grafana’s provisioning system. For more information on all the settings, refer to the [provisioning docs page](ref:provisioning-docs-page).
-
-Use the JSON configuration option `default_baselayer_config` to define the default base map. There are currently four base map options to choose from: `carto`, `esri-xyz`, `osm-standard`, `xyz`. Here are some provisioning examples for each base map option.
-
-- **carto** loads the CartoDB tile server. You can choose from `auto`, `dark`, and `light` theme for the base map and can be set as shown below. The `showLabels` tag determines whether or not Grafana shows the Country details on top of the map. Here is an example:
-
-```ini
-geomap_default_baselayer = `{
- "type": "carto",
- "config": {
- "theme": "auto",
- "showLabels": true
- }
-}`
-```
-
-- **esri-xyz** loads the ESRI tile server. There are already multiple server instances implemented to show the various map styles: `world-imagery`, `world-physical`, `topo`, `usa-topo`, and `ocean`. The `custom` server option allows you to configure your own ArcGIS map server. Here are some examples:
-
-```ini
-geomap_default_baselayer = `{
- "type": "esri-xyz",
- "config": {
- "server": "world-imagery"
- }
-}`
-```
-
-```ini
-geomap_default_baselayer = `{
- "type": "esri-xyz",
- "config": {
- "server": "custom",
- "url": "[tile server url]",
- "attribution": "[tile server attribution]"
- }
-}`
-```
-
-- **osm-standard** loads the OpenStreetMap tile server. There are no additional configurations needed and the `config` fields can be left blank. Here is an example:
-
-```ini
-default_baselayer_config = `{
- "type": "osm-standard",
- "config": {}
-}`
-```
-
-- **xyz** loads a custom tile server defined by the user. Set a valid tile server `url`, with {z}/{x}/{y} for this option in order to properly load a default base map. Here is an example:
-
-```ini
-default_baselayer_config = `{
- "type": "xyz",
- "config": {
- "attribution": "Open street map",
- "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png"
- }
-}`
-```
-
-`enable_custom_baselayers` allows you to enable or disable custom open source base maps that are already implemented. The default is `true`.
-
-## Markers layer
+#### Markers layer
The markers layer allows you to display data points as different marker shapes such as circles, squares, triangles, stars, and more.
![Markers Layer](/static/img/docs/geomap-panel/geomap-markers-8-1-0.png)
-{{< figure src="/media/docs/grafana/panels-visualizations/geomap-markers-options-11-1-0.png" max-width="350px" alt="Markers layer options" >}}
-
-- **Data** and **Location mode** configure the data settings for the layer. For more information, refer to [Data](#data) and [Location mode](#location-mode).
-- **Size** configures the size of the markers. The default is `Fixed size`, which makes all marker sizes the same regardless of the data; however, there is also an option to size the markers based on data corresponding to a selected field. `Min` and `Max` marker sizes have to be set such that the markers can scale within this range.
-- **Symbol** allows you to choose the symbol, icon, or graphic to aid in providing additional visual context to your data. Choose from assets that are included with Grafana such as simple symbols or the Unicon library. You can also specify a URL containing an image asset. The image must be a scalable vector graphic (SVG).
-- **Symbol Vertical Align** configures the vertical alignment of the symbol relative to the data point. Note that the symbol's rotation angle is applied first around the data point, then the vertical alignment is applied relative to the rotation of the symbol.
-- **Symbol Horizontal Align** configures the horizontal alignment of the symbol relative to the data point. Note that the symbol's rotation angle is applied first around the data point, then the horizontal alignment is applied relative to the rotation of the symbol.
-- **Color** configures the color of the markers. The default `Fixed color` sets all markers to a specific color. There is also an option to have conditional colors depending on the selected field data point values and the color scheme set in the `Standard options` section.
-- **Fill opacity** configures the transparency of each marker.
-- **Rotation angle** configures the rotation angle of each marker. The default is `Fixed value`, which makes all markers rotate to the same angle regardless of the data; however, there is also an option to set the rotation of the markers based on data corresponding to a selected field.
-- **Text label** configures a text label for each marker.
-- **Show legend** allows you to toggle the legend for the layer.
-- **Display tooltip** allows you to toggle tooltips for the layer.
-
-## Heatmap layer
+
+| Option | Description |
+| ------ | ----------- |
+| Data | Configure the data settings for the layer. For more information, refer to [Data](#data). |
+| Location | Configure the data settings for the layer. For more information, refer to [Location mode](#location-mode). |
+| Size | Configures the size of the markers. The default is `Fixed size`, which makes all marker sizes the same regardless of the data; however, there is also an option to size the markers based on data corresponding to a selected field. `Min` and `Max` marker sizes have to be set such that the markers can scale within this range. |
+| Symbol | Allows you to choose the symbol, icon, or graphic to aid in providing additional visual context to your data. Choose from assets that are included with Grafana such as simple symbols or the Unicon library. You can also specify a URL containing an image asset. The image must be a scalable vector graphic (SVG). |
+| Symbol Vertical Align | Configures the vertical alignment of the symbol relative to the data point. Note that the symbol's rotation angle is applied first around the data point, then the vertical alignment is applied relative to the rotation of the symbol. |
+| Symbol Horizontal Align | Configures the horizontal alignment of the symbol relative to the data point. Note that the symbol's rotation angle is applied first around the data point, then the horizontal alignment is applied relative to the rotation of the symbol. |
+| Color | Configures the color of the markers. The default `Fixed color` sets all markers to a specific color. There is also an option to have conditional colors depending on the selected field data point values and the color scheme set in the `Standard options` section. |
+| Fill opacity | Configures the transparency of each marker. |
+| Rotation angle | Configures the rotation angle of each marker. The default is `Fixed value`, which makes all markers rotate to the same angle regardless of the data; however, there is also an option to set the rotation of the markers based on data corresponding to a selected field. |
+| Text label | Configures a text label for each marker. |
+| Show legend | Allows you to toggle the legend for the layer. |
+| Display tooltip | Allows you to toggle tooltips for the layer. |
+
+
+#### Heatmap layer
The heatmap layer clusters various data points to visualize locations with different densities.
To add a heatmap layer:
@@ -295,72 +294,69 @@ Similar to `Markers`, you are prompted with various options to determine which d
![Heatmap Layer](/static/img/docs/geomap-panel/geomap-heatmap-8-1-0.png)
-{{< figure src="/media/docs/grafana/panels-visualizations/geomap-heatmap-options-11-1-0.png" max-width="350px" alt="Heatmap layer options" >}}
-
-- **Data** and **Location mode** configure the data settings for the layer. For more information, refer to [Data](#data) and [Location mode](#location-mode).
-- **Weight values** configure the intensity of the heatmap clusters. `Fixed value` keeps a constant weight value throughout all data points. This value should be in the range of 0~1. Similar to Markers, there is an alternate option in the drop-down to automatically scale the weight values depending on data values.
-- **Radius** configures the size of the heatmap clusters.
-- **Blur** configures the amount of blur on each cluster.
-- **Opacity** configures the opacity of each cluster.
-- **Display tooltip** allows you to toggle tooltips for the layer.
+
+| Option | Description |
+| ------ | ----------- |
+| Data | Configure the data settings for the layer. For more information, refer to [Data](#data). |
+| Location | Configure the data settings for the layer. For more information, refer to [Location mode](#location-mode). |
+| Weight values | Configures the size of the markers. The default is `Fixed size`, which makes all marker sizes the same regardless of the data; however, there is also an option to size the markers based on data corresponding to a selected field. `Min` and `Max` marker sizes have to be set such that the markers can scale within this range. |
+| Radius | Configures the size of the heatmap clusters. |
+| Blur | Configures the amount of blur on each cluster. |
+| Opacity | Configures the opacity of each cluster. |
+| Display tooltip | Allows you to toggle tooltips for the layer. |
+
-## GeoJSON layer
+#### GeoJSON layer
The GeoJSON layer allows you to select and load a static GeoJSON file from the filesystem.
-- **GeoJSON URL** provides a choice of GeoJSON files that ship with Grafana.
-- **Default Style** controls which styles to apply when no rules above match.
- - **Color** configures the color of the default style
- - **Opacity** configures the default opacity
-- **Style Rules** apply styles based on feature properties
- - **Rule** allows you to select a _feature_, _condition_, and _value_ from the GeoJSON file in order to define a rule. The trash bin icon can be used to delete the current rule.
- - **Color** configures the color of the style for the current rule
- - **Opacity** configures the transparency level for the current rule
-- **Add style rule** creates additional style rules.
-- **Display tooltip** allows you to toggle tooltips for the layer.
+
+| Option | Description |
+| ------ | ----------- |
+| GeoJSON URL | Provides a choice of GeoJSON files that ship with Grafana. |
+| Default Style | Controls which styles to apply when no rules above match.
**Color** - configures the color of the default style
**Opacity** - configures the default opacity
|
+| Style Rules | Apply styles based on feature properties
**Rule** - allows you to select a _feature_, _condition_, and _value_ from the GeoJSON file in order to define a rule. The trash bin icon can be used to delete the current rule.
**Color** - configures the color of the style for the current rule
**Opacity** - configures the transparency level for the current rule
|
+| Display tooltip | Allows you to toggle tooltips for the layer. |
+
-{{% admonition type="note" %}}
Styles can be set within the "properties" object of the GeoJSON with support for the following geometries:
-- Polygon, MultiPolygon
+**Polygon, MultiPolygon**
- - **"fill"** - The color of the interior of the polygon(s)
- - **"fill-opacity"** - The opacity of the interior of the polygon(s)
- - **"stroke-width"** - The width of the line component of the polygon(s)
+- **"fill"** - The color of the interior of the polygon(s)
+- **"fill-opacity"** - The opacity of the interior of the polygon(s)
+- **"stroke-width"** - The width of the line component of the polygon(s)
-- Point, MultiPoint
+**Point, MultiPoint**
- - **"marker-color"** - The color of the point(s)
- - **"marker-size"** - The size of the point(s)
+- **"marker-color"** - The color of the point(s)
+- **"marker-size"** - The size of the point(s)
-- LineString, MultiLineString
- - **"stroke"** - The color of the line(s)
- - **"stroke-width"** - The width of the line(s)
+**LineString, MultiLineString**
-{{% /admonition %}}
+- **"stroke"** - The color of the line(s)
+- **"stroke-width"** - The width of the line(s)
-## Night / Day layer
+#### Night / Day layer
The Night / Day layer displays night and day regions based on the current time range.
-{{< figure src="/static/img/docs/geomap-panel/geomap-day-night-9-1-0.png" max-width="1200px" caption="Geomap panel Night / Day" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-day-night-9-1-0.png" max-width="1200px" alt="Geomap panel Night / Day" >}}
-### Options
+
+| Option | Description |
+| ------ | ----------- |
+| Data | Configures the data set for the layer. For more information, refer to [Data](#data). |
+| Show | Toggles the time source from panel time range. |
+| Night region color | Picks the color for the night region. |
+| Display sun | Toggles the sun icon. |
+| Opacity | Set the opacity from `0` (transparent) to `1` (opaque). |
+| Display tooltip | Allows you to toggle tooltips for the layer. |
+
-- **Data** configures the data set for the layer. For more information, refer to [Data](#data).
-- **Show** toggles the time source from panel time range.
-- **Night region color** picks the color for the night region.
-- **Display sun** toggles the sun icon.
-- **Opacity** set the opacity from `0` (transparent) to `1` (opaque).
-- **Display tooltip** allows you to toggle tooltips for the layer.
+[Extensions for OpenLayers - DayNight](https://viglino.github.io/ol-ext/examples/layer/map.daynight.html)
-{{< figure src="/static/img/docs/geomap-panel/geomap-day-night-options-9-1-0.png" max-width="1200px" caption="Geomap panel Night / Day options" >}}
-
-### More information
-
-- [**Extensions for OpenLayers - DayNight**](https://viglino.github.io/ol-ext/examples/layer/map.daynight.html)
-
-## Route layer (Beta)
+#### Route layer (Beta)
{{% admonition type="caution" %}}
The Route layer is currently in [public preview](/docs/release-life-cycle/). Grafana Labs offers limited support, and breaking changes might occur prior to the feature being made generally available.
@@ -368,28 +364,28 @@ The Route layer is currently in [public preview](/docs/release-life-cycle/). Gra
The Route layer renders data points as a route.
-{{< figure src="/media/docs/grafana/geomap-route-layer-basic-9-4-0.png" max-width="1200px" caption="Geomap panel Route" >}}
-
-### Options
+{{< figure src="/media/docs/grafana/geomap-route-layer-basic-9-4-0.png" max-width="1200px" alt="Geomap panel Route" >}}
-- **Data** and **Location mode** configure the data settings for the layer. For more information, refer to [Data](#data) and [Location mode](#location-mode).
-- **Size** sets the route thickness. Fixed value by default. When field data is selected you can set the Min and Max range in which field data can scale.
-- **Color** sets the route color. Set to `Fixed color` by default. You can also tie the color to field data.
-- **Fill opacity** configures the opacity of the route.
-- **Text label** configures a text label for each route.
-- **Arrow** sets the arrow styling to display along route, in order of data.
- - **None**
- - **Forward**
- - **Reverse**
-- **Display tooltip** allows you to toggle tooltips for the layer.
+The layer can also render a route with arrows.
-{{< figure src="/media/docs/grafana/geomap-route-layer-arrow-size-9-4-0.png" max-width="1200px" caption="Geomap panel Route arrows with size" >}}
+{{< figure src="/media/docs/grafana/geomap-route-layer-arrow-size-9-4-0.png" max-width="1200px" alt="Geomap panel Route arrows with size" >}}
-### More information
+
+| Option | Description |
+| ------ | ----------- |
+| Data | configure the data settings for the layer. For more information, refer to [Data](#data). |
+| Location | configure the data settings for the layer. For more information, refer to [Location mode](#location-mode). |
+| Size | sets the route thickness. Fixed value by default. When field data is selected you can set the Min and Max range in which field data can scale. |
+| Color | sets the route color. Set to `Fixed color` by default. You can also tie the color to field data. |
+| Fill opacity | configures the opacity of the route. |
+| Text label | configures a text label for each route. |
+| Arrow | sets the arrow styling to display along route, in order of data. Choose from: **None**, **Forward**, and **Reverse** |
+| Display tooltip | allows you to toggle tooltips for the layer. |
+
-- [**Extensions for OpenLayers - Flow Line Style**](http://viglino.github.io/ol-ext/examples/style/map.style.gpxline.html)
+[Extensions for OpenLayers - Flow Line Style](http://viglino.github.io/ol-ext/examples/style/map.style.gpxline.html)
-## Photos layer (Beta)
+#### Photos layer (Beta)
{{% admonition type="caution" %}}
The Photos layer is currently in [public preview](/docs/release-life-cycle/). Grafana Labs offers limited support, and breaking changes might occur prior to the feature being made generally available.
@@ -397,33 +393,26 @@ The Photos layer is currently in [public preview](/docs/release-life-cycle/). Gr
The Photos layer renders a photo at each data point.
-{{< figure src="/static/img/docs/geomap-panel/geomap-photos-9-3-0.png" max-width="1200px" caption="Geomap panel Photos" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-photos-9-3-0.png" max-width="1200px" alt="Geomap panel Photos" >}}
-### Options
+
+| Option | Description |
+| ------ | ----------- |
+| Data | Configure the data settings for the layer. For more information, refer to [Data](#data). |
+| Location | Configure the data settings for the layer. For more information, refer to [Location mode](#location-mode). |
+| Image Source field | Allows you to select a string field containing image data in either of the following formats:
|
+| Kind | Sets the frame style around the images. Choose from: **Square**, **Circle**, **Anchored**, and **Folio**. |
+| Crop | Toggles whether the images are cropped to fit. |
+| Shadow | Toggles a box shadow behind the images. |
+| Border | Sets the border size around images. |
+| Border color | Sets the border color around images. |
+| Radius | Sets the overall size of images in pixels. |
+| Display tooltip | Allows you to toggle tooltips for the layer. |
+
-- **Data** and **Location mode** configure the data settings for the layer. For more information, refer to [Data](#data) and [Location mode](#location-mode).
-- **Image Source field** allows you to select a string field containing image data in either of the following formats:
- - **Image URLs**
- - **Base64 encoded** - Image binary ("data:image/png;base64,...")
-- **Kind** sets the frame style around the images. Choose from:
- - **Square**
- - **Circle**
- - **Anchored**
- - **Folio**
-- **Crop** toggles whether the images are cropped to fit.
-- **Shadow** toggles a box shadow behind the images.
-- **Border** sets the border size around images.
-- **Border color** sets the border color around images.
-- **Radius** sets the overall size of images in pixels.
-- **Display tooltip** allows you to toggle tooltips for the layer.
+[Extensions for OpenLayers - Image Photo Style](http://viglino.github.io/ol-ext/examples/style/map.style.photo.html)
-{{< figure src="/static/img/docs/geomap-panel/geomap-photos-options-9-3-0.png" max-width="1200px" caption="Geomap panel Photos options" >}}
-
-### More information
-
-- [**Extensions for OpenLayers - Image Photo Style**](http://viglino.github.io/ol-ext/examples/style/map.style.photo.html)
-
-## Network layer (Beta)
+#### Network layer (Beta)
{{% admonition type="caution" %}}
The Network layer is currently in [public preview](/docs/release-life-cycle/). Grafana Labs offers limited support, and breaking changes might occur prior to the feature being made generally available.
@@ -431,176 +420,256 @@ The Network layer is currently in [public preview](/docs/release-life-cycle/). G
The Network layer renders a network graph. This layer supports the same [data format supported by the node graph visualization](ref:data-format) with the addition of [geospatial data](#location-mode) included in the nodes data. The geospatial data is used to locate and render the nodes on the map.
-{{< figure src="/media/docs/grafana/screenshot-grafana-10-1-geomap-network-layer-v2.png" max-width="750px" caption="Geomap network layer" >}}
-{{< video-embed src="/media/docs/grafana/screen-recording-10-1-geomap-network-layer-from-node-graph.mp4" max-width="750px" caption="Node graph to Geomap network layer" >}}
-
-### Options
+{{< figure src="/media/docs/grafana/screenshot-grafana-10-1-geomap-network-layer-v2.png" max-width="750px" alt="Geomap network layer" >}}
+
+You can convert node graph data to a network layer:
+{{< video-embed src="/media/docs/grafana/screen-recording-10-1-geomap-network-layer-from-node-graph.mp4" max-width="750px" alt="Node graph to Geomap network layer" >}}
+
+
+| Option | Description |
+| ------ | ----------- |
+| Data | Configure the data settings for the layer. For more information, refer to [Data](#data). |
+| Location | Configure the data settings for the layer. For more information, refer to [Location mode](#location-mode). |
+| Arrow | Sets the arrow direction to display for each edge, with forward meaning source to target. Choose from: **None**, **Forward**, **Reverse** and **Both**. |
+| Show legend | Allows you to toggle the legend for the layer. **Note:** The legend currently only supports node data. |
+| Display tooltip | Allows you to toggle tooltips for the layer. |
+
+
+##### Node styles options
+
+
+| Option | Description |
+| ------ | ----------- |
+| Size | Configures the size of the nodes. The default is `Fixed size`, which makes all node sizes the same regardless of the data; however, there is also an option to size the nodes based on data corresponding to a selected field. `Min` and `Max` node sizes have to be set such that the nodes can scale within this range. |
+| Symbol | Allows you to choose the symbol, icon, or graphic to aid in providing additional visual context to your data. Choose from assets that are included with Grafana such as simple symbols or the Unicon library. You can also specify a URL containing an image asset. The image must be a scalable vector graphic (SVG). |
+| Color | Configures the color of the nodes. The default `Fixed color` sets all nodes to a specific color. There is also an option to have conditional colors depending on the selected field data point values and the color scheme set in the `Standard options` section. |
+| Fill opacity | Configures the transparency of each node. |
+| Rotation angle | Configures the rotation angle of each node. The default is `Fixed value`, which makes all nodes rotate to the same angle regardless of the data; however, there is also an option to set the rotation of the nodes based on data corresponding to a selected field. |
+| Text label | Configures a text label for each node. |
+
+
+##### Edge styles options
+
+
+| Option | Description |
+| ------ | ----------- |
+| Size | Configures the line width of the edges. The default is `Fixed size`, which makes all edge line widths the same regardless of the data; however, there is also an option to size the edges based on data corresponding to a selected field. `Min` and `Max` eges sizes have to be set such that the edges can scale within this range. |
+| Color | Configures the color of the edges. The default `Fixed color` sets all edges to a specific color. There is also an option to have conditional colors depending on the selected field data point values and the color scheme set in the `Standard options` section. |
+| Fill opacity | Configures the transparency of each edge. |
+| Text label | Configures a text label for each edge. |
+
+
+#### Open Street Map layer
-- **Data** and **Location mode** configure the data settings for the layer. For more information, refer to [Data](#data) and [Location mode](#location-mode).
-- **Arrow** sets the arrow direction to display for each edge, with forward meaning source to target. Choose from:
- - **None**
- - **Forward**
- - **Reverse**
- - **Both**
-- **Show legend** allows you to toggle the legend for the layer. **Note:** The legend currently only supports node data.
-- **Display tooltip** allows you to toggle tooltips for the layer.
-
-#### Node styles
+A map from a collaborative free geographic world database.
-- **Size** configures the size of the nodes. The default is `Fixed size`, which makes all node sizes the same regardless of the data; however, there is also an option to size the nodes based on data corresponding to a selected field. `Min` and `Max` node sizes have to be set such that the nodes can scale within this range.
-- **Symbol** allows you to choose the symbol, icon, or graphic to aid in providing additional visual context to your data. Choose from assets that are included with Grafana such as simple symbols or the Unicon library. You can also specify a URL containing an image asset. The image must be a scalable vector graphic (SVG).
-- **Color** configures the color of the nodes. The default `Fixed color` sets all nodes to a specific color. There is also an option to have conditional colors depending on the selected field data point values and the color scheme set in the `Standard options` section.
-- **Fill opacity** configures the transparency of each node.
-- **Rotation angle** configures the rotation angle of each node. The default is `Fixed value`, which makes all nodes rotate to the same angle regardless of the data; however, there is also an option to set the rotation of the nodes based on data corresponding to a selected field.
-- **Text label** configures a text label for each node.
+{{< figure src="/static/img/docs/geomap-panel/geomap-osm-9-1-0.png" max-width="1200px" alt="Geomap panel Open Street Map" >}}
-#### Edge styles
+- **Opacity** from 0 (transparent) to 1 (opaque)
+- **Display tooltip** - allows you to toggle tooltips for the layer.
-- **Size** configures the line width of the edges. The default is `Fixed size`, which makes all edge line widths the same regardless of the data; however, there is also an option to size the edges based on data corresponding to a selected field. `Min` and `Max` eges sizes have to be set such that the edges can scale within this range.
-- **Color** configures the color of the edges. The default `Fixed color` sets all edges to a specific color. There is also an option to have conditional colors depending on the selected field data point values and the color scheme set in the `Standard options` section.
-- **Fill opacity** configures the transparency of each edge.
-- **Text label** configures a text label for each edge.
+[About Open Street Map](https://www.openstreetmap.org/about)
-## CARTO layer
+#### CARTO basemap layer
A CARTO layer is from CARTO Raster basemaps.
-### Options
-
- **Theme**
- Auto
- Light
- {{< figure src="/static/img/docs/geomap-panel/geomap-carto-light-9-1-0.png" max-width="1200px" caption="Geomap panel CARTO light example" >}}
+ {{< figure src="/static/img/docs/geomap-panel/geomap-carto-light-9-1-0.png" max-width="1200px" alt="Geomap panel CARTO light example" >}}
- Dark
- {{< figure src="/static/img/docs/geomap-panel/geomap-carto-dark-9-1-0.png" max-width="1200px" caption="Geomap panel CARTO dark example" >}}
+ {{< figure src="/static/img/docs/geomap-panel/geomap-carto-dark-9-1-0.png" max-width="1200px" alt="Geomap panel CARTO dark example" >}}
- **Show labels** shows the Country details on top of the map.
- **Opacity** from 0 (transparent) to 1 (opaque)
+- **Display tooltip** - allows you to toggle tooltips for the layer.
-{{< figure src="/static/img/docs/geomap-panel/geomap-carto-options-9-1-0.png" max-width="1200px" caption="Geomap panel CARTO options" >}}
+[About CARTO](https://carto.com/about-us/)
-### More Information
+#### ArcGIS MapServer layer
-- [**About CARTO**](https://carto.com/about-us/)
+An ArcGIS layer is a layer from an ESRI ArcGIS MapServer.
-## XYZ tile layer
+- **Server Instance** to select the map type.
+ - World Street Map
+ {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-wsm-9-1-0.png" max-width="1200px" alt="Geomap panel ArcGIS World Street Map" >}}
+ - World Imagery
+ {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-wi-9-1-0.png" max-width="1200px" alt="Geomap panel ArcGIS World Imagery" >}}
+ - World Physical
+ {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-wp-9-1-0.png" max-width="1200px" alt="Geomap panel ArcGIS World Physical" >}}
+ - Topographic
+ {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-topographic-9-1-0.png" max-width="1200px" alt="Geomap panel ArcGIS Topographic" >}}
+ - USA Topographic
+ {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-usa-topographic-9-1-0.png" max-width="1200px" alt="Geomap panel ArcGIS USA Topographic" >}}
+ - World Ocean
+ {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-ocean-9-1-0.png" max-width="1200px" alt="Geomap panel ArcGIS World Ocean" >}}
+ - Custom MapServer (see [XYZ](#xyz-tile-layer) for formatting)
+ - URL template
+ - Attribution
+- **Opacity** from 0 (transparent) to 1 (opaque)
+- **Display tooltip** - allows you to toggle tooltips for the layer.
-The XYZ tile layer is a map from a generic tile layer.
+##### More Information
-{{< figure src="/static/img/docs/geomap-panel/geomap-xyz-9-1-0.png" max-width="1200px" caption="Geomap panel xyz example" >}}
+- [ArcGIS Services](https://services.arcgisonline.com/arcgis/rest/services)
+- [About ESRI](https://www.esri.com/en-us/about/about-esri/overview)
-### Options
+#### XYZ Tile layer
-- **URL template**
+The XYZ Tile layer is a map from a generic tile layer.
- > **Note:** Set a valid tile server url, with {z}/{x}/{y} for example: https://tile.openstreetmap.org/{z}/{x}/{y}.png
+{{< figure src="/static/img/docs/geomap-panel/geomap-xyz-9-1-0.png" max-width="1200px" alt="Geomap panel xyz example" >}}
+- **URL template** - Set a valid tile server url, with {z}/{x}/{y} for example: https://tile.openstreetmap.org/{z}/{x}/{y}.png
- **Attribution** sets the reference string for the layer if displayed in [map controls](#show-attribution)
- **Opacity** from 0 (transparent) to 1 (opaque)
-{{< figure src="/static/img/docs/geomap-panel/geomap-xyz-options-9-1-0.png" max-width="1200px" caption="Geomap panel xyz options" >}}
+##### More information
-### More information
+- [Tiled Web Map Wikipedia](https://en.wikipedia.org/wiki/Tiled_web_map)
+- [List of Open Street Map Tile Servers](https://wiki.openstreetmap.org/wiki/Tile_servers)
-- [**Tiled Web Map Wikipedia**](https://en.wikipedia.org/wiki/Tiled_web_map)
-- [**List of Open Street Map Tile Servers**](https://wiki.openstreetmap.org/wiki/Tile_servers)
+### Basemap layer options
-## Open Street Map layer
+A basemap layer provides the visual foundation for a mapping application. It typically contains data with global coverage. Several base layer options
+are available each with specific configuration options to style the base map.
-A map from a collaborative free geographic world database.
+Basemap layer types can also be added as layers. You can specify an opacity.
-{{< figure src="/static/img/docs/geomap-panel/geomap-osm-9-1-0.png" max-width="1200px" caption="Geomap panel Open Street Map" >}}
+There are four basemap layer types to choose from in a geomap.
-### Options
+- [Open Street Map](#open-street-map-layer) adds a map from a collaborative free geographic world database.
+- [CARTO basemap](#carto-basemap-layer) adds a layer from CARTO Raster basemaps.
+- [ArcGIS MapServer](#arcgis-mapserver-layer) adds a layer from an ESRI ArcGIS MapServer.
+- [XYZ Tile layer](#xyz-tile-layer) adds a map from a generic tile layer.
-- **Opacity** from 0 (transparent) to 1 (opaque)
+The default basemap layer uses the CARTO map. You can define custom default base layers in the `.ini` configuration file.
-{{< figure src="/static/img/docs/geomap-panel/geomap-osm-options-9-1-0.png" max-width="1200px" caption="Geomap panel Open Street Map options" >}}
+![Basemap layer options](/static/img/docs/geomap-panel/geomap-baselayer-8-1-0.png)
+
+#### Configure the default base layer with provisioning
-### More Information
+You can configure the default base map using config files with Grafana’s provisioning system. For more information on all the settings, refer to the [provisioning docs page](ref:provisioning-docs-page).
-- [**About Open Street Map**](https://www.openstreetmap.org/about)
+Use the JSON configuration option `default_baselayer_config` to define the default base map. There are currently four base map options to choose from: `carto`, `esri-xyz`, `osm-standard`, `xyz`. Here are some provisioning examples for each base map option.
-## ArcGIS layer
+- **carto** loads the CartoDB tile server. You can choose from `auto`, `dark`, and `light` theme for the base map and can be set as shown below. The `showLabels` tag determines whether or not Grafana shows the Country details on top of the map. Here is an example:
-An ArcGIS layer is a layer from an ESRI ArcGIS MapServer.
+```ini
+geomap_default_baselayer = `{
+ "type": "carto",
+ "config": {
+ "theme": "auto",
+ "showLabels": true
+ }
+}`
+```
-### Options
+- **esri-xyz** loads the ESRI tile server. There are already multiple server instances implemented to show the various map styles: `world-imagery`, `world-physical`, `topo`, `usa-topo`, and `ocean`. The `custom` server option allows you to configure your own ArcGIS map server. Here are some examples:
-- **Server Instance** to select the map type.
- - World Street Map
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-wsm-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS World Street Map" >}}
- - World Imagery
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-wi-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS World Imagery" >}}
- - World Physical
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-wp-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS World Physical" >}}
- - Topographic
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-topographic-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS Topographic" >}}
- - USA Topographic
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-usa-topographic-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS USA Topographic" >}}
- - World Ocean
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-ocean-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS World Ocean" >}}
- - Custom MapServer (see [XYZ](#xyz-tile-layer) for formatting)
- - URL template
- - Attribution
-- **Opacity** from 0 (transparent) to 1 (opaque)
+{{< tabs >}}
+{{< tab-content name="World imagery" >}}
- {{< figure src="/static/img/docs/geomap-panel/geomap-arcgis-options-9-1-0.png" max-width="1200px" caption="Geomap panel ArcGIS options" >}}
+```ini
+geomap_default_baselayer = `{
+ "type": "esri-xyz",
+ "config": {
+ "server": "world-imagery"
+ }
+}`
+```
-### More Information
+{{< /tab-content >}}
+{{< tab-content name="Custom" >}}
-- [**ArcGIS Services**](https://services.arcgisonline.com/arcgis/rest/services)
-- [**About ESRI**](https://www.esri.com/en-us/about/about-esri/overview)
+```ini
+geomap_default_baselayer = `{
+ "type": "esri-xyz",
+ "config": {
+ "server": "custom",
+ "url": "[tile server url]",
+ "attribution": "[tile server attribution]"
+ }
+}`
+```
-## Map Controls
+{{< /tab-content >}}
+{{< /tabs >}}
-The map controls section contains various options for map information and tool overlays.
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-9-1-0.png" max-width="1200px" caption="Geomap panel map controls" >}}
+- **osm-standard** loads the OpenStreetMap tile server. There are no additional configurations needed and the `config` fields can be left blank. Here is an example:
+
+```ini
+default_baselayer_config = `{
+ "type": "osm-standard",
+ "config": {}
+}`
+```
+
+- **xyz** loads a custom tile server defined by the user. Set a valid tile server `url`, with {z}/{x}/{y} for this option in order to properly load a default base map. Here is an example:
+
+```ini
+default_baselayer_config = `{
+ "type": "xyz",
+ "config": {
+ "attribution": "Open street map",
+ "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png"
+ }
+}`
+```
-### Zoom
+`enable_custom_baselayers` allows you to enable or disable custom open source base maps that are already implemented. The default is `true`.
-This section describes each of the zoom controls.
+### Map controls options
+
+The map controls section contains various options for map information and tool overlays.
+
+
+| Option | Description |
+| ------ | ----------- |
+| [Show zoom control](#show-zoom-control) | Displays zoom controls in the upper left corner. |
+| [Mouse wheel zoom](#mouse-wheel-zoom) | Enables the mouse wheel to be used for zooming in or out. |
+| [Show attribution](#show-attribution) | Displays attribution for basemap layers. |
+| [Show scale](#show-scale) | Displays scale information in the bottom left corner in meters (m) or kilometers (km). |
+| [Show measure tools](#show-measure-tools) | Displays measure tools in the upper right corner. This includes the [Length](#length) and [Area](#area) options. |
+| [Show debug](#show-debug) | Displays debug information in the upper right corner. |
+| [Tooltip](#tooltip) | Controls display of tooltips. |
+
#### Show zoom control
Displays zoom controls in the upper left corner. This control can be useful when using systems that don't have a mouse.
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-zoom-9-1-0.png" max-width="1200px" caption="Geomap panel zoom" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-zoom-9-1-0.png" max-width="1200px" alt="Geomap panel zoom" >}}
#### Mouse wheel zoom
Enables the mouse wheel to be used for zooming in or out.
-### Show attribution
+#### Show attribution
Displays attribution for basemap layers.
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-attribution-9-1-0.png" max-width="1200px" caption="Geomap panel attribution" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-attribution-9-1-0.png" max-width="1200px" alt="Geomap panel attribution" >}}
-### Show scale
+#### Show scale
-Displays scale information in the bottom left corner.
+Displays scale information in the bottom left corner in meters (m) or kilometers (km).
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-scale-9-1-0.png" max-width="1200px" caption="Geomap panel scale" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-scale-9-1-0.png" max-width="1200px" alt="Geomap panel scale" >}}
-{{% admonition type="note" %}}
-Currently only displays units in [m]/[km].
-{{% /admonition %}}
-
-### Show measure tools
+#### Show measure tools
Displays measure tools in the upper right corner. Measurements appear only when this control is open.
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-9-1-0.png" max-width="1200px" caption="Geomap panel measure" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-9-1-0.png" max-width="1200px" alt="Geomap panel measure" >}}
- **Click** to start measuring
- **Continue clicking** to continue measurement
- **Double-click** to end measurement
-{{% admonition type="note" %}}
When you change measurement type or units, the previous measurement is removed from the map. If the control is closed and then re-opened, the most recent measurement is displayed. A measurement can be modified by clicking and dragging on it.
-{{% /admonition %}}
-#### Length
+##### Length
Get the spherical length of a geometry. This length is the sum of the great circle distances between coordinates. For multi-part geometries, the length is the sum of the length of each part. Geometries are assumed to be in 'EPSG:3857'.
@@ -609,9 +678,9 @@ Get the spherical length of a geometry. This length is the sum of the great circ
- **Miles (mi)**
- **Nautical miles (nmi)**
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-length-9-1-0.png" max-width="1200px" caption="Geomap panel measure length" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-length-9-1-0.png" max-width="1200px" alt="Geomap panel measure length" >}}
-#### Area
+##### Area
Get the spherical area of a geometry. This area is calculated assuming that polygon edges are segments of great circles on a sphere. Geometries are assumed to be in 'EPSG:3857'.
@@ -622,38 +691,38 @@ Get the spherical area of a geometry. This area is calculated assuming that poly
- **Acres (acre)**
- **Hectare (ha)**
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-area-9-1-0.png" max-width="1200px" caption="Geomap panel measure area" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-measure-area-9-1-0.png" max-width="1200px" alt="Geomap panel measure area" >}}
-### Show debug
+#### Show debug
Displays debug information in the upper right corner. This can be useful for debugging or validating a data source.
- **Zoom** displays current zoom level of the map.
- **Center** displays the current **longitude**, **latitude** of the map center.
-{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-debug-9-1-0.png" max-width="1200px" caption="Geomap panel debug" >}}
+{{< figure src="/static/img/docs/geomap-panel/geomap-map-controls-debug-9-1-0.png" max-width="1200px" alt="Geomap panel debug" >}}
-### Tooltip
+#### Tooltip
- **None** displays tooltips only when a data point is clicked.
- **Details** displays tooltips when a mouse pointer hovers over a data point.
-## Standard options
+### Standard options
{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
-## Data links
+### Data links
{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}}
-## Value mappings
+### Value mappings
{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}}
-## Thresholds
+### Thresholds
{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}}
-## Field overrides
+### Field overrides
{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/histogram/index.md b/docs/sources/panels-visualizations/visualizations/histogram/index.md
index f72c8ea4e2c3a..6412d37d09a73 100644
--- a/docs/sources/panels-visualizations/visualizations/histogram/index.md
+++ b/docs/sources/panels-visualizations/visualizations/histogram/index.md
@@ -100,6 +100,10 @@ The data is converted as follows:
Use the following options to refine your histogram visualization.
+### Bucket count
+
+Specifies the number of bins used to group your data in the histogram, affecting the granularity of the displayed distribution. Leave this empty for automatic bucket count of 30.
+
### Bucket size
The size of the buckets. Leave this empty for automatic bucket sizing (~10% of the full range).
@@ -112,6 +116,14 @@ If the first bucket should not start at zero. A non-zero offset has the effect o
This will merge all series and fields into a combined histogram.
+### Stacking
+
+Controls how multiple series are displayed in the histogram. Choose from the following:
+
+- **Off** - Series are not stacked, but instead shown side by side.
+- **Normal** - Series are stacked on top of each other, showing cumulative values.
+- **100%** - Series are stacked to fill 100% of the chart, showing the relative proportion of each series.
+
### Line width
Controls line width of the bars.
@@ -126,17 +138,12 @@ Set the mode of the gradient fill. Fill gradient is based on the line color. To
Gradient display is influenced by the **Fill opacity** setting.
-#### None
-
-No gradient fill. This is the default setting.
-
-#### Opacity
-
-Transparency of the gradient is calculated based on the values on the Y-axis. The opacity of the fill is increasing with the values on the Y-axis.
-
-#### Hue
+Choose from the following:
-Gradient color is generated based on the hue of the line color.
+- **None** - No gradient fill. This is the default setting.
+- **Opacity** - Transparency of the gradient is calculated based on the values on the Y-axis. The opacity of the fill is increasing with the values on the Y-axis.
+- **Hue** - Gradient color is generated based on the hue of the line color.
+- **Scheme** - The selected [color palette](https://grafana.com/docs/grafana/latest/panels-visualizations/configure-standard-options/#color-scheme) is applied to the histogram bars.
## Standard options
diff --git a/docs/sources/panels-visualizations/visualizations/logs/index.md b/docs/sources/panels-visualizations/visualizations/logs/index.md
index b467b43d6bdff..c2d73352c8acc 100644
--- a/docs/sources/panels-visualizations/visualizations/logs/index.md
+++ b/docs/sources/panels-visualizations/visualizations/logs/index.md
@@ -19,7 +19,7 @@ description: Configure options for Grafana's logs visualization
title: Logs
weight: 100
refs:
- supported-log-levels-and-mappings-of-log-level-abbreviation-and-expressions:
+ log-levels:
- pattern: /docs/grafana/
destination: /docs/grafana//explore/logs-integration/#log-level
- pattern: /docs/grafana-cloud/
@@ -28,27 +28,51 @@ refs:
# Logs
-The logs visualization shows log lines from data sources that support logs, such as Elastic, Influx, and Loki. Typically you would use this visualization next to a graph visualization to display the log output of a related process.
+_Logs_ are structured records of events or messages generated by a system or application—that is, a series of text records with status updates from your system or app. They generally include timestamps, messages, and context information like the severity of the logged event.
+
+The logs visualization displays these records from data sources that support logs, such as Elastic, Influx, and Loki. The logs visualization has colored indicators of log status, as well as collapsible log events that help you analyze the information generated.
{{< figure src="/static/img/docs/v64/logs-panel.png" max-width="1025px" alt="Logs panel" >}}
{{< docs/play title="Logs Panel" url="https://play.grafana.org/d/6NmftOxZz/" >}}
-The logs visualization shows the result of queries that were entered in the Query tab. The results of multiple queries are merged and sorted by time. You can scroll inside the panel if the data source returns more lines than can be displayed at any one time.
+Typically, you use logs with a graph visualization to display the log output of a related process. If you have an incident in your application or systems, such as a website disruption or code failure, you can use the logs visualization to help you figure out what went wrong, when, and even why.
-To limit the number of lines rendered, you can use the **Max data points** setting in the **Query options**. If it is not set, then the data source will usually enforce a default limit.
+## Configure a log visualization
The following video provides a walkthrough of creating a logs visualization. You'll also learn how to customize some settings and log visualization caveats:
{{< youtube id="jSSi_x-fD_8" >}}
+## Supported data formats
+
+The logs visualization works best with log-type datasets such as queries from data sources like Loki, Elastic, and InlfuxDB.
+
+You can also build log-formatted data from other data sources as long as the first field is a time type followed by string, number, and time fields. The leading time field is used to sort and timestamp the logs and if the data contains other time-type fields, they’re included as elements of the logged record.
+
+The second field is used as the log record title regardless of whether it’s a time, numeric, or string field. Usually the second field is a text field containing multiple string elements, but if the message level (or `lvl`) is present, the visualization uses the values in it to add colors to the record, as described in [Log levels integration](ref:log-levels).
+
+Subsequent fields are collapsed inside of each log record and you can open them by clicking the expand (`>`) icon.
+
+To limit the number of log lines rendered in the visualization, you can use the **Max data points** setting in the panel **Query options**. If that option isn't set, then the data source typically enforces its own default limit.
+
+### Example
+
+| Time | TitleMessage | Element1 | Element2 | Element3 |
+| ------------------- | -------------------- | -------- | -------- | ------------------- |
+| 2023-02-01 12:00:00 | title=Log1 lvl=info | 1 | server2 | 2023-02-01 11:00:00 |
+| 2023-02-01 11:30:00 | title=Log1 lvl=error | 1 | server2 | 2023-02-01 11:00:00 |
+| 2023-02-01 11:00:00 | title=Log1 lvl=trace | 1 | server2 | 2023-02-01 11:00:00 |
+
+![Logs Example](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-logs-example.png 'Logs Example')
+
## Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
## Log level
-For logs where a **level** label is specified, we use the value of the label to determine the log level and update color accordingly. If the log doesn't have a level label specified, we try to find out if its content matches any of the supported expressions (see below for more information). The log level is always determined by the first match. In case Grafana is not able to determine a log level, it will be visualized with **unknown** log level. See [supported log levels and mappings of log level abbreviation and expressions](ref:supported-log-levels-and-mappings-of-log-level-abbreviation-and-expressions).
+For logs where a **level** label is specified, we use the value of the label to determine the log level and update color accordingly. If the log doesn't have a level label specified, we try to find out if its content matches any of the supported expressions (see below for more information). The log level is always determined by the first match. In case Grafana is not able to determine a log level, it will be visualized with **unknown** log level. See [supported log levels and mappings of log level abbreviation and expressions](ref:log-levels).
## Log details
diff --git a/docs/sources/panels-visualizations/visualizations/node-graph/index.md b/docs/sources/panels-visualizations/visualizations/node-graph/index.md
index eabc6d2e60b66..3c8355aa4f7f1 100644
--- a/docs/sources/panels-visualizations/visualizations/node-graph/index.md
+++ b/docs/sources/panels-visualizations/visualizations/node-graph/index.md
@@ -21,10 +21,24 @@ weight: 100
# Node graph
-Node graphs can visualize directed graphs or networks. They use a directed force layout to effectively position the nodes, so they can display complex infrastructure maps, hierarchies, or execution diagrams.
+Node graphs are useful when you need to visualize elements that are related to each other. This is done by displaying circles—or _nodes_—for each element you want to visualize, connected by lines—or _edges_. The visualization uses a directed force layout that positions the nodes into a network of connected circles.
+
+Node graphs display useful information about each node, as well as the relationships between them, allowing you to visualize complex infrastructure maps, hierarchies, or execution diagrams.
![Node graph visualization](/static/img/docs/node-graph/node-graph-8-0.png 'Node graph')
+The appearance of nodes and edges can also be customized in several ways including color, borders, and line style.
+
+You can use a node graph visualization if you need to show:
+
+- Solution topologies
+- Networks
+- Infrastructure
+- Organizational charts
+- Critical path diagrams
+- Family trees
+- Mind maps
+
## Configure a node graph visualization
The following video provides beginner steps for creating node panel visualizations. You'll learn the data requirements and caveats, special customizations, and much more:
@@ -33,6 +47,38 @@ The following video provides beginner steps for creating node panel visualizatio
{{< docs/play title="Node graph panel" url="https://play.grafana.org/d/bdodfbi3d57uoe/" >}}
+## Supported data formats
+
+To create node graphs, you need two datasets: one containing the records for the displayed elements (nodes) and one dataset containing the records for the connections between those elements (edges).
+
+### Nodes dataset
+
+The nodes dataset must contain one alphanumeric ID field that gives each element a unique identifier. The visualization also accepts other options fields for titles, subtitles, main and secondary stats, arc information for how much of the circle border to paint, details, colors, icons, node size, and indicators for element highlighting. For more information and naming conventions for these fields, refer to the [Nodes data frame structure](#nodes-data-frame-structure) section.
+
+#### Example
+
+| id | title | subtitle | mainstat | secondarystat | color | icon | highlighted |
+| ----- | ----- | -------- | -------- | ------------- | ----- | ---- | ----------- |
+| node1 | PC | Windows | AMD | 16gbRAM | blue | | true |
+| node2 | PC | Linux | Intel | 32gbRAM | green | eye | false |
+| node3 | Mac | MacOS | M3 | 16gbRAM | gray | apps | false |
+| node4 | Alone | SoLonely | JustHere | NotConnected | red | | false |
+
+If the icon field contains a value, it’s displayed instead of the title and subtitle. For a list of of available icons, refer to [Icons Overview](https://developers.grafana.com/ui/latest/index.html?path=/story/docs-overview-icon--icons-overview).
+
+### Edges dataset
+
+Similar to the nodes dataset, the edges dataset needs one unique ID field for each relationship, followed by two fields containing the source and the target nodes of the edge; that is, the nodes the edge connects. Other optional fields are main and secondary stats, context menu elements, line thickness, highlight indications, line colors, and configurations to turn the connection into a dashed line. For more information and naming conventions for these fields, refer to the [Edges data frame structure](#edges-data-frame-structure) section.
+
+#### Example
+
+| id | source | target | mainstat | seconddarystat | thickness | highlighted | color |
+| ----- | ------ | ------ | -------- | -------------- | --------- | ----------- | ------ |
+| edge1 | node1 | node2 | TheMain | TheSub | 3 | true | cyan |
+| edge2 | node3 | node2 | Main2 | Sub2 | 1 | false | orange |
+
+If a node lacks edge connections, it’s displayed on its own outside of the network.
+
## Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/pie-chart/index.md b/docs/sources/panels-visualizations/visualizations/pie-chart/index.md
index 01f49e3de1aca..9f56def9011f0 100644
--- a/docs/sources/panels-visualizations/visualizations/pie-chart/index.md
+++ b/docs/sources/panels-visualizations/visualizations/pie-chart/index.md
@@ -23,9 +23,18 @@ refs:
# Pie chart
-{{< figure src="/static/img/docs/pie-chart-panel/pie-chart-example.png" max-width="1200px" lightbox="true" caption="Pie charts" >}}
+A pie chart is a graph that displays data as segments of a circle proportional to the whole, making it look like a sliced pie. Each slice corresponds to a value or measurement.
-Pie charts display reduced series, or values in a series, from one or more queries, as they relate to each other, in the form of slices of a pie. The arc length, area and central angle of a slice are all proportional to the slices value, as it relates to the sum of all values. This type of chart is best used when you want a quick comparison of a small set of values in an aesthetically pleasing form.
+{{< figure src="/static/img/docs/pie-chart-panel/pie-chart-example.png" max-width="1200px" lightbox="true" alt="Pie charts" >}}
+
+The pie chart visualization is ideal when you have data that adds up to a total and you want to show the proportion of each value compared to other slices, as well as to the whole of the pie.
+
+You can use a pie chart if you need to compare:
+
+- Browser share distribution in the market
+- Incident causes per category
+- Network traffic sources
+- User demographics
## Configure a pie chart visualization
@@ -35,6 +44,60 @@ The following video guides you through the creation steps and common customizati
{{< docs/play title="Grafana Bar Charts and Pie Charts" url="https://play.grafana.org/d/ktMs4D6Mk/" >}}
+## Supported data formats
+
+The pie chart is different from other visualizations in that it will only display one pie, regardless of the number of datasets, fields, or records queried in it.
+
+To create a pie chart visualization, you need a dataset containing a set of numeric values either in rows, columns, or both.
+
+### Example - One row
+
+The easiest way to provide data for a pie chart visualization is in a dataset with a single record (or row) containing the fields (or columns) that you want in the pie, as in the following example. The default settings of the pie chart visualization automatically display each column as a slice of the pie.
+
+| Value1 | Value2 | Value3 | Optional |
+| ------ | ------ | ------ | -------- |
+| 5 | 3 | 2 | Sums10 |
+
+![Pie chart visualization with multiple values in a single row](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-pie-example1.png)
+
+### Example - Multiple rows
+
+If you need to use numeric data that's in multiple rows, the default **Show** parameter of the visualization [Value options](#value-options) is set to **Calculate** and use data from the last row.
+
+| Value | Label |
+| ----- | ------ |
+| 5 | Value1 |
+| 3 | Value2 |
+| 2 | Value3 |
+
+![Pie chart visualization with multiple row values showing the last one](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-pie-example2.png)
+
+By default, the visualization is configured to [calculate](#value-options) a single value per column or series and to display only the last row of data.
+
+To allow values in multiple rows to be displayed, change the **Show** setting in the [Value options](#value-options) from **Calculate** to **All values**.
+
+![Pie chart visualization with multiple row values showing all values](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-pie-example3.png)
+
+### Example - Multiple rows and columns
+
+If your dataset contains multiple rows and columns with numeric data, by default only the last row's values are summed.
+
+| Value1 | Value2 | Value3 | Optional |
+| ------ | ------ | ------ | -------- |
+| 5 | 3 | 2 | Sums10 |
+| 10 | 6 | 4 | Sums20 |
+| 20 | 8 | 2 | Sums30 |
+
+![Pie chart visualization with multiple rows and columns showing the last one](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-pie-example4.png)
+
+If you want to display all the cells, change the **Show** setting in the [Value options](#value-options) from **Calculate** to **All values**. This also labels the elements by concatenating all the text fields (if you have any) with the column name.
+
+![Pie chart visualization with multiple rows and columns showing the all values](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-pie-example5.png)
+
+If you want to display only the values from a given field (or column), once the **Show** setting in the [Value options](#value-options) is set to **All values**, set the **Fields** option to the column you wish to sum in the display. The value labels are also concatenated as indicated before.
+
+![Pie chart visualization with multiple rows and columns showing values from one column](/media/docs/grafana/panels-visualizations/screenshot-grafana-12.1-pie-example6.png)
+
## Panel options
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
@@ -96,10 +159,6 @@ The following example shows a pie chart with **Name** and **Percent** labels dis
![Pie chart labels](/static/img/docs/pie-chart-panel/pie-chart-labels-7-5.png)
-## Standard options
-
-{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
-
## Tooltip options
{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="" >}}
@@ -137,6 +196,14 @@ Select values to display in the legend. You can select more than one.
- **Percent:** The percentage of the whole.
- **Value:** The raw numerical value.
+## Standard options
+
+{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
+
+## Data links
+
+{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}}
+
## Value mappings
{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/status-history/index.md b/docs/sources/panels-visualizations/visualizations/status-history/index.md
index 67326723ea591..b7825b94b828a 100644
--- a/docs/sources/panels-visualizations/visualizations/status-history/index.md
+++ b/docs/sources/panels-visualizations/visualizations/status-history/index.md
@@ -107,6 +107,10 @@ Use these options to refine the visualization.
Controls whether values are rendered inside the value boxes. Auto will render values if there is sufficient space.
+### Row height
+
+Controls the height of boxes. 1 = maximum space and 0 = minimum space.
+
### Column width
Controls the width of boxes. 1 = maximum space and 0 = minimum space.
@@ -119,10 +123,6 @@ Controls line width of state regions.
Controls the opacity of state regions.
-## Standard options
-
-{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
-
## Legend options
{{< docs/shared lookup="visualizations/legend-options-2.md" source="grafana" version="" >}}
@@ -131,6 +131,10 @@ Controls the opacity of state regions.
{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="" >}}
+## Standard options
+
+{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
+
## Data links
{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/table/index.md b/docs/sources/panels-visualizations/visualizations/table/index.md
index 6d203faabf935..e1b6ecdaaaf1b 100644
--- a/docs/sources/panels-visualizations/visualizations/table/index.md
+++ b/docs/sources/panels-visualizations/visualizations/table/index.md
@@ -54,13 +54,36 @@ refs:
destination: /docs/grafana//panels-visualizations/configure-overrides/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides/
+ data-transformation:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//panels-visualizations/query-transform-data/transform-data/
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/transform-data/
+ build-query:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//panels-visualizations/query-transform-data/
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/
---
# Table
Tables are a highly flexible visualization designed to display data in columns and rows. They support various data types, including tables, time series, annotations, and raw JSON data. The table visualization can even take multiple data sets and provide the option to switch between them. With this versatility, it's the preferred visualization for viewing multiple data types, aiding in your data analysis needs.
-{{< figure src="/static/img/docs/tables/table_visualization.png" max-width="1200px" lightbox="true" caption="Table visualization" >}}
+{{< figure src="/static/img/docs/tables/table_visualization.png" max-width="1200px" lightbox="true" alt="Table visualization" >}}
+
+You can use a table visualization to show datasets such as:
+
+- Common database queries like logs, traces, metrics
+- Financial reports
+- Customer lists
+- Product catalogs
+
+Any information you might want to put in a spreadsheet can often be best visualized in a table.
+
+Tables also provide different styles to visualize data inside the table cells such as colored text and cell backgrounds, gauges, sparklines, data links, JSON code, and images.
+
+## Configure a table visualization
The following video provides a visual walkthrough of the options you can set in a table visualization. If you want to see a configuration in action, check out the video:
@@ -72,243 +95,265 @@ The following video provides a visual walkthrough of the options you can set in
Annotations and alerts are not currently supported for tables.
{{< /admonition >}}
-## Sort column
-
-Click a column title to change the sort order from default to descending to ascending. Each time you click, the sort order changes to the next option in the cycle. You can sort multiple columns by holding the `shift` key and clicking the column name.
-
-![Sort descending](/static/img/docs/tables/sort-descending.png 'Sort descending')
+## Supported data formats
-## Data set selector
+The table visualization supports any data that has a column-row structure.
-If the data queried contains multiple data sets, a table displays a drop-down list at the bottom, so you can select the data set you want to visualize.
+### Example
-![Table visualization with multiple data sets](/media/docs/grafana/panels-visualizations/TablePanelMultiSet.png)
+```
+Column1, Column2, Column3
+value1 , value2 , value3
+value4 , value5 , value6
+value7 , value8 , value9
+```
-## Panel options
+If a cell is missing or the table cell-row structure is not complete, the table visualization won’t display any of the data:
-{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
-
-## Table options
+```
+Column1, Column2, Column3
+value1 , value2 , value3
+gap1 , gap2
+value4 , value5 , value6
+```
-{{% admonition type="note" %}}
-If you are using a table created before Grafana 7.0, then you need to migrate to the new table version in order to see these options. To migrate, on the Panel tab, click **Table** visualization. Grafana updates the table version and you can then access all table options.
-{{% /admonition %}}
+If you need to hide columns, you can do so using [data transformations](ref:data-transformation), [field overrides](#field-overrides), or by [building a query](ref:build-query) that returns only the needed columns.
-### Show header
+If you’re using a cell type such as sparkline or JSON, the data requirements may differ in a way that’s specific to that type. For more info refer to [Cell type](#cell-type).
-Show or hide column names imported from your data source.
+## Debugging in tables
-### Column width
+The table visualization helps with debugging when you need to know exactly what results your query is returning and why other visualizations might not be working. This functionality is also accessible in most visualizations by toggling on the **Table view** switch at the top of the panel:
-By default, Grafana automatically calculates the column width based on the table size and the minimum column width. This field option can override the setting and define the width for all columns in pixels.
+![The Table view switch](/media/docs/grafana/panels-visualizations/screenshot-table-view-on-11.2.png)
-For example, if you enter `100` in the field, then when you click outside the field, all the columns will be set to 100 pixels wide.
+## Turn on column filtering
-### Minimum column width
+1. In Grafana, navigate to the dashboard with the table with the columns that you want to filter.
+1. On the table panel you want to filter, open the panel editor.
+1. Expand the the **Table** options section.
+1. Toggle on the [**Column filter** switch](#table-options).
-By default, the minimum width of the table column is 150 pixels. This field option can override that default and will define the new minimum column width for the table in pixels.
+A filter icon appears next to each column title.
-For example, if you enter `75` in the field, then when you click outside the field, all the columns will scale to no smaller than 75 pixels wide.
+{{< figure src="/static/img/docs/tables/column-filter-with-icon.png" max-width="350px" alt="Column filtering turned on" class="docs-image--no-shadow" >}}
-For small-screen devices, such as smartphones or tablets, reduce the default `150` pixel value to`50` to allow table-based panels to render correctly in dashboards.
+### Filter column values
-### Column alignment
+To filter column values, click the filter (funnel) icon next to a column title. Grafana displays the filter options for that column.
-Choose how Grafana should align cell contents:
+{{< figure src="/static/img/docs/tables/filter-column-values.png" max-width="300px" alt="Filter column values" class="docs-image--no-shadow" >}}
-- Auto (default)
-- Left
-- Center
-- Right
+Click the check box next to the values that you want to display. Enter text in the search field at the top to show those values in the display so that you can select them rather than scroll to find them.
-### Column filter
+Choose from several operators to display column values:
-You can temporarily change how column data is displayed. For example, you can order values from highest to lowest or hide specific values. For more information, refer to [Filter table columns](#filter-table-columns).
+- **Contains** - Matches a regex pattern (operator by default).
+- **Expression** - Evaluates a boolean expression. The character `$` represents the column value in the expression (for example, "$ >= 10 && $ <= 12").
+- The typical comparison operators: `=`, `!=`, `<`, `<=`, `>`, `>=`.
-### Pagination
+Click the check box above the **Ok** and **Cancel** buttons to add or remove all displayed values to/from the filter.
-Use this option to enable or disable pagination. It is a front-end option that does not affect queries. When enabled, the page size automatically adjusts to the height of the table.
+### Clear column filters
-## Cell options
+Columns with filters applied have a blue funnel displayed next to the title.
-### Cell type
+{{< figure src="/static/img/docs/tables/filtered-column.png" max-width="100px" alt="Filtered column" class="docs-image--no-shadow" >}}
-By default, Grafana automatically chooses display settings. You can override the settings by choosing one of the following options to set the default for all fields. Additional configuration is available for some cell types.
+To remove the filter, click the blue funnel icon and then click **Clear filter**.
-{{% admonition type="note" %}}
-If you set these in the Field tab, then the type will apply to all fields, including the time field. Many options will work best if you set them in the Override tab so that they can be restricted to one or more fields.
-{{% /admonition %}}
+## Sort columns
-#### Auto
+Click a column title to change the sort order from default to descending to ascending. Each time you click, the sort order changes to the next option in the cycle. You can sort multiple columns by holding the `shift` key and clicking the column name.
-The **Auto** cell type automatically displays values, with sensible defaults applied.
+{{< figure src="/static/img/docs/tables/sort-descending.png" max-width="350px" alt="Sort descending" class="docs-image--no-shadow" >}}
-#### Color text
+## Dataset selector
-If thresholds are set, then the field text is displayed in the appropriate threshold color.
+If the data queried contains multiple datasets, a table displays a drop-down list at the bottom, so you can select the dataset you want to visualize.
-{{< figure src="/static/img/docs/tables/color-text.png" max-width="500px" caption="Color text" class="docs-image--no-shadow" >}}
+{{< figure src="/media/docs/grafana/panels-visualizations/TablePanelMultiSet.png" max-width="650px" alt="Table visualization with multiple datasets" class="docs-image--no-shadow" >}}
-#### Color background (gradient or solid)
+## Configuration options
-If thresholds are set, then the field background is displayed in the appropriate threshold color.
+### Panel options
-{{< figure src="/static/img/docs/tables/color-background.png" max-width="500px" caption="Color background" class="docs-image--no-shadow" >}}
+{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="" >}}
-Toggle the **Apply to entire row** switch, to apply the background color that's configured for the cell to the whole row.
+### Table options
-{{< figure src="/static/img/docs/tables/colored-rows.png" max-width="500px" alt="Colored row background" class="docs-image--no-shadow" >}}
+{{% admonition type="note" %}}
+If you are using a table created before Grafana 7.0, then you need to migrate to the new table version in order to see these options. To migrate, on the Panel tab, click **Table** visualization. Grafana updates the table version and you can then access all table options.
+{{% /admonition %}}
-#### Gauge
+| Option | Description |
+| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Show table header | Show or hide column names imported from your data source. |
+| Cell height | Set the height of the cell. Choose from **Small**, **Medium**, and **Large**. |
+| Enable pagination | Toggle the switch to control how many table rows are visible at once. When switched on, the page size automatically adjusts to the height of the table. This option doesn't affect queries. |
+| Minimum column width | Define the lower limit of the column width, in pixels. By default, the minimum width of the table column is 150 pixels. For small-screen devices, such as smartphones or tablets, reduce the default `150` pixel value to `50` to allow table-based panels to render correctly in dashboards. |
+| Column width | Define a column width, in pixels, rather than allowing the width to be set automatically. By default, Grafana calculates the column width based on the table size and the minimum column width. |
+| Column alignment | Set how Grafana should align cell contents. Choose from: **Auto** (default), **Left**, **Center**, and **Right**. |
+| Column filter | Temporarily change how column data is displayed. For example, you can order values from highest to lowest or hide specific values. For more information, refer to [Filter table columns](#filter-table-columns). |
-Cells can be displayed as a graphical gauge, with several different presentation types.
+### Table footer options
-{{< admonition type="note" >}}
-The maximum and minimum values of the gauges are configured automatically from the smallest and largest values in your whole data set. If you don't want the max/min values to be pulled from the whole data set, you can configure them for each column with field overrides.
-{{< /admonition >}}
+Toggle the **Show table footer** switch on and off to control the display of the footer. When the toggle is switched on, you can use the table footer to show [calculations](ref:calculations) on fields.
-##### Basic
+After you activate the table footer, make selections in the following options:
-The basic mode will show a simple gauge with the threshold levels defining the color of gauge.
+- **Calculation** - The calculation that you want to apply.
+- **Fields** - The fields to which you want to apply the calculations. The system applies the calculation to all numeric fields if you do not select a field.
+- **Count rows** - This options is displayed if you select the **Count** calculation. If you want to show the number of rows in the dataset instead of the number of values in the selected fields, toggle on the **Count rows** switch.
-{{< figure src="/static/img/docs/tables/basic-gauge.png" max-width="500px" caption="Gradient gauge" class="docs-image--no-shadow" >}}
+### Cell options
-##### Gradient
+Cell options allow you to control how data is displayed in a table.
-The threshold levels define a gradient.
+#### Cell type
-{{< figure src="/static/img/docs/tables/gradient-gauge.png" max-width="500px" caption="Gradient gauge" class="docs-image--no-shadow" >}}
+By default, Grafana automatically chooses display settings. You can override the settings by choosing one of the following options to set the default for all fields. Additional configuration is available for some cell types.
-##### LCD
+{{% admonition type="note" %}}
+If you set these in the Field tab, then the type will apply to all fields, including the time field. Many options will work best if you set them in the Override tab so that they can be restricted to one or more fields.
+{{% /admonition %}}
-The gauge is split up in small cells that are lit or unlit.
+| Cell type | Description |
+| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Auto | The **Auto** cell type automatically displays values, with sensible defaults applied. |
+| [Sparkline](#sparkline) | Shows values rendered as a sparkline. |
+| [Colored text](#colored-text) | If thresholds are set, then the field text is displayed in the appropriate threshold color. |
+| [Colored background](#colored-background) | If thresholds are set, then the field background is displayed in the appropriate threshold color. |
+| [Gauge](#gauge) | Cells can be displayed as a graphical gauge, with several different presentation types. You can set the [Gauge display mode](#gauge-display-mode) and the [Value display](#value-display) options. |
+| Data links | If you've configured data links, when the cell type is **Auto** mode, the cell text becomes clickable. If you change the cell type to **Data links**, the cell text reflects the titles of the configured data links. To control the application of data link text more granularly use a **Cell option > Cell type > Data links** field override. |
+| [JSON View](#json-view) | Shows value formatted as code. |
+| [Image](#image) | If you have a field value that is an image URL or a base64 encoded image you can configure the table to display it as an image. |
-{{< figure src="/static/img/docs/tables/lcd-gauge.png" max-width="500px" caption="LCD gauge" class="docs-image--no-shadow" >}}
+##### Sparkline
-##### Label Options
+Shows values rendered as a sparkline. You can show sparklines using the [Time series to table transformation](ref:time-series-to-table-transformation) on data with multiple time series to process it into a format the table can show.
-Additionally, labels displayed alongside of the gauges can be set to be colored by value, match the theme text color, or be hidden.
+{{< figure src="/static/img/docs/tables/sparkline2.png" max-width="500px" alt="Sparkline" class="docs-image--no-shadow" >}}
-**Value Color**
+You can customize sparklines with many of the same options as the [time series visualization](ref:time-series-panel) including line style and width, fill opacity, gradient mode, and more. You can also change the color of the sparkline by updating the [color scheme](ref:color-scheme) in the **Standard options** section of the panel configuration.
-{{< figure src="/static/img/docs/tables/value-color-mode.png" max-width="500px" caption="Color Label by Value" class="docs-image--no-shadow" >}}
+##### Colored text
-**Text Color**
+If thresholds are set, then the field text is displayed in the appropriate threshold color.
-{{< figure src="/static/img/docs/tables/text-color-mode.png" max-width="500px" caption="Color Label by theme color" class="docs-image--no-shadow" >}}
+{{< figure src="/static/img/docs/tables/color-text.png" max-width="500px" alt="Color text" class="docs-image--no-shadow" >}}
-**Hidden**
+{{< admonition type="note" >}}
+This is an experimental feature.
+{{< /admonition >}}
-{{< figure src="/static/img/docs/tables/hidden-mode.png" max-width="500px" caption="Hide Label" class="docs-image--no-shadow" >}}
+##### Colored background
-#### Data links
+If thresholds are set, then the field background is displayed in the appropriate threshold color.
-If you've configured data links, when the cell type is **Auto** mode, the cell text becomes clickable. If you change the cell type to **Data links**, the cell text reflects the titles of the configured data links. To control the application of data link text more granularly use a **Cell option > Cell type > Data links** field override.
+{{< figure src="/static/img/docs/tables/color-background.png" max-width="500px" alt="Color background" class="docs-image--no-shadow" >}}
-#### JSON view
+Choose between **Basic** and **Gradient** to set the **Background display mode**.
-Shows value formatted as code. If a value is an object the JSON view allowing browsing the JSON object will appear on hover.
+Toggle the **Apply to entire row** switch, to apply the background color that's configured for the cell to the whole row.
-{{< figure src="/static/img/docs/tables/json-view.png" max-width="500px" caption="JSON view" class="docs-image--no-shadow" >}}
+{{< figure src="/static/img/docs/tables/colored-rows.png" max-width="500px" alt="Colored row background" class="docs-image--no-shadow" >}}
-#### Image
+##### Gauge
-> Only available in Grafana 7.3+
+Cells can be displayed as a graphical gauge, with several different presentation types controlled by the gauge display mode and the value display.
-If you have a field value that is an image URL or a base64 encoded image you can configure the table to display it as an image.
+{{< admonition type="note" >}}
+The maximum and minimum values of the gauges are configured automatically from the smallest and largest values in your whole data set. If you don't want the max/min values to be pulled from the whole data set, you can configure them for each column with field overrides.
+{{< /admonition >}}
-{{< figure src="/static/img/docs/v73/table_hover.gif" max-width="900px" caption="Table hover" >}}
+###### Gauge display mode
-#### Sparkline
+You can set three gauge display modes.
-Shows values rendered as a sparkline. You can show sparklines using the [Time series to table transformation](ref:time-series-to-table-transformation) on data with multiple time series to process it into a format the table can show.
+- **Basic** - Shows a simple gauge with the threshold levels defining the color of gauge.
-{{< figure src="/static/img/docs/tables/sparkline2.png" max-width="500px" caption="Sparkline" class="docs-image--no-shadow" >}}
+ {{< figure src="/static/img/docs/tables/basic-gauge.png" max-width="500px" alt="Gradient gauge" class="docs-image--no-shadow" >}}
-You can be customize sparklines with many of the same options as the [Time series panel](ref:time-series-panel) including line width, fill opacity, and more. You can also change the color of the sparkline by updating the [color scheme](ref:color-scheme) in the _Standard options_ section of the panel configuration.
+- **Gradient** - The threshold levels define a gradient.
-### Wrap text
+ {{< figure src="/static/img/docs/tables/gradient-gauge.png" max-width="500px" alt="Gradient gauge" class="docs-image--no-shadow" >}}
-{{< admonition type="note" >}}
-Text wrapping is in [public preview](https://grafana.com/docs/release-life-cycle/#public-preview), however, it’s available to use by default. We’d love hear from you about how this new feature is working. To provide feedback, you can open an issue in the [Grafana GitHub repository](https://github.com/grafana/grafana).
-{{< /admonition >}}
+- **Retro LCD** - The gauge is split up in small cells that are lit or unlit.
-Toggle the **Wrap text** switch to wrap text in the cell with the longest content in your table. To wrap the text in a specific column only, use the Wrap Text option in a [field override](ref:field-override).
+ {{< figure src="/static/img/docs/tables/lcd-gauge.png" max-width="500px" alt="LCD gauge" class="docs-image--no-shadow" >}}
-### Cell value inspect
+###### Value display
-Enables value inspection from table cell. The raw value is presented in a modal window.
+Labels displayed alongside of the gauges can be set to be colored by value, match the theme text color, or be hidden.
-{{% admonition type="note" %}}
-Cell value inspection is only available when cell display mode is set to Auto, Color text, Color background or JSON View.
-{{% /admonition %}}
+- **Value color**
-## Turn on column filtering
+ {{< figure src="/static/img/docs/tables/value-color-mode.png" max-width="500px" alt="Color Label by Value" class="docs-image--no-shadow" >}}
-1. In Grafana, navigate to the dashboard with the table with the columns that you want to filter.
-1. On the table panel you want to filter, open the panel editor.
-1. Click the **Field** tab.
-1. In Table options, turn on the **Column filter** option.
+- **Text color**
-A filter icon appears next to each column title.
+ {{< figure src="/static/img/docs/tables/text-color-mode.png" max-width="500px" alt="Color Label by theme color" class="docs-image--no-shadow" >}}
-{{< figure src="/static/img/docs/tables/column-filter-with-icon.png" max-width="500px" caption="Column filtering turned on" class="docs-image--no-shadow" >}}
+- **Hidden**
-### Filter column values
+ {{< figure src="/static/img/docs/tables/hidden-mode.png" max-width="500px" alt="Hide Label" class="docs-image--no-shadow" >}}
-To filter column values, click the filter (funnel) icon next to a column title. Grafana displays the filter options for that column.
+##### JSON View
-{{< figure src="/static/img/docs/tables/filter-column-values.png" max-width="500px" caption="Filter column values" class="docs-image--no-shadow" >}}
+Shows value formatted as code. If a value is an object the JSON view allowing browsing the JSON object will appear on hover.
-Click the check box next to the values that you want to display. Enter text in the search field at the top to show those values in the display so that you can select them rather than scroll to find them.
+{{< figure src="/static/img/docs/tables/json-view.png" max-width="350px" alt="JSON view" class="docs-image--no-shadow" >}}
-Choose from several operators to display column values:
+##### Image
-- **Contains** - Matches a regex pattern (operator by default).
-- **Expression** - Evaluates a boolean expression. The character `$` represents the column value in the expression (for example, "$ >= 10 && $ <= 12").
-- The typical comparison operators: `=`, `!=`, `<`, `<=`, `>`, `>=`.
+{{< admonition type="note" >}}
+Only available in Grafana 7.3+
+{{< /admonition >}}
-Click the check box above the **Ok** and **Cancel** buttons to add or remove all displayed values to/from the filter.
+If you have a field value that is an image URL or a base64 encoded image you can configure the table to display it as an image.
-### Clear column filters
+{{< figure src="/static/img/docs/v73/table_hover.gif" max-width="900px" alt="Table hover" >}}
-Columns with filters applied have a blue funnel displayed next to the title.
+- **Alt text** - Set the alternative text of an image. The text will be available for screen readers and in cases when images can't be loaded.
+- **Title text** - Set the text that's displayed when the image is hovered over with a cursor.
-{{< figure src="/static/img/docs/tables/filtered-column.png" max-width="500px" caption="Filtered column" class="docs-image--no-shadow" >}}
+#### Wrap text
-To remove the filter, click the blue funnel icon and then click **Clear filter**.
+{{< admonition type="note" >}}
+Text wrapping is in [public preview](https://grafana.com/docs/release-life-cycle/#public-preview), however, it’s available to use by default. We’d love hear from you about how this new feature is working. To provide feedback, you can open an issue in the [Grafana GitHub repository](https://github.com/grafana/grafana).
+{{< /admonition >}}
-## Table footer
+Toggle the **Wrap text** switch to wrap text in the cell with the longest content in your table. To wrap the text in a specific column only, use the Wrap Text option in a [field override](ref:field-override).
-You can use the table footer to show [calculations](ref:calculations) on fields.
+This option isn't available when you set the cell type to **Gauge** or Data links,JSON View, Image.
-After you enable the table footer:
+#### Cell value inspect
-1. Select the **Calculation**
-2. Select the **Fields** that you want to calculate
+Enables value inspection from table cells. When the **Cell inspect value** switch is toggled on, clicking the inspect icon in a cell opens the **Inspect value** drawer.
-The system applies the calculation to all numeric fields if you do not select a field.
+The **Inspect value** drawer has two tabs, **Plain text** and **Code editor**. Grafana attempts to automatically detect the type of data in the cell and opens the drawer with the associated tab showing. However, you can switch back and forth between tabs.
-### Count rows
+Cell value inspection is only available when the **Cell type** selection is **Auto**, **Colored text**, **Colored background**, or **JSON View**.
-If you want to show the number of rows in the dataset instead of the number of values in the selected fields, select the **Count** calculation and enable **Count rows**.
+This option isn't available when you set the cell type to **Gauge** or Data links, Image, .
-## Standard options
+### Standard options
{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
-## Data links
+### Data links
{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="" >}}
-## Value mappings
+### Value mappings
{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="" >}}
-## Thresholds
+### Thresholds
{{< docs/shared lookup="visualizations/thresholds-options-2.md" source="grafana" version="" >}}
-## Field overrides
+### Field overrides
{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/time-series/index.md b/docs/sources/panels-visualizations/visualizations/time-series/index.md
index 5a1907da8d2a1..e7f21000554d4 100644
--- a/docs/sources/panels-visualizations/visualizations/time-series/index.md
+++ b/docs/sources/panels-visualizations/visualizations/time-series/index.md
@@ -64,11 +64,16 @@ refs:
destination: /docs/grafana//panels-visualizations/panel-editor-overview/#data-section
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/visualizations/panels-visualizations/panel-editor-overview/#data-section
+ data-transformation:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//panels-visualizations/panel-editor-overview/#data-section
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/visualizations/panels-visualizations/panel-editor-overview/#data-section
---
# Time series
-Time series visualizations are the default way to visualize data points over intervals of time, as a graph. They can render series as lines, points, or bars and are versatile enough to display almost any time-series data.
+Time series visualizations are the default way to show the variations of a set of data values over time. Each data point is matched to a timestamp and this _time series_ is displayed as a graph. The visualization can render series as lines, points, or bars and it's versatile enough to display almost any type of [time-series data](https://grafana.com/docs/grafana//fundamentals/timeseries/).
{{< figure src="/static/img/docs/time-series-panel/time_series_small_example.png" max-width="1200px" alt="Time series" >}}
@@ -76,6 +81,14 @@ Time series visualizations are the default way to visualize data points over int
You can migrate from the legacy Graph visualization to the time series visualization. To migrate, open the panel and click the **Migrate** button in the side pane.
{{< /admonition >}}
+A time series visualization displays an x-y graph with time progression on the x-axis and the magnitude of the values on the y-axis. This visualization is ideal for displaying large numbers of timed data points that would be hard to track in a table or list.
+
+You can use the time series visualization if you need track:
+
+- Temperature variations throughout the day
+- The daily progress of your retirement account
+- The distance you jog each day over the course of a year
+
## Configure a time series visualization
The following video guides you through the creation steps and common customizations of time series visualizations, and is great for beginners:
@@ -86,7 +99,72 @@ The following video guides you through the creation steps and common customizati
## Supported data formats
-Time series visualizations require time-series data—a sequence of measurements, ordered in time, and formatted as a table—where every row in the table represents one individual measurement at a specific time. Learn more about [time-series data](https://grafana.com/docs/grafana//fundamentals/timeseries/).
+Time series visualizations require time-series data—a sequence of measurements, ordered in time, and formatted as a table—where every row in the table represents one individual measurement at a specific time. Learn more about [time-series data](https://grafana.com/docs/grafana//fundamentals/timeseries/).
+
+The dataset must contain at least one numeric field, and in the case of multiple numeric fields, each one is plotted as a new line, point, or bar labeled with the field name in the tooltip.
+
+### Example 1
+
+In the following example, there are three numeric fields represented by three lines in the chart:
+
+| Time | value1 | value2 | value3 |
+| ------------------- | ------ | ------ | ------ |
+| 2022-11-01 10:00:00 | 1 | 2 | 3 |
+| 2022-11-01 11:00:00 | 4 | 5 | 6 |
+| 2022-11-01 12:00:00 | 7 | 8 | 9 |
+| 2022-11-01 13:00:00 | 4 | 5 | 6 |
+
+![Time series line chart with multiple numeric fields](/media/docs/grafana/panels-visualizations/screenshot-grafana-11.1-timeseries-example1v2.png 'Time series line chart with multiple numeric fields')
+
+If the time field isn't automatically detected, you might need to convert the data to a time format using a [data transformation](ref:data-transformation).
+
+### Example 2
+
+The time series visualization also supports multiple datasets. If all datasets are in the correct format, the visualization plots the numeric fields of all datasets and labels them using the column name of the field.
+
+#### Query1
+
+| Time | value1 | value2 | value3 |
+| ------------------- | ------ | ------ | ------ |
+| 2022-11-01 10:00:00 | 1 | 2 | 3 |
+| 2022-11-01 11:00:00 | 4 | 5 | 6 |
+| 2022-11-01 12:00:00 | 7 | 8 | 9 |
+
+#### Query2
+
+| timestamp | number1 | number2 | number3 |
+| ------------------- | ------- | ------- | ------- |
+| 2022-11-01 10:30:00 | 11 | 12 | 13 |
+| 2022-11-01 11:30:00 | 14 | 15 | 16 |
+| 2022-11-01 12:30:00 | 17 | 18 | 19 |
+| 2022-11-01 13:30:00 | 14 | 15 | 16 |
+
+![Time series line chart with two datasets](/media/docs/grafana/panels-visualizations/screenshot-grafana-11.1-timeseries-example2v2.png 'Time series line chart with two datasets')
+
+### Example 3
+
+If you want to more easily compare events between different, but overlapping, time frames, you can do this by using a time offset while querying the compared dataset:
+
+#### Query1
+
+| Time | value1 | value2 | value3 |
+| ------------------- | ------ | ------ | ------ |
+| 2022-11-01 10:00:00 | 1 | 2 | 3 |
+| 2022-11-01 11:00:00 | 4 | 5 | 6 |
+| 2022-11-01 12:00:00 | 7 | 8 | 9 |
+
+#### Query2
+
+| timestamp(-30min) | number1 | number2 | number3 |
+| ------------------- | ------- | ------- | ------- |
+| 2022-11-01 10:30:00 | 11 | 12 | 13 |
+| 2022-11-01 11:30:00 | 14 | 15 | 16 |
+| 2022-11-01 12:30:00 | 17 | 18 | 19 |
+| 2022-11-01 13:30:00 | 14 | 15 | 16 |
+
+![Time Series Example with second Data Set offset](/media/docs/grafana/panels-visualizations/screenshot-grafana-11.1-timeseries-example3v2.png 'Time Series Example with second Data Set offset')
+
+When you add the offset, the resulting visualization makes the datasets appear to be occurring at the same time so that you can compare them more easily.
## Alert rules
diff --git a/docs/sources/setup-grafana/configure-grafana/_index.md b/docs/sources/setup-grafana/configure-grafana/_index.md
index dae820f5ec6ce..88b3755746179 100644
--- a/docs/sources/setup-grafana/configure-grafana/_index.md
+++ b/docs/sources/setup-grafana/configure-grafana/_index.md
@@ -39,7 +39,7 @@ On Windows, the `sample.ini` file is located in the same directory as `defaults.
### macOS
-By default, the configuration file is located at `/usr/local/etc/grafana/grafana.ini`. For a Grafana instance installed using Homebrew, edit the `grafana.ini` file directly. Otherwise, add a configuration file named `custom.ini` to the `conf` folder to override the settings defined in `conf/defaults.ini`.
+By default, the configuration file is located at `/opt/homebrew/etc/grafana/grafana.ini` or `/usr/local/etc/grafana/grafana.ini`. For a Grafana instance installed using Homebrew, edit the `grafana.ini` file directly. Otherwise, add a configuration file named `custom.ini` to the `conf` folder to override the settings defined in `conf/defaults.ini`.
## Remove comments in the .ini files
@@ -1325,7 +1325,7 @@ Either "OpportunisticStartTLS", "MandatoryStartTLS", "NoStartTLS". Default is `e
### enable_tracing
-Enable trace propagation in e-mail headers, using the `traceparent`, `tracestate` and (optionally) `baggage` fields. Default is `false`. To enable, you must first configure tracing in one of the `tracing.oentelemetry.*` sections.
+Enable trace propagation in e-mail headers, using the `traceparent`, `tracestate` and (optionally) `baggage` fields. Default is `false`. To enable, you must first configure tracing in one of the `tracing.opentelemetry.*` sections.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
index afd59a7f0d51c..dac259eb5acd8 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
@@ -183,13 +183,13 @@ Grafana supports user authentication through Okta, which is useful when you want
- In the **Single sign on URL** field, use the `/saml/acs` endpoint URL of your Grafana instance, for example, `https://grafana.example.com/saml/acs`.
- In the **Audience URI (SP Entity ID)** field, use the `/saml/metadata` endpoint URL, for example, `https://grafana.example.com/saml/metadata`.
- Leave the default values for **Name ID format** and **Application username**.
- - In the **ATTRIBUTE STATEMENTS (OPTIONAL)** section, enter the SAML attributes to be shared with Grafana, for example:
+ - In the **ATTRIBUTE STATEMENTS (OPTIONAL)** section, enter the SAML attributes to be shared with Grafana. The attribute names in Okta need to match exactly what is defined within Grafana, for example:
- | Attribute name (in Grafana) | Value (in Okta profile) |
- | --------------------------- | -------------------------------------- |
- | Login | `user.login` |
- | Email | `user.email` |
- | DisplayName | `user.firstName + " " + user.lastName` |
+ | Attribute name (in Grafana) | Name and value (in Okta profile) |
+ | --------------------------- | -------------------------------------------------- |
+ | Login | Login `user.login` |
+ | Email | Email `user.email` |
+ | DisplayName | DisplayName `user.firstName + " " + user.lastName` |
- In the **GROUP ATTRIBUTE STATEMENTS (OPTIONAL)** section, enter a group attribute name (for example, `Group`) and set filter to `Matches regex .*` to return all user groups.
diff --git a/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md b/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
index 34d220c51b28b..65c63cdaf2508 100644
--- a/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
+++ b/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
@@ -97,6 +97,14 @@ On a minimal CentOS 8 installation, the following dependencies are required for
libXcomposite libXdamage libXtst cups libXScrnSaver pango atk adwaita-cursor-theme adwaita-icon-theme at at-spi2-atk at-spi2-core cairo-gobject colord-libs dconf desktop-file-utils ed emacs-filesystem gdk-pixbuf2 glib-networking gnutls gsettings-desktop-schemas gtk-update-icon-cache gtk3 hicolor-icon-theme jasper-libs json-glib libappindicator-gtk3 libdbusmenu libdbusmenu-gtk3 libepoxy liberation-fonts liberation-narrow-fonts liberation-sans-fonts liberation-serif-fonts libgusb libindicator-gtk3 libmodman libproxy libsoup libwayland-cursor libwayland-egl libxkbcommon m4 mailx nettle patch psmisc redhat-lsb-core redhat-lsb-submod-security rest spax time trousers xdg-utils xkeyboard-config alsa-lib libX11-xcb
```
+**RHEL:**
+
+On a minimal RHEL 8 installation, the following dependencies are required for the image rendering to function:
+
+```bash
+linux-vdso.so.1 libdl.so.2 libpthread.so.0 libgobject-2.0.so.0 libglib-2.0.so.0 libnss3.so libnssutil3.so libsmime3.so libnspr4.so libatk-1.0.so.0 libatk-bridge-2.0.so.0 libcups.so.2 libgio-2.0.so.0 libdrm.so.2 libdbus-1.so.3 libexpat.so.1 libxcb.so.1 libxkbcommon.so.0 libm.so.6 libX11.so.6 libXcomposite.so.1 libXdamage.so.1 libXext.so.6 libXfixes.so.3 libXrandr.so.2 libgbm.so.1 libpango-1.0.so.0 libcairo.so.2 libasound.so.2 libatspi.so.0 libgcc_s.so.1 libc.so.6 /lib64/ld-linux-x86-64.so.2 libgnutls.so.30 libpcre.so.1 libffi.so.6 libplc4.so libplds4.so librt.so.1 libgmodule-2.0.so.0 libgssapi_krb5.so.2 libkrb5.so.3 libk5crypto.so.3 libcom_err.so.2 libavahi-common.so.3 libavahi-client.so.3 libcrypt.so.1 libz.so.1 libselinux.so.1 libresolv.so.2 libmount.so.1 libsystemd.so.0 libXau.so.6 libXrender.so.1 libthai.so.0 libfribidi.so.0 libpixman-1.so.0 libfontconfig.so.1 libpng16.so.16 libxcb-render.so.0 libidn2.so.0 libunistring.so.2 libtasn1.so.6 libnettle.so.6 libhogweed.so.4 libgmp.so.10 libkrb5support.so.0 libkeyutils.so.1 libpcre2-8.so.0 libuuid.so.1 liblz4.so.1 libgcrypt.so.20 libbz2.so.1
+```
+
## Certificate signed by internal certificate authorities
In many cases, Grafana runs on internal servers and uses certificates that have not been signed by a CA ([Certificate Authority](https://en.wikipedia.org/wiki/Certificate_authority)) known to Chrome, and therefore cannot be validated. Chrome internally uses NSS ([Network Security Services](https://en.wikipedia.org/wiki/Network_Security_Services)) for cryptographic operations such as the validation of certificates.
diff --git a/docs/sources/setup-grafana/installation/_index.md b/docs/sources/setup-grafana/installation/_index.md
index c3cc2ae4fb346..2f852fc3f2238 100644
--- a/docs/sources/setup-grafana/installation/_index.md
+++ b/docs/sources/setup-grafana/installation/_index.md
@@ -61,7 +61,7 @@ Grafana requires a database to store its configuration data, such as users, data
Grafana supports the following databases:
- [SQLite 3](https://www.sqlite.org/index.html)
-- [MySQL 5.7+](https://www.mysql.com/support/supportedplatforms/database.html)
+- [MySQL 8.0+](https://www.mysql.com/support/supportedplatforms/database.html)
- [PostgreSQL 12+](https://www.postgresql.org/support/versioning/)
By default Grafana uses an embedded SQLite database, which is stored in the Grafana installation location.
diff --git a/docs/sources/setup-grafana/installation/debian/index.md b/docs/sources/setup-grafana/installation/debian/index.md
index ddefa5b79887e..1aeb3203e4b9d 100644
--- a/docs/sources/setup-grafana/installation/debian/index.md
+++ b/docs/sources/setup-grafana/installation/debian/index.md
@@ -111,7 +111,7 @@ Complete any of the following steps to uninstall Grafana.
To uninstall Grafana, run the following commands in a terminal window:
-1. If you configured Grafana to run with systemd, stop the systemd servivce for Grafana server:
+1. If you configured Grafana to run with systemd, stop the systemd service for Grafana server:
```shell
sudo systemctl stop grafana-server
diff --git a/docs/sources/setup-grafana/installation/helm/index.md b/docs/sources/setup-grafana/installation/helm/index.md
index 566f73d5610b4..d34e5c35f0ed8 100644
--- a/docs/sources/setup-grafana/installation/helm/index.md
+++ b/docs/sources/setup-grafana/installation/helm/index.md
@@ -278,6 +278,67 @@ To install plugins in the Grafana Helm Charts, complete the following steps:
1. Search for the above plugins and they should be marked as installed.
+### Configure a Private CA (Certificate Authority)
+
+In many enterprise networks, TLS certificates are issued by a private certificate authority and are not trusted by default (using the provided OS trust chain).
+
+If your Grafana instance needs to interact with services exposing certificates issued by these private CAs, then you need to ensure Grafana trusts the root certificate.
+
+You might need to configure this if you:
+
+- have plugins that require connectivity to other self hosted systems. For example, if you've installed the Grafana Enterprise Metrics, Logs, or Traces (GEM, GEL, GET) plugins, and your GEM (or GEL/GET) cluster is using a private certificate.
+- want to connect to data sources which are listening on HTTPS with a private certificate.
+- are using a backend database for persistence, or caching service that uses private certificates for encryption in transit.
+
+In some cases you can specify a self-signed certificate within Grafana (such as in some data sources), or choose to skip TLS certificate validation (this is not recommended unless absolutely necessary).
+
+A simple solution which should work across your entire instance (plugins, data sources, and backend connections) is to add your self-signed CA certificate to your Kubernetes deployment.
+
+1. Create a ConfigMap containing the certificate, and deploy it to your Kubernetes cluster
+
+ ```yaml
+ # grafana-ca-configmap.yaml
+ ---
+ apiVersion: v1
+ kind: ConfigMap
+ metadata:
+ name: grafana-ca-cert
+ data:
+ ca.pem: |
+ -----BEGIN CERTIFICATE-----
+ (rest of the CA cert)
+ -----END CERTIFICATE-----
+ ```
+
+ ```bash
+ kubectl apply --filename grafana-ca-configmap.yaml --namespace monitoring
+ ```
+
+1. Open the Helm `values.yaml` file in your favorite editor.
+
+1. Find the line that says `extraConfigmapMounts:` and under that section, specify the additional ConfigMap that you want to mount.
+
+ ```yaml
+ .......
+ ............
+ ......
+ extraConfigmapMounts:
+ - name: ca-certs-configmap
+ mountPath: /etc/ssl/certs/ca.pem
+ subPath: ca.pem
+ configMap: grafana-ca-cert
+ readOnly: true
+ .......
+ ............
+ ......
+ ```
+
+1. Save the changes and use the `helm upgrade` command to update your Grafana deployment and mount the new ConfigMap:
+
+ ```bash
+ helm upgrade my-grafana grafana/grafana --values values.yaml --namespace monitoring
+ ```
+
## Troubleshooting
This section includes troubleshooting tips you might find helpful when deploying Grafana on Kubernetes via Helm.
diff --git a/docs/sources/shared/alerts/alerting_provisioning.md b/docs/sources/shared/alerts/alerting_provisioning.md
index 6146a1cf36961..3e78039d0e882 100644
--- a/docs/sources/shared/alerts/alerting_provisioning.md
+++ b/docs/sources/shared/alerts/alerting_provisioning.md
@@ -1621,9 +1621,9 @@ Status: Accepted
### Duration
-| Name | Type | Go type | Default | Description | Example |
-| -------- | ------------------------- | ------- | ------- | ----------- | ------- |
-| Duration | int64 (formatted integer) | int64 | | | |
+| Name | Type | Go type | Default | Description | Example |
+| -------- | ------ | ------- | ------- | ----------- | ------- |
+| Duration | string | int64 | | | |
### EmbeddedContactPoint
diff --git a/docs/sources/shared/visualizations/thresholds-options-2.md b/docs/sources/shared/visualizations/thresholds-options-2.md
index d2ea9c2a44a2c..f6defc3928ec8 100644
--- a/docs/sources/shared/visualizations/thresholds-options-2.md
+++ b/docs/sources/shared/visualizations/thresholds-options-2.md
@@ -8,11 +8,11 @@ comments: |
A threshold is a value or limit you set for a metric that’s reflected visually when it’s met or exceeded. Thresholds are one way you can conditionally style and color your visualizations based on query results.
-Set the following options:
+For each threshold, set the following options:
-- **Value** - Set the value for each threshold.
-- **Thresholds mode** - Choose from:
- - **Absolute**
- - **Percentage**
+| Option | Description |
+| --------------- | -------------------------------------------- |
+| Value | Set the value for each threshold. |
+| Thresholds mode | Choose from **Absolute** and **Percentage**. |
To learn more, refer to [Configure thresholds](../../configure-thresholds/).
diff --git a/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md b/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md
index 5e03387a8dda4..0dfc09eadb6c1 100644
--- a/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md
+++ b/docs/sources/tutorials/provision-dashboards-and-data-sources/index.md
@@ -232,10 +232,7 @@ For more information on how to configure dashboard providers, refer to [Dashboar
"from": "now-6h",
"to": "now"
},
- "timepicker": {
- "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"],
- "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"]
- },
+ "timepicker": {},
"timezone": "browser",
"title": "Cluster",
"version": 0
diff --git a/docs/sources/upgrade-guide/when-to-upgrade/index.md b/docs/sources/upgrade-guide/when-to-upgrade/index.md
new file mode 100644
index 0000000000000..33fe3211ed605
--- /dev/null
+++ b/docs/sources/upgrade-guide/when-to-upgrade/index.md
@@ -0,0 +1,115 @@
+---
+description: Strategies for upgrading your self-managed Grafana instance
+keywords:
+ - grafana
+ - configuration
+ - documentation
+ - upgrade
+title: Strategies for upgrading your self-managed Grafana instance
+menuTitle: Upgrade strategies
+weight: 1000
+---
+
+# Strategies for upgrading your self-managed Grafana instance
+
+At Grafana Labs, we believe in shipping features early and often, and in recent years we’ve increased our commitment to that philosophy.
+
+We no longer wait for the yearly major release to give you access to the next big improvement. Instead, we regularly make new features, bug fixes, and security patches available to our self-managing users ([Grafana OSS](https://grafana.com/oss/grafana/) and [Grafana Enterprise](https://grafana.com/products/enterprise/)) throughout the year.
+
+Having a dependable release process provides users like you with the best Grafana experience possible, and it provides the flexibility to upgrade in a manner that works best for you and your organization.
+
+## What to expect from each release type
+
+We split Grafana OSS and Grafana Enterprise releases into three main categories:
+
+- **Minor release (every other month)**: These releases can include new features, deprecation notices, notices about upcoming breaking changes, previously announced breaking changes, bug fixes, and security vulnerability patches.
+- **Major release (once a year, in April/May)**: These are like a minor release, but accompanied by [GrafanaCON](https://grafana.com/events/grafanacon/) and a comprehensive upgrade guide for users who like to upgrade only once a year.
+- **Patching release (every month)**: These include bug fixes for currently supported versions, as well as any security vulnerability patches.
+
+You can choose your cadence: For frequent self-managed updates, you should follow the minor release (for example, upgrade 10.1 to 10.2), which also gives you access to the latest features. If you need a longer period to review our new releases, you should follow the major releases. Both strategies get patching releases with security fixes (high severity security fixes also result in ad-hoc patch releases). We’ll get into additional guidance on upgrade cadences later in this guide.
+
+## How to find the specifics for a release
+
+We love sharing all our great features with you so you can leverage Grafana to its fullest. We also understand that great release documentation allows you to upgrade with confidence.
+Whether it’s knowing that a bug has been fixed, seeing that a security vulnerability is patched, or understanding how to mitigate the impact of breaking changes, proper documentation allows you to make informed decisions about when to upgrade your local Grafana instances.
+
+We provide release documentation in multiple places to address different needs:
+
+- [**What’s new**](https://grafana.com/docs/grafana/latest/whatsnew/?pg=blog&plcmt=body-txt) outlines new features debuting in each major and minor release.
+- [**Breaking changes**](https://grafana.com/docs/grafana/latest/breaking-changes/?pg=blog&plcmt=body-txt) notify you of updates included in major releases that could impact you and provide mitigation recommendations when needed.
+- [**Upgrade guides**](https://grafana.com/docs/grafana/latest/upgrade-guide/?pg=blog&plcmt=body-txt) instruct you on how to upgrade to a newer minor or major version.
+- And finally, a [**changelog**](https://github.com/grafana/grafana/blob/main/CHANGELOG.md) is generated for every release (major, minor, patching, security) and outlines all changes included in that release.
+
+## When to expect releases
+
+Currently, Grafana is on a monthly release cycle. Here’s a look at scheduled releases for 2024:
+
+| **Anticipated release date** | **Grafana versions** | **Release type** |
+| ---------------------------- | -------------------- | ------------------ |
+| May 14, 2024 | 11 | Major and patching |
+| June 25, 2024 | 11.1 | Minor and patching |
+| July 23, 2024 | 11.1.x | Patching |
+| Aug. 27, 2024 | 11.2 | Minor and patching |
+| Sept. 24, 2024 | 11.2.x | Patching |
+| Oct. 22, 2024 | 11.3 | Minor and patching |
+| November/December 2024 | To be determined | To be determined |
+
+### A few important notes
+
+- The schedule above outlines how we plan release dates. However, unforeseen events and circumstances may cause dates to change.
+- High severity security and feature degradation incidents will result in ad-hoc releases that are not scheduled ahead of time.
+- Patching releases are for the current (last released) minor version of Grafana. Additional older versions of Grafana may be included if there is a critical bug or security vulnerability that needs to be patched.
+- A Grafana release freeze occurs for a week in November and again during the end of December. This does not apply to changes that may be required during the course of an operational or security incident.
+
+## What to know about version support
+
+Self-managed Grafana users have control over when they upgrade to a new version of Grafana. To help you make an informed decision about whether it's time to upgrade, it’s important that you understand the level of support provided for your current version.
+
+For self-managed Grafana (both Enterprise and OSS), the support for versions is as follows:
+
+- Support for each minor release extends to nine months after the release date.
+- Support for the last minor release of a major version is extended an additional six months, for a total of 15 months of support after the release date.
+
+Here is an overview of projected version support through 2024:
+
+| **Version** | **Release date** | **Support end of life (EOL)** |
+| ------------------------- | ----------------------- | ----------------------------- |
+| 10.3 | January 2024 | October 2024 |
+| 10.4 (Last minor of 10.0) | March 2024 | June 2025 (extended support) |
+| 11.0 | May 2024 | February 2025 |
+| 11.1 | June 2024 | March 2025 |
+| 11.2 | August 2024 (tentative) | May 2025 (tentative) |
+
+{{< admonition type="note" >}}
+Grafana 9.5.x was the last supported minor for the 9.0 major release and is no longer supported as of July 2024.
+{{< /admonition >}}
+
+## How are these versions supported?
+
+The level of support changes as new versions of Grafana are released. Here are a few details to keep in mind:
+
+- The current (most recently released) version of Grafana gets the highest level of support. Releases for this version include all the new features along with all bug fixes.
+- All supported versions receive security patches for vulnerabilities impacting that version.
+- All supported versions receive patches for bugs that cause critical feature degradation incidents.
+
+Keeping all this in mind, users that want to receive the most recent features and all bug fixes should be on the current (most recently released) version of Grafana.
+
+### What is a critical feature degradation?
+
+A critical feature degradation usually meets one of the following criteria:
+
+- Major functionality is universally unavailable (for example, cannot create dashboards, unable to authenticate).
+- Major (critical) impact to a significant amount of customers.
+- Major escalated incident for one or many customers.
+
+## Self-managing upgrade strategies
+
+Based on your needs, you can choose your ideal upgrade strategy. Here’s what that might look like in practice:
+
+| **Strategy/cadence** | **Advantages/disadvantages** | **Example upgrade procedure** |
+| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Minor / bi-monthly (11.1 to 11.2)** | Our recommended strategy. It combines up-to-date, secure releases with access to latest features as soon as they're released.
Small changelog to review
Highest compatibility with actively maintained plugins
Easy migration to [Grafana Cloud](https://grafana.com/products/cloud)
|
**June 2024**: You review the 11.1 changelog and deploy the release to testing
**July 2024**: You deploy 11.1 to production
**August 2024**: 11.2 is released
|
+| **Major / yearly (10.0 to 11.0)** | Yearly upgrade path that still gives access to up-to-date features presented at GrafanaCON.
Big changelog to review
High compatibility with plugins
Relatively easy migration to [Grafana Cloud](https://grafana.com/products/cloud)
|
**April 2024**: 11.0 is released, you start a big changelog review
**May 2024**: You deploy 11.0 to testing
**June 2024**: You deploy 11.0 to production
**April 2025**: 12.0 is released
|
+| **Previous major / yearly (9.5 to 10.4)** | Release with extended support timeline
Limited compatibility with actively developed plugins
Big changelog to review
Migrations to Grafana Cloud might require professional support
|
**April 2024**: 11.0 is released, marking the previous minor (10.4.x) with extended support, you start a big changelog review (9.5.x to 10.4.x)