Compare commits
49 Commits
release-11
...
v11.1.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2355de00c6 | ||
|
|
87fcc7c9b6 | ||
|
|
51b5cc5cc0 | ||
|
|
498737b472 | ||
|
|
99b31dbe3f | ||
|
|
0b609bb15d | ||
|
|
f76df3b3ce | ||
|
|
ec70e471bd | ||
|
|
8fa0eaa2b5 | ||
|
|
6f8319b740 | ||
|
|
fcec78b8c4 | ||
|
|
36eca38bc0 | ||
|
|
9cdba084a9 | ||
|
|
beac3bdbcb | ||
|
|
00614f2813 | ||
|
|
16bca1736d | ||
|
|
907916dc39 | ||
|
|
417edf5c43 | ||
|
|
a034ed6f1b | ||
|
|
bf264b2df3 | ||
|
|
bd59be01e8 | ||
|
|
8ecf1dff7e | ||
|
|
12a3a261a2 | ||
|
|
b4f4b3e9b4 | ||
|
|
c2e78f5cd6 | ||
|
|
f5cebcca1b | ||
|
|
009a75f796 | ||
|
|
7e742cdaa2 | ||
|
|
17fce96f7f | ||
|
|
220f0a5b42 | ||
|
|
61662f3574 | ||
|
|
2c8c2199a1 | ||
|
|
6a9fc2ac93 | ||
|
|
af6b53420b | ||
|
|
ed0cd7ee06 | ||
|
|
104daa45db | ||
|
|
7e9f8a8779 | ||
|
|
1d30eb36d9 | ||
|
|
27cd35a97b | ||
|
|
41bd47700a | ||
|
|
6f27663318 | ||
|
|
be8ff40d58 | ||
|
|
e0dbd8f3f2 | ||
|
|
af1aaab3a6 | ||
|
|
b1a552bd07 | ||
|
|
26822fae62 | ||
|
|
abd9e86fe6 | ||
|
|
eab471a17c | ||
|
|
c5ea48aec9 |
@@ -6236,6 +6236,9 @@ exports[`better eslint`] = {
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"],
|
||||
[0, 0, 0, "Do not use any type assertions.", "1"]
|
||||
],
|
||||
"public/app/plugins/datasource/dashboard/datasource.ts:5381": [
|
||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
||||
],
|
||||
"public/app/plugins/datasource/dashboard/index.ts:5381": [
|
||||
[0, 0, 0, "Do not re-export imported variable (\`./runSharedRequest\`)", "0"],
|
||||
[0, 0, 0, "Do not re-export imported variable (\`./DashboardQueryEditor\`)", "1"],
|
||||
|
||||
399
.drone.yml
399
.drone.yml
@@ -2672,8 +2672,40 @@ steps:
|
||||
- name: docker
|
||||
path: /var/run/docker.sock
|
||||
- commands:
|
||||
- ./bin/grabpl artifacts docker publish --dockerhub-repo grafana/grafana --version-tag
|
||||
${DRONE_TAG}
|
||||
- apk add bash
|
||||
- |2-
|
||||
|
||||
bash -c '
|
||||
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
|
||||
|
||||
# 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:${TAG}-ubuntu grafana/grafana-image-tags:$${TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
|
||||
|
||||
# Push the grafana manifests
|
||||
$$debug docker manifest push grafana/grafana:$${TAG}
|
||||
$$debug docker manifest push grafana/grafana:$${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 push grafana/grafana:latest
|
||||
$$debug docker manifest push grafana/grafana:latest-ubuntu
|
||||
|
||||
fi'
|
||||
depends_on:
|
||||
- fetch-images
|
||||
environment:
|
||||
@@ -2681,15 +2713,7 @@ steps:
|
||||
from_secret: docker_password
|
||||
DOCKER_USER:
|
||||
from_secret: docker_username
|
||||
GCP_KEY:
|
||||
from_secret: gcp_grafanauploads
|
||||
GITHUB_APP_ID:
|
||||
from_secret: delivery-bot-app-id
|
||||
GITHUB_APP_INSTALLATION_ID:
|
||||
from_secret: delivery-bot-app-installation-id
|
||||
GITHUB_APP_PRIVATE_KEY:
|
||||
from_secret: delivery-bot-app-private-key
|
||||
image: google/cloud-sdk:431.0.0
|
||||
image: docker:27-cli
|
||||
name: publish-images-grafana
|
||||
volumes:
|
||||
- name: docker
|
||||
@@ -2731,6 +2755,114 @@ volumes:
|
||||
clone:
|
||||
retries: 3
|
||||
depends_on: []
|
||||
environment:
|
||||
EDITION: oss
|
||||
image_pull_secrets:
|
||||
- gcr
|
||||
- gar
|
||||
kind: pipeline
|
||||
name: manually-publish-docker-public
|
||||
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:
|
||||
- mkdir -p bin
|
||||
- curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v3.0.50/grabpl
|
||||
- chmod +x bin/grabpl
|
||||
image: byrnedo/alpine-curl:0.1.8
|
||||
name: grabpl
|
||||
- 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:
|
||||
- ./bin/build artifacts docker fetch --edition oss
|
||||
depends_on:
|
||||
- compile-build-cmd
|
||||
environment:
|
||||
DOCKER_PASSWORD:
|
||||
from_secret: docker_password
|
||||
DOCKER_USER:
|
||||
from_secret: docker_username
|
||||
GCP_KEY:
|
||||
from_secret: gcp_grafanauploads
|
||||
image: google/cloud-sdk:431.0.0
|
||||
name: fetch-images
|
||||
volumes:
|
||||
- name: docker
|
||||
path: /var/run/docker.sock
|
||||
- commands:
|
||||
- apk add bash
|
||||
- |2-
|
||||
|
||||
bash -c '
|
||||
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
|
||||
|
||||
# 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:${TAG}-ubuntu grafana/grafana-image-tags:$${TAG}-ubuntu-amd64 grafana/grafana-image-tags:$${TAG}-ubuntu-arm64 grafana/grafana-image-tags:$${TAG}-ubuntu-armv7
|
||||
|
||||
# Push the grafana manifests
|
||||
$$debug docker manifest push grafana/grafana:$${TAG}
|
||||
$$debug docker manifest push grafana/grafana:$${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 push grafana/grafana:latest
|
||||
$$debug docker manifest push grafana/grafana:latest-ubuntu
|
||||
|
||||
fi'
|
||||
depends_on:
|
||||
- fetch-images
|
||||
environment:
|
||||
DOCKER_PASSWORD:
|
||||
from_secret: docker_password
|
||||
DOCKER_USER:
|
||||
from_secret: docker_username
|
||||
image: docker:27-cli
|
||||
name: publish-images-grafana
|
||||
volumes:
|
||||
- name: docker
|
||||
path: /var/run/docker.sock
|
||||
trigger:
|
||||
event:
|
||||
- promote
|
||||
target:
|
||||
- publish-docker-public
|
||||
type: docker
|
||||
volumes:
|
||||
- host:
|
||||
path: /var/run/docker.sock
|
||||
name: docker
|
||||
---
|
||||
clone:
|
||||
retries: 3
|
||||
depends_on: []
|
||||
image_pull_secrets:
|
||||
- gcr
|
||||
- gar
|
||||
@@ -2746,12 +2878,9 @@ steps:
|
||||
- commands:
|
||||
- apk add perl
|
||||
- v_target=`echo $${TAG} | perl -pe 's/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/v\1.\2.x/'`
|
||||
- default_target=`if [[ -n $$LATEST ]]; then echo 'main'; else echo $$v_target;
|
||||
fi`
|
||||
- backport=`if [[ -n $$LATEST ]]; then echo $$v_target; fi`
|
||||
- curl -L $${GH_CLI_URL} | tar -xz --strip-components=1 -C /usr
|
||||
- gh workflow run -f dry_run=$${DRY_RUN} -f version=$${TAG} -f target=$${TARGET:-$default_target}
|
||||
-f backport=$${BACKPORT:-$default_backport} --repo=grafana/grafana release-pr.yml
|
||||
- gh workflow run -f dry_run=$${DRY_RUN} -f version=$${TAG} -f target=$${v_target}
|
||||
-f latest=$${LATEST} --repo=grafana/grafana release-pr.yml
|
||||
depends_on: []
|
||||
environment:
|
||||
GH_CLI_URL: https://github.com/cli/cli/releases/download/v2.50.0/gh_2.50.0_linux_amd64.tar.gz
|
||||
@@ -2831,12 +2960,9 @@ steps:
|
||||
- commands:
|
||||
- apk add perl
|
||||
- v_target=`echo $${TAG} | perl -pe 's/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/v\1.\2.x/'`
|
||||
- default_target=`if [[ -n $$LATEST ]]; then echo 'main'; else echo $$v_target;
|
||||
fi`
|
||||
- backport=`if [[ -n $$LATEST ]]; then echo $$v_target; fi`
|
||||
- curl -L $${GH_CLI_URL} | tar -xz --strip-components=1 -C /usr
|
||||
- gh workflow run -f dry_run=$${DRY_RUN} -f version=$${TAG} -f target=$${TARGET:-$default_target}
|
||||
-f backport=$${BACKPORT:-$default_backport} --repo=grafana/grafana release-pr.yml
|
||||
- gh workflow run -f dry_run=$${DRY_RUN} -f version=$${TAG} -f target=$${v_target}
|
||||
-f latest=$${LATEST} --repo=grafana/grafana release-pr.yml
|
||||
depends_on:
|
||||
- publish-artifacts
|
||||
- publish-static-assets
|
||||
@@ -2955,6 +3081,130 @@ volumes:
|
||||
path: /var/run/docker.sock
|
||||
name: docker
|
||||
---
|
||||
clone:
|
||||
retries: 3
|
||||
depends_on: []
|
||||
image_pull_secrets:
|
||||
- gcr
|
||||
- gar
|
||||
kind: pipeline
|
||||
name: verify-linux-packages
|
||||
node:
|
||||
type: no-parallel
|
||||
platform:
|
||||
arch: amd64
|
||||
os: linux
|
||||
services: []
|
||||
steps:
|
||||
- commands:
|
||||
- 'echo "Step 1: Updating package lists..."'
|
||||
- apt-get update >/dev/null 2>&1
|
||||
- 'echo "Step 2: Installing prerequisites..."'
|
||||
- DEBIAN_FRONTEND=noninteractive apt-get install -yq apt-transport-https software-properties-common
|
||||
wget >/dev/null 2>&1
|
||||
- 'echo "Step 3: Adding Grafana GPG key..."'
|
||||
- mkdir -p /etc/apt/keyrings/
|
||||
- wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | tee /etc/apt/keyrings/grafana.gpg
|
||||
> /dev/null
|
||||
- 'echo "Step 4: Adding Grafana repository..."'
|
||||
- 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
|
||||
- ' if apt-get update >/dev/null 2>&1 && DEBIAN_FRONTEND=noninteractive apt-get
|
||||
install -yq grafana=${TAG} >/dev/null 2>&1; then'
|
||||
- ' echo "Command succeeded on attempt $i"'
|
||||
- ' break'
|
||||
- ' else'
|
||||
- ' echo "Attempt $i failed"'
|
||||
- ' if [ $i -eq 10 ]; then'
|
||||
- ' echo ''All attempts failed'''
|
||||
- ' exit 1'
|
||||
- ' fi'
|
||||
- ' echo "Waiting 60 seconds before next attempt..."'
|
||||
- ' sleep 60'
|
||||
- ' fi'
|
||||
- done
|
||||
- 'echo "Step 6: Verifying Grafana installation..."'
|
||||
- 'if dpkg -s grafana | grep -q "Version: ${TAG}"; then'
|
||||
- ' echo "Successfully verified Grafana version ${TAG}"'
|
||||
- else
|
||||
- ' echo "Failed to verify Grafana version ${TAG}"'
|
||||
- ' exit 1'
|
||||
- fi
|
||||
- echo "Verification complete."
|
||||
depends_on: []
|
||||
environment: {}
|
||||
image: ubuntu:22.04
|
||||
name: verify-linux-DEB-packages
|
||||
- commands:
|
||||
- 'echo "Step 1: Updating package lists..."'
|
||||
- dnf check-update -y >/dev/null 2>&1 || true
|
||||
- 'echo "Step 2: Installing prerequisites..."'
|
||||
- dnf install -y dnf-utils >/dev/null 2>&1
|
||||
- 'echo "Step 3: Adding Grafana GPG key..."'
|
||||
- rpm --import https://rpm.grafana.com/gpg.key
|
||||
- 'echo "Step 4: Configuring Grafana repository..."'
|
||||
- |-
|
||||
echo -e '[grafana]
|
||||
name=grafana
|
||||
baseurl=https://rpm.grafana.com
|
||||
repo_gpgcheck=0
|
||||
enabled=1
|
||||
gpgcheck=0
|
||||
gpgkey=https://rpm.grafana.com/gpg.key
|
||||
sslverify=1
|
||||
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}
|
||||
- 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'
|
||||
- ' echo "Command succeeded on attempt $i"'
|
||||
- ' break'
|
||||
- ' else'
|
||||
- ' echo "Attempt $i failed"'
|
||||
- ' if [ $i -eq 5 ]; then'
|
||||
- ' echo ''All attempts failed'''
|
||||
- ' exit 1'
|
||||
- ' fi'
|
||||
- ' echo "Waiting 60 seconds before next attempt..."'
|
||||
- ' sleep 60'
|
||||
- ' 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."'
|
||||
- ' 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}"'
|
||||
- else
|
||||
- ' echo "Failed to verify Grafana version ${TAG}"'
|
||||
- ' exit 1'
|
||||
- fi
|
||||
- echo "Verification complete."
|
||||
depends_on: []
|
||||
environment: {}
|
||||
image: rockylinux:9
|
||||
name: verify-linux-RPM-packages
|
||||
trigger:
|
||||
event:
|
||||
- promote
|
||||
target: verify-linux-packages
|
||||
type: docker
|
||||
volumes:
|
||||
- host:
|
||||
path: /var/run/docker.sock
|
||||
name: docker
|
||||
---
|
||||
clone:
|
||||
retries: 3
|
||||
depends_on:
|
||||
@@ -3023,6 +3273,107 @@ steps:
|
||||
service_account_json:
|
||||
from_secret: packages_service_account
|
||||
target_bucket: grafana-packages
|
||||
- commands:
|
||||
- 'echo "Step 1: Updating package lists..."'
|
||||
- apt-get update >/dev/null 2>&1
|
||||
- 'echo "Step 2: Installing prerequisites..."'
|
||||
- DEBIAN_FRONTEND=noninteractive apt-get install -yq apt-transport-https software-properties-common
|
||||
wget >/dev/null 2>&1
|
||||
- 'echo "Step 3: Adding Grafana GPG key..."'
|
||||
- mkdir -p /etc/apt/keyrings/
|
||||
- wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | tee /etc/apt/keyrings/grafana.gpg
|
||||
> /dev/null
|
||||
- 'echo "Step 4: Adding Grafana repository..."'
|
||||
- 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
|
||||
- ' if apt-get update >/dev/null 2>&1 && DEBIAN_FRONTEND=noninteractive apt-get
|
||||
install -yq grafana=${TAG} >/dev/null 2>&1; then'
|
||||
- ' echo "Command succeeded on attempt $i"'
|
||||
- ' break'
|
||||
- ' else'
|
||||
- ' echo "Attempt $i failed"'
|
||||
- ' if [ $i -eq 10 ]; then'
|
||||
- ' echo ''All attempts failed'''
|
||||
- ' exit 1'
|
||||
- ' fi'
|
||||
- ' echo "Waiting 60 seconds before next attempt..."'
|
||||
- ' sleep 60'
|
||||
- ' fi'
|
||||
- done
|
||||
- 'echo "Step 6: Verifying Grafana installation..."'
|
||||
- 'if dpkg -s grafana | grep -q "Version: ${TAG}"; then'
|
||||
- ' echo "Successfully verified Grafana version ${TAG}"'
|
||||
- else
|
||||
- ' echo "Failed to verify Grafana version ${TAG}"'
|
||||
- ' exit 1'
|
||||
- fi
|
||||
- echo "Verification complete."
|
||||
depends_on:
|
||||
- publish-linux-packages-deb
|
||||
environment: {}
|
||||
image: ubuntu:22.04
|
||||
name: verify-linux-DEB-packages
|
||||
- commands:
|
||||
- 'echo "Step 1: Updating package lists..."'
|
||||
- dnf check-update -y >/dev/null 2>&1 || true
|
||||
- 'echo "Step 2: Installing prerequisites..."'
|
||||
- dnf install -y dnf-utils >/dev/null 2>&1
|
||||
- 'echo "Step 3: Adding Grafana GPG key..."'
|
||||
- rpm --import https://rpm.grafana.com/gpg.key
|
||||
- 'echo "Step 4: Configuring Grafana repository..."'
|
||||
- |-
|
||||
echo -e '[grafana]
|
||||
name=grafana
|
||||
baseurl=https://rpm.grafana.com
|
||||
repo_gpgcheck=0
|
||||
enabled=1
|
||||
gpgcheck=0
|
||||
gpgkey=https://rpm.grafana.com/gpg.key
|
||||
sslverify=1
|
||||
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}
|
||||
- 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'
|
||||
- ' echo "Command succeeded on attempt $i"'
|
||||
- ' break'
|
||||
- ' else'
|
||||
- ' echo "Attempt $i failed"'
|
||||
- ' if [ $i -eq 5 ]; then'
|
||||
- ' echo ''All attempts failed'''
|
||||
- ' exit 1'
|
||||
- ' fi'
|
||||
- ' echo "Waiting 60 seconds before next attempt..."'
|
||||
- ' sleep 60'
|
||||
- ' 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."'
|
||||
- ' 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}"'
|
||||
- else
|
||||
- ' echo "Failed to verify Grafana version ${TAG}"'
|
||||
- ' exit 1'
|
||||
- fi
|
||||
- echo "Verification complete."
|
||||
depends_on:
|
||||
- publish-linux-packages-rpm
|
||||
environment: {}
|
||||
image: rockylinux:9
|
||||
name: verify-linux-RPM-packages
|
||||
- commands:
|
||||
- ./bin/build publish grafana-com --edition oss ${DRONE_TAG}
|
||||
depends_on:
|
||||
@@ -4705,6 +5056,7 @@ steps:
|
||||
- name: config
|
||||
path: /root/.docker/
|
||||
- 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 node:20.9.0-alpine
|
||||
@@ -4730,6 +5082,7 @@ steps:
|
||||
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM cypress/included:13.10.0
|
||||
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM jwilder/dockerize:0.6.1
|
||||
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM koalaman/shellcheck:stable
|
||||
- trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM rockylinux:9
|
||||
depends_on:
|
||||
- authenticate-gcr
|
||||
image: aquasec/trivy:0.21.0
|
||||
@@ -4740,6 +5093,7 @@ steps:
|
||||
- name: config
|
||||
path: /root/.docker/
|
||||
- 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 node:20.9.0-alpine
|
||||
@@ -4765,6 +5119,7 @@ steps:
|
||||
- trivy --exit-code 1 --severity HIGH,CRITICAL cypress/included:13.10.0
|
||||
- trivy --exit-code 1 --severity HIGH,CRITICAL jwilder/dockerize:0.6.1
|
||||
- trivy --exit-code 1 --severity HIGH,CRITICAL koalaman/shellcheck:stable
|
||||
- trivy --exit-code 1 --severity HIGH,CRITICAL rockylinux:9
|
||||
depends_on:
|
||||
- authenticate-gcr
|
||||
environment:
|
||||
@@ -4996,6 +5351,6 @@ kind: secret
|
||||
name: gcr_credentials
|
||||
---
|
||||
kind: signature
|
||||
hmac: db626ee0a4585a9279be18e92a85af639385bc723af50c154d5341ff66479f54
|
||||
hmac: faa6a717a8a8140633e39cefbd43432d1121392ac118cefb3985395857868889
|
||||
|
||||
...
|
||||
|
||||
22
.github/workflows/actions/changelog/action.yml
vendored
Normal file
22
.github/workflows/actions/changelog/action.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: Changelog generator
|
||||
description: Generates and publishes a changelog for the given release version
|
||||
inputs:
|
||||
target:
|
||||
description: Target tag, branch or commit hash for the changelog
|
||||
required: true
|
||||
previous:
|
||||
description: Previous tag, branch or commit hash to start changelog from
|
||||
required: false
|
||||
github_token:
|
||||
description: GitHub token with read/write access to all necessary repositories
|
||||
required: true
|
||||
output_file:
|
||||
description: A file to store resulting changelog markdown
|
||||
required: false
|
||||
outputs:
|
||||
changelog:
|
||||
description: Changelog contents between the two given versions in Markdown format
|
||||
runs:
|
||||
using: 'node20'
|
||||
main: 'index.js'
|
||||
|
||||
319
.github/workflows/actions/changelog/index.js
vendored
Normal file
319
.github/workflows/actions/changelog/index.js
vendored
Normal file
@@ -0,0 +1,319 @@
|
||||
import { appendFileSync, writeFileSync } from 'fs';
|
||||
import { exec as execCallback } from 'node:child_process';
|
||||
import { promisify } from 'node:util';
|
||||
|
||||
//
|
||||
// Github Action core utils: logging (notice + debug log levels), must escape
|
||||
// newlines and percent signs
|
||||
//
|
||||
const escapeData = (s) => s.replace(/%/g, '%25').replace(/\r/g, '%0D').replace(/\n/g, '%0A');
|
||||
const LOG = (msg) => console.log(`::notice::${escapeData(msg)}`);
|
||||
|
||||
//
|
||||
// Semver utils: parse, compare, sort etc (using official regexp)
|
||||
// https://regex101.com/r/Ly7O1x/3/
|
||||
//
|
||||
const semverRegExp =
|
||||
/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
||||
|
||||
const semverParse = (tag) => {
|
||||
const m = tag.match(semverRegExp);
|
||||
if (!m) {
|
||||
return;
|
||||
}
|
||||
const [_, major, minor, patch, prerelease] = m;
|
||||
return [+major, +minor, +patch, prerelease, tag];
|
||||
};
|
||||
|
||||
// semverCompare takes two parsed semver tags and comparest them more or less
|
||||
// according to the semver specs
|
||||
const semverCompare = (a, b) => {
|
||||
for (let i = 0; i < 3; i++) {
|
||||
if (a[i] !== b[i]) {
|
||||
return a[i] < b[i] ? 1 : -1;
|
||||
}
|
||||
}
|
||||
if (a[3] !== b[3]) {
|
||||
return a[3] < b[3] ? 1 : -1;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
// Using `git tag -l` output find the tag (version) that goes semantically
|
||||
// right before the given version. This might not work correctly with some
|
||||
// pre-release versions, which is why it's possible to pass previous version
|
||||
// into this action explicitly to avoid this step.
|
||||
const getPreviousVersion = async (version) => {
|
||||
const exec = promisify(execCallback);
|
||||
const { stdout } = await exec('git tag -l');
|
||||
const prev = stdout
|
||||
.split('\n')
|
||||
.map(semverParse)
|
||||
.filter((tag) => tag)
|
||||
.sort(semverCompare)
|
||||
.find((tag) => semverCompare(tag, semverParse(version)) > 0);
|
||||
if (!prev) {
|
||||
throw `Could not find previous git tag for ${version}`;
|
||||
}
|
||||
return prev[4];
|
||||
};
|
||||
|
||||
// A helper for Github GraphQL API endpoint
|
||||
const graphql = async (ghtoken, query, variables) => {
|
||||
const { env } = process;
|
||||
const results = await fetch('https://api.github.com/graphql', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${ghtoken}`,
|
||||
},
|
||||
body: JSON.stringify({ query, variables }),
|
||||
});
|
||||
const { data } = await results.json();
|
||||
return data;
|
||||
};
|
||||
|
||||
// Using Github GraphQL API find the timestamp for the given tag/commit hash.
|
||||
// This is required for PR listing, because Github API only takes date/time as
|
||||
// a "since" parameter while listing. Currently there is no way to provide two
|
||||
// "commitish" items and get a list of PRs in between them.
|
||||
const getCommitishDate = async (name, owner, target) => {
|
||||
const result = await graphql(
|
||||
ghtoken,
|
||||
`
|
||||
query getCommitDate($owner: String!, $name: String!, $target: String!) {
|
||||
repository(owner: $owner, name: $name) {
|
||||
object(expression: $target) {
|
||||
... on Commit {
|
||||
committedDate
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
{ name, owner, target }
|
||||
);
|
||||
return result.repository.object.committedDate;
|
||||
};
|
||||
|
||||
// Using Github GraphQL API get a list of PRs between the two "commitish" items.
|
||||
// This resoves the "since" item's timestamp first and iterates over all PRs
|
||||
// till "target" using naïve pagination.
|
||||
const getHistory = async (name, owner, target, sinceDate) => {
|
||||
LOG(`Fetching ${owner}/${name} PRs since ${sinceDate} till ${target}`);
|
||||
const query = `
|
||||
query findCommitsWithAssociatedPullRequests(
|
||||
$name: String!
|
||||
$owner: String!
|
||||
$target: String!
|
||||
$sinceDate: GitTimestamp
|
||||
$cursor: String
|
||||
) {
|
||||
repository(name: $name, owner: $owner) {
|
||||
object(expression: $target) {
|
||||
... on Commit {
|
||||
history(first: 50, since: $sinceDate, after: $cursor) {
|
||||
totalCount
|
||||
pageInfo {
|
||||
hasNextPage
|
||||
endCursor
|
||||
}
|
||||
nodes {
|
||||
id
|
||||
associatedPullRequests(first: 1) {
|
||||
nodes {
|
||||
title
|
||||
number
|
||||
labels(first: 10) {
|
||||
nodes {
|
||||
name
|
||||
}
|
||||
}
|
||||
commits(first: 1) {
|
||||
nodes {
|
||||
commit {
|
||||
author {
|
||||
user {
|
||||
login
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
let cursor;
|
||||
let nodes = [];
|
||||
for (;;) {
|
||||
const result = await graphql(ghtoken, query, {
|
||||
name,
|
||||
owner,
|
||||
target,
|
||||
sinceDate,
|
||||
cursor,
|
||||
});
|
||||
LOG(`GraphQL: ${JSON.stringify(result)}`);
|
||||
nodes = [...nodes, ...result.repository.object.history.nodes];
|
||||
const { hasNextPage, endCursor } = result.repository.object.history.pageInfo;
|
||||
if (!hasNextPage) {
|
||||
break;
|
||||
}
|
||||
cursor = endCursor;
|
||||
}
|
||||
return nodes;
|
||||
};
|
||||
|
||||
// The main function for this action: given two "commitish" items it gets a
|
||||
// list of PRs between them and filters/groups the PRs by category (bugfix,
|
||||
// feature, deprecation, breaking change and plugin fixes/enhancements).
|
||||
//
|
||||
// PR grouping relies on Github labels only, not on the PR contents.
|
||||
const getChangeLogItems = async (name, owner, sinceDate, to) => {
|
||||
// check if a node contains a certain label
|
||||
const hasLabel = ({ labels }, label) => labels.nodes.some(({ name }) => name === label);
|
||||
// get all the PRs between the two "commitish" items
|
||||
const history = await getHistory(name, owner, to, sinceDate);
|
||||
|
||||
const items = history.flatMap((node) => {
|
||||
// discard PRs without a "changelog" label
|
||||
const changes = node.associatedPullRequests.nodes.filter((PR) => hasLabel(PR, 'add to changelog'));
|
||||
if (changes.length === 0) {
|
||||
return [];
|
||||
}
|
||||
const item = changes[0];
|
||||
const { number, url, labels } = item;
|
||||
const title = item.title.replace(/^\[[^\]]+\]:?\s*/, '');
|
||||
// for changelog PRs try to find a suitable category.
|
||||
// Note that we can not detect "deprecation notices" like that
|
||||
// as there is no suitable label yet.
|
||||
const isBug = /fix/i.test(title) || hasLabel({ labels }, 'type/bug');
|
||||
const isBreaking = hasLabel({ labels }, 'breaking change');
|
||||
const isPlugin =
|
||||
hasLabel({ labels }, 'area/grafana/ui') ||
|
||||
hasLabel({ labels }, 'area/grafana/toolkit') ||
|
||||
hasLabel({ labels }, 'area/grafana/runtime');
|
||||
const author = item.commits.nodes[0].commit.author.user.login;
|
||||
return {
|
||||
repo: name,
|
||||
number,
|
||||
title,
|
||||
author,
|
||||
isBug,
|
||||
isPlugin,
|
||||
isBreaking,
|
||||
};
|
||||
});
|
||||
return items;
|
||||
};
|
||||
|
||||
// ======================================================
|
||||
// GENERATE CHANGELOG
|
||||
// ======================================================
|
||||
|
||||
LOG(`Changelog action started`);
|
||||
|
||||
const ghtoken = process.env.GITHUB_TOKEN || process.env.INPUT_GITHUB_TOKEN;
|
||||
if (!ghtoken) {
|
||||
throw 'GITHUB_TOKEN is not set and "github_token" input is empty';
|
||||
}
|
||||
|
||||
const target = process.argv[2] || process.env.INPUT_TARGET;
|
||||
LOG(`Target tag/branch/commit: ${target}`);
|
||||
|
||||
const previous = process.argv[3] || process.env.INPUT_PREVIOUS || (await getPreviousVersion(target));
|
||||
|
||||
LOG(`Previous tag/commit: ${previous}`);
|
||||
|
||||
const sinceDate = await getCommitishDate('grafana', 'grafana', previous);
|
||||
LOG(`Previous tag/commit timestamp: ${sinceDate}`);
|
||||
|
||||
// Get all changelog items from Grafana OSS
|
||||
const oss = await getChangeLogItems('grafana', 'grafana', sinceDate, target);
|
||||
// Get all changelog items from Grafana Enterprise
|
||||
const entr = await getChangeLogItems('grafana-enterprise', 'grafana', sinceDate, target);
|
||||
|
||||
LOG(`Found OSS PRs: ${oss.length}`);
|
||||
LOG(`Found Enterprise PRs: ${entr.length}`);
|
||||
|
||||
// Sort PRs and categorise them into sections
|
||||
const changelog = [...oss, ...entr]
|
||||
.sort((a, b) => (a.title < b.title ? -1 : 1))
|
||||
.reduce(
|
||||
(changelog, item) => {
|
||||
if (item.isPlugin) {
|
||||
changelog.plugins.push(item);
|
||||
} else if (item.isBug) {
|
||||
changelog.bugfixes.push(item);
|
||||
} else if (item.isBreaking) {
|
||||
changelog.breaking.push(item);
|
||||
} else {
|
||||
changelog.features.push(item);
|
||||
}
|
||||
return changelog;
|
||||
},
|
||||
{
|
||||
breaking: [],
|
||||
plugins: [],
|
||||
bugfixes: [],
|
||||
features: [],
|
||||
}
|
||||
);
|
||||
|
||||
// Convert PR numbers to Github links
|
||||
const pullRequestLink = (n) => `[#${n}](https://github.com/grafana/grafana/pull/${n})`;
|
||||
// Convert Github user IDs to Github links
|
||||
const userLink = (u) => `[@${u}](https://github.com/${u})`;
|
||||
|
||||
// Now that we have a changelog - we can render some markdown as an output
|
||||
const markdown = (changelog) => {
|
||||
// This convers a list of changelog items into a markdown section with a list of titles/links
|
||||
const section = (title, items) =>
|
||||
items.length === 0
|
||||
? ''
|
||||
: `### ${title}
|
||||
|
||||
${items
|
||||
.map(
|
||||
(item) =>
|
||||
`- ${item.title.replace(/^([^:]*:)/gm, '**$1**')} ${
|
||||
item.repo === 'grafana-enterprise'
|
||||
? '(Enterprise)'
|
||||
: `${pullRequestLink(item.number)}, ${userLink(item.author)}`
|
||||
}`
|
||||
)
|
||||
.join('\n')}
|
||||
`;
|
||||
|
||||
// Render all present sections for the given changelog
|
||||
return `${section('Features and enhancements', changelog.features)}
|
||||
${section('Bug fixes', changelog.bugfixes)}
|
||||
${section('Breaking changes', changelog.breaking)}
|
||||
${section('Plugin development fixes & changes', changelog.plugins)}
|
||||
`;
|
||||
};
|
||||
|
||||
const md = markdown(changelog);
|
||||
|
||||
// Print changelog, mostly for debugging
|
||||
LOG(`Resulting markdown: ${md}`);
|
||||
|
||||
// Save changelog as an output for this action
|
||||
if (process.env.GITHUB_OUTPUT) {
|
||||
LOG(`Output to ${process.env.GITHUB_OUTPUT}`);
|
||||
appendFileSync(process.env.GITHUB_OUTPUT, `changelog<<EOF\n${escapeData(md)}\nEOF`);
|
||||
} else {
|
||||
LOG('GITHUB_OUTPUT is not set');
|
||||
}
|
||||
|
||||
// Save changelog as an output file (if requested)
|
||||
if (process.env.INPUT_OUTPUT_FILE) {
|
||||
LOG(`Output to ${process.env.INPUT_OUTPUT_FILE}`);
|
||||
writeFileSync(process.env.INPUT_OUTPUT_FILE, md);
|
||||
}
|
||||
130
.github/workflows/changelog.yml
vendored
Normal file
130
.github/workflows/changelog.yml
vendored
Normal file
@@ -0,0 +1,130 @@
|
||||
name: Generate changelog
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
version:
|
||||
type: string
|
||||
required: true
|
||||
description: 'Target release version (semver, git tag, branch or commit)'
|
||||
target:
|
||||
required: true
|
||||
type: string
|
||||
description: 'The base branch that these changes are being merged into'
|
||||
dry_run:
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
latest:
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
secrets:
|
||||
GRAFANA_DELIVERY_BOT_APP_ID:
|
||||
required: true
|
||||
GRAFANA_DELIVERY_BOT_APP_PEM:
|
||||
required: true
|
||||
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
type: string
|
||||
required: true
|
||||
description: 'Target release version (semver, git tag, branch or commit)'
|
||||
target:
|
||||
required: true
|
||||
type: string
|
||||
description: 'The base branch that these changes are being merged into'
|
||||
dry_run:
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
latest:
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: "Generate token"
|
||||
id: generate_token
|
||||
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||
with:
|
||||
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||
- name: "Checkout Grafana repo"
|
||||
uses: "actions/checkout@v4"
|
||||
with:
|
||||
ref: main
|
||||
sparse-checkout: |
|
||||
.github/workflows
|
||||
CHANGELOG.md
|
||||
fetch-depth: 0
|
||||
fetch-tags: true
|
||||
- name: "Configure git user"
|
||||
run: |
|
||||
git config --local user.name "github-actions[bot]"
|
||||
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --local --add --bool push.autoSetupRemote true
|
||||
- name: "Create branch"
|
||||
run: git checkout -b "changelog/${{ github.run_id }}/${{ inputs.version }}"
|
||||
- name: "Generate changelog"
|
||||
id: changelog
|
||||
uses: ./.github/workflows/actions/changelog
|
||||
with:
|
||||
github_token: ${{ steps.generate_token.outputs.token }}
|
||||
target: v${{ inputs.version }}
|
||||
output_file: changelog_items.md
|
||||
- name: "Patch CHANGELOG.md"
|
||||
run: |
|
||||
# Prepare CHANGELOG.md content with version delimiters
|
||||
(
|
||||
echo
|
||||
echo "# ${{ inputs.version}} ($(date '+%F'))"
|
||||
echo
|
||||
cat changelog_items.md
|
||||
) > CHANGELOG.part
|
||||
|
||||
# Check if a version exists in the changelog
|
||||
if grep -q "<!-- ${{ inputs.version}} START" CHANGELOG.md ; then
|
||||
# Replace the content between START and END delimiters
|
||||
echo "Version ${{ inputs.version }} is found in the CHANGELOG.md, patching contents..."
|
||||
sed -i -e '/${{ inputs.version }} START/,/${{ inputs.version }} END/{//!d;}' \
|
||||
-e '/${{ inputs.version }} START/r CHANGELOG.part' CHANGELOG.md
|
||||
else
|
||||
# Prepend changelog part to the main changelog file
|
||||
echo "Version ${{ inputs.version }} not found in the CHANGELOG.md"
|
||||
(
|
||||
echo "<!-- ${{ inputs.version }} START -->"
|
||||
cat CHANGELOG.part
|
||||
echo "<!-- ${{ inputs.version }} END -->"
|
||||
cat CHANGELOG.md
|
||||
) > CHANGELOG.tmp
|
||||
mv CHANGELOG.tmp CHANGELOG.md
|
||||
fi
|
||||
|
||||
git diff CHANGELOG.md
|
||||
git add CHANGELOG.md
|
||||
- name: "Commit changelog changes"
|
||||
run: git commit --allow-empty -m "Update changelog" CHANGELOG.md
|
||||
- name: "git push"
|
||||
if: ${{ inputs.dry_run }} != true
|
||||
run: git push
|
||||
- name: "Create changelog PR"
|
||||
run: >
|
||||
gh pr create \
|
||||
--dry-run=${{ inputs.dry_run }} \
|
||||
--label "no-backport" \
|
||||
--label "no-changelog" \
|
||||
-B "${{ inputs.target }}" \
|
||||
--title "Release: update changelog for ${{ inputs.version }}" \
|
||||
--body "Changelog changes for release ${{ inputs.version }}"
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||
35
.github/workflows/community-release.yml
vendored
35
.github/workflows/community-release.yml
vendored
@@ -1,25 +1,46 @@
|
||||
name: Create community release post
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
version:
|
||||
type: string
|
||||
required: true
|
||||
description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview<number> format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1'
|
||||
dry_run:
|
||||
type: boolean
|
||||
required: false
|
||||
default: false
|
||||
description: When enabled, this workflow will print a preview instead of creating an actual post.
|
||||
secrets:
|
||||
GRAFANA_MISC_STATS_API_KEY:
|
||||
required: true
|
||||
GRAFANABOT_FORUM_KEY:
|
||||
required: true
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
type: string
|
||||
required: true
|
||||
description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview<number> format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1'
|
||||
dry_run:
|
||||
type: boolean
|
||||
required: false
|
||||
default: false
|
||||
description: When enabled, this workflow will print a preview instead of creating an actual post.
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "Generate token"
|
||||
id: generate_token
|
||||
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||
with:
|
||||
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||
- name: Run community-release (manually invoked)
|
||||
uses: grafana/grafana-github-actions-go/community-release@main
|
||||
with:
|
||||
token: ${{ steps.generate_token.outputs.token }}
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version: ${{ inputs.version }}
|
||||
metrics_api_key: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||
community_api_key: ${{ secrets.GRAFANABOT_FORUM_KEY }}
|
||||
community_api_username: grafanabot
|
||||
dry_run: ${{ inputs.dry_run }}
|
||||
|
||||
27
.github/workflows/release-comms.yml
vendored
27
.github/workflows/release-comms.yml
vendored
@@ -19,6 +19,7 @@ on:
|
||||
branches:
|
||||
- 'main'
|
||||
- 'v*.*.*'
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
if: ${{ github.event_name == 'workflow_dispatch' || (github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/')) }}
|
||||
@@ -37,8 +38,8 @@ jobs:
|
||||
echo "LATEST=${{ inputs.latest }}" >> $GITHUB_ENV
|
||||
- if: ${{ github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/') }}
|
||||
run: |
|
||||
echo "VERSION=$(echo ${{ github.head_ref }} | sed -e 's/release\///g')" >> $GITHUB_ENV
|
||||
echo "DRY_RUN=true" >> $GITHUB_ENV
|
||||
echo "VERSION=$(echo ${{ github.head_ref }} | sed -e 's/release\/.*\///g')" >> $GITHUB_ENV
|
||||
echo "DRY_RUN=${{ contains(github.event.pull_request.labels.*.name, 'release/dry-run') }}" >> $GITHUB_ENV
|
||||
echo "LATEST=${{ contains(github.event.pull_request.labels.*.name, 'release/latest') }}" >> $GITHUB_ENV
|
||||
- id: output
|
||||
run: |
|
||||
@@ -51,25 +52,23 @@ jobs:
|
||||
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
||||
post_changelog_on_forum:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: |
|
||||
echo post changelog to forums for ${{ needs.setup.outputs.version }}
|
||||
echo dry run: ${{ needs.setup.outputs.dry_run }}
|
||||
uses: ./.github/workflows/community-release.yml
|
||||
secrets:
|
||||
GRAFANA_MISC_STATS_API_KEY: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }}
|
||||
GRAFANABOT_FORUM_KEY: ${{ secrets.GRAFANABOT_FORUM_KEY }}
|
||||
with:
|
||||
version: ${{ needs.setup.outputs.version }}
|
||||
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
|
||||
create_github_release:
|
||||
# a github release requires a git tag
|
||||
# The github-release action retrieves the changelog using the /repos/grafana/grafana/contents/CHANGELOG.md API
|
||||
# endpoint.
|
||||
needs: setup
|
||||
uses: ./.github/workflows/github-release.yml
|
||||
with:
|
||||
version: ${{ needs.setup.outputs.version }}
|
||||
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
|
||||
publish_docs:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: |
|
||||
echo publish docs for ${{ needs.setup.outputs.version }}
|
||||
echo dry run: ${{ needs.setup.outputs.dry_run }}
|
||||
latest: ${{ needs.setup.outputs.latest }}
|
||||
post_on_slack:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
102
.github/workflows/release-pr.yml
vendored
102
.github/workflows/release-pr.yml
vendored
@@ -23,62 +23,136 @@ on:
|
||||
dry_run:
|
||||
required: false
|
||||
default: false
|
||||
type: bool
|
||||
type: boolean
|
||||
latest:
|
||||
required: false
|
||||
default: false
|
||||
type: bool
|
||||
type: boolean
|
||||
|
||||
permissions:
|
||||
content: write
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
push-changelog-to-main:
|
||||
name: Create PR to main to update the changelog
|
||||
uses: ./.github/workflows/changelog.yml
|
||||
with:
|
||||
version: ${{ inputs.version }}
|
||||
latest: ${{ inputs.latest }}
|
||||
dry_run: ${{ inputs.dry_run }}
|
||||
target: main
|
||||
secrets:
|
||||
GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||
GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||
create-prs:
|
||||
name: Create Release PR
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'grafana/grafana'
|
||||
steps:
|
||||
- name: Generate bot token
|
||||
id: generate_token
|
||||
uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92
|
||||
with:
|
||||
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
|
||||
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
|
||||
- name: Checkout Grafana
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.target }}
|
||||
fetch-depth: 0
|
||||
fetch-tags: true
|
||||
- name: Checkout Grafana (main)
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
fetch-depth: '0'
|
||||
fetch-tags: 'false'
|
||||
path: .grafana-main
|
||||
- name: Configure git user
|
||||
run: |
|
||||
git config --local user.name "github-actions[bot]"
|
||||
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --local --add --bool push.autoSetupRemote true
|
||||
|
||||
- name: Create branch
|
||||
run: git checkout -b "release/${{ github.run_id }}/${{ inputs.version }}"
|
||||
- name: Generate changelog
|
||||
run: git commit --allow-empty -m "Update changelog placeholder"
|
||||
- name: Update package.json versions
|
||||
uses: ./pkg/build/actions/bump-version
|
||||
id: changelog
|
||||
uses: ./.grafana-main/.github/workflows/actions/changelog
|
||||
with:
|
||||
version: ${{ inputs.version }}
|
||||
- name: add package.json changes
|
||||
github_token: ${{ steps.generate_token.outputs.token }}
|
||||
target: v${{ inputs.version }}
|
||||
output_file: changelog_items.md
|
||||
- name: Patch CHANGELOG.md
|
||||
run: |
|
||||
git add .
|
||||
# Prepare CHANGELOG.md content with version delimiters
|
||||
(
|
||||
echo
|
||||
echo "# ${{ inputs.version}} ($(date '+%F'))"
|
||||
echo
|
||||
cat changelog_items.md
|
||||
) > CHANGELOG.part
|
||||
|
||||
# Check if a version exists in the changelog
|
||||
if grep -q "<!-- ${{ inputs.version}} START" CHANGELOG.md ; then
|
||||
# Replace the content between START and END delimiters
|
||||
echo "Version ${{ inputs.version }} is found in the CHANGELOG.md, patching contents..."
|
||||
sed -i -e '/${{ inputs.version }} START/,/${{ inputs.version }} END/{//!d;}' \
|
||||
-e '/${{ inputs.version }} START/r CHANGELOG.part' CHANGELOG.md
|
||||
else
|
||||
# Prepend changelog part to the main changelog file
|
||||
echo "Version ${{ inputs.version }} not found in the CHANGELOG.md"
|
||||
(
|
||||
echo "<!-- ${{ inputs.version }} START -->"
|
||||
cat CHANGELOG.part
|
||||
echo "<!-- ${{ inputs.version }} END -->"
|
||||
cat CHANGELOG.md
|
||||
) > CHANGELOG.tmp
|
||||
mv CHANGELOG.tmp CHANGELOG.md
|
||||
fi
|
||||
|
||||
rm -f CHANGELOG.part changelog_items.md
|
||||
|
||||
git diff CHANGELOG.md
|
||||
|
||||
- name: Commit CHANGELOG.md changes
|
||||
run: git add CHANGELOG.md && git commit --allow-empty -m "Update changelog" CHANGELOG.md
|
||||
|
||||
- name: Update package.json versions
|
||||
uses: ./.grafana-main/pkg/build/actions/bump-version
|
||||
with:
|
||||
version: 'patch'
|
||||
|
||||
- name: Add package.json changes
|
||||
run: |
|
||||
git add package.json lerna.json yarn.lock packages public
|
||||
git commit -m "Update version to ${{ inputs.version }}"
|
||||
- name: git push
|
||||
|
||||
- name: Git push
|
||||
if: ${{ inputs.dry_run }} != true
|
||||
run: git push
|
||||
run: git push --set-upstream origin release/${{ github.run_id }}/${{ inputs.version }}
|
||||
|
||||
- name: Create PR without backports
|
||||
if: "${{ inputs.backport == '' }}"
|
||||
run: >
|
||||
gh pr create \
|
||||
$( (( ${{ inputs.latest }} == "true" )) && printf %s '-l "release/latest"') \
|
||||
$( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \
|
||||
-l "no-changelog" \
|
||||
--dry-run=${{ inputs.dry_run }} \
|
||||
-B "${{ inputs.target }}" \
|
||||
--title "Release: ${{ inputs.version }}" \
|
||||
--body "These code changes must be merged after a release is complete"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Create PR with backports
|
||||
if: "${{ inputs.backport != '' }}"
|
||||
run: >
|
||||
gh pr create \
|
||||
$( (( ${{ inputs.latest }} == "true" )) && printf %s '-l "release/latest"') \
|
||||
-l "backport ${{ inputs.backport }}" \
|
||||
$( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \
|
||||
-l "product-approved" \
|
||||
-l "no-changelog" \
|
||||
--dry-run=${{ inputs.dry_run }} \
|
||||
-B "${{ inputs.target }}" \
|
||||
--title "Release: ${{ inputs.version }}" \
|
||||
|
||||
29
CHANGELOG.md
29
CHANGELOG.md
@@ -1,3 +1,32 @@
|
||||
<!-- 11.1.3 START -->
|
||||
|
||||
# 11.1.3 (2024-07-26)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- **RBAC**: Allow plugins to use scoped actions [#90946](https://github.com/grafana/grafana/pull/90946), [@gamab](https://github.com/gamab)
|
||||
|
||||
<!-- 11.1.3 END -->
|
||||
<!-- 11.1.2 START -->
|
||||
|
||||
# 11.1.2 (2024-07-26)
|
||||
|
||||
<!-- 11.1.2 END -->
|
||||
<!-- 11.1.1 START -->
|
||||
|
||||
# 11.1.1 (2024-07-25)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
- **Alerting:** Skip fetching alerts for unsaved dashboards [#90074](https://github.com/grafana/grafana/pull/90074), [@gillesdemey](https://github.com/gillesdemey)
|
||||
- **Alerting:** Skip loading alert rules for dashboards when disabled [#89905](https://github.com/grafana/grafana/pull/89905), [@gillesdemey](https://github.com/gillesdemey)
|
||||
- **Alerting:** Support `utf8_strict_mode: false` in Mimir [#90148](https://github.com/grafana/grafana/pull/90148), [@gillesdemey](https://github.com/gillesdemey)
|
||||
- **Scenes:** Fixes issue with panel repeat height calculation [#90232](https://github.com/grafana/grafana/pull/90232), [@kaydelaney](https://github.com/kaydelaney)
|
||||
- **Table Panel:** Fix Image hover without datalinks [#89922](https://github.com/grafana/grafana/pull/89922), [@codeincarnate](https://github.com/codeincarnate)
|
||||
- **Tempo:** Fix grpc streaming support over pdc-agent [#90055](https://github.com/grafana/grafana/pull/90055), [@taylor-s-dean](https://github.com/taylor-s-dean)
|
||||
- **RBAC**: Allow plugins to use scoped actions [#90946](https://github.com/grafana/grafana/pull/90946), [@gamab](https://github.com/gamab)
|
||||
|
||||
<!-- 11.1.1 END -->
|
||||
<!-- 11.1.0 START -->
|
||||
|
||||
# 11.1.0 (2024-06-21)
|
||||
|
||||
@@ -16,7 +16,7 @@ weight: 114
|
||||
hero:
|
||||
title: Grafana Alerting
|
||||
level: 1
|
||||
image: /media/docs/alerting/alerting-bell-icon.png
|
||||
image: /media/docs/grafana-cloud/alerting-and-irm/grafana-icon-alerting.svg
|
||||
width: 100
|
||||
height: 100
|
||||
description: Grafana Alerting allows you to learn about problems in your systems moments after they occur.
|
||||
|
||||
@@ -13,7 +13,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Discord
|
||||
title: Configure Discord for Alerting
|
||||
weight: 300
|
||||
weight: 10
|
||||
---
|
||||
|
||||
# Configure Discord for Alerting
|
||||
|
||||
@@ -13,7 +13,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Email
|
||||
title: Configure email for Alerting
|
||||
weight: 300
|
||||
weight: 20
|
||||
---
|
||||
|
||||
# Configure email for Alerting
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-google-chat/
|
||||
description: Configure the Google Chat integration to receive notifications when your alerts are firing
|
||||
keywords:
|
||||
- grafana
|
||||
- alerting
|
||||
- Google Chat
|
||||
- integration
|
||||
labels:
|
||||
products:
|
||||
- cloud
|
||||
- enterprise
|
||||
- oss
|
||||
menuTitle: Google Chat
|
||||
title: Configure Google Chat for Alerting
|
||||
weight: 30
|
||||
---
|
||||
|
||||
# Configure Google Chat for Alerting
|
||||
|
||||
Use the Grafana Alerting - Google Chat integration to receive alert notifications in your Google Chat space when your Grafana alert rules are triggered and resolved.
|
||||
|
||||
## Before you begin
|
||||
|
||||
Create a Webhook to enable Grafana to send alert notifications to a Google Chat space.
|
||||
To create a Webhook in Google Chat space, complete the following steps.
|
||||
|
||||
1. Follow the steps in [Google's Chat app guide](https://developers.google.com/workspace/chat/quickstart/webhooks#create_a_webhook).
|
||||
1. Copy the Webhook URL.
|
||||
|
||||
## Procedure
|
||||
|
||||
To create your Google Chat integration in Grafana Alerting, complete the following steps.
|
||||
|
||||
1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**.
|
||||
1. Click **+ Add contact point**.
|
||||
1. Enter a contact point name.
|
||||
1. From the Integration list, select **Google Chat**.
|
||||
1. In the **URL** field, paste in your Webhook URL.
|
||||
1. Click **Test** to check that your integration works.
|
||||
|
||||
A test alert notification should be sent to the Google Chat space that you associated with the Webhook.
|
||||
|
||||
1. Click **Save contact point**.
|
||||
|
||||
## Next steps
|
||||
|
||||
The Google Chat contact point is ready to receive alert notifications.
|
||||
|
||||
To add this contact point to your alert, complete the following steps.
|
||||
|
||||
1. In Grafana, navigate to **Alerting** > **Alert rules**.
|
||||
1. Edit or create a new alert rule.
|
||||
1. Scroll down to the **Configure labels and notifications** section.
|
||||
1. Under **Notifications** click **Select contact point**.
|
||||
1. From the drop-down menu, select the previously created contact point.
|
||||
1. Click **Save rule and exit**.
|
||||
@@ -18,7 +18,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Grafana OnCall
|
||||
title: Configure Grafana OnCall for Alerting
|
||||
weight: 300
|
||||
weight: 40
|
||||
---
|
||||
|
||||
# Configure Grafana OnCall for Alerting
|
||||
|
||||
@@ -13,7 +13,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Opsgenie
|
||||
title: Configure Opsgenie for Alerting
|
||||
weight: 300
|
||||
weight: 60
|
||||
---
|
||||
|
||||
# Configure Opsgenie for Alerting
|
||||
|
||||
@@ -13,7 +13,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Slack
|
||||
title: Configure Slack for Alerting
|
||||
weight: 300
|
||||
weight: 80
|
||||
refs:
|
||||
nested-policy:
|
||||
- pattern: /docs/grafana/
|
||||
|
||||
@@ -13,7 +13,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Microsoft Teams
|
||||
title: Configure Microsoft Teams for Alerting
|
||||
weight: 300
|
||||
weight: 50
|
||||
---
|
||||
|
||||
# Configure Microsoft Teams for Alerting
|
||||
|
||||
@@ -13,7 +13,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Telegram
|
||||
title: Configure Telegram for Alerting
|
||||
weight: 300
|
||||
weight: 90
|
||||
---
|
||||
|
||||
# Configure Telegram for Alerting
|
||||
|
||||
@@ -14,7 +14,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: PagerDuty
|
||||
title: Configure PagerDuty for Alerting
|
||||
weight: 400
|
||||
weight: 70
|
||||
---
|
||||
|
||||
# Configure PagerDuty for Alerting
|
||||
|
||||
@@ -21,7 +21,7 @@ labels:
|
||||
- oss
|
||||
menuTitle: Webhook notifier
|
||||
title: Configure the webhook notifier for Alerting
|
||||
weight: 200
|
||||
weight: 100
|
||||
---
|
||||
|
||||
# Configure the webhook notifier for Alerting
|
||||
|
||||
@@ -81,7 +81,7 @@ Grafana legacy alerting (dashboard alerts) has been deprecated since Grafana v9.
|
||||
|
||||
#### Migration path
|
||||
|
||||
The new Grafana Alerting was introduced in Grafana 8 and is a superset of legacy alerting. Learn how to migrate your alerts in the [Upgrade Alerting documentation]({{< relref "./v10.4/alerting/set-up/migrating-alerts/" >}}).
|
||||
The new Grafana Alerting was introduced in Grafana 8 and is a superset of legacy alerting. Learn how to migrate your alerts in the [Upgrade Alerting documentation](https://grafana.com/docs/grafana/v10.4/alerting/set-up/migrating-alerts/).
|
||||
|
||||
### API keys are migrating to service accounts
|
||||
|
||||
|
||||
@@ -17,46 +17,56 @@ title: Dashboard URL variables
|
||||
description: Use variables in dashboard URLs to add more context to your links
|
||||
weight: 250
|
||||
refs:
|
||||
add-ad-hoc-filters:
|
||||
ad-hoc-filters:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/variables/add-template-variables/#add-ad-hoc-filters
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/variables/add-template-variables/#add-ad-hoc-filters
|
||||
destination: /docs/grafana-cloud/visualizations/dashboards/variables/add-template-variables/#add-ad-hoc-filters
|
||||
manage-dashboard-links:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/build-dashboards/manage-dashboard-links/
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/build-dashboards/manage-dashboard-links/
|
||||
linking-overview:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/build-dashboards/
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/build-dashboards/
|
||||
template-and-variables:
|
||||
destination: /docs/grafana-cloud/visualizations/dashboards/build-dashboards/manage-dashboard-links/
|
||||
variables:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/variables/
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/dashboards/variables/
|
||||
destination: /docs/grafana-cloud/visualizations/dashboards/variables/
|
||||
---
|
||||
|
||||
# Dashboard URL variables
|
||||
|
||||
Grafana can apply variable values passed as query parameters in dashboard URLs.
|
||||
For more information, refer to [Manage dashboard links](ref:manage-dashboard-links) and [Templates and variables][].
|
||||
Dashboard URL [variables](ref:variables) allow you to provide more context when you share a dashboard URL.
|
||||
|
||||
## Passing variables as query parameters
|
||||
For example, you could share a basic URL to your dashboard that looks like this:
|
||||
|
||||
Grafana interprets query string parameters prefixed with `var-` as variables in the given dashboard.
|
||||
```
|
||||
https://${your-domain}/path/to/your/dashboard
|
||||
```
|
||||
|
||||
For example, in this URL:
|
||||
This allows someone to navigate to the dashboard, but doesn't provide any helpful context that might be available.
|
||||
|
||||
Instead, you can add dashboard variables, passed as query parameters in the dashboard URL, to provide a URL like this:
|
||||
|
||||
```
|
||||
https://${your-domain}/path/to/your/dashboard?var-example=value
|
||||
```
|
||||
|
||||
The query parameter `var-example=value` represents the dashboard variable `example` with a value of `value`.
|
||||
This allows you to provide added context to the dashboard when someone navigates to it.
|
||||
|
||||
### Passing multiple values for a variable
|
||||
## Variables as query parameters
|
||||
|
||||
Grafana interprets query string parameters prefixed with `var-` as variables in the given dashboard.
|
||||
|
||||
For example:
|
||||
|
||||
```
|
||||
https://${your-domain}/path/to/your/dashboard?var-example=value
|
||||
```
|
||||
|
||||
In this URL, the query parameter `var-example=value` represents the dashboard variable `example` with a value of `value`.
|
||||
|
||||
### Multiple values for a variable
|
||||
|
||||
To pass multiple values, repeat the variable parameter once for each value:
|
||||
|
||||
@@ -68,34 +78,38 @@ Grafana interprets `var-example=value1&var-example=value2` as the dashboard vari
|
||||
|
||||
### Example
|
||||
|
||||
This example in [Grafana Play](https://play.grafana.org/d/000000074/alerting?var-app=backend&var-server=backend_01&var-server=backend_03&var-interval=1h) passes the variable `server` with multiple values, and the variables `app` and `interval` with a single value each.
|
||||
[This dashboard in Grafana Play](https://play.grafana.org/d/000000074/alerting?var-app=backend&var-server=backend_01&var-server=backend_03&var-interval=1h) passes the variable `server` with multiple values, and the variables `app` and `interval` with a single value each.
|
||||
|
||||
## Adding variables to dashboard links
|
||||
## Ad hoc filters
|
||||
|
||||
Grafana can add variables to dashboard links when you generate them from a dashboard's settings. For more information and steps to add variables, refer to [Manage dashboard links](ref:manage-dashboard-links).
|
||||
Ad hoc filters apply key/value filters to all metric queries that use the specified data source. For more information, refer to [Add ad hoc filters](ref:ad-hoc-filters).
|
||||
|
||||
## Passing ad hoc filters
|
||||
To pass an ad hoc filter as a query parameter, use the variable syntax to pass the ad hoc filter variable. Then provide the key, operator, and value as a pipe-separated list.
|
||||
|
||||
Ad hoc filters apply key/value filters to all metric queries that use a specified data source. For more information, refer to [Add ad hoc filters](ref:add-ad-hoc-filters).
|
||||
|
||||
To pass an ad hoc filter as a query parameter, use the variable syntax to pass the ad hoc filter variable, and also provide the key, the operator as the value, and the value as a pipe-separated list.
|
||||
|
||||
For example, in this URL:
|
||||
For example:
|
||||
|
||||
```
|
||||
https://${your-domain}/path/to/your/dashboard?var-adhoc=example_key|=|example_value
|
||||
```
|
||||
|
||||
The query parameter `var-adhoc=key|=|value` applies the ad hoc filter configured as the `adhoc` dashboard variable using the `example_key` key, the `=` operator, and the `example_value` value.
|
||||
In this URL, the query parameter `var-adhoc=key|=|value` applies the ad hoc filter configured as the `adhoc` dashboard variable using the `example_key` key, the `=` operator, and the `example_value` value.
|
||||
|
||||
{{% admonition type="note" %}}
|
||||
When sharing URLs with ad hoc filters, remember to encode the URL. In the above example, replace the pipes (`|`) with `%7C` and the equality operator (`=`) with `%3D`.
|
||||
{{% /admonition %}}
|
||||
{{< admonition type="note" >}}
|
||||
When sharing URLs with ad hoc filters, remember to encode the URL. In the preceding example, replace the pipes (`|`) with `%7C` and the equality operator (`=`) with `%3D`.
|
||||
{{< /admonition >}}
|
||||
|
||||
### Example
|
||||
|
||||
[This example in Grafana Play](https://play.grafana.org/d/000000002/influxdb-templated?orgId=1&var-datacenter=America&var-host=All&var-summarize=1m&var-adhoc=datacenter%7C%3D%7CAmerica) passes the ad hoc filter variable `adhoc` with the filter value `datacenter = America`.
|
||||
[This dashboard in Grafana Play](https://play.grafana.org/d/000000002/influxdb-templated?orgId=1&var-datacenter=America&var-host=All&var-summarize=1m&var-adhoc=datacenter%7C%3D%7CAmerica) passes the ad hoc filter variable `adhoc` with the filter value `datacenter = America`.
|
||||
|
||||
## Controlling time range using the URL
|
||||
## Time range control using the URL
|
||||
|
||||
To set a dashboard's time range, use the `from`, `to`, `time`, and `time.window` query parameters. Because these are not variables, they do not require the `var-` prefix. For more information, see the [Linking overview](ref:linking-overview).
|
||||
{{< docs/shared lookup="dashboards/time-range-URLs.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
## Variables in dashboard links
|
||||
|
||||
When you create dashboard links the dashboard settings, you can have current dashboard variables included in the link by selecting that option:
|
||||
|
||||
{{< figure src="/media/docs/grafana/dashboards/screenshot-dashboard-link-variables-11.1.png" max-width="500px" alt="Dashboard link page with variables option selected" >}}
|
||||
|
||||
For steps to add variables to dashboard links, refer to [Manage dashboard links](ref:manage-dashboard-links).
|
||||
|
||||
@@ -241,8 +241,4 @@ Selecting the **Auto** interval schedules a refresh based on the query time rang
|
||||
|
||||
### Control the time range using a URL
|
||||
|
||||
You can control the time range of a dashboard by providing the following query parameters in the dashboard URL:
|
||||
|
||||
- `from`: Defines the lower limit of the time range, specified in `ms`, `epoch`, or [relative time](#relative-time-range)
|
||||
- `to`: Defines the upper limit of the time range, specified in `ms`, `epoch`, or [relative time](#relative-time-range)
|
||||
- `time` and `time.window`: Defines a time range from `time-time.window/2` to `time+time.window/2`. Both parameters should be specified in `ms`. For example `?time=1500000000000&time.window=10000` results in 10s time range from 1499999995000 to 1500000005000
|
||||
{{< docs/shared lookup="dashboards/time-range-URLs.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
@@ -72,7 +72,7 @@ You use the Service Graph to detect performance issues; track increases in error
|
||||
|
||||
## Display the Service Graph
|
||||
|
||||
1. [Configure Grafana Agent](/docs/tempo/latest/configuration/grafana-agent/) or [Tempo or GET](/docs/tempo/latest/metrics-generator/service_graphs/#tempo) to generate Service Graph data.
|
||||
1. [Configure Grafana Alloy](https://grafana.com/docs/tempo/latest/configuration/grafana-alloy/) or [Tempo or GET](https://grafana.com/docs/tempo/latest/metrics-generator/service_graphs/#tempo) to generate Service Graph data.
|
||||
1. Link a Prometheus data source in the Tempo data source's [Service Graph]({{< relref "./configure-tempo-data-source#configure-service-graph" >}}) settings.
|
||||
1. Navigate to [Explore](ref:explore).
|
||||
1. Select the Tempo data source.
|
||||
|
||||
@@ -61,7 +61,12 @@ refs:
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/administration/data-source-management/
|
||||
---
|
||||
|
||||
# Span Filters
|
||||
# Span filters
|
||||
|
||||
When working with traces, especially those comprising a vast number of spans, pinpointing specific spans of interest can be a daunting task.
|
||||
This is where span filtering comes in.
|
||||
Located above the trace view, span filters allow you to refine the spans displayed based on specific criteria.
|
||||
Whether you’re looking to identify spans from a certain service, those exceeding a particular duration, or spans tagged with specific attributes, span filtering streamlines the process.
|
||||
|
||||
Using span filters, you can filter your spans in the trace timeline viewer. The more filters you add, the more specific are the filtered spans.
|
||||
|
||||
@@ -74,6 +79,27 @@ You can add one or more of the following filters:
|
||||
- Duration
|
||||
- Tags (which include tags, process tags, and log fields)
|
||||
|
||||
To only show the spans you have matched, select the `Show matches only` toggle.
|
||||
{{< youtube id="VP2XV3IIc80" >}}
|
||||
|
||||
<!-- Adding these in case they are needed. -->
|
||||
## Use span filters
|
||||
|
||||
You can access span filters from within the trace view. You can add one or more filters.
|
||||
The more filters you add, the more specific data that you are filtering.
|
||||
|
||||
1. Expand a trace to view individual spans.
|
||||
1. Select a span to view the span details.
|
||||
1. Select **Span Filters** to display the available filters.
|
||||
|
||||

|
||||
|
||||
Query results in the span view update as you select filters.
|
||||
|
||||
### Show matches only
|
||||
|
||||
For a more focused view, the **Show matches only** toggle ensures only the spans meeting your criteria are displayed. This is particularly useful when sifting through thousands of spans, allowing you to zero in on those that truly matter.
|
||||
For instance, if you’re keen on understanding why a specific request is lagging, or if you’re on the hunt for spans without a certain tag, span filtering is your go-to tool.
|
||||
It even lets you search for spans based on specific tag keys, like cluster.
|
||||
|
||||
### Remove a filter
|
||||
|
||||
To remove a filter, select the **X** next to the line item.
|
||||
|
||||
@@ -8,77 +8,87 @@ labels:
|
||||
- cloud
|
||||
- enterprise
|
||||
- oss
|
||||
title: Query management
|
||||
title: Query management in Explore
|
||||
weight: 10
|
||||
---
|
||||
|
||||
# Query management in Explore
|
||||
|
||||
To help with debugging queries, Explore allows you to investigate query requests and responses, as well as query statistics, via the Query inspector.
|
||||
This functionality is similar to the panel inspector tasks [Inspect query performance]({{< relref "../panels-visualizations/panel-inspector/#inspect-query-performance" >}}) and
|
||||
[Inspect query request and response data]({{< relref "../panels-visualizations/panel-inspector/#inspect-query-request-and-response-data" >}}).
|
||||
Grafana Explore provides a variety of tools to help manage your queries.
|
||||
|
||||
{{< figure src="/static/img/docs/v71/query_inspector_explore.png" class="docs-image--no-shadow" max-width= "550px" caption="Screenshot of the query inspector button in Explore" >}}
|
||||
{{% admonition type="note" %}}
|
||||
For help with debugging queries, Explore allows you to investigate query requests and responses, as well as query statistics, via the Query inspector. Refer to [Query inspector in Explore](/docs/grafana/<GRAFANA_VERSION>/explore/explore-inspector/) for more information.
|
||||
{{% /admonition %}}
|
||||
|
||||
## Query history
|
||||
|
||||
Query history is a list of queries that you used in Explore. The history is stored in the Grafana database and it is not shared with other users. The retention period for queries in history is two weeks. Queries older than two weeks are automatically deleted. To open and interact with your history, click the **Query history** button in Explore.
|
||||
Query history contains the list of queries that you created in Explore. This history is stored in the Grafana database and isn't shared with other users. The retention period for a query history is **two weeks**. Queries older than two weeks are automatically deleted.
|
||||
|
||||
{{% admonition type="note" %}}
|
||||
Starred queries are not subject to the two weeks retention period and they are not deleted.
|
||||
Starred queries aren't subject to the two-week retention period and aren't deleted.
|
||||
{{% /admonition %}}
|
||||
|
||||
### View query history
|
||||
To view your query history:
|
||||
|
||||
Query history lets you view the history of your querying. For each individual query, you can:
|
||||
1. Go to the Explore page.
|
||||
1. Click **Query history**.
|
||||
|
||||
- Run a query.
|
||||
The Query history pane opens at the bottom of the page, and contains the following tabs:
|
||||
|
||||
- **Query history tab-** Contains a history of all your queries, with options for searching and managing them.
|
||||
- **Starred tab -** Contains all of your starred queries.
|
||||
- **Settings tab-** Provides customizable options for your query history.
|
||||
|
||||
### Query history tab
|
||||
|
||||
The Query history depicts a history of your queries for the past two weeks, unless the query is starred, which means it doesn't get deleted. For each individual query, you can:
|
||||
|
||||
- Run and re-run the query.
|
||||
- Create and/or edit a comment.
|
||||
- Copy a query to the clipboard.
|
||||
- Copy a shortened link with the query to the clipboard.
|
||||
- Delete a query.
|
||||
- Star a query.
|
||||
|
||||
### Manage favorite queries
|
||||
By default, query history shows you newest queries first. Click the sort box in the upper right to change to **Oldest first** to older queries first. You can search your queries using keywords.
|
||||
|
||||
All queries that have been starred in the Query history tab are displayed in the Starred tab. This allows you to access your favorite queries faster and to reuse these queries without typing them from scratch.
|
||||
### Query history Starred tab
|
||||
|
||||
### Sort query history
|
||||
All starred queries are displayed in the **Starred** tab. This gives quick access to key or favorite queries without having to rewrite them.
|
||||
|
||||
By default, query history shows you the most recent queries. You can sort your history by date or by data source name in ascending or descending order.
|
||||
You also have the option to switch the data source and run a starred query.
|
||||
|
||||
1. Click the **Sort queries by** field.
|
||||
1. Select one of the following options:
|
||||
- Newest first
|
||||
- Oldest first
|
||||
#### Filter query history
|
||||
|
||||
### Filter query history
|
||||
|
||||
Filter query history in Query history and Starred tab by data source name:
|
||||
Filter query history in both the **Query history** and **Starred** tabs by data source name:
|
||||
|
||||
1. Click the **Filter queries for specific data source(s)** field.
|
||||
1. Select the data source for which you would like to filter your history. You can select multiple data sources.
|
||||
1. Select the data source in the dropdown by which you want to filter your history. You can select multiple data sources.
|
||||
|
||||
> **Note:** Queries ran using the Mixed data source will appear only when filtering for Mixed and not when filtering by their individual data sources.
|
||||
{{% admonition type="note" %}}
|
||||
Queries with the **Mixed** data source appear only when filtering for "Mixed" and not when filtering by individual data source.
|
||||
{{% /admonition %}}
|
||||
|
||||
In **Query history** tab it is also possible to filter queries by date using the slider:
|
||||
You can also filter queries by date using the vertical slider:
|
||||
|
||||
- Use vertical slider to filter queries by date.
|
||||
- By dragging bottom handle, adjust start date.
|
||||
- By dragging top handle, adjust end date.
|
||||
- Drag the bottom circle to adjust the start date.
|
||||
- Drag the top circle to adjust the end date.
|
||||
|
||||
### Search in query history
|
||||
#### Search in query history
|
||||
|
||||
You can search in your history across queries and your comments. Search is possible for queries in the Query history tab and Starred tab.
|
||||
Use **Search queries** in both the **Query history** and **Starred** tabs to search your query history and comments using keywords.
|
||||
|
||||
1. Click the **Search queries** field.
|
||||
1. Type the term you are searching for into search field.
|
||||
1. Click in the **Search queries** field.
|
||||
1. Type the keyword(s) or term you are want to search for in search field.
|
||||
|
||||
### Query history settings
|
||||
### Query history Settings tab
|
||||
|
||||
You can customize the query history in the Settings tab. Options are described in the table below.
|
||||
You can customize your query history in the **Settings** tab.
|
||||
|
||||
| Setting | Default value |
|
||||
| ----------------------------- | ----------------- |
|
||||
| Change the default active tab | Query history tab |
|
||||
Toggle **Change the default active tab from "Query history" to "Starred"** to make the **Starred tab** the default active tab.
|
||||
|
||||
> **Note:** Query history settings are global, and applied to both panels in split mode.
|
||||
{{% admonition type="note" %}}
|
||||
Query history settings are global, and applied to both panels in split mode.
|
||||
{{% /admonition %}}
|
||||
|
||||
<!-- All queries that have been starred in the Query history tab are displayed in the Starred tab. This allows you to access your favorite queries faster and to reuse these queries without typing them from scratch. -->
|
||||
|
||||
@@ -106,17 +106,17 @@ The following image shows the two metrics associated with the endpoint. The HELP
|
||||
|
||||
The 'MyApp' metrics are available in an HTTP endpoint, but how do they get to Grafana, and subsequently, into a dashboard? The process of recording and transmitting the readings of an application or piece of infrastructure is known as _telemetry_. Telemetry is critical to observability because it helps you understand exactly what's going on in your infrastructure. The metrics introduced previously, for example, `MyAppnodejs_active_requests_total`, are telemetry data.
|
||||
|
||||
To get metrics into Grafana, you can use either the Prometheus software or [Grafana Agent](/docs/agent/latest/) to scrape metrics. Grafana Agent collects and forwards the telemetry data to open-source deployments of the Grafana Stack, Grafana Cloud, or Grafana Enterprise, where your data can be analyzed. For example, you can configure Grafana Agent to pull the data from 'MyApp' every five seconds and send the results to Grafana Cloud.
|
||||
To get metrics into Grafana, you can use either the Prometheus software or [Grafana Alloy](https://grafana.com/docs/alloy/latest/) to scrape metrics. Grafana Alloy collects and forwards the telemetry data to open-source deployments of the Grafana Stack, Grafana Cloud, or Grafana Enterprise, where your data can be analyzed. For example, you can configure Grafana Alloy to pull the data from 'MyApp' every five seconds and send the results to Grafana Cloud.
|
||||
|
||||
Metrics data is only one type of telemetry data; the other kinds are logs and traces. Using Grafana Agent can be a great option to send telemetry data because as you scale your observability practices to include logs and traces, which Grafana Agent also supports, you've got a solution already in place.
|
||||
Metrics data is only one type of telemetry data; the other kinds are logs and traces. Using Grafana Alloy can be a great option to send telemetry data because as you scale your observability practices to include logs and traces, which Grafana Alloy also supports, you've got a solution already in place.
|
||||
|
||||
The following image illustrates how Grafana Agent works as an intermediary between 'MyApp' and Grafana Cloud.
|
||||
The following image illustrates how Grafana Alloy works as an intermediary between 'MyApp' and Grafana Cloud.
|
||||
|
||||
{{< figure src="/media/docs/grafana/intro-prometheus/grafana-agent.png" max-width="750px" caption="Grafana Agent" >}}
|
||||
{{< figure src="/media/docs/alloy/flow-diagram-small-alloy.png" alt="Grafana Alloy" caption="Grafana Alloy" >}}
|
||||
|
||||
## Bringing it together
|
||||
|
||||
The combination of Prometheus and Grafana Agent gives you control over the metrics you want to report, where they come from, and where they’re going. Once the data is in Grafana, it can be stored in a Grafana Mimir database. Grafana dashboards consist of visualizations populated by data queried from the Prometheus data source. The PromQL query filters and aggregates the data to provide you the insight you need. With those steps, we’ve gone from raw numbers, generated by software, into Prometheus, delivered to Grafana, queried by PromQL, and visualized by Grafana.
|
||||
The combination of Prometheus and Grafana Alloy gives you control over the metrics you want to report, where they come from, and where they’re going. Once the data is in Grafana, it can be stored in a Grafana Mimir database. Grafana dashboards consist of visualizations populated by data queried from the Prometheus data source. The PromQL query filters and aggregates the data to provide you the insight you need. With those steps, we’ve gone from raw numbers, generated by software, into Prometheus, delivered to Grafana, queried by PromQL, and visualized by Grafana.
|
||||
|
||||
## What’s next?
|
||||
|
||||
|
||||
@@ -84,7 +84,9 @@ In addition to Grafana, Grafana Labs also provides the following open source pro
|
||||
|
||||
**Grafana Beyla:** Grafana Beyla is an eBPF-based application auto-instrumentation tool for application observability. eBPF is used to automatically inspect application executables and the OS networking layer as well as capture basic trace spans related to web transactions and Rate-Errors-Duration (RED) metrics for Linux HTTP/S and gRPC services. All data capture occurs without any modifications to application code or configuration. For more information about Grafana Beyla, refer to [Grafana Beyla documentation](/docs/beyla/latest/).
|
||||
|
||||
**Grafana Agent:** Grafana Agent is a vendor-neutral, batteries-included telemetry collector with configuration inspired by Terraform. It is designed to be flexible, performant, and compatible with multiple ecosystems such as Prometheus and OpenTelemetry. For more information about Grafana Agent, refer to [Grafana Agent documentation](/docs/agent/latest/).
|
||||
**Grafana Alloy:** Grafana Alloy is a flexible, high performance, vendor-neutral distribution of the [OpenTelemetry][] (OTel) Collector.
|
||||
It's fully compatible with the most popular open source observability standards such as OpenTelemetry (OTel) and Prometheus.
|
||||
For more information about Grafana Alloy, refer to the [Grafana Alloy documentation](https://grafana.com/docs/alloy/latest/).
|
||||
|
||||
**Grafana k6:** Grafana k6 is an open-source load testing tool that makes performance testing easy and productive for engineering teams. For more information about Grafana k6, refer to [Grafana k6 documentation](/docs/k6/latest/).
|
||||
|
||||
|
||||
@@ -219,7 +219,6 @@ To access values and labels from other fields use:
|
||||
| --------------------------------- | ------------------------------------------ |
|
||||
| `__data.fields[i]` | Value of field `i` (on the same row) |
|
||||
| `__data.fields["NameOfField"]` | Value of field using name instead of index |
|
||||
| `__data.fields["NameOfField"]` | Value of field using name instead of index |
|
||||
| `__data.fields[1].labels.cluster` | Access labels of another field |
|
||||
|
||||
### Template variables
|
||||
|
||||
@@ -237,6 +237,8 @@ Select one of the following schemes:
|
||||
| Multiple continuous colors (by value) | Grafana automatically assigns colors based on the percentage of a value relative to the min and the max of the field or series. For some visualizations, you also need to choose if the color is set by the **Last**, **Min**, or **Max** value of the field or series. Select from: **Green-Yellow-Red**, **Red-Yellow-Green**, **Blue-Yellow-Red**, **Yellow-Red**, **Blue-Purple**, and **Yellow-Blue**. |
|
||||
| Single continuous color (by value) | Grafana automatically assigns shades of one color based on the percentage of a value relative to the min and the max of the field or series. For some visualizations, you also need to choose if the color is set by the **Last**, **Min**, or **Max** value of the field or series. Select from: **Blues**, **Reds**, **Greens**, and **Purples**. |
|
||||
|
||||
You can also use the legend to open the color picker by clicking the legend series color icon. Setting color this way automatically creates an override rule that set's a specific color for a specific series.
|
||||
|
||||
### No value
|
||||
|
||||
Enter what Grafana should display if the field value is empty or null. The default value is a hyphen (-).
|
||||
|
||||
@@ -673,7 +673,7 @@ We can generate a matrix using the values of 'Server Status' as column names, th
|
||||
|
||||
Use this transformation to construct a matrix by specifying fields from your query results. The matrix output reflects the relationships between the unique values in these fields. This helps you present complex relationships in a clear and structured matrix format.
|
||||
|
||||
### Group to nested table
|
||||
### Group to nested tables
|
||||
|
||||
Use this transformation to group the data by a specified field (column) value and process calculations on each group. Records are generated that share the same grouped field value, to be displayed in a nested table.
|
||||
|
||||
|
||||
@@ -154,6 +154,22 @@ Transparency of the gradient is calculated based on the values on the y-axis. Op
|
||||
|
||||
Gradient color is generated based on the hue of the line color.
|
||||
|
||||
#### Scheme gradient mode
|
||||
|
||||
The **Gradient mode** option located under the **Graph styles** has a mode named **Scheme**. When you enable **Scheme**, the bar receives a gradient color defined from the selected **Color scheme**.
|
||||
|
||||
##### From thresholds
|
||||
|
||||
If the **Color scheme** is set to **From thresholds (by value)** and **Gradient mode** is set to **Scheme**, then the bar color changes as they cross the defined thresholds.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_thresholds_bars.png" max-width="1200px" caption="Color scheme: From thresholds" >}}
|
||||
|
||||
##### Gradient color schemes
|
||||
|
||||
The following image shows a bar chart with the **Green-Yellow-Red (by value)** color scheme option selected.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_bars.png" max-width="1200px" caption="Color scheme: Green-Yellow-Red" >}}
|
||||
|
||||
## Tooltip options
|
||||
|
||||
{{< docs/shared lookup="visualizations/tooltip-options-1.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
@@ -31,6 +31,10 @@ Gauges are single-value visualizations that can repeat a gauge for every series,
|
||||
|
||||
{{< docs/play title="Grafana Gauge Visualization" url="https://play.grafana.org/d/KIhkVD6Gk/" >}}
|
||||
|
||||
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" >}}
|
||||
|
||||
## Panel options
|
||||
|
||||
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
@@ -98,6 +98,14 @@ The initial view configures how the geomap renders when the panel is first loade
|
||||
- **Oceania**
|
||||
- **Zoom** sets the initial zoom level.
|
||||
|
||||
### 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.
|
||||
|
||||
{{< admonition type="note" >}}
|
||||
You might need to reload the dashboard for this feature to work.
|
||||
{{< /admonition >}}
|
||||
|
||||
## Map layers
|
||||
|
||||
Geomaps support showing multiple layers. Each layer determines how you visualize geospatial data on top of the base map.
|
||||
@@ -156,9 +164,13 @@ The layer controls allow you to create layers, change their name, reorder and de
|
||||
|
||||
You can add multiple layers of data to a single geomap in order to create rich, detailed visualizations.
|
||||
|
||||
### Location
|
||||
### Data
|
||||
|
||||
Geomaps need a source of geographical data. This data comes from a database query, and there are four mapping options for your 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
|
||||
|
||||
There are four options to map the data returned by the selected query:
|
||||
|
||||
- **Auto** automatically searches for location data. Use this option when your query is based on one of the following names for data fields.
|
||||
- geohash: “geohash”
|
||||
|
||||
@@ -54,10 +54,6 @@ For logs where a **level** label is specified, we use the value of the label to
|
||||
|
||||
Each log row has an extendable area with its labels and detected fields, for more robust interaction. Each field or label has a stats icon to display ad-hoc statistics in relation to all displayed logs.
|
||||
|
||||
### Data links
|
||||
|
||||
By using data links, you can turn any part of a log message into an internal or external link. The created link is visible as a button in the **Links** section inside the **Log details** view.
|
||||
|
||||
### Display options
|
||||
|
||||
Use these settings to refine your visualization:
|
||||
@@ -68,5 +64,5 @@ Use these settings to refine your visualization:
|
||||
- **Wrap lines -** Toggle line wrapping.
|
||||
- **Prettify JSON -** Set this to `true` to pretty print all JSON logs. This setting does not affect logs in any format other than JSON.
|
||||
- **Enable log details -** Toggle option to see the log details view for each log row. The default setting is true.
|
||||
- **Deduplication -** Hides log messages that are duplicates of others shown according to criteria such as exact match, or those that only differ by numbers such as IPs or latencies.
|
||||
- **Deduplication -** Hides log messages that are duplicates of others shown according to your selected criteria. Choose from: **Exact** (ignoring ISO datetimes), **Numerical** (ignoring only those that differ by numbers such as IPs or latencies), or **Signatures** (removing successive lines with identical punctuation and white space).
|
||||
- **Order -** Display results in descending or ascending time order. The default is **Descending**, showing the newest logs first. Set to **Ascending** to show the oldest log lines first.
|
||||
|
||||
@@ -58,7 +58,7 @@ refs:
|
||||
|
||||
# Table
|
||||
|
||||
Tables are very flexible, supporting multiple modes for time series and for tables, annotation, and raw JSON data. This visualization also provides date formatting, value formatting, and coloring options. In addition to formatting and coloring options, Grafana also provides a variety of _Cell types_ which you can use to display gauges, sparklines, and other rich data displays.
|
||||
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" >}}
|
||||
|
||||
@@ -68,9 +68,9 @@ The following video provides a visual walkthrough of the options you can set in
|
||||
|
||||
{{< docs/play title="Table Visualizations in Grafana" url="https://play.grafana.org/d/OhR1ID6Mk/" >}}
|
||||
|
||||
## Annotation and alert support
|
||||
|
||||
Annotations and alerts are not currently supported in tables.
|
||||
{{< admonition type="note" >}}
|
||||
Annotations and alerts are not currently supported for tables.
|
||||
{{< /admonition >}}
|
||||
|
||||
## Sort column
|
||||
|
||||
@@ -78,6 +78,12 @@ Click a column title to change the sort order from default to descending to asce
|
||||
|
||||

|
||||
|
||||
## Data set selector
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
## Panel options
|
||||
|
||||
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
@@ -157,6 +163,10 @@ Toggle the **Apply to entire row** switch, to apply the background color that's
|
||||
|
||||
Cells can be displayed as a graphical gauge, with several different presentation types.
|
||||
|
||||
{{< 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 >}}
|
||||
|
||||
##### Basic
|
||||
|
||||
The basic mode will show a simple gauge with the threshold levels defining the color of gauge.
|
||||
|
||||
@@ -31,6 +31,7 @@ labels:
|
||||
- oss
|
||||
description: Configure options for Grafana's time series visualization
|
||||
title: Time series
|
||||
menuTitle: Time series
|
||||
weight: 10
|
||||
refs:
|
||||
configure-standard-options:
|
||||
@@ -43,10 +44,6 @@ refs:
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/configure-standard-options/#color-scheme
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options/#color-scheme
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/configure-standard-options/#color-scheme
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana-cloud/visualizations/panels-visualizations/configure-standard-options/#color-scheme
|
||||
add-a-field-override:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/configure-overrides/#add-a-field-override
|
||||
@@ -57,11 +54,6 @@ refs:
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/configure-overrides/
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana-cloud/visualizations/panels-visualizations/configure-overrides/
|
||||
alert-list:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/visualizations/alert-list/
|
||||
- pattern: /docs/grafana-cloud/
|
||||
destination: /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/alert-list/
|
||||
link-alert:
|
||||
- pattern: /docs/grafana/
|
||||
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/alerting-rules/create-grafana-managed-rule/
|
||||
@@ -71,18 +63,15 @@ refs:
|
||||
|
||||
# Time series
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/time_series_small_example.png" max-width="1200px" caption="Time series" >}}
|
||||
Time series visualizations are the default and primary way to visualize data points over intervals of time as a graph. They can render series as lines, points, or bars. They're versatile enough to display almost any time-series data.
|
||||
|
||||
Time series visualizations are the default and primary way to visualize time series data as a graph. They can render series as lines, points, or bars. They're versatile enough to display almost any time-series data.
|
||||
{{< figure src="/static/img/docs/time-series-panel/time_series_small_example.png" max-width="1200px" alt="Time series" >}}
|
||||
|
||||
{{% admonition type="note" %}}
|
||||
You can [link alert rules](ref:link-alert) to time series visualization to observe when alerts fire and are resolved in the form of annotations. In addition, you can create alert rules from the Alert tab within the panel options.
|
||||
At the moment, alerts are only supported in the time series and [alert list](ref:alert-list) visualizations.
|
||||
{{% /admonition %}}
|
||||
|
||||
{{% admonition type="note" %}}
|
||||
{{< admonition type="note" >}}
|
||||
You can migrate from the old Graph visualization to the new time series visualization. To migrate, open the panel and click the **Migrate** button in the side pane.
|
||||
{{% /admonition %}}
|
||||
{{< /admonition >}}
|
||||
|
||||
## 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:
|
||||
|
||||
@@ -90,19 +79,110 @@ The following video guides you through the creation steps and common customizati
|
||||
|
||||
{{< docs/play title="Time Series Visualizations in Grafana" url="https://play.grafana.org/d/000000016/" >}}
|
||||
|
||||
## Panel options
|
||||
## Supported data formats
|
||||
|
||||
Time series visualizations require time series data; that is a sequence of measurements, ordered in time, 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/<GRAFANA_VERSION>/fundamentals/timeseries/).
|
||||
|
||||
## Alert rules
|
||||
|
||||
You can [link alert rules](ref:link-alert) to time series visualizations to observe when alerts fire and are resolved in the form of annotations. In addition, you can create alert rules from the **Alert** tab within the panel editor.
|
||||
|
||||
## Transform override property
|
||||
|
||||
Use the **Transform** override property to transform series values without affecting the values shown in the tooltip, context menu, or legend.
|
||||
|
||||
<!-- add more information about how to access this property -->
|
||||
|
||||
- **Negative Y transform:** Flip the results to negative values on the Y axis.
|
||||
- **Constant:** Show the first value as a constant line.
|
||||
|
||||
{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="<GRAFANA_VERSION>" leveloffset="+1" >}}
|
||||
|
||||
<!-- update shared filed above to add actual steps for adding this override -->
|
||||
|
||||
## Add the Fill below to override
|
||||
|
||||
The **Fill below to** option fills the area between two series. This option is only available as a series/field override.
|
||||
|
||||
1. Edit the panel and click **Overrides**.
|
||||
1. Select the fields to fill below.
|
||||
1. In **Add override property**, select **Fill below to**.
|
||||
1. Select the series for which you want the fill to stop.
|
||||
|
||||
The following example shows three series: Min, Max, and Value. The Min and Max series have **Line width** set to 0. Max has a **Fill below to** override set to Min, which fills the area between Max and Min with the Max line color.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/fill-below-to-7-4.png" max-width="600px" alt="Fill below to example" >}}
|
||||
|
||||
## Configuration options
|
||||
|
||||
### Panel options
|
||||
|
||||
{{< docs/shared lookup="visualizations/panel-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
## Tooltip options
|
||||
### Tooltip options
|
||||
|
||||
{{< docs/shared lookup="visualizations/tooltip-options-2.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
{{< docs/shared lookup="visualizations/tooltip-options-2.md" source="grafana" version="<GRAFANA_VERSION>" leveloffset="+1">}}
|
||||
|
||||
## Legend options
|
||||
### Legend options
|
||||
|
||||
{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
{{< docs/shared lookup="visualizations/legend-options-1.md" source="grafana" version="<GRAFANA_VERSION>" leveloffset="+1" >}}
|
||||
|
||||
## Graph styles
|
||||
### Axis options
|
||||
|
||||
Options under the axis category change how the x- and y-axes are rendered. Some options do not take effect until you click outside of the field option box you are editing. You can also or press `Enter`.
|
||||
|
||||
| Option | Description |
|
||||
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Time zone | Set the desired time zone(s) to display along the x-axis. |
|
||||
| [Placement](#placement) | Select the placement of the y-axis. |
|
||||
| Label | Set a y-axis text label. If you have more than one y-axis, then you can assign different labels using an override. |
|
||||
| Width | Set a fixed width of the axis. By default, Grafana dynamically calculates the width of an axis. By setting the width of the axis, data with different axes types can share the same display proportions. This setting makes it easier for you to compare more than one graph’s worth of data because the axes are not shifted or stretched within visual proximity to each other. |
|
||||
| Show grid lines | Set the axis grid line visibility.<br> |
|
||||
| Color | Set the color of the axis. |
|
||||
| Show border | Set the axis border visibility. |
|
||||
| Scale | Set the y-axis values scale.<br> |
|
||||
| Centered zero | Set the y-axis to be centered on zero. |
|
||||
| [Soft min](#soft-min-and-soft-max) | Set a soft min to better control the y-axis limits. zero. |
|
||||
| [Soft max](#soft-min-and-soft-max) | Set a soft max to better control the y-axis limits. zero. |
|
||||
|
||||
#### Placement
|
||||
|
||||
Select the placement of the y-axis.
|
||||
|
||||
- **Auto:** Automatically assigns the y-axis to the series. When there are two or more series with different units, Grafana assigns the left axis to the first unit and the right axis to the units that follow.
|
||||
- **Left:** Display all y-axes on the left side.
|
||||
- **Right:** Display all y-axes on the right side.
|
||||
- **Hidden:** Hide all axes. To selectively hide axes, [Add a field override](ref:add-a-field-override) that targets specific fields.
|
||||
|
||||
#### Soft min and soft max
|
||||
|
||||
Set a **Soft min** or **soft max** option for better control of y-axis limits. By default, Grafana sets the range for the y-axis automatically based on the dataset.
|
||||
|
||||
**Soft min** and **soft max** settings can prevent small variations in the data from being magnified when it's mostly flat. In contrast, hard min and max values help prevent obscuring useful detail in the data by clipping intermittent spikes past a specific point.
|
||||
|
||||
To define hard limits of the y-axis, set standard min/max options. For more information, refer to [Configure standard options](ref:configure-standard-options).
|
||||
|
||||

|
||||
|
||||
### Graph styles options
|
||||
|
||||
| Option | Description |
|
||||
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [Style](#style) | Use this option to define how to display your time series data. |
|
||||
| [Line interpolation](#line-interpolation) | This option controls how the graph interpolates the series line. |
|
||||
| [Line width](#line-width) | Line width is a slider that controls the thickness for series lines or the outline for bars. |
|
||||
| [Fill opacity](#fill-opacity) | Use opacity to specify the series area fill color. |
|
||||
| [Gradient mode](#gradient-mode) | Gradient mode specifies the gradient fill, which is based on the series color. |
|
||||
| [Line style](#line-style) | Set the style of the line. |
|
||||
| [Connect null values](#connect-null-values) | Choose how null values, which are gaps in the data, appear on the graph. |
|
||||
| [Disconnect values](#disconnect-values) | Choose whether to set a threshold above which values in the data should be disconnected. |
|
||||
| [Show points](#show-points) | You can configure your visualization to add points to lines or bars. |
|
||||
| Point size | Set the size of the points, from 1 to 40 pixels in diameter. |
|
||||
| [Stack series](#stack-series) | Stacking allows Grafana to display series on top of each other. |
|
||||
| [Bar alignment](#bar-alignment) | Set the position of the bar relative to a data point. |
|
||||
| Bar width factor | Set the width of the bar relative to minimum space between data points. A factor of 0.5 means that the bars take up half of the available space between data points. A factor of 1.0 means that the bars take up all available space. |
|
||||
|
||||
#### Style
|
||||
|
||||
Use this option to define how to display your time series data. You can use overrides to combine multiple styles in the same graph.
|
||||
|
||||
@@ -112,30 +192,26 @@ Use this option to define how to display your time series data. You can use over
|
||||
|
||||

|
||||
|
||||
### Bar alignment
|
||||
#### Line interpolation
|
||||
|
||||
Set the position of the bar relative to a data point. In the examples below, **Show points** is set to **Always** which makes it easier to see the difference this setting makes. The points do not change; the bars change in relationship to the points.
|
||||
This option controls how the graph interpolates the series line.
|
||||
|
||||
- **Before** 
|
||||
The bar is drawn before the point. The point is placed on the trailing corner of the bar.
|
||||
- **Center** 
|
||||
The bar is drawn around the point. The point is placed in the center of the bar. This is the default.
|
||||
- **After** 
|
||||
The bar is drawn after the point. The point is placed on the leading corner of the bar.
|
||||
- **Linear:** Points are joined by straight lines.
|
||||
- **Smooth:** Points are joined by curved lines that smooths transitions between points.
|
||||
- **Step before:** The line is displayed as steps between points. Points are rendered at the end of the step.
|
||||
- **Step after:** The line is displayed as steps between points. Points are rendered at the beginning of the step.
|
||||
|
||||
### Line width
|
||||
#### Line width
|
||||
|
||||
Line width is a slider that controls the thickness for series lines or the outline for bars.
|
||||
|
||||

|
||||
|
||||
### Fill opacity
|
||||
#### Fill opacity
|
||||
|
||||
Use opacity to specify the series area fill color.
|
||||
|
||||

|
||||
|
||||
### Gradient mode
|
||||
#### Gradient mode
|
||||
|
||||
Gradient mode specifies the gradient fill, which is based on the series color. To change the color, use the standard color scheme field option. For more information, refer to [Color scheme](ref:color-scheme).
|
||||
|
||||
@@ -148,56 +224,53 @@ Gradient appearance is influenced by the **Fill opacity** setting. The following
|
||||
|
||||

|
||||
|
||||
### Show points
|
||||
##### Scheme gradient mode
|
||||
|
||||
You can configure your visualization to add points to lines or bars.
|
||||
The **Gradient mode** option located under the **Graph styles** has a mode named **Scheme**. When you enable **Scheme**, the line or bar receives a gradient color defined from the selected **Color scheme**.
|
||||
|
||||
- **Auto:** Grafana determines to show or not to show points based on the density of the data. If the density is low, then points appear.
|
||||
- **Always:** Show the points regardless of how dense the data set is.
|
||||
- **Never:** Do not show points.
|
||||
###### From thresholds
|
||||
|
||||
### Point size
|
||||
If the **Color scheme** is set to **From thresholds (by value)** and **Gradient mode** is set to **Scheme**, then the line or bar color changes as they cross the defined thresholds.
|
||||
|
||||
Set the size of the points, from 1 to 40 pixels in diameter.
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_thresholds_line.png" max-width="1200px" alt="Colors scheme: From thresholds" >}}
|
||||
|
||||
### Line interpolation
|
||||
###### Gradient color schemes
|
||||
|
||||
This option controls how the graph interpolates the series line.
|
||||
The following image shows a line chart with the **Green-Yellow-Red (by value)** color scheme option selected.
|
||||
|
||||

|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_line.png" max-width="1200px" alt="Color scheme: Green-Yellow-Red" >}}
|
||||
|
||||
- **Linear:** Points are joined by straight lines.
|
||||
- **Smooth:** Points are joined by curved lines that smooths transitions between points.
|
||||
- **Step before:** The line is displayed as steps between points. Points are rendered at the end of the step.
|
||||
- **Step after:** The line is displayed as steps between points. Points are rendered at the beginning of the step.
|
||||
|
||||
### Line style
|
||||
#### Line style
|
||||
|
||||
Set the style of the line. To change the color, use the standard [color scheme](ref:color-scheme) field option.
|
||||
|
||||

|
||||
|
||||
- **Solid:** Display a solid line. This is the default setting.
|
||||
- **Dash:** Display a dashed line. When you choose this option, a list appears for you to select the length and gap (length, gap) for the line dashes. Dash spacing set to 10, 10 (default).
|
||||
- **Dots:** Display dotted lines. When you choose this option, a list appears for you to select the gap (length = 0, gap) for the dot spacing. Dot spacing set to 0, 10 (default)
|
||||
|
||||

|
||||
|
||||
{{< docs/shared lookup="visualizations/connect-null-values.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
{{< docs/shared lookup="visualizations/connect-null-values.md" source="grafana" version="<GRAFANA_VERSION>" leveloffset="+1" >}}
|
||||
|
||||
{{< docs/shared lookup="visualizations/disconnect-values.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
{{< docs/shared lookup="visualizations/disconnect-values.md" source="grafana" version="<GRAFANA_VERSION>" leveloffset="+1" >}}
|
||||
|
||||
### Stack series
|
||||
#### Show points
|
||||
|
||||
You can configure your visualization to add points to lines or bars.
|
||||
|
||||
- **Auto:** Grafana determines to show or not to show points based on the density of the data. If the density is low, then points appear.
|
||||
- **Always:** Show the points regardless of how dense the data set is.
|
||||
- **Never:** Do not show points.
|
||||
|
||||
#### Stack series
|
||||
|
||||
_Stacking_ allows Grafana to display series on top of each other. Be cautious when using stacking in the visualization as it can easily create misleading graphs. To read more about why stacking might not be the best approach, refer to [The issue with stacking](https://www.data-to-viz.com/caveat/stacking.html).
|
||||
|
||||

|
||||
|
||||
- **Off:** Turns off series stacking. When **Off**, all series share the same space in the visualization.
|
||||
- **Normal:** Stacks series on top of each other.
|
||||
- **100%:** Stack by percentage where all series add up to 100%.
|
||||
|
||||
#### Stack series in groups
|
||||
##### Stack series in groups
|
||||
|
||||
The stacking group option is only available as an override. For more information about creating an override, refer to [Configure field overrides](ref:configure-field-overrides).
|
||||
|
||||
@@ -208,159 +281,33 @@ The stacking group option is only available as an override. For more information
|
||||
|
||||
The stacking group name option is only available when you create an override.
|
||||
|
||||
### Fill below to
|
||||
#### Bar alignment
|
||||
|
||||
The **Fill below to** option fills the area between two series. This option is only available as a series/field override.
|
||||
Set the position of the bar relative to a data point. In the examples below, **Show points** is set to **Always** which makes it easier to see the difference this setting makes. The points do not change; the bars change in relationship to the points.
|
||||
|
||||
1. Edit the panel and click **Overrides**.
|
||||
1. Select the fields to fill below.
|
||||
1. In **Add override property**, select **Fill below to**.
|
||||
1. Select the series for which you want the fill to stop.
|
||||
- **Before** 
|
||||
The bar is drawn before the point. The point is placed on the trailing corner of the bar.
|
||||
- **Center** 
|
||||
The bar is drawn around the point. The point is placed in the center of the bar. This is the default.
|
||||
- **After** 
|
||||
The bar is drawn after the point. The point is placed on the leading corner of the bar.
|
||||
|
||||
The following example shows three series: Min, Max, and Value. The Min and Max series have **Line width** set to 0. Max has a **Fill below to** override set to Min, which fills the area between Max and Min with the Max line color.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/fill-below-to-7-4.png" max-width="600px" caption="Fill below to example" >}}
|
||||
|
||||
## Axis options
|
||||
|
||||
Options under the axis category change how the x- and y-axes are rendered. Some options do not take effect until you click outside of the field option box you are editing. You can also or press `Enter`.
|
||||
|
||||
### Time zone
|
||||
|
||||
Set the desired time zone(s) to display along the x-axis.
|
||||
|
||||
### Placement
|
||||
|
||||
Select the placement of the y-axis.
|
||||
|
||||
- **Auto:** Automatically assigns the y-axis to the series. When there are two or more series with different units, Grafana assigns the left axis to the first unit and the right axis to the units that follow.
|
||||
- **Left:** Display all y-axes on the left side.
|
||||
- **Right:** Display all y-axes on the right side.
|
||||
- **Hidden:** Hide all axes.
|
||||
|
||||
To selectively hide axes, [Add a field override](ref:add-a-field-override) that targets specific fields.
|
||||
|
||||
### Label
|
||||
|
||||
Set a y-axis text label. If you have more than one y-axis, then you can assign different labels using an override.
|
||||
|
||||
### Width
|
||||
|
||||
Set a fixed width of the axis. By default, Grafana dynamically calculates the width of an axis.
|
||||
|
||||
By setting the width of the axis, data with different axes types can share the same display proportions. This setting makes it easier for you to compare more than one graph’s worth of data because the axes are not shifted or stretched within visual proximity to each other.
|
||||
|
||||
### Show grid lines
|
||||
|
||||
Set the axis grid line visibility.
|
||||
|
||||
- **Auto:** Automatically show grid lines based on the density of the data.
|
||||
- **On:** Always show grid lines.
|
||||
- **Off:** Never show grid lines.
|
||||
|
||||
### Color
|
||||
|
||||
Set the color of the axis.
|
||||
|
||||
- **Text:** Set the color based on theme text color.
|
||||
- **Series:** Set the color based on the series color.
|
||||
|
||||
### Show border
|
||||
|
||||
Set the axis border visibility.
|
||||
|
||||
### Scale
|
||||
|
||||
Set the y-axis values scale.
|
||||
|
||||
- **Linear:** Divides the scale into equal parts.
|
||||
- **Logarithmic:** Use a logarithmic scale. When you select this option, a list appears for you to choose a binary (base 2) or common (base 10) logarithmic scale.
|
||||
- **Symlog:** Use a symmetrical logarithmic scale. When you select this option, a list appears for you to choose a binary (base 2) or common (base 10) logarithmic scale. The linear threshold option allows you to set the threshold at which the scale changes from linear to logarithmic.
|
||||
|
||||
### Centered zero
|
||||
|
||||
Set the y-axis to be centered on zero.
|
||||
|
||||
### Soft min and soft max
|
||||
|
||||
Set a **Soft min** or **soft max** option for better control of y-axis limits. By default, Grafana sets the range for the y-axis automatically based on the dataset.
|
||||
|
||||
**Soft min** and **soft max** settings can prevent small variations in the data from being magnified when it's mostly flat. In contrast, hard min and max values help prevent obscuring useful detail in the data by clipping intermittent spikes past a specific point.
|
||||
|
||||
To define hard limits of the y-axis, set standard min/max options. For more information, refer to [Configure standard options](ref:configure-standard-options).
|
||||
|
||||

|
||||
|
||||
### Transform
|
||||
|
||||
Use this option to transform the series values without affecting the values shown in the tooltip, context menu, or legend.
|
||||
|
||||
- **Negative Y transform:** Flip the results to negative values on the Y axis.
|
||||
- **Constant:** Show the first value as a constant line.
|
||||
|
||||
{{% admonition type="note" %}}
|
||||
The transform option is only available as an override.
|
||||
{{% /admonition %}}
|
||||
|
||||
{{< docs/shared lookup="visualizations/multiple-y-axes.md" source="grafana" version="<GRAFANA_VERSION>" leveloffset="+2" >}}
|
||||
|
||||
## Color options
|
||||
|
||||
By default, the graph uses the standard [Color scheme](ref:color-scheme) option to assign series colors. You can also use the legend to open the color picker by clicking the legend series color icon. Setting
|
||||
color this way automatically creates an override rule that set's a specific color for a specific series.
|
||||
|
||||
### Classic palette
|
||||
|
||||
The most common setup is to use the **Classic palette** for graphs. This scheme automatically assigns a color for each field or series based on its order. If the order of a field changes in your query, the color also changes. You can manually configure a color for a specific field using an override rule.
|
||||
|
||||
### Single color
|
||||
|
||||
Use this mode to specify a color. You can also click the colored line icon next to each series in the Legend to open the color picker. This automatically creates a new override that sets the color scheme to single color and the selected color.
|
||||
|
||||
### By value color schemes
|
||||
|
||||
If you select a by value color scheme like **From thresholds (by value)** or **Green-Yellow-Red (by value)**, the **Color series by** option appears. This option controls which value (Last, Min, Max) to use to assign the series its color.
|
||||
|
||||
### Scheme gradient mode
|
||||
|
||||
The **Gradient mode** option located under the **Graph styles** has a mode named **Scheme**. When you enable **Scheme**, the line or bar receives a gradient color defined from the selected **Color scheme**.
|
||||
|
||||
#### From thresholds
|
||||
|
||||
If the **Color scheme** is set to **From thresholds (by value)** and **Gradient mode** is set to **Scheme**, then the line or bar color changes as they cross the defined thresholds.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_thresholds_line.png" max-width="1200px" caption="Colors scheme: From thresholds" >}}
|
||||
|
||||
The following image shows bars mode enabled.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_thresholds_bars.png" max-width="1200px" caption="Color scheme: From thresholds" >}}
|
||||
|
||||
#### Gradient color schemes
|
||||
|
||||
The following image shows a line chart with the **Green-Yellow-Red (by value)** color scheme option selected.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_line.png" max-width="1200px" caption="Color scheme: Green-Yellow-Red" >}}
|
||||
|
||||
The following image shows a bar chart with the **Green-Yellow-Red (by value)** color scheme option selected.
|
||||
|
||||
{{< figure src="/static/img/docs/time-series-panel/gradient_mode_scheme_bars.png" max-width="1200px" caption="Color scheme: Green-Yellow-Red" >}}
|
||||
|
||||
## Standard options
|
||||
### Standard options
|
||||
|
||||
{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
## Data links
|
||||
### Data links
|
||||
|
||||
{{< docs/shared lookup="visualizations/datalink-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
## Value mappings
|
||||
### Value mappings
|
||||
|
||||
{{< docs/shared lookup="visualizations/value-mappings-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
## Thresholds
|
||||
### Thresholds
|
||||
|
||||
{{< docs/shared lookup="visualizations/thresholds-options-1.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
## Field overrides
|
||||
### Field overrides
|
||||
|
||||
{{< docs/shared lookup="visualizations/overrides-options.md" source="grafana" version="<GRAFANA_VERSION>" >}}
|
||||
|
||||
@@ -1982,7 +1982,7 @@ Depending on the value of `sampler_type`, the sampler configuration parameter ca
|
||||
|
||||
When `sampler_type` is `remote`, this specifies the URL of the sampling server. This can be used by all tracing providers.
|
||||
|
||||
Use a sampling server that supports the Jaeger remote sampling API, such as jaeger-agent, jaeger-collector, opentelemetry-collector-contrib, or [Grafana Agent](/oss/agent/).
|
||||
Use a sampling server that supports the Jaeger remote sampling API, such as jaeger-agent, jaeger-collector, opentelemetry-collector-contrib, or [Grafana Alloy](https://grafana.com/oss/alloy-opentelemetry-collector/).
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
@@ -51,7 +51,10 @@ Enable port `3000` in your network environment, as this is the Grafana default p
|
||||
|
||||
## Deploy Grafana OSS on Kubernetes
|
||||
|
||||
This section explains how to install Grafana OSS using Kubernetes. If you want to install Grafana Enterprise on Kubernetes, refer to [Deploy Grafana Enterprise on Kubernetes](#deploy-grafana-enterprise-on-kubernetes).
|
||||
This section explains how to install Grafana OSS using Kubernetes.
|
||||
{{% admonition type="note" %}}
|
||||
If you want to install Grafana Enterprise on Kubernetes, refer to [Deploy Grafana Enterprise on Kubernetes](#deploy-grafana-enterprise-on-kubernetes).
|
||||
{{% /admonition %}}
|
||||
|
||||
If you deploy an application in Kubernetes, it will use the default namespace which may already have other applications running. This can result in conflicts and other issues.
|
||||
|
||||
|
||||
20
docs/sources/shared/dashboards/time-range-URLs.md
Normal file
20
docs/sources/shared/dashboards/time-range-URLs.md
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: Time range URLs
|
||||
comments: |
|
||||
This file is used in the following files: dashboards/build-dashboards/create-dashboard-url-variables/index.md, dashboards/use-dashboards/index.md
|
||||
---
|
||||
|
||||
You can control the time range of a dashboard by providing the following query parameters in the dashboard URL:
|
||||
|
||||
- `from` - Defines the lower limit of the time range, specified in ms, epoch, or relative time.
|
||||
- `to` - Defines the upper limit of the time range, specified in ms, epoch, or relative time.
|
||||
- `time` and `time.window` - Defines a time range from `time-time.window/2` to `time+time.window/2`. Both parameters should be specified in `ms`. For example `?time=1500000000000&time.window=10000` results in a 10-second time range from 1499999995000 to 1500000005000`.
|
||||
- `timezone` - Defines the time zone. For example `timezone=Europe/Madrid`.
|
||||
|
||||
Since these aren't variables, they don't require the `var-` prefix.
|
||||
|
||||
The following example shows a dashboard with the time range of the last five minutes:
|
||||
|
||||
```
|
||||
https://${your-domain}/path/to/your/dashboard?from=now-5m&to=now
|
||||
```
|
||||
@@ -84,7 +84,7 @@ To use a basic configuration, follow these steps:
|
||||
If you have configured a Pyroscope data source and no profile data is available or the **Profiles for this span**
|
||||
button and the embedded flame graph isn't visible, verify that the `pyroscope.profile.id` key-value pair exists in your span tags.
|
||||
|
||||
## Configure a custom query
|
||||
## Configure a custom query {#configure-custom-query-traces-profiles}
|
||||
|
||||
To use a custom query with the configuration, follow these steps:
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@ title: Connect null values
|
||||
|
||||
Choose how null values, which are gaps in the data, appear on the graph. Null values can be connected to form a continuous line or set to a threshold above which gaps in the data are no longer connected.
|
||||
|
||||

|
||||
|
||||
- **Never:** Time series data points with gaps in the data are never connected.
|
||||
- **Always:** Time series data points with gaps in the data are always connected.
|
||||
- **Threshold:** Specify a threshold above which gaps in the data are no longer connected. This can be useful when the connected gaps in the data are of a known size and/or within a known range, and gaps outside this range should no longer be connected.
|
||||
|
||||
@@ -6,7 +6,5 @@ title: Disconnect values
|
||||
|
||||
Choose whether to set a threshold above which values in the data should be disconnected.
|
||||
|
||||
{{< figure src="/media/docs/grafana/screenshot-grafana-10-1-disconnect-values.png" max-width="750px" alt="Disconnect values options" >}}
|
||||
|
||||
- **Never:** Time series data points in the data are never disconnected.
|
||||
- **Threshold:** Specify a threshold above which values in the data are disconnected. This can be useful when desired values in the data are of a known size and/or within a known range, and values outside this range should no longer be connected.
|
||||
|
||||
@@ -8,28 +8,10 @@ comments: |
|
||||
|
||||
Legend options control the series names and statistics that appear under or to the right of the graph. For more information about the legend, refer to [Configure a legend](../configure-legend/).
|
||||
|
||||
### Visibility
|
||||
|
||||
Toggle the switch to turn the legend on or off.
|
||||
|
||||
### Mode
|
||||
|
||||
Use these settings to define how the legend appears in your visualization.
|
||||
|
||||
- **List -** Displays the legend as a list. This is a default display mode of the legend.
|
||||
- **Table -** Displays the legend as a table.
|
||||
|
||||
### Placement
|
||||
|
||||
Choose where to display the legend.
|
||||
|
||||
- **Bottom -** Below the graph.
|
||||
- **Right -** To the right of the graph.
|
||||
|
||||
#### Width
|
||||
|
||||
Control how wide the legend is when placed on the right side of the visualization. This option is only displayed if you set the legend placement to **Right**.
|
||||
|
||||
### Values
|
||||
|
||||
Choose which of the [standard calculations](../../query-transform-data/calculation-types/) to show in the legend. You can have more than one.
|
||||
| Option | Description |
|
||||
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Visibility | Toggle the switch to turn the legend on or off. |
|
||||
| Mode | Use these settings to define how the legend appears in your visualization. **List** displays the legend as a list. This is a default display mode of the legend. **Table** displays the legend as a table. |
|
||||
| Placement | Choose where to display the legend. **Bottom -** Below the graph. **Right -** To the right of the graph. |
|
||||
| Width | Control how wide the legend is when placed on the right side of the visualization. This option is only displayed if you set the legend placement to **Right**. |
|
||||
| Values | Choose which of the [standard calculations](../../query-transform-data/calculation-types/) to show in the legend. You can have more than one. |
|
||||
|
||||
@@ -8,10 +8,12 @@ Overrides allow you to customize visualization settings for specific fields or s
|
||||
|
||||
Choose from one the following override options:
|
||||
|
||||
- **Fields with name** - Select a field from the list of all available fields.
|
||||
- **Fields with name matching regex** - Specify fields to override with a regular expression.
|
||||
- **Fields with type** - Select fields by type, such as string, numeric, or time.
|
||||
- **Fields returned by query** - Select all fields returned by a specific query, such as A, B, or C.
|
||||
- **Fields with values** - Select all fields returned by your defined reducer condition, such as **Min**, **Max**, **Count**, **Total**.
|
||||
| Option | Description |
|
||||
| ------------------------------ | ------------------------------------------------------------------------------------------------------------- |
|
||||
| Fields with name | Select a field from the list of all available fields. |
|
||||
| Field with name matching regex | Specify fields to override with a regular expression. |
|
||||
| Fields with type | Select fields by type, such as string, numeric, or time. |
|
||||
| Fields returned by query | Select all fields returned by a specific query, such as A, B, or C. |
|
||||
| Fields with values | Select all fields returned by your defined reducer condition, such as **Min**, **Max**, **Count**, **Total**. |
|
||||
|
||||
To learn more, refer to [Configure field overrides](../../configure-overrides/).
|
||||
|
||||
@@ -8,12 +8,14 @@ comments: |
|
||||
|
||||
You can customize the following standard options:
|
||||
|
||||
- **Unit** - Choose which unit a field should use.
|
||||
- **Min**/**Max** - Set the minimum and maximum values used in percentage threshold calculations or leave these field empty for them to be calculated automatically.
|
||||
- **Field min/max** - Enable **Field min/max** to have Grafana calculate the min or max of each field individually, based on the minimum or maximum value of the field.
|
||||
- **Decimals** - Specify the number of decimals Grafana includes in the rendered value.
|
||||
- **Display name** - Set the display title of all fields. You can use variables in the field title.
|
||||
- **Color scheme** - Set single or multiple colors for your entire visualization.
|
||||
- **No value** - Enter what Grafana should display if the field value is empty or null. The default value is a hyphen (-).
|
||||
| Option | Description |
|
||||
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Unit | Choose which unit a field should use. |
|
||||
| Min/Max | Set the minimum and maximum values used in percentage threshold calculations or leave these field empty for them to be calculated automatically. |
|
||||
| Field min/max | Enable **Field min/max** to have Grafana calculate the min or max of each field individually, based on the minimum or maximum value of the field. |
|
||||
| Decimals | Specify the number of decimals Grafana includes in the rendered value. |
|
||||
| Display name | Set the display title of all fields. You can use variables in the field title. |
|
||||
| Color scheme | Set single or multiple colors for your entire visualization. |
|
||||
| No value | Enter what Grafana should display if the field value is empty or null. The default value is a hyphen (-). |
|
||||
|
||||
To learn more, refer to [Configure standard options](../../configure-standard-options/).
|
||||
|
||||
@@ -10,10 +10,10 @@ A threshold is a value or limit you set for a metric that’s reflected visually
|
||||
|
||||
Set the following options:
|
||||
|
||||
- **Value** - Set the value for each threshold.
|
||||
- **Thresholds mode** - Choose from:
|
||||
- **Absolute**
|
||||
- **Percentage**
|
||||
- **Show thresholds** - Choose from a variety of display options including not displaying thresholds at all.
|
||||
| Option | Description |
|
||||
| --------------- | ------------------------------------------------------------------------------------ |
|
||||
| Value | Set the value for each threshold. |
|
||||
| Thresholds mode | Choose from **Absolute** and **Percentage**. |
|
||||
| Show thresholds | Choose from a variety of display options including not displaying thresholds at all. |
|
||||
|
||||
To learn more, refer to [Configure thresholds](../../configure-thresholds/).
|
||||
|
||||
@@ -8,6 +8,14 @@ comments: |
|
||||
|
||||
Tooltip options control the information overlay that appears when you hover over data points in the visualization.
|
||||
|
||||
| Option | Description |
|
||||
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| [Tooltip mode](#tooltip-mode) | When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave. |
|
||||
| [Values sort order](#values-sort-order) | This option controls the order in which values are listed in a tooltip. |
|
||||
| [Hover proximity](#hover-proximity) | Set the hover proximity (in pixels) to control how close the cursor must be to a data point to trigger the tooltip to display. |
|
||||
| Max width | Set the maximum width of the tooltip box. |
|
||||
| Max height | Set the maximum height of the tooltip box. The default is 600 pixels. |
|
||||
|
||||
### Tooltip mode
|
||||
|
||||
When you hover your cursor over the visualization, Grafana can display tooltips. Choose how tooltips behave.
|
||||
@@ -31,11 +39,3 @@ When you set the **Tooltip mode** to **All**, the **Values sort order** option i
|
||||
Set the hover proximity (in pixels) to control how close the cursor must be to a data point to trigger the tooltip to display.
|
||||
|
||||

|
||||
|
||||
### Max width
|
||||
|
||||
Set the maximum width of the tooltip box.
|
||||
|
||||
### Max height
|
||||
|
||||
Set the maximum height of the tooltip box. The default is 600 pixels.
|
||||
|
||||
2
go.mod
2
go.mod
@@ -82,7 +82,7 @@ require (
|
||||
github.com/googleapis/gax-go/v2 v2.12.3 // @grafana/grafana-backend-group
|
||||
github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group
|
||||
github.com/gorilla/websocket v1.5.0 // @grafana/grafana-app-platform-squad
|
||||
github.com/grafana/alerting v0.0.0-20240606211712-071c8609797a // @grafana/alerting-backend
|
||||
github.com/grafana/alerting v0.0.0-20240712181403-02e012d6dd7f // @grafana/alerting-backend
|
||||
github.com/grafana/authlib v0.0.0-20240515154731-fe4779055ef4 // @grafana/identity-access-team
|
||||
github.com/grafana/codejen v0.0.3 // @grafana/dataviz-squad
|
||||
github.com/grafana/cuetsy v0.1.11 // @grafana/grafana-as-code
|
||||
|
||||
13
go.sum
13
go.sum
@@ -2278,6 +2278,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm
|
||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grafana/alerting v0.0.0-20240606211712-071c8609797a h1:MvrEgxNxmUqaFWkBtRlbgxStbdD8FcmtjlRp98bmMJU=
|
||||
github.com/grafana/alerting v0.0.0-20240606211712-071c8609797a/go.mod h1:U7Ta3K4T7jVgqGSYuPsfuPKHFiL2GbCZSHa3nHjmCos=
|
||||
github.com/grafana/alerting v0.0.0-20240712181403-02e012d6dd7f h1:YXJj/6K9tzTZFeUyf39Q/zFoHKUdmz+zLNZUIOzP8Do=
|
||||
github.com/grafana/alerting v0.0.0-20240712181403-02e012d6dd7f/go.mod h1:U7Ta3K4T7jVgqGSYuPsfuPKHFiL2GbCZSHa3nHjmCos=
|
||||
github.com/grafana/authlib v0.0.0-20240515154731-fe4779055ef4 h1:Bfa397TXkM0X97MhbCC+fNSwVtg21c0Mg5STes1dRug=
|
||||
github.com/grafana/authlib v0.0.0-20240515154731-fe4779055ef4/go.mod h1:86rRD5P6u2JPWtNWTMOlqlU+YMv2fUvVz/DomA6L7w4=
|
||||
github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw=
|
||||
@@ -2352,6 +2354,7 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
|
||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||
github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok=
|
||||
github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc=
|
||||
@@ -2709,6 +2712,7 @@ github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4
|
||||
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
@@ -3071,6 +3075,7 @@ github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr
|
||||
github.com/segmentio/encoding v0.3.6 h1:E6lVLyDPseWEulBmCmAKPanDd3jiyGDo5gMcugCRwZQ=
|
||||
github.com/segmentio/encoding v0.3.6/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM=
|
||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
|
||||
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
|
||||
github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
|
||||
@@ -3190,6 +3195,7 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
|
||||
github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM=
|
||||
github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0=
|
||||
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
|
||||
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
|
||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs=
|
||||
@@ -3312,12 +3318,15 @@ go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFu
|
||||
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
|
||||
go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg=
|
||||
go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg=
|
||||
go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ=
|
||||
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
|
||||
go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.25.0/go.mod h1:h95q0LBGh7hlAC08X2DhSeyIG02YQ0UyioTCVAqRPmc=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.25.0/go.mod h1:8GlBGcDk8KKi7n+2S4BT/CPZQYH3erLu0/k64r1MYgo=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0/go.mod h1:e7ciERRhZaOZXVjx5MiL8TK5+Xv7G5Gv5PA2ZDEJdL8=
|
||||
go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o=
|
||||
go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
|
||||
@@ -3327,11 +3336,13 @@ go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms
|
||||
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
|
||||
go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s=
|
||||
go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik=
|
||||
go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak=
|
||||
go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ=
|
||||
go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
|
||||
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
|
||||
go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw=
|
||||
go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI=
|
||||
go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A=
|
||||
go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY=
|
||||
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
|
||||
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
|
||||
@@ -3340,12 +3351,14 @@ go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5Ukgg
|
||||
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
|
||||
go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I=
|
||||
go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw=
|
||||
go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||
go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
|
||||
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
||||
go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
|
||||
29
go.work.sum
29
go.work.sum
@@ -297,6 +297,8 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1
|
||||
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
|
||||
github.com/OneOfOne/xxhash v1.2.6 h1:U68crOE3y3MPttCMQGywZOLrTeF5HHJ3/vDBCJn9/bA=
|
||||
github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q=
|
||||
github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
|
||||
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
|
||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
|
||||
github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0=
|
||||
@@ -310,6 +312,8 @@ github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSd
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc=
|
||||
github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw=
|
||||
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
|
||||
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
|
||||
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM=
|
||||
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8=
|
||||
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw=
|
||||
@@ -320,8 +324,14 @@ github.com/alecthomas/kong v0.2.11/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QL
|
||||
github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4=
|
||||
github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
||||
github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0=
|
||||
github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM=
|
||||
github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70=
|
||||
github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw=
|
||||
github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI=
|
||||
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
|
||||
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
|
||||
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
|
||||
github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
|
||||
github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI=
|
||||
github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM=
|
||||
@@ -349,6 +359,8 @@ github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQ
|
||||
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
|
||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
|
||||
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
|
||||
github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs=
|
||||
github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0=
|
||||
github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s=
|
||||
github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA=
|
||||
github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw=
|
||||
@@ -394,6 +406,8 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI=
|
||||
github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
|
||||
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
|
||||
github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo=
|
||||
github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4=
|
||||
github.com/cristalhq/hedgedhttp v0.9.1 h1:g68L9cf8uUyQKQJwciD0A1Vgbsz+QgCjuB1I8FAsCDs=
|
||||
@@ -529,7 +543,6 @@ github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfE
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4=
|
||||
github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 h1:EcQR3gusLHN46TAD+G+EbaaqJArt5vHhNpXAa12PQf4=
|
||||
github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
|
||||
github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
|
||||
@@ -551,9 +564,6 @@ github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
|
||||
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
|
||||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||
github.com/grafana/authlib v0.0.0-20240319083410-9d4a6e3861e5/go.mod h1:86rRD5P6u2JPWtNWTMOlqlU+YMv2fUvVz/DomA6L7w4=
|
||||
github.com/grafana/dataplane/sdata v0.0.7 h1:CImITypIyS1jxijCR6xqKx71JnYAxcwpH9ChK0gH164=
|
||||
github.com/grafana/dataplane/sdata v0.0.7/go.mod h1:Jvs5ddpGmn6vcxT7tCTWAZ1mgi4sbcdFt9utQx5uMAU=
|
||||
github.com/grafana/e2e v0.1.1-0.20221018202458-cffd2bb71c7b h1:Ha+kSIoTutf4ytlVw/SaEclDUloYx0+FXDKJWKhNbE4=
|
||||
github.com/grafana/e2e v0.1.1-0.20221018202458-cffd2bb71c7b/go.mod h1:3UsooRp7yW5/NJQBlXcTsAHOoykEhNUYXkQ3r6ehEEY=
|
||||
github.com/grafana/grafana-plugin-sdk-go v0.212.0/go.mod h1:qsI4ktDf0lig74u8SLPJf9zRdVxWV/W4Wi+Ox6gifgs=
|
||||
@@ -579,8 +589,6 @@ github.com/hanwen/go-fuse/v2 v2.1.0 h1:+32ffteETaLYClUj0a3aHjZ1hOPxxaNEHiZiujuDa
|
||||
github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU=
|
||||
github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8=
|
||||
github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||
github.com/hashicorp/go-hclog v0.16.1 h1:IVQwpTGNRRIHafnTs2dQLIk4ENtneRIEEJWOVDqz99o=
|
||||
github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||
github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE=
|
||||
github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
@@ -655,6 +663,8 @@ github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIR
|
||||
github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA=
|
||||
github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw=
|
||||
github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8=
|
||||
github.com/kevinmbeaulieu/eq-go v1.0.0 h1:AQgYHURDOmnVJ62jnEk0W/7yFKEn+Lv8RHN6t7mB0Zo=
|
||||
github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM=
|
||||
github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY=
|
||||
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
|
||||
github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY=
|
||||
@@ -687,6 +697,8 @@ github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFe
|
||||
github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk=
|
||||
github.com/logrusorgru/aurora/v3 v3.0.0 h1:R6zcoZZbvVcGMvDCKo45A9U/lzYyzl5NfYIvznmDfE4=
|
||||
github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||
github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M=
|
||||
@@ -699,6 +711,8 @@ github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2 h1:JgVTCPf0uBVcUSW
|
||||
github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI=
|
||||
github.com/matryer/moq v0.3.1 h1:kLDiBJoGcusWS2BixGyTkF224aSCD8nLY24tj/NcTCs=
|
||||
github.com/matryer/moq v0.3.1/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s=
|
||||
github.com/matryer/moq v0.3.3 h1:pScMH9VyrdT4S93yiLpVyU8rCDqGQr24uOyBxmktG5Q=
|
||||
github.com/matryer/moq v0.3.3/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s=
|
||||
github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs=
|
||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
|
||||
@@ -865,6 +879,7 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
|
||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
|
||||
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
|
||||
github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0=
|
||||
github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw=
|
||||
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
|
||||
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
|
||||
@@ -887,7 +902,6 @@ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+
|
||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||
github.com/vburenin/ifacemaker v1.2.1 h1:3Vq8B/bfBgjWTkv+jDg4dVL1KHt3k1K4lO7XRxYA2sk=
|
||||
github.com/vectordotdev/go-datemath v0.1.1-0.20220323213446-f3954d0b18ae/go.mod h1:PnwzbSst7KD3vpBzzlntZU5gjVa455Uqa5QPiKSYJzQ=
|
||||
github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d h1:3wDi6J5APMqaHBVPuVd7RmHD2gRTfqbdcVSpCNoUWtk=
|
||||
github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d/go.mod h1:mb5taDqMnJiZNRQ3+02W2IFG+oEz1+dTuCXkp4jpkfo=
|
||||
github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
|
||||
@@ -1020,7 +1034,6 @@ k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1
|
||||
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
|
||||
k8s.io/kms v0.29.0/go.mod h1:mB0f9HLxRXeXUfHfn1A7rpwOlzXI1gIWu86z6buNoYA=
|
||||
k8s.io/kube-openapi v0.0.0-20231214164306-ab13479f8bf8/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
|
||||
k8s.io/kube-openapi v0.0.0-20240220201932-37d671a357a5/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw=
|
||||
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
|
||||
rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE=
|
||||
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
|
||||
"npmClient": "yarn",
|
||||
"version": "11.1.1"
|
||||
"version": "11.1.4"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"license": "AGPL-3.0-only",
|
||||
"private": true,
|
||||
"name": "grafana",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"repository": "github:grafana/grafana",
|
||||
"scripts": {
|
||||
"build": "NODE_ENV=production nx exec --verbose -- webpack --config scripts/webpack/webpack.prod.js",
|
||||
@@ -63,7 +63,7 @@
|
||||
"generate-apis": "rtk-query-codegen-openapi ./scripts/generate-rtk-apis.ts"
|
||||
},
|
||||
"grafana": {
|
||||
"whatsNewUrl": "https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v11-0/",
|
||||
"whatsNewUrl": "https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v11-1/",
|
||||
"releaseNotesUrl": "https://grafana.com/docs/grafana/next/release-notes/"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
"name": "@grafana/data",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana Data Library",
|
||||
"keywords": [
|
||||
"typescript"
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@braintree/sanitize-url": "7.0.1",
|
||||
"@grafana/schema": "11.1.1",
|
||||
"@grafana/schema": "11.1.4",
|
||||
"@types/d3-interpolate": "^3.0.0",
|
||||
"@types/string-hash": "1.1.3",
|
||||
"d3-interpolate": "3.0.1",
|
||||
|
||||
@@ -192,4 +192,5 @@ export interface FeatureToggles {
|
||||
alertingCentralAlertHistory?: boolean;
|
||||
pluginProxyPreserveTrailingSlash?: boolean;
|
||||
azureMonitorPrometheusExemplars?: boolean;
|
||||
prometheusAzureOverrideAudience?: boolean;
|
||||
}
|
||||
|
||||
@@ -10,22 +10,3 @@
|
||||
export const isEmptyObject = (value: unknown): value is Record<string, never> => {
|
||||
return typeof value === 'object' && value !== null && Object.keys(value).length === 0;
|
||||
};
|
||||
|
||||
/** Stringifies an object that may contain circular references */
|
||||
export function safeStringifyValue(value: unknown) {
|
||||
const getCircularReplacer = () => {
|
||||
const seen = new WeakSet();
|
||||
return (_: string, value: object | null) => {
|
||||
if (typeof value === 'object' && value !== null) {
|
||||
if (seen.has(value)) {
|
||||
return;
|
||||
}
|
||||
seen.add(value);
|
||||
}
|
||||
|
||||
return value;
|
||||
};
|
||||
};
|
||||
|
||||
return JSON.stringify(value, getCircularReplacer());
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
"name": "@grafana/e2e-selectors",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana End-to-End Test Selectors Library",
|
||||
"keywords": [
|
||||
"cli",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@grafana/eslint-plugin",
|
||||
"description": "ESLint rules for use within the Grafana repo. Not suitable (or supported) for external use.",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"main": "./index.cjs",
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
"name": "@grafana/flamegraph",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana flamegraph visualization component",
|
||||
"keywords": [
|
||||
"grafana",
|
||||
@@ -44,8 +44,8 @@
|
||||
],
|
||||
"dependencies": {
|
||||
"@emotion/css": "11.11.2",
|
||||
"@grafana/data": "11.1.1",
|
||||
"@grafana/ui": "11.1.1",
|
||||
"@grafana/data": "11.1.4",
|
||||
"@grafana/ui": "11.1.4",
|
||||
"@leeoniya/ufuzzy": "1.0.14",
|
||||
"d3": "^7.8.5",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@grafana/saga-icons",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"private": true,
|
||||
"description": "Icons for Grafana",
|
||||
"author": "Grafana Labs",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"license": "AGPL-3.0-only",
|
||||
"name": "@grafana/o11y-ds-frontend",
|
||||
"private": true,
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Library to manage traces in Grafana.",
|
||||
"sideEffects": false,
|
||||
"repository": {
|
||||
@@ -18,12 +18,12 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@emotion/css": "11.11.2",
|
||||
"@grafana/data": "11.1.1",
|
||||
"@grafana/e2e-selectors": "11.1.1",
|
||||
"@grafana/data": "11.1.4",
|
||||
"@grafana/e2e-selectors": "11.1.4",
|
||||
"@grafana/experimental": "1.7.11",
|
||||
"@grafana/runtime": "11.1.1",
|
||||
"@grafana/schema": "11.1.1",
|
||||
"@grafana/ui": "11.1.1",
|
||||
"@grafana/runtime": "11.1.4",
|
||||
"@grafana/schema": "11.1.4",
|
||||
"@grafana/ui": "11.1.4",
|
||||
"react-select": "5.8.0",
|
||||
"react-use": "17.5.0",
|
||||
"rxjs": "7.8.1",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "@grafana/plugin-configs",
|
||||
"description": "Shared dependencies and files for core plugins",
|
||||
"private": true,
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"dependencies": {
|
||||
"tslib": "2.6.3"
|
||||
},
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "AGPL-3.0-only",
|
||||
"name": "@grafana/prometheus",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana Prometheus Library",
|
||||
"keywords": [
|
||||
"typescript"
|
||||
@@ -38,12 +38,12 @@
|
||||
"dependencies": {
|
||||
"@emotion/css": "11.11.2",
|
||||
"@floating-ui/react": "0.26.16",
|
||||
"@grafana/data": "11.1.1",
|
||||
"@grafana/data": "11.1.4",
|
||||
"@grafana/experimental": "1.7.11",
|
||||
"@grafana/faro-web-sdk": "1.7.3",
|
||||
"@grafana/runtime": "11.1.1",
|
||||
"@grafana/schema": "11.1.1",
|
||||
"@grafana/ui": "11.1.1",
|
||||
"@grafana/runtime": "11.1.4",
|
||||
"@grafana/schema": "11.1.4",
|
||||
"@grafana/ui": "11.1.4",
|
||||
"@leeoniya/ufuzzy": "1.0.14",
|
||||
"@lezer/common": "1.2.1",
|
||||
"@lezer/highlight": "1.2.0",
|
||||
@@ -76,7 +76,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@emotion/eslint-plugin": "11.11.0",
|
||||
"@grafana/e2e-selectors": "11.1.1",
|
||||
"@grafana/e2e-selectors": "11.1.4",
|
||||
"@grafana/tsconfig": "^1.3.0-rc1",
|
||||
"@rollup/plugin-image": "3.0.3",
|
||||
"@rollup/plugin-node-resolve": "15.2.3",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
"name": "@grafana/runtime",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana Runtime Library",
|
||||
"keywords": [
|
||||
"grafana",
|
||||
@@ -37,11 +37,11 @@
|
||||
"postpack": "mv package.json.bak package.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@grafana/data": "11.1.1",
|
||||
"@grafana/e2e-selectors": "11.1.1",
|
||||
"@grafana/data": "11.1.4",
|
||||
"@grafana/e2e-selectors": "11.1.4",
|
||||
"@grafana/faro-web-sdk": "^1.3.6",
|
||||
"@grafana/schema": "11.1.1",
|
||||
"@grafana/ui": "11.1.1",
|
||||
"@grafana/schema": "11.1.4",
|
||||
"@grafana/ui": "11.1.4",
|
||||
"history": "4.10.1",
|
||||
"lodash": "4.17.21",
|
||||
"rxjs": "7.8.1",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
"name": "@grafana/schema",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana Schema Library",
|
||||
"keywords": [
|
||||
"typescript"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
limit: number;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip, common.OptionsWithTextFormatting {
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends common.SingleStatBaseOptions {
|
||||
displayMode: common.BarGaugeDisplayMode;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export enum VizDisplayMode {
|
||||
Candles = 'candles',
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as ui from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export enum HorizontalConstraint {
|
||||
Center = 'center',
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface MetricStat {
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
selectedSeries: number;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export type UpdateConfig = {
|
||||
render: boolean,
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export type BucketAggregation = (DateHistogram | Histogram | Terms | Filters | GeoHashGrid | Nested);
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends common.SingleStatBaseOptions {
|
||||
minVizHeight: number;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as ui from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
basemap: ui.MapLayerOptions;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as ui from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
/**
|
||||
* Controls the color mode of the heatmap
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip {
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
dedupStrategy: common.LogsDedupStrategy;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export enum QueryEditorMode {
|
||||
Builder = 'builder',
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface ArcOption {
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
/**
|
||||
* Select the pie chart display style.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends common.SingleStatBaseOptions {
|
||||
colorMode: common.BigValueColorMode;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as ui from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as ui from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as ui from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options {
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
//
|
||||
// Run 'make gen-cue' from repository root to regenerate.
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export enum TextMode {
|
||||
Code = 'code',
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
export interface Options extends common.OptionsWithTimezones {
|
||||
legend: common.VizLegendOptions;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
/**
|
||||
* Identical to timeseries... except it does not have timezone settings
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import * as common from '@grafana/schema';
|
||||
|
||||
export const pluginVersion = "11.1.1";
|
||||
export const pluginVersion = "11.1.4";
|
||||
|
||||
/**
|
||||
* Auto is "table" in the UI
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"license": "AGPL-3.0-only",
|
||||
"private": true,
|
||||
"name": "@grafana/sql",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://github.com/grafana/grafana.git",
|
||||
@@ -15,11 +15,11 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@emotion/css": "11.11.2",
|
||||
"@grafana/data": "11.1.1",
|
||||
"@grafana/e2e-selectors": "11.1.1",
|
||||
"@grafana/data": "11.1.4",
|
||||
"@grafana/e2e-selectors": "11.1.4",
|
||||
"@grafana/experimental": "1.7.11",
|
||||
"@grafana/runtime": "11.1.1",
|
||||
"@grafana/ui": "11.1.1",
|
||||
"@grafana/runtime": "11.1.4",
|
||||
"@grafana/ui": "11.1.4",
|
||||
"@react-awesome-query-builder/ui": "6.5.2",
|
||||
"immutable": "4.3.6",
|
||||
"lodash": "4.17.21",
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"author": "Grafana Labs",
|
||||
"license": "Apache-2.0",
|
||||
"name": "@grafana/ui",
|
||||
"version": "11.1.1",
|
||||
"version": "11.1.4",
|
||||
"description": "Grafana Components Library",
|
||||
"keywords": [
|
||||
"grafana",
|
||||
@@ -50,10 +50,10 @@
|
||||
"@emotion/css": "11.11.2",
|
||||
"@emotion/react": "11.11.4",
|
||||
"@floating-ui/react": "0.26.16",
|
||||
"@grafana/data": "11.1.1",
|
||||
"@grafana/e2e-selectors": "11.1.1",
|
||||
"@grafana/data": "11.1.4",
|
||||
"@grafana/e2e-selectors": "11.1.4",
|
||||
"@grafana/faro-web-sdk": "^1.3.6",
|
||||
"@grafana/schema": "11.1.1",
|
||||
"@grafana/schema": "11.1.4",
|
||||
"@leeoniya/ufuzzy": "1.0.14",
|
||||
"@monaco-editor/react": "4.6.0",
|
||||
"@popperjs/core": "2.11.8",
|
||||
|
||||
@@ -60,11 +60,7 @@ export const CustomScrollbar = ({
|
||||
}
|
||||
}, [ref, scrollRefCallback]);
|
||||
|
||||
useEffect(() => {
|
||||
if (ref.current && scrollTop != null) {
|
||||
ref.current.scrollTop(scrollTop);
|
||||
}
|
||||
}, [scrollTop]);
|
||||
useScrollTop(ref.current, scrollTop);
|
||||
|
||||
/**
|
||||
* Special logic for doing a update a few milliseconds after mount to check for
|
||||
@@ -216,3 +212,21 @@ const getStyles = (theme: GrafanaTheme2) => {
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Calling scrollTop on a scrollbar ref in a useEffect can race with internal state in react-custom-scrollbars-2, causing scrollTop to get called on a stale reference, which prevents the element from scrolling as desired.
|
||||
* Adding the reference to the useEffect dependency array not notify react that the reference has changed (and is an eslint violation), so we create a custom hook so updates to the reference trigger another render, fixing the race condition bug.
|
||||
*
|
||||
* @param scrollBar
|
||||
* @param scrollTop
|
||||
*/
|
||||
function useScrollTop(
|
||||
scrollBar: (Scrollbars & { view: HTMLDivElement; update: () => void }) | null,
|
||||
scrollTop?: number
|
||||
) {
|
||||
useEffect(() => {
|
||||
if (scrollBar && scrollTop != null) {
|
||||
scrollBar.scrollTop(scrollTop);
|
||||
}
|
||||
}, [scrollTop, scrollBar]);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { cx } from '@emotion/css';
|
||||
import { max } from 'lodash';
|
||||
import React, { RefCallback, useEffect, useMemo, useRef } from 'react';
|
||||
import React, { RefCallback, useLayoutEffect, useMemo, useRef } from 'react';
|
||||
import { MenuListProps } from 'react-select';
|
||||
import { FixedSizeList as List } from 'react-window';
|
||||
|
||||
@@ -51,6 +51,7 @@ const VIRTUAL_LIST_WIDTH_EXTRA = 36;
|
||||
export const VirtualizedSelectMenu = ({
|
||||
children,
|
||||
maxHeight,
|
||||
innerRef: scrollRef,
|
||||
options,
|
||||
focusedOption,
|
||||
}: MenuListProps<SelectableValue>) => {
|
||||
@@ -70,7 +71,7 @@ export const VirtualizedSelectMenu = ({
|
||||
const focusedIndex = flattenedOptions.findIndex(
|
||||
(option: SelectableValue<unknown>) => option.value === focusedOption?.value
|
||||
);
|
||||
useEffect(() => {
|
||||
useLayoutEffect(() => {
|
||||
listRef.current?.scrollToItem(focusedIndex);
|
||||
}, [focusedIndex]);
|
||||
|
||||
@@ -98,6 +99,7 @@ export const VirtualizedSelectMenu = ({
|
||||
|
||||
return (
|
||||
<List
|
||||
outerRef={scrollRef}
|
||||
ref={listRef}
|
||||
className={styles.menu}
|
||||
height={heightEstimate}
|
||||
|
||||
@@ -80,6 +80,9 @@ export const RowsList = (props: RowsListProps) => {
|
||||
} = props;
|
||||
|
||||
const [rowHighlightIndex, setRowHighlightIndex] = useState<number | undefined>(initialRowIndex);
|
||||
if (initialRowIndex === undefined && rowHighlightIndex !== undefined) {
|
||||
setRowHighlightIndex(undefined);
|
||||
}
|
||||
|
||||
const theme = useTheme2();
|
||||
const panelContext = usePanelContext();
|
||||
|
||||
@@ -334,7 +334,7 @@ func (hs *HTTPServer) AdminEnableUser(c *contextmodel.ReqContext) response.Respo
|
||||
return response.Error(http.StatusInternalServerError, "Could not enable external user", nil)
|
||||
}
|
||||
|
||||
isDisabled := true
|
||||
isDisabled := false
|
||||
if err := hs.userService.Update(c.Req.Context(), &user.UpdateUserCommand{UserID: userID, IsDisabled: &isDisabled}); err != nil {
|
||||
if errors.Is(err, user.ErrUserNotFound) {
|
||||
return response.Error(http.StatusNotFound, user.ErrUserNotFound.Error(), nil)
|
||||
|
||||
@@ -19,11 +19,11 @@ import (
|
||||
glog "github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
"github.com/grafana/grafana/pkg/plugins"
|
||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/oauthtoken"
|
||||
pluginac "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginaccesscontrol"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/util"
|
||||
"github.com/grafana/grafana/pkg/util/proxyutil"
|
||||
@@ -341,12 +341,12 @@ func (proxy *DataSourceProxy) hasAccessToRoute(route *plugins.Route) bool {
|
||||
ctxLogger := logger.FromContext(proxy.ctx.Req.Context())
|
||||
useRBAC := proxy.features.IsEnabled(proxy.ctx.Req.Context(), featuremgmt.FlagAccessControlOnCall) && route.ReqAction != ""
|
||||
if useRBAC {
|
||||
routeEval := accesscontrol.EvalPermission(route.ReqAction)
|
||||
ok := routeEval.Evaluate(proxy.ctx.GetPermissions())
|
||||
if !ok {
|
||||
routeEval := pluginac.GetDataSourceRouteEvaluator(proxy.ds.UID, route.ReqAction)
|
||||
hasAccess := routeEval.Evaluate(proxy.ctx.GetPermissions())
|
||||
if !hasAccess {
|
||||
ctxLogger.Debug("plugin route is covered by RBAC, user doesn't have access", "route", proxy.ctx.Req.URL.Path, "action", route.ReqAction, "path", route.Path, "method", route.Method)
|
||||
}
|
||||
return ok
|
||||
return hasAccess
|
||||
}
|
||||
if route.ReqRole.IsValid() {
|
||||
if hasUserRole := proxy.ctx.HasUserRole(route.ReqRole); !hasUserRole {
|
||||
|
||||
@@ -108,9 +108,18 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
|
||||
Path: "mypath",
|
||||
URL: "https://example.com/api/v1/",
|
||||
},
|
||||
{
|
||||
Path: "api/rbac-home",
|
||||
ReqAction: "datasources:read",
|
||||
},
|
||||
{
|
||||
Path: "api/rbac-restricted",
|
||||
ReqAction: "test-app.settings:read",
|
||||
},
|
||||
}
|
||||
|
||||
ds := &datasources.DataSource{
|
||||
UID: "dsUID",
|
||||
JsonData: simplejson.NewFromAny(map[string]any{
|
||||
"clientId": "asd",
|
||||
"dynamicUrl": "https://dynamic.grafana.com",
|
||||
@@ -249,6 +258,51 @@ func TestDataSourceProxy_routeRule(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("plugin route with RBAC protection user is allowed", func(t *testing.T) {
|
||||
ctx, _ := setUp()
|
||||
ctx.SignedInUser.OrgID = int64(1)
|
||||
ctx.SignedInUser.OrgRole = org.RoleNone
|
||||
ctx.SignedInUser.Permissions = map[int64]map[string][]string{1: {"test-app.settings:read": nil}}
|
||||
proxy, err := setupDSProxyTest(t, ctx, ds, routes, "api/rbac-restricted")
|
||||
require.NoError(t, err)
|
||||
err = proxy.validateRequest()
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("plugin route with RBAC protection user is not allowed", func(t *testing.T) {
|
||||
ctx, _ := setUp()
|
||||
ctx.SignedInUser.OrgID = int64(1)
|
||||
ctx.SignedInUser.OrgRole = org.RoleNone
|
||||
ctx.SignedInUser.Permissions = map[int64]map[string][]string{1: {"test-app:read": nil}}
|
||||
proxy, err := setupDSProxyTest(t, ctx, ds, routes, "api/rbac-restricted")
|
||||
require.NoError(t, err)
|
||||
err = proxy.validateRequest()
|
||||
require.Error(t, err)
|
||||
})
|
||||
|
||||
t.Run("plugin route with dynamic RBAC protection user is allowed", func(t *testing.T) {
|
||||
ctx, _ := setUp()
|
||||
ctx.SignedInUser.OrgID = int64(1)
|
||||
ctx.SignedInUser.OrgRole = org.RoleNone
|
||||
ctx.SignedInUser.Permissions = map[int64]map[string][]string{1: {"datasources:read": {"datasources:uid:dsUID"}}}
|
||||
proxy, err := setupDSProxyTest(t, ctx, ds, routes, "api/rbac-home")
|
||||
require.NoError(t, err)
|
||||
err = proxy.validateRequest()
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("plugin route with dynamic RBAC protection user is not allowed", func(t *testing.T) {
|
||||
ctx, _ := setUp()
|
||||
ctx.SignedInUser.OrgID = int64(1)
|
||||
ctx.SignedInUser.OrgRole = org.RoleNone
|
||||
// Has access but to another app
|
||||
ctx.SignedInUser.Permissions = map[int64]map[string][]string{1: {"datasources:read": {"datasources:uid:notTheDsUID"}}}
|
||||
proxy, err := setupDSProxyTest(t, ctx, ds, routes, "api/rbac-home")
|
||||
require.NoError(t, err)
|
||||
err = proxy.validateRequest()
|
||||
require.Error(t, err)
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("Plugin with multiple routes for token auth", func(t *testing.T) {
|
||||
@@ -1021,7 +1075,7 @@ func setupDSProxyTest(t *testing.T, ctx *contextmodel.ReqContext, ds *datasource
|
||||
cfg := setting.NewCfg()
|
||||
secretsService := secretsmng.SetupTestService(t, fakes.NewFakeSecretsStore())
|
||||
secretsStore := secretskvs.NewSQLSecretsKVStore(dbtest.NewFakeDB(), secretsService, log.NewNopLogger())
|
||||
features := featuremgmt.WithFeatures()
|
||||
features := featuremgmt.WithFeatures(featuremgmt.FlagAccessControlOnCall)
|
||||
dsService, err := datasourceservice.ProvideService(nil, secretsService, secretsStore, cfg, features, acimpl.ProvideAccessControl(features),
|
||||
&actest.FakePermissionsService{}, quotatest.New(false, nil), &pluginstore.FakePluginStore{}, &pluginfakes.FakePluginClient{},
|
||||
plugincontext.ProvideBaseService(cfg, pluginconfig.NewFakePluginRequestConfigProvider()))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user