diff --git a/.betterer.results b/.betterer.results
index f83e79923d8..31d1f23e1c8 100644
--- a/.betterer.results
+++ b/.betterer.results
@@ -1692,10 +1692,7 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with ", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "7"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "8"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "9"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "10"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "11"]
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "8"]
],
"public/app/features/alerting/unified/components/expressions/ExpressionStatusIndicator.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
@@ -2639,6 +2636,11 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
+ "public/app/features/dashboard-scene/addToDashboard/AddToDashboardForm.tsx:5381": [
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
+ [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
+ ],
"public/app/features/dashboard-scene/embedding/EmbeddedDashboardTestPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"]
],
@@ -4003,11 +4005,6 @@ 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/features/explore/extensions/AddToDashboard/AddToDashboardForm.tsx:5381": [
- [0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
- [0, 0, 0, "No untranslated strings. Wrap text with ", "2"]
- ],
"public/app/features/explore/extensions/ConfirmNavigationModal.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with ", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with ", "1"],
@@ -6712,10 +6709,6 @@ exports[`better eslint`] = {
"public/app/plugins/panel/timeseries/SpanNullsEditor.tsx:5381": [
[0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"]
],
- "public/app/plugins/panel/timeseries/TimezonesEditor.tsx:5381": [
- [0, 0, 0, "Styles should be written using objects.", "0"],
- [0, 0, 0, "Styles should be written using objects.", "1"]
- ],
"public/app/plugins/panel/timeseries/migrations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index aea94e92eeb..d9c88232b09 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -731,7 +731,6 @@ embed.go @grafana/grafana-as-code
/.github/workflows/remove-milestone.yml @grafana/grafana-release-guild
/.github/workflows/sbom-report.yml @grafana/security-team
/.github/workflows/scripts/json-file-to-job-output.js @grafana/plugins-platform-frontend
-/.github/workflows/scripts/pr-get-job-link.js @grafana/plugins-platform-frontend
/.github/workflows/stale.yml @grafana/grafana-release-guild
/.github/workflows/update-changelog.yml @grafana/grafana-release-guild
/.github/workflows/update-make-docs.yml @grafana/docs-tooling
diff --git a/.github/commands.json b/.github/commands.json
index af047be4341..cbbdea3813b 100644
--- a/.github/commands.json
+++ b/.github/commands.json
@@ -59,14 +59,6 @@
"url": "https://github.com/orgs/grafana/projects/76"
}
},
- {
- "type": "label",
- "name": "type/docs",
- "action": "addToProject",
- "addToProject": {
- "url": "https://github.com/orgs/grafana/projects/69"
- }
- },
{
"type": "label",
"name": "datasource/Azure",
diff --git a/.github/workflows/detect-breaking-changes-levitate.yml b/.github/workflows/detect-breaking-changes-levitate.yml
index 8e802abd639..bb71dc4cfe8 100644
--- a/.github/workflows/detect-breaking-changes-levitate.yml
+++ b/.github/workflows/detect-breaking-changes-levitate.yml
@@ -6,6 +6,10 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
+permissions:
+ contents: read
+ id-token: write
+
on:
pull_request:
paths:
@@ -154,26 +158,16 @@ jobs:
project_id: 'grafanalabs-global'
install_components: 'bq'
- - name: Get link for the Github Action job
- id: job
- uses: actions/github-script@v6
- with:
- script: |
- const name = 'Detect breaking changes';
- const script = require('./.github/workflows/scripts/pr-get-job-link.js')
- await script({name, github, context, core})
-
- name: Detect breaking changes
id: breaking-changes
run: ./scripts/check-breaking-changes.sh
env:
FORCE_COLOR: 3
- GITHUB_JOB_LINK: ${{ steps.job.outputs.link }}
- name: Persisting the check output
run: |
mkdir -p ./levitate
- echo "{ \"exit_code\": ${{ steps.breaking-changes.outputs.is_breaking }}, \"message\": \"${{ steps.breaking-changes.outputs.message }}\", \"job_link\": \"${{ steps.job.outputs.link }}#step:${GITHUB_STEP_NUMBER}:1\", \"pr_number\": \"${{ github.event.pull_request.number }}\" }" > ./levitate/result.json
+ echo "{ \"exit_code\": ${{ steps.breaking-changes.outputs.is_breaking }}, \"message\": \"${{ steps.breaking-changes.outputs.message }}\", \"pr_number\": \"${{ github.event.pull_request.number }}\" }" > ./levitate/result.json
- name: Upload check output as artifact
uses: actions/upload-artifact@v4
@@ -219,15 +213,12 @@ jobs:
PR_NUMBER: ${{ github.event.pull_request.number }}
with:
script: |
- const { data } = await github.rest.issues.listLabelsOnIssue({
- issue_number: process.env.PR_NUMBER,
+ const { data: labels } = await github.rest.issues.listLabelsOnIssue({
+ issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
});
- const labels = data.map(({ name }) => name);
- const doesExist = labels.includes('levitate breaking change');
-
- return doesExist ? 1 : 0;
+ return labels.some(label => label.name === 'levitate breaking change') ? 1 : 0
# put the markdown into a variable
- name: Levitate Markdown
@@ -271,22 +262,41 @@ jobs:
delete: true
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
- # Posts a notification to Slack if a PR has a breaking change and it did not have a breaking change before
- - name: Post to Slack
+ - name: Send Slack Message via Payload
id: slack
- if: steps.levitate-run.outputs.exit_code == 1 && steps.does-label-exist.outputs.result == 0 && env.HAS_SECRETS
- uses: slackapi/slack-github-action@v1.26.0
+ if: steps.levitate-run.outputs.exit_code == 1 && steps.does-label-exist.outputs.result == 0 && github.repository == 'grafana/grafana'
+ uses: grafana/shared-workflows/actions/send-slack-message@main
with:
- payload: |
+ channel-id: "C031SLFH6G0"
+ payload: |
{
- "pr_link": "https://github.com/grafana/grafana/pull/${{ steps.levitate-run.outputs.pr_number }}",
- "pr_number": "${{ steps.levitate-run.outputs.pr_number }}",
- "job_link": "${{ steps.levitate-run.outputs.job_link }}",
- "message": "${{ steps.levitate-run.outputs.message }}"
+ "channel": "C031SLFH6G0",
+ "text": ":warning: Possible breaking changes detected in *PR:* <${{ github.event.pull_request.html_url }}|#${{ github.event.pull_request.number }} :warning:",
+ "icon_emoji": ":grot:",
+ "username": "Levitate Bot",
+ "blocks": [
+ {
+ "type": "section",
+ "text": {
+ "type": "mrkdwn",
+ "text": "*grafana/grafana* repository has possible breaking changes"
+ }
+ },
+ {
+ "type": "section",
+ "fields": [
+ {
+ "type": "mrkdwn",
+ "text": "*PR:* <${{ github.event.pull_request.html_url }}|#${{ github.event.pull_request.number }}>"
+ },
+ {
+ "type": "mrkdwn",
+ "text": "*Job:* <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Job>"
+ }
+ ]
+ }
+ ]
}
- env:
- SLACK_WEBHOOK_URL: ${{ secrets.SLACK_LEVITATE_WEBHOOK_URL }}
- HAS_SECRETS: ${{ (github.repository == 'grafana/grafana' || secrets.SLACK_LEVITATE_WEBHOOK_URL != '') || '' }}
# Add the label
- name: Add "levitate breaking change" label
diff --git a/.github/workflows/doc-validator.yml b/.github/workflows/doc-validator.yml
index 75b721904cc..0e6f613da9b 100644
--- a/.github/workflows/doc-validator.yml
+++ b/.github/workflows/doc-validator.yml
@@ -1,13 +1,18 @@
name: "doc-validator"
on:
- pull_request:
- paths: ["docs/sources/**"]
workflow_dispatch:
+ inputs:
+ include:
+ description: |
+ Regular expression that matches paths to include in linting.
+
+ For example: docs/sources/(?:alerting|fundamentals)/.+\.md
+ required: true
jobs:
doc-validator:
runs-on: "ubuntu-latest"
container:
- image: "grafana/doc-validator:v5.0.0"
+ image: "grafana/doc-validator:v5.2.0"
steps:
- name: "Checkout code"
uses: "actions/checkout@v4"
@@ -15,15 +20,7 @@ jobs:
# Only run doc-validator on specific directories.
run: >
doc-validator
- '--include=^docs/sources/(?:alerting|fundamentals|getting-started|introduction|setup-grafana|upgrade-guide|whatsnew/whats-new-in-v(?:9|10))/.+\.md$'
+ '--include=${{ inputs.include }}'
'--skip-checks=^(?:image.+|canonical-does-not-match-pretty-URL)$'
./docs/sources
/docs/grafana/latest
- | reviewdog
- -f=rdjsonl
- --fail-on-error
- --filter-mode=nofilter
- --name=doc-validator
- --reporter=github-pr-review
- env:
- REVIEWDOG_GITHUB_API_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/.github/workflows/scripts/pr-get-job-link.js b/.github/workflows/scripts/pr-get-job-link.js
deleted file mode 100644
index b1b49c89941..00000000000
--- a/.github/workflows/scripts/pr-get-job-link.js
+++ /dev/null
@@ -1,9 +0,0 @@
-
-module.exports = async ({ name, github, context, core }) => {
- const { owner, repo } = context.repo;
- const url = `https://api.github.com/repos/${owner}/${repo}/actions/runs/${context.runId}/jobs`
- const result = await github.request(url);
- const job = result.data.jobs.find(j => j.name === name);
-
- core.setOutput('link', `${job.html_url}?check_suite_focus=true`);
-}
diff --git a/Makefile b/Makefile
index 9346e4b9b10..9c8f178a3d9 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,7 @@ GO_RACE_FLAG := $(if $(GO_RACE),-race)
GO_BUILD_FLAGS += $(if $(GO_BUILD_DEV),-dev)
GO_BUILD_FLAGS += $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS))
GO_BUILD_FLAGS += $(GO_RACE_FLAG)
+GIT_BASE = remotes/origin/main
# GNU xargs has flag -r, and BSD xargs (e.g. MacOS) has that behaviour by default
XARGSR = $(shell xargs --version 2>&1 | grep -q GNU && echo xargs -r || echo xargs)
@@ -308,7 +309,7 @@ lint-go: golangci-lint ## Run all code checks for backend. You can use GO_LINT_F
.PHONY: lint-go-diff
lint-go-diff: $(GOLANGCI_LINT)
- git diff --name-only remotes/origin/main | \
+ git diff --name-only $(GIT_BASE) | \
grep '\.go$$' | \
$(XARGSR) dirname | \
sort -u | \
diff --git a/docs/sources/dashboards/create-reports/index.md b/docs/sources/dashboards/create-reports/index.md
index 29beabb4794..272b948d796 100644
--- a/docs/sources/dashboards/create-reports/index.md
+++ b/docs/sources/dashboards/create-reports/index.md
@@ -39,6 +39,11 @@ refs:
destination: /docs/grafana//administration/roles-and-permissions/access-control/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana//administration/roles-and-permissions/access-control/
+ permission:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//administration/roles-and-permissions/
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana//administration/roles-and-permissions/
role-based-access-control:
- pattern: /docs/grafana/
destination: /docs/grafana//administration/roles-and-permissions/access-control/
@@ -109,7 +114,7 @@ For information about recent improvements to the reporting UI, refer to [Grafana
## Access control
-When [RBAC](ref:rbac) is enabled, you need to have the relevant [Permissions][] to create and manage reports.
+When [RBAC](ref:rbac) is enabled, you need to have the relevant [Permissions](ref:permission) to create and manage reports.
## Create or update a report
diff --git a/docs/sources/datasources/tempo/configure-tempo-data-source.md b/docs/sources/datasources/tempo/configure-tempo-data-source.md
index 1a85b2357af..9505f33bd41 100644
--- a/docs/sources/datasources/tempo/configure-tempo-data-source.md
+++ b/docs/sources/datasources/tempo/configure-tempo-data-source.md
@@ -123,30 +123,25 @@ For additional information on setting up TLS encryption with Tempo, refer to [Co
## Streaming
-
-
Streaming enables TraceQL query results to be displayed as they become available.
Without streaming, no results are displayed until all results have returned.
-{{< docs/public-preview product="TraceQL streaming results" >}}
-
To use streaming, you need to:
-- Run Tempo version 2.2 or newer, or Grafana Enterprise Traces (GET) version 2.2 or newer, or use Grafana Cloud Traces.
-- For self-managed Tempo or GET instances: If your Tempo or GET instance is behind a load balancer or proxy that doesn't supporting gRPC or HTTP2, streaming may not work and should be disabled.
+- Run Tempo version 2.2 or later, or Grafana Enterprise Traces (GET) version 2.2 or later, or use Grafana Cloud Traces.
+- Tempo must have `stream_over_http_enabled: true` for streaming to work.
+
+ For more information, refer to [Tempo GRPC API](https://grafana.com/docs/tempo//api_docs/#tempo-grpc-api).
+
+- For self-managed Tempo or GET instances: If your Tempo or GET instance is behind a load balancer or proxy that doesn't supporting gRPC or HTTP2, streaming may not work and should be deactivated.
### Activate streaming
-You can activate streaming by either setting the `traceQLStreaming` [feature toggle](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/feature-toggles/) to true or by activating the **Streaming** toggle in the Tempo data source.
+Streaming is available in Grafana and Grafana Cloud.
+You can activate streaming by turning the **Streaming** toggle to on in the Tempo data source.

-If you are using Grafana Cloud, the `traceQLStreaming` feature toggle is already set to `true` by default.
-
-If the Tempo data source is set to allow streaming but the `traceQLStreaming` feature toggle is set to `false` in Grafana, streaming occurs.
-
-If the data source has streaming disabled and `traceQLStreaming` is set to `true`, streaming happens for that data source.
-
When streaming is active, it's shows as **Enabled** in **Explore**.
To check the status, select Explore in the menu, select your Tempo data source, and expand the **Options** section.
diff --git a/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md b/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md
index dd297b5503e..f4059970634 100644
--- a/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md
+++ b/docs/sources/panels-visualizations/visualizations/bar-gauge/index.md
@@ -39,6 +39,12 @@ You can use a bar gauge visualization when you need to show:
- Attendance
- Process completion rates
+## Configure a bar gauge visualization
+
+The following video shows you how to create and configure a bar gauge visualization:
+
+{{< youtube id="7PhDysObEXA" >}}
+
{{< docs/play title="Bar Gauge" url="https://play.grafana.org/d/vmie2cmWz/" >}}
## Supported data formats
diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
index ef8bc6a3396..46c13858bb3 100644
--- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
@@ -191,11 +191,10 @@ Experimental features might be changed or removed without prior notice.
| `queryLibrary` | Enables Query Library feature in Explore |
| `logsExploreTableDefaultVisualization` | Sets the logs table as default visualisation in logs explore |
| `alertingListViewV2` | Enables the new alert list view design |
-| `dashboardRestore` | Enables deleted dashboard restore feature (backend only) |
+| `dashboardRestore` | Enables deleted dashboard restore feature |
| `alertingCentralAlertHistory` | Enables the new central alert history. |
| `failWrongDSUID` | Throws an error if a datasource has an invalid UIDs |
| `alertingApiServer` | Register Alerting APIs with the K8s API server |
-| `dashboardRestoreUI` | Enables the frontend to be able to restore a recently deleted dashboard |
| `dataplaneAggregator` | Enable grafana dataplane aggregator |
| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture |
| `lokiSendDashboardPanelNames` | Send dashboard and panel names to Loki when querying |
diff --git a/docs/sources/setup-grafana/configure-security/audit-grafana.md b/docs/sources/setup-grafana/configure-security/audit-grafana.md
index 981eddbbd08..9f421becc5f 100644
--- a/docs/sources/setup-grafana/configure-security/audit-grafana.md
+++ b/docs/sources/setup-grafana/configure-security/audit-grafana.md
@@ -48,7 +48,7 @@ Audit logs contain the following fields. The fields followed by **\*** are alway
| `user.orgId`\* | number | Current organization of the user that made the request. |
| `user.orgRole` | string | Current role of the user that made the request. |
| `user.name` | string | Name of the Grafana user that made the request. |
-| `user.tokenId` | number | ID of the user authentication token. |
+| `user.authTokenId` | number | ID of the user authentication token. |
| `user.apiKeyId` | number | ID of the Grafana API key used to make the request. |
| `user.isAnonymous`\* | boolean | If an anonymous user made the request, `true`. Otherwise, `false`. |
| `action`\* | string | The request action. For example, `create`, `update`, or `manage-permissions`. |
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
index 29ef9f04975..11b405c1959 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/index.md
@@ -231,21 +231,34 @@ This app registration will be used as a Service Account to retrieve more informa
1. Go to the [Azure portal](https://portal.azure.com/#home) and sign in with your Azure AD account.
1. In the left-hand navigation pane, select the Azure Active Directory service, and then select **App registrations**.
-1. Select **New registration**.
+1. Click the **New registration** button.
1. In the **Register an application** pane, enter a name for the application.
1. In the **Supported account types** section, select the account types that can use the application.
1. In the **Redirect URI** section, select Web and enter `https://localhost/login/azuread`.
-1. Select **Register**.
+1. Click the **Register** button.
#### Set up permissions for the application
1. In the overview pane, look for **API permissions** section and select **Add a permission**.
1. In the **Request API permissions** pane, select **Microsoft Graph**, and click **Application permissions**.
1. In the **Select permissions** pane, under the **GroupMember** section, select **GroupMember.Read.All**.
+1. In the **Select permissions** pane, under the **User** section, select **User.Read.All**.
+1. Click the **Add permissions** button at the bottom of the page.
+1. In the **Request API permissions** pane, select **Microsoft Graph**, and click **Delegated permissions**.
1. In the **Select permissions** pane, under the **User** section, select **User.Read**.
-1. Select **Add permissions** at the bottom of the page.
+1. Click the **Add permissions** button at the bottom of the page.
1. In the **API permissions** section, select **Grant admin consent for **.
+The following table shows what the permissions look like from the Azure AD portal:
+
+| Permissions name | Type | Admin consent required | Status |
+| ---------------- | ----------- | ---------------------- | ------- |
+| `Group.Read.All` | Application | Yes | Granted |
+| `User.Read` | Delegated | No | Granted |
+| `User.Read.All` | Application | Yes | Granted |
+
+{{< figure src="/media/docs/grafana/saml/graph-api-app-permissions.png" caption="Screen shot of the permissions listed in Azure AD for the App registration" >}}
+
#### Generate a client secret
1. In the **Overview** pane, select **Certificates & secrets**.
diff --git a/docs/sources/setup-grafana/installation/helm/index.md b/docs/sources/setup-grafana/installation/helm/index.md
index 566f73d5610..d34e5c35f0e 100644
--- a/docs/sources/setup-grafana/installation/helm/index.md
+++ b/docs/sources/setup-grafana/installation/helm/index.md
@@ -278,6 +278,67 @@ To install plugins in the Grafana Helm Charts, complete the following steps:
1. Search for the above plugins and they should be marked as installed.
+### Configure a Private CA (Certificate Authority)
+
+In many enterprise networks, TLS certificates are issued by a private certificate authority and are not trusted by default (using the provided OS trust chain).
+
+If your Grafana instance needs to interact with services exposing certificates issued by these private CAs, then you need to ensure Grafana trusts the root certificate.
+
+You might need to configure this if you:
+
+- have plugins that require connectivity to other self hosted systems. For example, if you've installed the Grafana Enterprise Metrics, Logs, or Traces (GEM, GEL, GET) plugins, and your GEM (or GEL/GET) cluster is using a private certificate.
+- want to connect to data sources which are listening on HTTPS with a private certificate.
+- are using a backend database for persistence, or caching service that uses private certificates for encryption in transit.
+
+In some cases you can specify a self-signed certificate within Grafana (such as in some data sources), or choose to skip TLS certificate validation (this is not recommended unless absolutely necessary).
+
+A simple solution which should work across your entire instance (plugins, data sources, and backend connections) is to add your self-signed CA certificate to your Kubernetes deployment.
+
+1. Create a ConfigMap containing the certificate, and deploy it to your Kubernetes cluster
+
+ ```yaml
+ # grafana-ca-configmap.yaml
+ ---
+ apiVersion: v1
+ kind: ConfigMap
+ metadata:
+ name: grafana-ca-cert
+ data:
+ ca.pem: |
+ -----BEGIN CERTIFICATE-----
+ (rest of the CA cert)
+ -----END CERTIFICATE-----
+ ```
+
+ ```bash
+ kubectl apply --filename grafana-ca-configmap.yaml --namespace monitoring
+ ```
+
+1. Open the Helm `values.yaml` file in your favorite editor.
+
+1. Find the line that says `extraConfigmapMounts:` and under that section, specify the additional ConfigMap that you want to mount.
+
+ ```yaml
+ .......
+ ............
+ ......
+ extraConfigmapMounts:
+ - name: ca-certs-configmap
+ mountPath: /etc/ssl/certs/ca.pem
+ subPath: ca.pem
+ configMap: grafana-ca-cert
+ readOnly: true
+ .......
+ ............
+ ......
+ ```
+
+1. Save the changes and use the `helm upgrade` command to update your Grafana deployment and mount the new ConfigMap:
+
+ ```bash
+ helm upgrade my-grafana grafana/grafana --values values.yaml --namespace monitoring
+ ```
+
## Troubleshooting
This section includes troubleshooting tips you might find helpful when deploying Grafana on Kubernetes via Helm.
diff --git a/docs/sources/shared/datasources/tempo-editor-traceql.md b/docs/sources/shared/datasources/tempo-editor-traceql.md
index 8b47093f616..4a63ecb651b 100644
--- a/docs/sources/shared/datasources/tempo-editor-traceql.md
+++ b/docs/sources/shared/datasources/tempo-editor-traceql.md
@@ -129,10 +129,8 @@ Using the **Spans** option makes it easier access the spans to apply transformat
The Tempo data source supports streaming responses to TraceQL queries so you can see partial query results as they come in without waiting for the whole query to finish.
-{{% admonition type="note" %}}
-To use this feature in Grafana OSS v10.1 and later, enable the `traceQLStreaming` feature toggle. This capability is enabled by default in Grafana Cloud.
-{{% /admonition %}}
-
Streaming is available for both the **Search** and **TraceQL** query types, and you'll get immediate visibility of incoming traces on the results table.
+To learn how to activate streaming, refer to [Streaming](https://grafana.com/docs/grafana//datasources/tempo/configure-tempo-data-source/#streaming) in the Tempo data source documentation.
+
{{< video-embed src="/media/docs/grafana/data-sources/tempo-streaming-v2.mp4" >}}
diff --git a/docs/sources/shared/datasources/tempo-search-traceql.md b/docs/sources/shared/datasources/tempo-search-traceql.md
index 5f5f19b034e..e51a25860f5 100644
--- a/docs/sources/shared/datasources/tempo-search-traceql.md
+++ b/docs/sources/shared/datasources/tempo-search-traceql.md
@@ -167,12 +167,9 @@ Selecting a Trace ID (2 in the screenshot) displays more detailed information (3
The Tempo data source supports streaming responses to TraceQL queries so you can see partial query results as they come in without waiting for the whole query to finish.
-{{% admonition type="note" %}}
-To use this public preview feature, enable the `traceQLStreaming` feature toggle.
-When active, all configured Tempo data sources will attempt to use streaming.
-You can control which Tempo data sources do and don't attempt to stream results at the per-data source level using the **Streaming** section of the Tempo data source configuration.
-
-{{% /admonition %}}
+When active, all configured Tempo data sources attempt to use streaming.
+You can activate and control which Tempo data sources do and don't attempt to stream results at the per-data source level using the **Streaming** section of the Tempo data source configuration.
+For more information, refer to the [Tempo data source](https://grafana.com/docs/grafana//datasources/tempo/configure-tempo-data-source/#streaming) documentation.
Streaming is available for both the **Search** and **TraceQL** query types.
You'll get immediate visibility of incoming traces on the results table.
diff --git a/docs/sources/upgrade-guide/_index.md b/docs/sources/upgrade-guide/_index.md
index 390c81e965c..874374740f4 100644
--- a/docs/sources/upgrade-guide/_index.md
+++ b/docs/sources/upgrade-guide/_index.md
@@ -22,7 +22,7 @@ We recommend that you upgrade Grafana often to stay current with the latest fixe
Because Grafana upgrades are backward compatible, the upgrade process is straightforward, and dashboards and graphs will not change.
-To learn what's available in a Grafana release, refer to [What's New ]({{< relref "../whatsnew" >}}).
+To learn what's available in a Grafana release, refer to [What's New]({{< relref "../whatsnew" >}}).
Refer to any of the following upgrade guides:
diff --git a/docs/sources/upgrade-guide/when-to-upgrade/index.md b/docs/sources/upgrade-guide/when-to-upgrade/index.md
new file mode 100644
index 00000000000..33fe3211ed6
--- /dev/null
+++ b/docs/sources/upgrade-guide/when-to-upgrade/index.md
@@ -0,0 +1,115 @@
+---
+description: Strategies for upgrading your self-managed Grafana instance
+keywords:
+ - grafana
+ - configuration
+ - documentation
+ - upgrade
+title: Strategies for upgrading your self-managed Grafana instance
+menuTitle: Upgrade strategies
+weight: 1000
+---
+
+# Strategies for upgrading your self-managed Grafana instance
+
+At Grafana Labs, we believe in shipping features early and often, and in recent years we’ve increased our commitment to that philosophy.
+
+We no longer wait for the yearly major release to give you access to the next big improvement. Instead, we regularly make new features, bug fixes, and security patches available to our self-managing users ([Grafana OSS](https://grafana.com/oss/grafana/) and [Grafana Enterprise](https://grafana.com/products/enterprise/)) throughout the year.
+
+Having a dependable release process provides users like you with the best Grafana experience possible, and it provides the flexibility to upgrade in a manner that works best for you and your organization.
+
+## What to expect from each release type
+
+We split Grafana OSS and Grafana Enterprise releases into three main categories:
+
+- **Minor release (every other month)**: These releases can include new features, deprecation notices, notices about upcoming breaking changes, previously announced breaking changes, bug fixes, and security vulnerability patches.
+- **Major release (once a year, in April/May)**: These are like a minor release, but accompanied by [GrafanaCON](https://grafana.com/events/grafanacon/) and a comprehensive upgrade guide for users who like to upgrade only once a year.
+- **Patching release (every month)**: These include bug fixes for currently supported versions, as well as any security vulnerability patches.
+
+You can choose your cadence: For frequent self-managed updates, you should follow the minor release (for example, upgrade 10.1 to 10.2), which also gives you access to the latest features. If you need a longer period to review our new releases, you should follow the major releases. Both strategies get patching releases with security fixes (high severity security fixes also result in ad-hoc patch releases). We’ll get into additional guidance on upgrade cadences later in this guide.
+
+## How to find the specifics for a release
+
+We love sharing all our great features with you so you can leverage Grafana to its fullest. We also understand that great release documentation allows you to upgrade with confidence.
+Whether it’s knowing that a bug has been fixed, seeing that a security vulnerability is patched, or understanding how to mitigate the impact of breaking changes, proper documentation allows you to make informed decisions about when to upgrade your local Grafana instances.
+
+We provide release documentation in multiple places to address different needs:
+
+- [**What’s new**](https://grafana.com/docs/grafana/latest/whatsnew/?pg=blog&plcmt=body-txt) outlines new features debuting in each major and minor release.
+- [**Breaking changes**](https://grafana.com/docs/grafana/latest/breaking-changes/?pg=blog&plcmt=body-txt) notify you of updates included in major releases that could impact you and provide mitigation recommendations when needed.
+- [**Upgrade guides**](https://grafana.com/docs/grafana/latest/upgrade-guide/?pg=blog&plcmt=body-txt) instruct you on how to upgrade to a newer minor or major version.
+- And finally, a [**changelog**](https://github.com/grafana/grafana/blob/main/CHANGELOG.md) is generated for every release (major, minor, patching, security) and outlines all changes included in that release.
+
+## When to expect releases
+
+Currently, Grafana is on a monthly release cycle. Here’s a look at scheduled releases for 2024:
+
+| **Anticipated release date** | **Grafana versions** | **Release type** |
+| ---------------------------- | -------------------- | ------------------ |
+| May 14, 2024 | 11 | Major and patching |
+| June 25, 2024 | 11.1 | Minor and patching |
+| July 23, 2024 | 11.1.x | Patching |
+| Aug. 27, 2024 | 11.2 | Minor and patching |
+| Sept. 24, 2024 | 11.2.x | Patching |
+| Oct. 22, 2024 | 11.3 | Minor and patching |
+| November/December 2024 | To be determined | To be determined |
+
+### A few important notes
+
+- The schedule above outlines how we plan release dates. However, unforeseen events and circumstances may cause dates to change.
+- High severity security and feature degradation incidents will result in ad-hoc releases that are not scheduled ahead of time.
+- Patching releases are for the current (last released) minor version of Grafana. Additional older versions of Grafana may be included if there is a critical bug or security vulnerability that needs to be patched.
+- A Grafana release freeze occurs for a week in November and again during the end of December. This does not apply to changes that may be required during the course of an operational or security incident.
+
+## What to know about version support
+
+Self-managed Grafana users have control over when they upgrade to a new version of Grafana. To help you make an informed decision about whether it's time to upgrade, it’s important that you understand the level of support provided for your current version.
+
+For self-managed Grafana (both Enterprise and OSS), the support for versions is as follows:
+
+- Support for each minor release extends to nine months after the release date.
+- Support for the last minor release of a major version is extended an additional six months, for a total of 15 months of support after the release date.
+
+Here is an overview of projected version support through 2024:
+
+| **Version** | **Release date** | **Support end of life (EOL)** |
+| ------------------------- | ----------------------- | ----------------------------- |
+| 10.3 | January 2024 | October 2024 |
+| 10.4 (Last minor of 10.0) | March 2024 | June 2025 (extended support) |
+| 11.0 | May 2024 | February 2025 |
+| 11.1 | June 2024 | March 2025 |
+| 11.2 | August 2024 (tentative) | May 2025 (tentative) |
+
+{{< admonition type="note" >}}
+Grafana 9.5.x was the last supported minor for the 9.0 major release and is no longer supported as of July 2024.
+{{< /admonition >}}
+
+## How are these versions supported?
+
+The level of support changes as new versions of Grafana are released. Here are a few details to keep in mind:
+
+- The current (most recently released) version of Grafana gets the highest level of support. Releases for this version include all the new features along with all bug fixes.
+- All supported versions receive security patches for vulnerabilities impacting that version.
+- All supported versions receive patches for bugs that cause critical feature degradation incidents.
+
+Keeping all this in mind, users that want to receive the most recent features and all bug fixes should be on the current (most recently released) version of Grafana.
+
+### What is a critical feature degradation?
+
+A critical feature degradation usually meets one of the following criteria:
+
+- Major functionality is universally unavailable (for example, cannot create dashboards, unable to authenticate).
+- Major (critical) impact to a significant amount of customers.
+- Major escalated incident for one or many customers.
+
+## Self-managing upgrade strategies
+
+Based on your needs, you can choose your ideal upgrade strategy. Here’s what that might look like in practice:
+
+| **Strategy/cadence** | **Advantages/disadvantages** | **Example upgrade procedure** |
+| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Minor / bi-monthly (11.1 to 11.2)** | Our recommended strategy. It combines up-to-date, secure releases with access to latest features as soon as they're released.
Small changelog to review
Highest compatibility with actively maintained plugins
Easy migration to [Grafana Cloud](https://grafana.com/products/cloud)
|
**June 2024**: You review the 11.1 changelog and deploy the release to testing
**July 2024**: You deploy 11.1 to production
**August 2024**: 11.2 is released
|
+| **Major / yearly (10.0 to 11.0)** | Yearly upgrade path that still gives access to up-to-date features presented at GrafanaCON.
Big changelog to review
High compatibility with plugins
Relatively easy migration to [Grafana Cloud](https://grafana.com/products/cloud)
|
**April 2024**: 11.0 is released, you start a big changelog review
**May 2024**: You deploy 11.0 to testing
**June 2024**: You deploy 11.0 to production
**April 2025**: 12.0 is released
|
+| **Previous major / yearly (9.5 to 10.4)** | Release with extended support timeline
Limited compatibility with actively developed plugins
Big changelog to review
Migrations to Grafana Cloud might require professional support
|
**April 2024**: 11.0 is released, marking the previous minor (10.4.x) with extended support, you start a big changelog review (9.5.x to 10.4.x)