Compare commits

..

6 Commits

Author SHA1 Message Date
Sofia Papagiannaki 1cbaaefb60 Fix static handler redirect logic to ensure proper clean up URLs before redirection. 2025-05-06 07:30:31 -05:00
Kevin Minehart 4a01194a7d CI: Use docker creds from ci/common (#104827)
Use docker creds from ci/common

(cherry picked from commit fd4afdbd2c)
2025-05-02 16:37:01 -06:00
Kevin Minehart 002dbf1542 CI: move grafana-delivery-bot path in Drone (#104886)
* move delivery bot creds to vault

* format-drone

(cherry picked from commit ec35e861e0)
2025-05-02 16:36:52 -06:00
github-actions[bot] ae23ead4d9 apply security patch: release-11.6.1/394-202504041254.patch
commit 16b732e9ffe6034f828b3f8e10aa17232da022ef
Author: Stephanie Hingtgen <stephanie.hingtgen@grafana.com>
Date:   Fri Apr 4 13:50:50 2025 +0100

    APIs: Remove dashboard and folder registration
2025-04-18 22:35:57 +00:00
github-actions[bot] a29981b6b7 apply security patch: release-11.6.1/380-202504030832.patch
commit cbcd7edd6d2b2cf29b42c96a56f669e0d8e5209f
Author: nmarrs <nathanielmarrs@gmail.com>
Date:   Thu Apr 3 09:28:43 2025 +0100

    backport change
2025-04-18 22:35:57 +00:00
github-actions[bot] e471a96595 apply security patch: release-11.6.1/364-202504020728.patch
commit e555e18f4974f539e8210f3ce965a3eb56f5a406
Author: Andres Martinez Gotor <andres.martinez@grafana.com>
Date:   Mon Mar 31 12:15:52 2025 +0200

    Sanitize paths before evaluating access to route
2025-04-18 22:35:57 +00:00
80 changed files with 497 additions and 617 deletions
+13 -33
View File
@@ -738,10 +738,8 @@ steps:
from_secret: docker_password
DOCKER_USER:
from_secret: docker_username
GITHUB_APP_ID:
from_secret: delivery-bot-app-id
GITHUB_APP_INSTALLATION_ID:
from_secret: delivery-bot-app-installation-id
GITHUB_APP_ID: "329617"
GITHUB_APP_INSTALLATION_ID: "37346161"
GITHUB_APP_PRIVATE_KEY:
from_secret: delivery-bot-app-private-key
failure: ignore
@@ -2160,10 +2158,8 @@ steps:
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_ID: "329617"
GITHUB_APP_INSTALLATION_ID: "37346161"
GITHUB_APP_PRIVATE_KEY:
from_secret: delivery-bot-app-private-key
image: google/cloud-sdk:431.0.0
@@ -2464,10 +2460,8 @@ steps:
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_ID: "329617"
GITHUB_APP_INSTALLATION_ID: "37346161"
GITHUB_APP_PRIVATE_KEY:
from_secret: delivery-bot-app-private-key
image: google/cloud-sdk:431.0.0
@@ -3463,10 +3457,8 @@ steps:
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_ID: "329617"
GITHUB_APP_INSTALLATION_ID: "37346161"
GITHUB_APP_PRIVATE_KEY:
from_secret: delivery-bot-app-private-key
image: google/cloud-sdk:431.0.0
@@ -5415,13 +5407,13 @@ name: prerelease_bucket
---
get:
name: username
path: infra/data/ci/grafanaci-docker-hub
path: ci/data/common/dockerhub
kind: secret
name: docker_username
---
get:
name: password
path: infra/data/ci/grafanaci-docker-hub
path: ci/data/common/dockerhub
kind: secret
name: docker_password
---
@@ -5540,20 +5532,8 @@ kind: secret
name: dagger_token
---
get:
name: app-id
path: infra/data/ci/grafana-release-eng/grafana-delivery-bot
kind: secret
name: delivery-bot-app-id
---
get:
name: app-installation-id
path: infra/data/ci/grafana-release-eng/grafana-delivery-bot
kind: secret
name: delivery-bot-app-installation-id
---
get:
name: app-private-key
path: infra/data/ci/grafana-release-eng/grafana-delivery-bot
name: PRIVATE_KEY
path: ci/data/repo/grafana/grafana/delivery-bot-app
kind: secret
name: delivery-bot-app-private-key
---
@@ -5564,6 +5544,6 @@ kind: secret
name: gcr_credentials
---
kind: signature
hmac: 3e9721305edd682042fed2e6469bf4c83e0ea6406cf92bd9657b1167afb6d13d
hmac: c0e27d237198566806eb4b6309a0f017f88a3733c57c40651536cad5bf92c8fc
...
@@ -1,49 +0,0 @@
# Owned by grafana-delivery-squad
# Intended to be dropped into the base repo Ex: grafana/grafana
name: Dispatch check for patch conflicts
run-name: dispatch-check-patch-conflicts-${{ github.base_ref }}-${{ github.head_ref }}
on:
pull_request:
types:
- opened
- reopened
- synchronize
branches:
- "main"
- "v*.*.*"
- "release-*"
# Since this is run on a pull request, we want to apply the patches intended for the
# target branch onto the source branch, to verify compatibility before merging.
jobs:
dispatch-job:
runs-on: ubuntu-latest
steps:
- name: "Generate token"
id: generate_token
uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a
with:
# App needs Actions: Read/Write for the grafana/security-patch-actions repo
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
- name: "Dispatch job"
uses: actions/github-script@v7
with:
github-token: ${{ steps.generate_token.outputs.token }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: 'grafana',
repo: 'security-patch-actions',
workflow_id: 'test-patches-event.yml',
ref: 'main',
inputs: {
src_repo: "${{ github.repository }}",
src_ref: "${{ github.head_ref }}",
src_merge_sha: "${{ github.sha }}",
src_pr_commit_sha: "${{ github.event.pull_request.head.sha }}",
patch_repo: "${{ github.repository }}-security-patches",
patch_ref: "${{ github.base_ref }}",
triggering_github_handle: "${{ github.event.sender.login }}"
}
})
+27
View File
@@ -0,0 +1,27 @@
# Owned by grafana-release-guild
# Intended to be dropped into the base repo Ex: grafana/grafana
name: Check for patch conflicts
run-name: check-patch-conflicts-${{ github.base_ref }}-${{ github.head_ref }}
on:
pull_request:
types:
- opened
- reopened
- synchronize
branches:
- "main"
- "v*.*.*"
- "release-*"
# Since this is run on a pull request, we want to apply the patches intended for the
# target branch onto the source branch, to verify compatibility before merging.
jobs:
trigger_downstream_patch_check:
uses: grafana/security-patch-actions/.github/workflows/test-patches.yml@main
if: github.repository == 'grafana/grafana'
with:
src_repo: "${{ github.repository }}"
src_ref: "${{ github.head_ref }}" # this is the source branch name, Ex: "feature/newthing"
patch_repo: "${{ github.repository }}-security-patches"
patch_ref: "${{ github.base_ref }}" # this is the target branch name, Ex: "main"
secrets: inherit
-43
View File
@@ -1,43 +0,0 @@
# Owned by grafana-delivery-squad
# Intended to be dropped into the base repo, Ex: grafana/grafana
name: Dispatch sync to mirror
run-name: dispatch-sync-to-mirror-${{ github.ref_name }}
on:
workflow_dispatch:
push:
branches:
- "main"
- "v*.*.*"
- "release-*"
# This is run after the pull request has been merged, so we'll run against the target branch
jobs:
dispatch-job:
runs-on: ubuntu-latest
steps:
- name: "Generate token"
id: generate_token
uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a
with:
# App needs Actions: Read/Write for the grafana/security-patch-actions repo
app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }}
private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }}
- uses: actions/github-script@v7
if: github.repository == 'grafana/grafana'
with:
github-token: ${{ steps.generate_token.outputs.token }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: 'grafana',
repo: 'security-patch-actions',
workflow_id: 'mirror-branch-and-apply-patches-event.yml',
ref: 'main',
inputs: {
src_ref: "${{ github.ref_name }}",
src_repo: "${{ github.repository }}",
src_sha: "${{ github.sha }}",
dest_repo: "${{ github.repository }}-security-mirror",
patch_repo: "${{ github.repository }}-security-patches"
}
})
+25
View File
@@ -0,0 +1,25 @@
# Owned by grafana-release-guild
# Intended to be dropped into the base repo, Ex: grafana/grafana
name: Sync to mirror
run-name: sync-to-mirror-${{ github.ref_name }}
on:
workflow_dispatch:
push:
branches:
- "main"
- "v*.*.*"
- "release-*"
# This is run after the pull request has been merged, so we'll run against the target branch
jobs:
trigger_downstream_patch_mirror:
concurrency: patch-mirror-${{ github.ref_name }}
uses: grafana/security-patch-actions/.github/workflows/mirror-branch-and-apply-patches.yml@main
if: github.repository == 'grafana/grafana'
with:
ref: "${{ github.ref_name }}" # this is the target branch name, Ex: "main"
src_repo: "${{ github.repository }}"
dest_repo: "${{ github.repository }}-security-mirror"
patch_repo: "${{ github.repository }}-security-patches"
secrets: inherit
-26
View File
@@ -1,29 +1,3 @@
<!-- 11.6.1 START -->
# 11.6.1 (2025-04-23)
### Features and enhancements
- **Chore:** Update JWT library (CVE-2025-30204) [#102727](https://github.com/grafana/grafana/pull/102727), [@grambbledook](https://github.com/grambbledook)
- **DashboardScenePage:** Correct slug in self referencing data links [#103854](https://github.com/grafana/grafana/pull/103854), [@Sergej-Vlasov](https://github.com/Sergej-Vlasov)
- **Dependencies:** Bump github.com/redis/go-redis/v9 to 9.7.3 to address CVE-2025-29923 [#102863](https://github.com/grafana/grafana/pull/102863), [@macabu](https://github.com/macabu)
- **Go:** Bump to 1.24.2 [#103523](https://github.com/grafana/grafana/pull/103523), [@Proximyst](https://github.com/Proximyst)
- **Go:** Bump to 1.24.2 (Enterprise)
- **GrafanaUI:** Use safePolygon close handler for interactive tooltips instead of a delay [#102869](https://github.com/grafana/grafana/pull/102869), [@mthorning](https://github.com/mthorning)
- **Prometheus:** Add support for cloud partners Prometheus data sources [#103941](https://github.com/grafana/grafana/pull/103941), [@kevinwcyu](https://github.com/kevinwcyu)
### Bug fixes
- **Alertmanager:** Add Role-Based Access Control via reqAction Field [#103479](https://github.com/grafana/grafana/pull/103479), [@olegpixel](https://github.com/olegpixel)
- **GrafanaUI:** Remove blurred background from overlay backdrops to improve performance [#103647](https://github.com/grafana/grafana/pull/103647), [@joshhunt](https://github.com/joshhunt)
- **InfluxDB:** Fix nested variable interpolation [#104096](https://github.com/grafana/grafana/pull/104096), [@aangelisc](https://github.com/aangelisc)
- **LDAP test:** Fix page crash [#102684](https://github.com/grafana/grafana/pull/102684), [@ashharrison90](https://github.com/ashharrison90)
- **Org redirection:** Fix linking between orgs [#102870](https://github.com/grafana/grafana/pull/102870), [@ashharrison90](https://github.com/ashharrison90)
- **Security:** Fix CVE-2025-3454
- **Security:** Fix CVE-2025-2703
- **Security:** Fix CVE-2025-3260
<!-- 11.6.1 END -->
<!-- 11.6.0 START -->
# 11.6.0 (2025-03-25)
@@ -29,11 +29,6 @@ refs:
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/alert-rule-evaluation/state-and-health/#alert-instance-state
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rule-evaluation/state-and-health/#alert-instance-state
recovery-threshold:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/alert-rules/queries-conditions/#recovery-threshold
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/queries-conditions/#recovery-threshold
modify-the-no-data-or-error-state:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/alert-rule-evaluation/state-and-health/#modify-the-no-data-or-error-state
@@ -197,9 +192,9 @@ You can toggle between **Default** and **Advanced** options. If the [Default vs.
b. Click **Preview** to verify that the expression is successful.
1. To add a [recovery threshold](ref:recovery-threshold), enable the **Custom recovery threshold** toggle and enter a value that defines when the alert should recover—transition to `Normal` state from the `Alerting` or `Pending` state.
1. To add a recovery threshold, turn the **Custom recovery threshold** toggle on and fill in a value for when your alert rule should stop firing.
You can only add one recovery threshold, and it must be part of the alert condition.
You can only add one recovery threshold in a query and it must be the alert condition.
1. Click **Set as alert condition** on the query or expression you want to set as your [alert condition](ref:alert-condition).
{{< /collapse >}}
@@ -33,11 +33,6 @@ refs:
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/monitor-status/view-alert-state/#view-alert-state-on-panels
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/monitor-status/view-alert-state/#view-alert-state-on-panels
images-in-notifications:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/template-notifications/images-in-notifications/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/template-notifications/images-in-notifications/
---
# Create and link alert rules to panels
@@ -46,10 +41,13 @@ Grafana allows you to link an alert rule to a dashboard panel. This can help you
- Inform alert responders about where to investigate and which data to examine.
- Visualize the alert state directly from dashboards.
- Include a screenshot of the panel in notification messages.
An alert rule is linked to a panel by setting the [`__dashboardUid__` and `__panelId__` annotations](ref:annotations). Both annotations must be set together.
{{% admonition type="tutorial" %}}
For a hands-on example of integrating alert rules with dashboards, check out [Part 5 of our Get Started with Grafana Alerting tutorial](http://www.grafana.com/tutorials/alerting-get-started-pt5/).
{{% /admonition %}}
## Link alert rules to panels
When configuring the alert rule, you can set the dashboard and panel annotations as shown in this [video](https://youtu.be/ClLp-iSoaSY?si=qKWnvSVaQuvYcuw9&t=170).
@@ -61,8 +59,6 @@ When configuring the alert rule, you can set the dashboard and panel annotations
You can then [view the alert state on the panel](ref:view-alert-state-on-panels).
By default, notification messages include a link to the dashboard panel. Additionally, you can [enable displaying panel screenshots in notifications](ref:images-in-notifications).
{{< figure src="/media/docs/alerting/panel-displays-alert-state.png" max-width="1200px" caption="A panel displaying the alert status and state changes." >}}
## Create alert rules from panels
@@ -79,8 +75,6 @@ To streamline alert creation, you can create an alert rule directly from a panel
You can then [view the alert state on the panel](ref:view-alert-state-on-panels).
By default, notification messages include a link to the dashboard panel. Additionally, you can [enable displaying panel screenshots in notifications](ref:images-in-notifications).
{{% admonition type="note" %}}
Changes to panel and alert rule queries aren't synchronized. If you change a query, you have to update it in both the panel and the alert rule.
{{% /admonition %}}
@@ -92,7 +86,3 @@ This option is available only in [time series panels](ref:time-series-visualizat
1. Hover over the top-right corner of the panel and click the panel menu icon.
1. Click **Edit**.
1. Click the **Alert** tab to view existing alert rules or create a new one.
{{< admonition type="tip" >}}
For a practical example that links a panel to an alert rule, refer to [Part 5 of our Get Started with Grafana Alerting tutorial](http://www.grafana.com/tutorials/alerting-get-started-pt5/).
{{% /admonition %}}
@@ -26,11 +26,6 @@ labels:
title: Configure contact points
weight: 410
refs:
alertmanager:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/manage-contact-points/integrations/configure-alertmanager/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/integrations/configure-alertmanager/
sns:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/manage-contact-points/integrations/configure-amazon-sns/
@@ -143,7 +138,7 @@ Each contact point integration has its own configuration options and setup proce
{{< column-list >}}
- [Alertmanager](ref:alertmanager)
- Alertmanager
- [AWS SNS](ref:sns)
- Cisco Webex Teams
- DingDing
@@ -1,77 +0,0 @@
---
canonical: https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-alertmanager/
description: Use the Alertmanager integration in a contact point to send specific alerts to a different Alertmanager.
keywords:
- grafana
- alerting
- Alertmanager
- integration
labels:
products:
- cloud
- enterprise
- oss
menuTitle: Alertmanager
title: Configure an Alertmanager contact point
weight: 100
refs:
configure-contact-points:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/manage-contact-points/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/
configure-alertmanagers:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/manage-contact-points/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/
---
# Configure an Alertmanager contact point
Use the Alertmanager integration in a contact point to send specific alerts to a different Alertmanager.
If you have an existing Alertmanager running in your infrastructure, you can use a contact point to forward Grafana alerts to your Alertmanager.
For example, a team might run its own Alertmanager to manage notifications from other alerting systems. That team can create alerts with Grafana and configure an Alertmanager contact point to forward only their alerts to their existing Alertmanager.
This setup avoids duplicating Alertmanager configurations for better maintenance.
{{% admonition type="note" %}}
To send all Grafana-managed alerts to an Alertmanager, add it as a data source and enable it to receive all alerts. With this setup, you can configure multiple Alertmanagers to receive all alerts.
For setup instructions, refer to [Configure Alertmanagers](ref:configure-alertmanagers).
{{% /admonition %}}
## Configure an Alertmanager for a contact point
To create a contact point with Alertmanager integration, complete the following steps.
1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**.
1. Click **+ Add contact point**.
1. Enter a name for the contact point.
1. From the **Integration** list, select **Alertmanager**.
1. In the **URL** field, enter the URL of the Alertmanager.
1. (Optional) Configure [optional settings](#optional-settings).
1. Click **Save contact point**.
For more details on contact points, including how to test them and enable notifications, refer to [Configure contact points](ref:configure-contact-points).
## Alertmanager settings
| Option | Description |
| ------ | --------------------- |
| URL | The Alertmanager URL. |
#### Optional settings
| Option | Description |
| ------------------- | --------------------------------------- |
| Basic Auth User | Username for HTTP Basic Authentication. |
| Basic Auth Password | Password for HTTP Basic Authentication. |
#### Optional notification settings
| Option | Description |
| ------------------------ | ------------------------------------------------------------------- |
| Disable resolved message | Enable this option to prevent notifications when an alert resolves. |
@@ -13,7 +13,7 @@ labels:
- oss
menuTitle: Amazon SNS
title: Configure Amazon SNS for Alerting
weight: 102
weight: 100
refs:
notification-templates:
- pattern: /docs/grafana/
@@ -20,21 +20,6 @@ menuTitle: Grafana IRM
title: Configure Grafana IRM for Alerting
weight: 120
refs:
configure-grafana-alerts:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/alerting-rules/create-grafana-managed-rule/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-grafana-managed-rule/
pending-period:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/alert-rule-evaluation/#pending-period
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rule-evaluation/#pending-period
timing-options:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/notifications/group-alert-notifications/#timing-options
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/group-alert-notifications/#timing-options
configure-contact-points:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/manage-contact-points/
@@ -97,6 +82,8 @@ To create the integration, follow the same steps as described in [Configure an O
- **Alertmanager** integration Includes preconfigured IRM templates for processing Grafana and Prometheus alerts.
> The **Grafana Alerting** integration works similarly but may display a warning in the UI.
- **Webhook** integration Uses default IRM templates for general alert processing.
1. Provide a title, description, and assign it to a team, then click **Create Integration**.
@@ -117,52 +104,8 @@ In **Grafana OSS** and **Grafana Enterprise**, you need to create a **Webhook**
After configuring the contact point in Grafana Alerting and the integration in Grafana IRM, you can start testing the Alerting-to-IRM integration.
{{< figure src="/media/docs/alerting/test-alert-group-on-irm.png" max-width="750px" caption="Example of a test alert group in Grafana IRM" >}}
For more information, see:
- **[Configure contact points](ref:configure-contact-points)** Learn how to test the integration and enable notifications in Alerting.
- **[Webhook contact point](ref:webhook-contact-point)** Learn the format of the webhook payload and additional settings in Alerting.
- **[Configure IRM alert templates](ref:irm-alert-templates)** Learn how to process the incoming webhook messages in IRM.
## Enable heartbeat monitoring in Grafana IRM (optional)
Enabling the heartbeat in the IRM integration acts as a monitoring for your Grafana Alerting setup. If Grafana Alerting stops sending alerts—due to downtime or misconfiguration—Grafana IRM creates a new alert group to notify you.
To set up heartbeat monitoring, you must enable the heartbeat in IRM and create an alert rule that continuously sends alerts to the heartbeat endpoint.
#### Enable the heartbeat for the IRM integration
1. In **IRM**, select the IRM integration you configured earlier.
1. Click the ⋮ (three dots) on top right, then select **Heartbeat Settings**.
1. Copy the **Endpoint** URL—this will be used in a new contact point in Grafana Alerting.
1. Set the **heartbeat interval**, time period after which Grafana IRM starts a new alert group if it doesnt receive a heartbeat.
#### Create another Webhook contact point in Grafana Alerting
Follow the same steps as before to create a webhook contact point in Grafana Alerting:
1. Navigate to **Alerts & IRM** -> **Alerting** -> **Contact points**.
1. Click **+ Add contact point**.
1. Enter a name for the contact point.
1. From the **Integration** list, select **Webhook**.
1. In the **URL** field, enter the endpoint URL of the heartbeat.
1. Click **Save contact point**.
You can now click the **Test** button to send an alert to the heartbeat endpoint. In **IRM**, verify the heartbeat status in the **Hearbeat** column on the **Integrations** page.
{{< figure src="/media/docs/alerting/view-heartbeat-status-on-irm.png" max-width="750px" caption="Heartbeat status column in the Grafana IRM Integrations page" >}}
#### Create an alert rule in Grafana Alerting
Create a [Grafana-managed alert rule](ref:configure-grafana-alerts) with the following settings:
- **Always firing** Use a query and alert condition that constantly fire. For example, select a Prometheus data source and set the query to `vector(1) > 0`.
- Configure a [pending period](ref:pending-period) that is shorter than the **hearbeat interval**.
- Choose the **webhook contact point** you created for the heartbeat to forward alerts.
- Adjust [timing options](ref:timing-options) in the alert rule or notification policy to ensure alerts are forwarded before the **heartbeat interval** elapses:
- **Group wait**: `0s`
- **Group interval**: `1s`
- **Repeat interval**: shorter than the **hearbeat interval**.
After it's created, the alert rule acts as a heartbeat, verifying that Grafana Alerting is running and sending alerts to Grafana IRM.
@@ -32,11 +32,6 @@ refs:
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/query-transform-data/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/
math-operation:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/query-transform-data/expression-queries/#math
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/expression-queries/#math
---
# Queries and conditions
@@ -93,23 +88,15 @@ The following aggregations functions are included: `Min`, `Max`, `Mean`, `Mediam
### Math
Performs free-form math functions/operations on time series data and numbers. For example, `$A + 1` or `$A * 100`.
Performs free-form math functions/operations on time series data and numbers. For instance, `$A + 1` or `$A * 100`.
If queries being compared have **multiple series in their results**, series from different queries are matched(joined) if they have the same labels. For example:
- `$A` returns series `{host=web01} 30` and `{host=web02} 20`
- `$B` returns series `{host=web01} 10` and `{host=web02} 0`
- `$A + $B` returns `{host=web01} 40` and `{host=web02} 20`.
In this case, only series with matching labels are joined, and the operation is calculated between them.
For additional scenarios on how Math handles different data types, refer to the [Math documentation](ref:math-operation).
You can also use a Math expression to define the **alert condition**. For example:
You can also use a Math expression to define the alert condition for numbers. For example:
- `$B > 70` should fire if the value of B (query or expression) is more than 70.
- `$B < $C * 100` should fire if the value of B is less than the value of C multiplied by 100.
If queries being compared have multiple series in their results, series from different queries are matched if they have the same labels or one is a subset of the other.
### Resample
Realigns a time range to a new set of timestamps, this is useful when comparing time series data from different data sources where the timestamps would otherwise not align.
@@ -135,11 +122,13 @@ A threshold returns `0` when the condition is false and `1` when true.
If the threshold is set as the alert condition, the alert fires when the threshold returns `1`.
### Recovery threshold
#### Recovery threshold
To reduce the noise from flapping alerts, you can set a recovery threshold so that the alert returns to the `Normal` state only after the recovery threshold is crossed.
To reduce the noise from flapping alerts, you can set a recovery threshold different to the alert threshold.
Flapping alerts occur when the query value repeatedly crosses above and below the alert threshold, causing frequent state changes. This results in a series of firing-resolved-firing notifications and a noisy alert state history.
Flapping alerts occur when a metric hovers around the alert threshold condition and may lead to frequent state changes, resulting in too many notifications.
The value of a flapping metric can continually go above and below a threshold, resulting in a series of firing-resolved-firing notifications and a noisy alert state history.
For example, if you have an alert for latency with a threshold of 1000ms and the number fluctuates around 1000 (say 980 -> 1010 -> 990 -> 1020, and so on), then each of those might trigger a notification:
@@ -149,8 +138,8 @@ For example, if you have an alert for latency with a threshold of 1000ms and the
To prevent this, you can set a recovery threshold to define two thresholds instead of one:
1. An alert transitions to the `Pending` or `Alerting` state when the alert threshold is crossed.
1. An alert transitions back to `Normal` state only after the recovery threshold is crossed.
1. An alert is triggered when the first threshold is crossed.
1. An alert is resolved only when the second (recovery) threshold is crossed.
In the previous example, setting the recovery threshold to 900ms means the alert only resolves when the latency falls below 900ms:
@@ -6,7 +6,7 @@ aliases:
- ../fundamentals/alertmanager/ # /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/alertmanager/
- ../fundamentals/notifications/alertmanager/ # /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/notifications/alertmanager
canonical: https://grafana.com/docs/grafana/latest/alerting/set-up/configure-alertmanager/
description: Learn about Alertmanagers and set up Alerting to use other Alertmanagers
description: Learn about Alertmanagers and set up Alerting to use an external Alertmanager
keywords:
- grafana
- alerting
@@ -21,21 +21,6 @@ labels:
title: Configure Alertmanagers
weight: 200
refs:
configure-grafana-alerts-notifications:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/alerting-rules/create-grafana-managed-rule/#configure-notifications
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-grafana-managed-rule/#configure-notifications
configure-notification-policies:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/create-notification-policy/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/create-notification-policy/
alertmanager-contact-point:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/configure-notifications/manage-contact-points/integrations/configure-alertmanager/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/alerting-and-irm/alerting/configure-notifications/manage-contact-points/integrations/configure-alertmanager/
alertmanager-data-source:
- pattern: /docs/grafana/
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/alertmanager/
@@ -54,15 +39,7 @@ Grafana Alerting is based on the architecture of the Prometheus alerting system.
{{< figure src="/media/docs/alerting/alerting-alertmanager-architecture.png" max-width="750px" alt="A diagram with the alert generator and alert manager architecture" >}}
Grafana includes a built-in **Grafana Alertmanager** to handle notifications. This guide shows you how to:
- Use different [types of Alertmanagers](#types-of-alertmanagers-in-grafana) with Grafana
- [Add other Alertmanager](#add-an-alertmanager) and [enable it to receive all Grafana-managed alerts](#enable-an-alertmanager-to-receive-grafana-managed-alerts)
- Use an [Alertmanager as a contact point]() to route specific alerts
## Alertmanager resources
Its important to note that each Alertmanager manages its own independent alerting resources, such as:
Grafana can enable one or more Alertmanagers to receive Grafana-managed alerts for notification handling. Its important to note that each Alertmanager manages its own independent alerting resources, such as:
- Contact points and notification templates
- Notification policies and mute timings
@@ -123,18 +100,6 @@ All Grafana-managed alerts are forwarded to Alertmanagers marked as `Receiving G
Grafana Alerting does not support forwarding Grafana-managed alerts to the AlertManager in Amazon Managed Service for Prometheus. For more details, refer to [this GitHub issue](https://github.com/grafana/grafana/issues/64064).
{{% /admonition %}}
## Use an Alertmanager as a contact point to receive specific alerts
The previous instructions enable sending **all** Grafana-managed alerts to an Alertmanager.
To send **specific** alerts to an Alertmanager, configure the Alertmanager as a contact point. You can then assign this contact point to notification policies or individual alert rules.
For detailed instructions, refer to:
- [Alertmanager contact point](ref:alertmanager-contact-point)
- [Configure Grafana-managed alert rules](ref:configure-grafana-alerts-notifications)
- [Configure notification policies](ref:configure-notification-policies)
## Manage Alertmanager configurations
On the Settings page, you can also manage your Alertmanager configurations.
@@ -124,7 +124,7 @@ const storageAcctName = 'azmonteststorage';
const logAnalyticsName = 'az-mon-test-logs';
const applicationInsightsName = 'az-mon-test-ai-a';
describe.skip('Azure monitor datasource', () => {
describe('Azure monitor datasource', () => {
before(() => {
e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD'));
@@ -1,6 +1,6 @@
{
"name": "@test-plugins/extensions-test-app",
"version": "11.6.2",
"version": "11.6.1",
"private": true,
"scripts": {
"build": "webpack -c ./webpack.config.ts --env production",
@@ -1,6 +1,6 @@
{
"name": "@test-plugins/grafana-e2etest-datasource",
"version": "11.6.2",
"version": "11.6.1",
"private": true,
"scripts": {
"build": "webpack -c ./webpack.config.ts --env production",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"npmClient": "yarn",
"version": "11.6.2"
"version": "11.6.1"
}
+1 -1
View File
@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "grafana",
"version": "11.6.2",
"version": "11.6.1",
"repository": "github:grafana/grafana",
"scripts": {
"build": "NODE_ENV=production nx exec --verbose -- webpack --config scripts/webpack/webpack.prod.js --progress",
+2 -2
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/data",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana Data Library",
"keywords": [
"typescript"
@@ -36,7 +36,7 @@
},
"dependencies": {
"@braintree/sanitize-url": "7.0.1",
"@grafana/schema": "11.6.2",
"@grafana/schema": "11.6.1",
"@types/d3-interpolate": "^3.0.0",
"@types/string-hash": "1.1.3",
"d3-interpolate": "3.0.1",
+1 -1
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/e2e-selectors",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana End-to-End Test Selectors Library",
"keywords": [
"cli",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@grafana/eslint-plugin",
"description": "ESLint rules for use within the Grafana repo. Not suitable (or supported) for external use.",
"version": "11.6.2",
"version": "11.6.1",
"main": "./index.cjs",
"author": "Grafana Labs",
"license": "Apache-2.0",
+3 -3
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/flamegraph",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana flamegraph visualization component",
"keywords": [
"grafana",
@@ -44,8 +44,8 @@
],
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/ui": "11.6.1",
"@leeoniya/ufuzzy": "1.0.18",
"d3": "^7.8.5",
"lodash": "4.17.21",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@grafana/saga-icons",
"version": "11.6.2",
"version": "11.6.1",
"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.6.2",
"version": "11.6.1",
"description": "Library to manage traces in Grafana.",
"sideEffects": false,
"repository": {
@@ -18,12 +18,12 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/e2e-selectors": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"react-select": "5.10.0",
"react-use": "17.6.0",
"rxjs": "7.8.1",
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "@grafana/plugin-configs",
"description": "Shared dependencies and files for core plugins",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"tslib": "2.8.1"
},
+6 -6
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "AGPL-3.0-only",
"name": "@grafana/prometheus",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana Prometheus Library",
"keywords": [
"typescript"
@@ -38,12 +38,12 @@
"dependencies": {
"@emotion/css": "11.13.5",
"@floating-ui/react": "0.27.5",
"@grafana/data": "11.6.2",
"@grafana/e2e-selectors": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"@hello-pangea/dnd": "17.0.0",
"@leeoniya/ufuzzy": "1.0.18",
"@lezer/common": "1.2.3",
+5 -5
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/runtime",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana Runtime Library",
"keywords": [
"grafana",
@@ -37,11 +37,11 @@
"postpack": "mv package.json.bak package.json && rimraf ./unstable"
},
"dependencies": {
"@grafana/data": "11.6.2",
"@grafana/e2e-selectors": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/faro-web-sdk": "^1.13.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"history": "4.10.1",
"lodash": "4.17.21",
"react-loading-skeleton": "3.5.0",
+1 -1
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/schema",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana Schema Library",
"keywords": [
"typescript"
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
limit: number;
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip, common.OptionsWithTextFormatting {
/**
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends common.OptionsWithLegend, common.SingleStatBaseOptions {
displayMode: common.BarGaugeDisplayMode;
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export enum VizDisplayMode {
Candles = 'candles',
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export enum HorizontalConstraint {
Center = 'center',
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface MetricStat {
/**
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
/**
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
selectedSeries: number;
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export type UpdateConfig = {
render: boolean,
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export type BucketAggregation = (DateHistogram | Histogram | Terms | Filters | GeoHashGrid | Nested);
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends common.SingleStatBaseOptions {
minVizHeight: number;
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
basemap: ui.MapLayerOptions;
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
/**
* Controls the color mode of the heatmap
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip {
/**
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
dedupStrategy: common.LogsDedupStrategy;
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
dedupStrategy: common.LogsDedupStrategy;
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export enum QueryEditorMode {
Builder = 'builder',
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
/**
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface ArcOption {
/**
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
/**
* Select the pie chart display style.
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends common.SingleStatBaseOptions {
colorMode: common.BigValueColorMode;
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
/**
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends ui.OptionsWithLegend, ui.OptionsWithTooltip, ui.OptionsWithTimezones {
/**
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options {
/**
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export enum TextMode {
Code = 'code',
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export interface Options extends common.OptionsWithTimezones {
legend: common.VizLegendOptions;
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
/**
* Identical to timeseries... except it does not have timezone settings
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
export const pluginVersion = "11.6.2";
export const pluginVersion = "11.6.1";
export enum PointShape {
Circle = 'circle',
+5 -5
View File
@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "@grafana/sql",
"version": "11.6.2",
"version": "11.6.1",
"repository": {
"type": "git",
"url": "http://github.com/grafana/grafana.git",
@@ -15,11 +15,11 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/e2e-selectors": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/ui": "11.6.1",
"@react-awesome-query-builder/ui": "6.6.4",
"immutable": "5.0.3",
"lodash": "4.17.21",
+4 -4
View File
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/ui",
"version": "11.6.2",
"version": "11.6.1",
"description": "Grafana Components Library",
"keywords": [
"grafana",
@@ -50,10 +50,10 @@
"@emotion/react": "11.14.0",
"@emotion/serialize": "1.3.3",
"@floating-ui/react": "0.27.5",
"@grafana/data": "11.6.2",
"@grafana/e2e-selectors": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/faro-web-sdk": "^1.13.2",
"@grafana/schema": "11.6.2",
"@grafana/schema": "11.6.1",
"@hello-pangea/dnd": "17.0.0",
"@leeoniya/ufuzzy": "1.0.18",
"@monaco-editor/react": "4.6.0",
+6 -5
View File
@@ -159,16 +159,17 @@ func staticHandler(ctx *web.Context, log log.Logger, opt StaticOptions) bool {
if fi.IsDir() {
// Redirect if missing trailing slash.
if !strings.HasSuffix(ctx.Req.URL.Path, "/") {
path := fmt.Sprintf("%s/", ctx.Req.URL.Path)
if !strings.HasPrefix(path, "/") {
redirectPath := path.Clean(ctx.Req.URL.Path)
redirectPath = fmt.Sprintf("%s/", redirectPath)
if !strings.HasPrefix(redirectPath, "/") {
// Disambiguate that it's a path relative to this server
path = fmt.Sprintf("/%s", path)
redirectPath = fmt.Sprintf("/%s", redirectPath)
} else {
// A string starting with // or /\ is interpreted by browsers as a URL, and not a server relative path
rePrefix := regexp.MustCompile(`^(?:/\\|/+)`)
path = rePrefix.ReplaceAllString(path, "/")
redirectPath = rePrefix.ReplaceAllString(redirectPath, "/")
}
http.Redirect(ctx.Resp, ctx.Req, path, http.StatusFound)
http.Redirect(ctx.Resp, ctx.Req, redirectPath, http.StatusFound)
return true
}
+174
View File
@@ -0,0 +1,174 @@
package httpstatic
import (
"io"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"testing"
claims "github.com/grafana/authlib/types"
"github.com/grafana/grafana/pkg/models/usertoken"
"github.com/grafana/grafana/pkg/services/authn"
"github.com/grafana/grafana/pkg/services/authn/authntest"
"github.com/grafana/grafana/pkg/services/contexthandler"
"github.com/grafana/grafana/pkg/services/featuremgmt"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/web"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestStatic(t *testing.T) {
// Create a temporary directory for test files
tmpDir, err := os.MkdirTemp("", "static-test")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
// Create test files
testFiles := map[string]string{
"test.txt": "Test content",
"subdir/test.txt": "Subdir content",
}
for path, content := range testFiles {
fullPath := filepath.Join(tmpDir, path)
err := os.MkdirAll(filepath.Dir(fullPath), 0o755)
require.NoError(t, err)
err = os.WriteFile(fullPath, []byte(content), 0o644)
require.NoError(t, err)
}
tests := []struct {
dir string
name string
path string
options StaticOptions
expectedStatus int
expectedBody string
expectedLocation string
}{
{
name: "should serve existing file",
path: "/test.txt",
expectedStatus: http.StatusOK,
expectedBody: "Test content",
dir: tmpDir,
},
{
name: "should serve file from subdirectory",
path: "/subdir/test.txt",
expectedStatus: http.StatusOK,
expectedBody: "Subdir content",
dir: tmpDir,
},
{
name: "should redirect directory without trailing slash",
path: "/subdir",
expectedStatus: http.StatusFound,
expectedLocation: "/subdir/",
dir: tmpDir,
},
{
name: "should handle prefix",
path: "/static/test.txt",
options: StaticOptions{Prefix: "/static"},
expectedStatus: http.StatusOK,
expectedBody: "Test content",
dir: tmpDir,
},
{
name: "should handle excluded path",
path: "/test.txt",
options: StaticOptions{Exclude: []string{"/test.txt"}},
expectedStatus: http.StatusNotFound,
dir: tmpDir,
},
{
name: "should add custom headers",
path: "/test.txt",
options: StaticOptions{AddHeaders: func(ctx *web.Context) { ctx.Resp.Header().Set("X-Test", "test") }},
expectedStatus: http.StatusOK,
expectedBody: "Test content",
dir: tmpDir,
},
{
name: "should clean up path before redirecting",
path: "/subdir/..%2F%5C127.0.0.1:80%2F%3F%2F..%2F..",
options: StaticOptions{Prefix: "subdir"},
expectedStatus: http.StatusFound,
expectedLocation: "/",
dir: tmpDir,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
sc := setupScenarioContext(t, "")
sc.m.Use(Static(tt.dir, tt.options))
// Create a test request
req := httptest.NewRequest("GET", tt.path, nil)
w := httptest.NewRecorder()
// Execute the handler
sc.m.ServeHTTP(w, req)
// Verify the response
resp := w.Result()
require.Equal(t, tt.expectedStatus, resp.StatusCode)
if tt.expectedBody != "" {
body, err := io.ReadAll(resp.Body)
require.NoError(t, err)
assert.Equal(t, tt.expectedBody, string(body))
}
if tt.options.AddHeaders != nil {
assert.Equal(t, "test", resp.Header.Get("X-Test"))
}
if tt.expectedLocation != "" {
assert.Equal(t, tt.expectedLocation, resp.Header.Get("Location"))
}
})
}
}
type scenarioContext struct {
t *testing.T
cfg *setting.Cfg
m *web.Mux
ctxHdlr *contexthandler.ContextHandler
}
func getContextHandler(t *testing.T, cfg *setting.Cfg) *contexthandler.ContextHandler {
t.Helper()
if cfg == nil {
cfg = setting.NewCfg()
}
return contexthandler.ProvideService(
cfg,
&authntest.FakeService{ExpectedIdentity: &authn.Identity{ID: "0", Type: claims.TypeAnonymous, SessionToken: &usertoken.UserToken{}}},
featuremgmt.WithFeatures(),
)
}
func setupScenarioContext(t *testing.T, url string) *scenarioContext {
cfg := setting.NewCfg()
ctxHdlr := getContextHandler(t, cfg)
sc := &scenarioContext{
t: t,
cfg: cfg,
ctxHdlr: ctxHdlr,
}
sc.m = web.New()
sc.m.Use(ctxHdlr.Middleware)
return sc
}
+5 -1
View File
@@ -28,6 +28,7 @@ import (
dashboardv2alpha1 "github.com/grafana/grafana/pkg/apis/dashboard/v2alpha1"
grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic"
"github.com/grafana/grafana/pkg/infra/db"
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/infra/tracing"
"github.com/grafana/grafana/pkg/services/accesscontrol"
"github.com/grafana/grafana/pkg/services/apiserver/builder"
@@ -50,7 +51,8 @@ var (
// This is used just so wire has something unique to return
type DashboardsAPIBuilder struct {
features featuremgmt.FeatureToggles
dashboardService dashboards.DashboardService
features featuremgmt.FeatureToggles
accessControl accesscontrol.AccessControl
legacy *DashboardStorage
@@ -59,6 +61,7 @@ type DashboardsAPIBuilder struct {
scheme *runtime.Scheme
search *SearchHandler
log log.Logger
reg prometheus.Registerer
}
@@ -66,6 +69,7 @@ func RegisterAPIService(
cfg *setting.Cfg,
features featuremgmt.FeatureToggles,
apiregistration builder.APIRegistrar,
dashboardService dashboards.DashboardService,
provisioningDashboardService dashboards.DashboardProvisioningService,
accessControl accesscontrol.AccessControl,
provisioning provisioning.ProvisioningService,
@@ -28,7 +28,6 @@ func TestMain(m *testing.M) {
}
func runDashboardTest(t *testing.T, helper *apis.K8sTestHelper, gvr schema.GroupVersionResource) {
t.Skip("dashboard apis are currently disabled")
t.Run("simple crud+list", func(t *testing.T) {
ctx := context.Background()
client := helper.GetResourceClient(apis.ResourceClientArgs{
@@ -110,7 +109,6 @@ func runDashboardTest(t *testing.T, helper *apis.K8sTestHelper, gvr schema.Group
}
func TestIntegrationDashboardsAppV0Alpha1(t *testing.T) {
t.Skip("dashboard apis are currently disabled")
gvr := schema.GroupVersionResource{
Group: "dashboard.grafana.app",
Version: "v0alpha1",
@@ -255,7 +253,6 @@ func TestIntegrationDashboardsAppV1Alpha1(t *testing.T) {
}
func TestIntegrationLegacySupport(t *testing.T) {
t.Skip("dashboard apis are currently disabled")
ctx := context.Background()
helper := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{
EnableFeatureToggles: []string{
-5
View File
@@ -46,7 +46,6 @@ func TestIntegrationFoldersApp(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
t.Skip("api is currently disabled")
helper := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{
AppModeProduction: true,
EnableFeatureToggles: []string{
@@ -493,7 +492,6 @@ func TestIntegrationFolderCreatePermissions(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
t.Skip("api is currently disabled")
t.Skip("not working yet")
folderWithoutParentInput := "{ \"uid\": \"uid\", \"title\": \"Folder\"}"
@@ -619,7 +617,6 @@ func TestIntegrationFolderGetPermissions(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
t.Skip("api is currently disabled")
t.Skip("not yet working")
type testCase struct {
@@ -771,7 +768,6 @@ func TestFoldersCreateAPIEndpointK8S(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
t.Skip("api is currently disabled")
folderWithoutParentInput := "{ \"uid\": \"uid\", \"title\": \"Folder\"}"
folderWithTitleEmpty := "{ \"title\": \"\"}"
@@ -933,7 +929,6 @@ func TestFoldersGetAPIEndpointK8S(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test")
}
t.Skip("api is currently disabled")
type testCase struct {
description string
+8 -1
View File
@@ -28,7 +28,8 @@ func TestIntegrationOpenAPIs(t *testing.T) {
h := NewK8sTestHelper(t, testinfra.GrafanaOpts{
AppModeProduction: true,
EnableFeatureToggles: []string{
featuremgmt.FlagQueryService, // Query Library
featuremgmt.FlagKubernetesClientDashboardsFolders, // Will be default on by G12
featuremgmt.FlagQueryService, // Query Library
featuremgmt.FlagProvisioning,
featuremgmt.FlagInvestigationsBackend,
},
@@ -59,6 +60,12 @@ func TestIntegrationOpenAPIs(t *testing.T) {
dir := "openapi_snapshots"
var groups = []schema.GroupVersion{{
Group: "dashboard.grafana.app",
Version: "v0alpha1",
}, {
Group: "folder.grafana.app",
Version: "v0alpha1",
}, {
Group: "iam.grafana.app",
Version: "v0alpha1",
}, {
@@ -25,7 +25,6 @@ func TestMain(m *testing.M) {
}
func TestIntegrationProvisioning(t *testing.T) {
t.Skip("dashboard and folder apis are currently disabled")
if testing.Short() {
t.Skip("skipping integration test")
}
@@ -2,14 +2,14 @@
"name": "@grafana-plugins/grafana-azure-monitor-datasource",
"description": "Grafana data source for Azure Monitor",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"@kusto/monaco-kusto": "^10.0.0",
"fast-deep-equal": "^3.1.3",
"i18next": "^24.0.0",
@@ -25,8 +25,8 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.6.2",
"@grafana/plugin-configs": "11.6.2",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",
@@ -2,15 +2,15 @@
"name": "@grafana-plugins/stackdriver",
"description": "Grafana data source for Google Cloud Monitoring",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/google-sdk": "0.1.2",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"debounce-promise": "3.1.2",
"fast-deep-equal": "^3.1.3",
"i18next": "^24.0.0",
@@ -26,8 +26,8 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.6.2",
"@grafana/plugin-configs": "11.6.2",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",
@@ -2,22 +2,22 @@
"name": "@grafana-plugins/grafana-postgresql-datasource",
"description": "PostgreSQL data source plugin",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/sql": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/sql": "11.6.1",
"@grafana/ui": "11.6.1",
"lodash": "4.17.21",
"react": "18.3.1",
"rxjs": "7.8.1",
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.6.2",
"@grafana/plugin-configs": "11.6.2",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",
@@ -2,13 +2,13 @@
"name": "@grafana-plugins/grafana-pyroscope-datasource",
"description": "Continuous profiling for analysis of CPU and memory usage, down to the line number and throughout time. Saving infrastructure cost, improving performance, and increasing reliability.",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"fast-deep-equal": "^3.1.3",
"lodash": "4.17.21",
"monaco-editor": "0.34.1",
@@ -20,7 +20,7 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/plugin-configs": "11.6.2",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",
@@ -2,13 +2,13 @@
"name": "@grafana-plugins/grafana-testdata-datasource",
"description": "Generates test data in different forms",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"d3-random": "^3.0.1",
"lodash": "4.17.21",
"micro-memoize": "^4.1.2",
@@ -21,8 +21,8 @@
"uuid": "11.0.5"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.6.2",
"@grafana/plugin-configs": "11.6.2",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",
@@ -2,7 +2,7 @@
"name": "@grafana-plugins/jaeger",
"description": "Jaeger plugin for Grafana",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "workspace:*",
@@ -2,22 +2,22 @@
"name": "@grafana-plugins/mssql",
"description": "MSSQL data source plugin",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/sql": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/sql": "11.6.1",
"@grafana/ui": "11.6.1",
"lodash": "4.17.21",
"react": "18.3.1",
"rxjs": "7.8.1",
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.6.2",
"@grafana/plugin-configs": "11.6.2",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",
@@ -2,22 +2,22 @@
"name": "@grafana-plugins/mysql",
"description": "MySQL data source plugin",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/plugin-ui": "0.10.1",
"@grafana/runtime": "11.6.2",
"@grafana/sql": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/runtime": "11.6.1",
"@grafana/sql": "11.6.1",
"@grafana/ui": "11.6.1",
"lodash": "4.17.21",
"react": "18.3.1",
"rxjs": "7.8.1",
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/e2e-selectors": "11.6.2",
"@grafana/plugin-configs": "11.6.2",
"@grafana/e2e-selectors": "11.6.1",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",
@@ -2,13 +2,13 @@
"name": "@grafana-plugins/parca",
"description": "Continuous profiling for analysis of CPU and memory usage, down to the line number and throughout time. Saving infrastructure cost, improving performance, and increasing reliability.",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "11.6.2",
"@grafana/runtime": "11.6.2",
"@grafana/schema": "11.6.2",
"@grafana/ui": "11.6.2",
"@grafana/data": "11.6.1",
"@grafana/runtime": "11.6.1",
"@grafana/schema": "11.6.1",
"@grafana/ui": "11.6.1",
"lodash": "4.17.21",
"monaco-editor": "0.34.1",
"react": "18.3.1",
@@ -18,7 +18,7 @@
"tslib": "2.8.1"
},
"devDependencies": {
"@grafana/plugin-configs": "11.6.2",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/react": "16.2.0",
"@testing-library/user-event": "14.6.1",
@@ -2,7 +2,7 @@
"name": "@grafana-plugins/tempo",
"description": "Grafana plugin for the Tempo data source.",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "workspace:*",
@@ -39,7 +39,7 @@
"uuid": "11.0.5"
},
"devDependencies": {
"@grafana/plugin-configs": "11.6.2",
"@grafana/plugin-configs": "11.6.1",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
"@testing-library/react": "16.2.0",
@@ -2,7 +2,7 @@
"name": "@grafana-plugins/zipkin",
"description": "Zipkin plugin for Grafana",
"private": true,
"version": "11.6.2",
"version": "11.6.1",
"dependencies": {
"@emotion/css": "11.13.5",
"@grafana/data": "workspace:*",
+4 -4
View File
@@ -976,8 +976,8 @@ def publish_images_step(ver_mode, docker_repo, trigger = None, depends_on = ["rg
"GCP_KEY": from_secret(gcp_grafanauploads),
"DOCKER_USER": from_secret("docker_username"),
"DOCKER_PASSWORD": from_secret("docker_password"),
"GITHUB_APP_ID": from_secret("delivery-bot-app-id"),
"GITHUB_APP_INSTALLATION_ID": from_secret("delivery-bot-app-installation-id"),
"GITHUB_APP_ID": "329617",
"GITHUB_APP_INSTALLATION_ID": "37346161",
"GITHUB_APP_PRIVATE_KEY": from_secret("delivery-bot-app-private-key"),
}
@@ -994,8 +994,8 @@ def publish_images_step(ver_mode, docker_repo, trigger = None, depends_on = ["rg
environment = {
"DOCKER_USER": from_secret("docker_username"),
"DOCKER_PASSWORD": from_secret("docker_password"),
"GITHUB_APP_ID": from_secret("delivery-bot-app-id"),
"GITHUB_APP_INSTALLATION_ID": from_secret("delivery-bot-app-installation-id"),
"GITHUB_APP_ID": "329617",
"GITHUB_APP_INSTALLATION_ID": "37346161",
"GITHUB_APP_PRIVATE_KEY": from_secret("delivery-bot-app-private-key"),
}
+4 -15
View File
@@ -55,8 +55,8 @@ def secrets():
vault_secret(gar_pull_secret, "secret/data/common/gar", ".dockerconfigjson"),
vault_secret(drone_token, "infra/data/ci/drone", "machine-user-token"),
vault_secret(prerelease_bucket, "infra/data/ci/grafana/prerelease", "bucket"),
vault_secret(docker_username, "infra/data/ci/grafanaci-docker-hub", "username"),
vault_secret(docker_password, "infra/data/ci/grafanaci-docker-hub", "password"),
vault_secret(docker_username, "ci/data/common/dockerhub", "username"),
vault_secret(docker_password, "ci/data/common/dockerhub", "password"),
vault_secret(
gcp_upload_artifacts_key,
"infra/data/ci/grafana/releng/artifacts-uploader-service-account",
@@ -153,21 +153,10 @@ def secrets():
"infra/data/ci/grafana-release-eng/rgm",
"dagger_token",
),
# grafana-delivery-bot secrets
vault_secret(
"delivery-bot-app-id",
"infra/data/ci/grafana-release-eng/grafana-delivery-bot",
"app-id",
),
vault_secret(
"delivery-bot-app-installation-id",
"infra/data/ci/grafana-release-eng/grafana-delivery-bot",
"app-installation-id",
),
vault_secret(
"delivery-bot-app-private-key",
"infra/data/ci/grafana-release-eng/grafana-delivery-bot",
"app-private-key",
"ci/data/repo/grafana/grafana/delivery-bot-app",
"PRIVATE_KEY",
),
vault_secret(
"gcr_credentials",
+81 -81
View File
@@ -2482,13 +2482,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-azure-monitor-datasource@workspace:public/app/plugins/datasource/azuremonitor"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@kusto/monaco-kusto": "npm:^10.0.0"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:6.6.3"
@@ -2526,13 +2526,13 @@ __metadata:
resolution: "@grafana-plugins/grafana-postgresql-datasource@workspace:public/app/plugins/datasource/grafana-postgresql-datasource"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/sql": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/sql": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2557,11 +2557,11 @@ __metadata:
resolution: "@grafana-plugins/grafana-pyroscope-datasource@workspace:public/app/plugins/datasource/grafana-pyroscope-datasource"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:6.6.3"
"@testing-library/react": "npm:16.2.0"
@@ -2597,12 +2597,12 @@ __metadata:
resolution: "@grafana-plugins/grafana-testdata-datasource@workspace:public/app/plugins/datasource/grafana-testdata-datasource"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2678,13 +2678,13 @@ __metadata:
resolution: "@grafana-plugins/mssql@workspace:public/app/plugins/datasource/mssql"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/sql": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/sql": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2709,13 +2709,13 @@ __metadata:
resolution: "@grafana-plugins/mysql@workspace:public/app/plugins/datasource/mysql"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/sql": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/sql": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2740,11 +2740,11 @@ __metadata:
resolution: "@grafana-plugins/parca@workspace:public/app/plugins/datasource/parca"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/react": "npm:16.2.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -2772,14 +2772,14 @@ __metadata:
resolution: "@grafana-plugins/stackdriver@workspace:public/app/plugins/datasource/cloud-monitoring"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/google-sdk": "npm:0.1.2"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/ui": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:6.6.3"
"@testing-library/react": "npm:16.2.0"
@@ -2824,7 +2824,7 @@ __metadata:
"@grafana/lezer-traceql": "npm:0.0.20"
"@grafana/monaco-logql": "npm:^0.0.8"
"@grafana/o11y-ds-frontend": "workspace:*"
"@grafana/plugin-configs": "npm:11.6.2"
"@grafana/plugin-configs": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "workspace:*"
"@grafana/schema": "workspace:*"
@@ -2937,12 +2937,12 @@ __metadata:
languageName: node
linkType: hard
"@grafana/data@npm:11.6.2, @grafana/data@workspace:*, @grafana/data@workspace:packages/grafana-data":
"@grafana/data@npm:11.6.1, @grafana/data@workspace:*, @grafana/data@workspace:packages/grafana-data":
version: 0.0.0-use.local
resolution: "@grafana/data@workspace:packages/grafana-data"
dependencies:
"@braintree/sanitize-url": "npm:7.0.1"
"@grafana/schema": "npm:11.6.2"
"@grafana/schema": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@rollup/plugin-node-resolve": "npm:16.0.0"
"@types/d3-interpolate": "npm:^3.0.0"
@@ -2989,7 +2989,7 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/e2e-selectors@npm:11.6.2, @grafana/e2e-selectors@workspace:*, @grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors":
"@grafana/e2e-selectors@npm:11.6.1, @grafana/e2e-selectors@workspace:*, @grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors":
version: 0.0.0-use.local
resolution: "@grafana/e2e-selectors@workspace:packages/grafana-e2e-selectors"
dependencies:
@@ -3092,9 +3092,9 @@ __metadata:
"@babel/preset-env": "npm:7.26.9"
"@babel/preset-react": "npm:7.26.3"
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.6.2"
"@grafana/ui": "npm:11.6.1"
"@leeoniya/ufuzzy": "npm:1.0.18"
"@rollup/plugin-node-resolve": "npm:16.0.0"
"@testing-library/dom": "npm:10.4.0"
@@ -3201,13 +3201,13 @@ __metadata:
resolution: "@grafana/o11y-ds-frontend@workspace:packages/grafana-o11y-ds-frontend"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.6.2"
"@grafana/ui": "npm:11.6.1"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:^6.1.2"
"@testing-library/react": "npm:16.2.0"
@@ -3231,7 +3231,7 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/plugin-configs@npm:11.6.2, @grafana/plugin-configs@workspace:*, @grafana/plugin-configs@workspace:packages/grafana-plugin-configs":
"@grafana/plugin-configs@npm:11.6.1, @grafana/plugin-configs@workspace:*, @grafana/plugin-configs@workspace:packages/grafana-plugin-configs":
version: 0.0.0-use.local
resolution: "@grafana/plugin-configs@workspace:packages/grafana-plugin-configs"
dependencies:
@@ -3331,13 +3331,13 @@ __metadata:
dependencies:
"@emotion/css": "npm:11.13.5"
"@floating-ui/react": "npm:0.27.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/schema": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.6.2"
"@grafana/ui": "npm:11.6.1"
"@hello-pangea/dnd": "npm:17.0.0"
"@leeoniya/ufuzzy": "npm:1.0.18"
"@lezer/common": "npm:1.2.3"
@@ -3392,16 +3392,16 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/runtime@npm:11.6.2, @grafana/runtime@workspace:*, @grafana/runtime@workspace:packages/grafana-runtime":
"@grafana/runtime@npm:11.6.1, @grafana/runtime@workspace:*, @grafana/runtime@workspace:packages/grafana-runtime":
version: 0.0.0-use.local
resolution: "@grafana/runtime@workspace:packages/grafana-runtime"
dependencies:
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/faro-web-sdk": "npm:^1.13.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/schema": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.6.2"
"@grafana/ui": "npm:11.6.1"
"@rollup/plugin-node-resolve": "npm:16.0.0"
"@rollup/plugin-terser": "npm:0.4.4"
"@testing-library/dom": "npm:10.4.0"
@@ -3515,7 +3515,7 @@ __metadata:
languageName: node
linkType: hard
"@grafana/schema@npm:11.6.2, @grafana/schema@workspace:*, @grafana/schema@workspace:packages/grafana-schema":
"@grafana/schema@npm:11.6.1, @grafana/schema@workspace:*, @grafana/schema@workspace:packages/grafana-schema":
version: 0.0.0-use.local
resolution: "@grafana/schema@workspace:packages/grafana-schema"
dependencies:
@@ -3533,17 +3533,17 @@ __metadata:
languageName: unknown
linkType: soft
"@grafana/sql@npm:11.6.2, @grafana/sql@workspace:*, @grafana/sql@workspace:packages/grafana-sql":
"@grafana/sql@npm:11.6.1, @grafana/sql@workspace:*, @grafana/sql@workspace:packages/grafana-sql":
version: 0.0.0-use.local
resolution: "@grafana/sql@workspace:packages/grafana-sql"
dependencies:
"@emotion/css": "npm:11.13.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/plugin-ui": "npm:0.10.1"
"@grafana/runtime": "npm:11.6.2"
"@grafana/runtime": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:11.6.2"
"@grafana/ui": "npm:11.6.1"
"@react-awesome-query-builder/ui": "npm:6.6.4"
"@testing-library/dom": "npm:10.4.0"
"@testing-library/jest-dom": "npm:^6.1.2"
@@ -3584,7 +3584,7 @@ __metadata:
languageName: node
linkType: hard
"@grafana/ui@npm:11.6.2, @grafana/ui@workspace:*, @grafana/ui@workspace:packages/grafana-ui":
"@grafana/ui@npm:11.6.1, @grafana/ui@workspace:*, @grafana/ui@workspace:packages/grafana-ui":
version: 0.0.0-use.local
resolution: "@grafana/ui@workspace:packages/grafana-ui"
dependencies:
@@ -3594,10 +3594,10 @@ __metadata:
"@emotion/serialize": "npm:1.3.3"
"@faker-js/faker": "npm:^9.0.0"
"@floating-ui/react": "npm:0.27.5"
"@grafana/data": "npm:11.6.2"
"@grafana/e2e-selectors": "npm:11.6.2"
"@grafana/data": "npm:11.6.1"
"@grafana/e2e-selectors": "npm:11.6.1"
"@grafana/faro-web-sdk": "npm:^1.13.2"
"@grafana/schema": "npm:11.6.2"
"@grafana/schema": "npm:11.6.1"
"@grafana/tsconfig": "npm:^2.0.0"
"@hello-pangea/dnd": "npm:17.0.0"
"@leeoniya/ufuzzy": "npm:1.0.18"
@@ -11722,13 +11722,13 @@ __metadata:
linkType: hard
"axios@npm:^1.7.4, axios@npm:^1.7.9":
version: 1.9.0
resolution: "axios@npm:1.9.0"
version: 1.7.9
resolution: "axios@npm:1.7.9"
dependencies:
follow-redirects: "npm:^1.15.6"
form-data: "npm:^4.0.0"
proxy-from-env: "npm:^1.1.0"
checksum: 10/a2f90bba56820883879f32a237e2b9ff25c250365dcafd41cec41b3406a3df334a148f90010182dfdadb4b41dc59f6f0b3e8898ff41b666d1157b5f3f4523497
checksum: 10/b7a5f660ea53ba9c2a745bf5ad77ad8bf4f1338e13ccc3f9f09f810267d6c638c03dac88b55dae8dc98b79c57d2d6835be651d58d2af97c174f43d289a9fd007
languageName: node
linkType: hard