mirror of https://github.com/grafana/grafana.git
360 lines
16 KiB
Markdown
360 lines
16 KiB
Markdown
---
|
||
aliases:
|
||
- ../data-sources/prometheus/
|
||
- ../features/datasources/prometheus/
|
||
description: Guide for authenticating with Azure Monitor Managed Service for Prometheus in Grafana
|
||
keywords:
|
||
- grafana
|
||
- prometheus
|
||
- guide
|
||
labels:
|
||
products:
|
||
- cloud
|
||
- enterprise
|
||
- oss
|
||
menuTitle: Authenticating with Azure
|
||
title: Configure the Prometheus data source
|
||
weight: 200
|
||
refs:
|
||
intro-to-prometheus:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/fundamentals/intro-to-prometheus/
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/fundamentals/intro-to-prometheus/
|
||
exemplars:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/fundamentals/exemplars/
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/fundamentals/exemplars/
|
||
configure-data-links-value-variables:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/configure-data-links/#value-variables
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/panels-visualizations/configure-data-links/#value-variables
|
||
alerting-alert-rules:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/fundamentals/alert-rules/
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/
|
||
add-a-data-source:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/#add-a-data-source
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/#add-a-data-source
|
||
prom-query-editor:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/prometheus/query-editor
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/prometheus/query-editor
|
||
default-manage-alerts-ui-toggle:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#default_manage_alerts_ui_toggle
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#default_manage_alerts_ui_toggle
|
||
provision-grafana:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/administration/provisioning/
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/administration/provisioning/
|
||
manage-alerts-toggle:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#default_manage_alerts_ui_toggle
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#default_manage_alerts_ui_toggle
|
||
manage-recording-rules-toggle:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#default_allow_recording_rules_target_alerts_ui_toggle
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#default_allow_recording_rules_target_alerts_ui_toggle
|
||
private-data-source-connect:
|
||
- pattern: /docs/grafana/
|
||
destination: docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/
|
||
configure-pdc:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/configure-pdc/#configure-grafana-private-data-source-connect-pdc
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/configure-pdc/#configure-grafana-private-data-source-connect-pdc
|
||
azure-active-directory:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/azure-monitor/#configure-azure-active-directory-ad-authentication
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/datasources/azure-monitor/#configure-azure-active-directory-ad-authentication
|
||
configure-grafana-configuration-file-location:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#configuration-file-location
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/#configuration-file-location
|
||
grafana-managed-recording-rules:
|
||
- pattern: /docs/grafana/
|
||
destination: /docs/grafana/<GRAFANA_VERSION>/alerting/alerting-rules/create-recording-rules/create-grafana-managed-recording-rules/
|
||
- pattern: /docs/grafana-cloud/
|
||
destination: /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-recording-rules/create-grafana-managed-recording-rules/
|
||
---
|
||
|
||
# Connect to Azure Monitor Managed Service for Prometheus
|
||
|
||
After creating a Azure Monitor Managed Service for Prometheus data source:
|
||
|
||
1. In the data source configuration page, locate the **Authentication** section
|
||
2. Select your authentication method:
|
||
- **Managed Identity**: For Azure-hosted Grafana instances. To learn more about Entra login for Grafana, refer to [Configure Azure AD/Entra ID OAuth authentication](/docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-security/configure-authentication/azuread/#configure-azure-adentra-id-oauth-authentication)
|
||
- **App Registration**: For service principal authentication
|
||
- **Current User**: Uses the current user's Azure AD credentials
|
||
|
||
3. Configure based on your chosen method:
|
||
|
||
| Setting | Description | Example |
|
||
| --------------------------- | ------------------------------- | -------------------------------------- |
|
||
| **Directory (tenant) ID** | Your Azure AD tenant ID | `12345678-1234-1234-1234-123456789012` |
|
||
| **Application (client) ID** | Your app registration client ID | `87654321-4321-4321-4321-210987654321` |
|
||
| **Client secret** | Your app registration secret | `your-client-secret` |
|
||
|
||
When using Managed Identity for authentication:
|
||
|
||
- No additional configuration required if using system-assigned identity.
|
||
- For user-assigned identity, provide the **Client ID**.
|
||
|
||
4. Set the **Prometheus server URL** to your Azure Monitor workspace endpoint:
|
||
|
||
```
|
||
https://your-workspace.eastus2.prometheus.monitor.azure.com
|
||
```
|
||
|
||
5. Click **Save & test** to verify the connection
|
||
|
||
## Example configuration
|
||
|
||
```yaml
|
||
# Example provisioning configuration for App Registration
|
||
apiVersion: 1
|
||
datasources:
|
||
- name: 'Azure Monitor Prometheus'
|
||
type: 'grafana-azureprometheus-datasource'
|
||
url: 'https://your-workspace.eastus2.prometheus.monitor.azure.com'
|
||
jsonData:
|
||
azureCredentials:
|
||
authType: 'clientsecret'
|
||
azureCloud: 'AzureCloud'
|
||
clientId: '<client_id>'
|
||
httpMethod: 'POST'
|
||
tenantId: '<tenant_id>'
|
||
secureJsonData:
|
||
clientSecret: 'your-client-secret'
|
||
```
|
||
|
||
## Migrate to Azure Monitor Managed Service for Prometheus
|
||
|
||
Learn more about why this is happening: [Prometheus data source update: Redefining our big tent philosophy](https://grafana.com/blog/2025/06/16/prometheus-data-source-update-redefining-our-big-tent-philosophy/)
|
||
|
||
Before you begin, ensure you have the organization administrator role. If you are self-hosting Grafana, back up your existing dashboard configurations and queries.
|
||
|
||
Grafana Cloud users will be automatically migrated to the relevant version of Prometheus, so no action needs to be taken.
|
||
|
||
For air-gapped environments, download and install [Azure Monitor Managed Service for Prometheus](https://grafana.com/grafana/plugins/grafana-azureprometheus-datasource/), then follow the standard migration process.
|
||
|
||
### Migrate
|
||
|
||
1. Enable the `prometheusTypeMigration` feature toggle. For more information on feature toggles, refer to [Manage feature toggles](/docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/feature-toggles/#manage-feature-toggles).
|
||
2. Restart Grafana for the changes to take effect.
|
||
|
||
{{< admonition type="note" >}}
|
||
This feature toggle will be removed in Grafana 13, and the migration will be automatic.
|
||
{{< /admonition >}}
|
||
|
||
To determine if your Prometheus data sources have been migrated:
|
||
|
||
1. Navigate to **Connections** > **Data sources**
|
||
2. Select your Prometheus data source
|
||
3. Look for a migration banner at the top of the configuration page
|
||
|
||
The banner displays one of the following messages:
|
||
|
||
- **"Migration Notice"** - The data source has already been migrated
|
||
- **"Deprecation Notice"** - The data source has not been migrated
|
||
- **No banner** - No migration is needed for this data source
|
||
|
||
## Common migration issues
|
||
|
||
The following sections contain troubleshooting guidance.
|
||
|
||
**Migration banner not appearing**
|
||
|
||
- Verify the `prometheusTypeMigration` feature toggle is enabled.
|
||
- Restart Grafana after enabling the feature toggle
|
||
|
||
**Azure Monitor Managed Service for Prometheus is not installed**
|
||
|
||
- Verify that Azure Monitor Managed Service for Prometheus is installed by going to **Connections** > **Add new connection** and search for "Azure Monitor Managed Service for Prometheus"
|
||
- Install Azure Monitor Managed Service for Prometheus if not already installed
|
||
|
||
**After migrating, my data source returns "401 Unauthorized"**
|
||
|
||
- If you are using self-hosted Grafana, check your .ini for `grafana-azureprometheus-datasource` is included in `forward_settings_to_plugins` under the `[azure]` heading.
|
||
- If you are using Grafana Cloud, contact Grafana support.
|
||
|
||
### Rollback self-hosted Grafana without a backup
|
||
|
||
If you don’t have a backup of your Grafana instance before the migration, remove the `prometheusTypeMigration` feature toggle, and run the following script. It reverts all the Azure Monitor Managed Service data source instances back to core Prometheus.
|
||
|
||
To revert the migration:
|
||
|
||
1. Disable the `prometheusTypeMigration` feature toggle. For more information on feature toggles, refer to [Manage feature toggles](/docs/grafana/<GRAFANA_VERSION>/setup-grafana/configure-grafana/feature-toggles/#manage-feature-toggles).
|
||
2. Obtain a bearer token that has `read` and `write` permissions for your Grafana data source API. For more information on the data source API, refer to [Data source API](/docs/grafana/<GRAFANA_VERSION>/developers/http_api/data_source/).
|
||
3. Run the script below. Make sure to provide your Grafana URL and bearer token.
|
||
4. (Optional) Report the issue you were experiencing on the [Grafana repository](https://github.com/grafana/grafana/issues). Tag the issue with "datasource/migrate-prometheus-type"
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
|
||
# Configuration
|
||
GRAFANA_URL=""
|
||
BEARER_TOKEN=""
|
||
LOG_FILE="grafana_migration_$(date +%Y%m%d_%H%M%S).log"
|
||
|
||
# Function to log messages to both console and file
|
||
log_message() {
|
||
local message="$1"
|
||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||
echo "[$timestamp] $message" | tee -a "$LOG_FILE"
|
||
}
|
||
|
||
# Function to update a data source
|
||
update_data_source() {
|
||
local uid="$1"
|
||
local data="$2"
|
||
|
||
response=$(curl -s -w "\n%{http_code}" -X PUT \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer $BEARER_TOKEN" \
|
||
-d "$data" \
|
||
"$GRAFANA_URL/api/datasources/uid/$uid")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
response_body=$(echo "$response" | sed '$d')
|
||
|
||
if [[ "$http_code" -ge 200 && "$http_code" -lt 300 ]]; then
|
||
log_message "$uid successful"
|
||
else
|
||
log_message "$uid error: HTTP $http_code - $response_body"
|
||
fi
|
||
}
|
||
|
||
# Function to process and update data source types
|
||
update_data_source_type() {
|
||
local result="$1"
|
||
local processed_count=0
|
||
local updated_count=0
|
||
local readonly_count=0
|
||
local skipped_count=0
|
||
|
||
# Use jq to parse and process JSON
|
||
echo "$result" | jq -c '.[]' | while read -r data; do
|
||
uid=$(echo "$data" | jq -r '.uid')
|
||
prometheus_type_migration=$(echo "$data" | jq -r '.jsonData["prometheus-type-migration"] // false')
|
||
data_type=$(echo "$data" | jq -r '.type')
|
||
read_only=$(echo "$data" | jq -r '.readOnly // false')
|
||
|
||
processed_count=$((processed_count + 1))
|
||
|
||
# Check conditions
|
||
if [[ "$prometheus_type_migration" != "true" ]] || [[ "$data_type" != "grafana-azureprometheus-datasource" ]]; then
|
||
skipped_count=$((skipped_count + 1))
|
||
continue
|
||
fi
|
||
|
||
if [[ "$read_only" == "true" ]]; then
|
||
readonly_count=$((readonly_count + 1))
|
||
log_message "$uid is readOnly. If this data source is provisioned, edit the data source type to be \`prometheus\` in the provisioning file."
|
||
continue
|
||
fi
|
||
|
||
# Update the data
|
||
updated_data=$(echo "$data" | jq '.type = "prometheus" | .jsonData["prometheus-type-migration"] = false')
|
||
update_data_source "$uid" "$updated_data"
|
||
updated_count=$((updated_count + 1))
|
||
|
||
# Log the raw data for debugging (optional - uncomment if needed)
|
||
# log_message "DEBUG - Updated data for $uid: $updated_data"
|
||
done
|
||
|
||
# Note: These counts won't work in the while loop due to subshell
|
||
# Moving summary to the main function instead
|
||
}
|
||
|
||
# Function to get summary statistics
|
||
get_summary_stats() {
|
||
local result="$1"
|
||
local total_datasources=$(echo "$result" | jq '. | length')
|
||
local migration_candidates=$(echo "$result" | jq '[.[] | select(.jsonData["prometheus-type-migration"] == true and .type == "grafana-azureprometheus-datasource")] | length')
|
||
local readonly_candidates=$(echo "$result" | jq '[.[] | select(.jsonData["prometheus-type-migration"] == true and .type == "grafana-azureprometheus-datasource" and .readOnly == true)] | length')
|
||
local updateable_candidates=$(echo "$result" | jq '[.[] | select(.jsonData["prometheus-type-migration"] == true and .type == "grafana-azureprometheus-datasource" and (.readOnly == false or .readOnly == null))] | length')
|
||
|
||
log_message "=== MIGRATION SUMMARY ==="
|
||
log_message "Total data sources found: $total_datasources"
|
||
log_message "Migration candidates found: $migration_candidates"
|
||
log_message "Read-only candidates (will be skipped): $readonly_candidates"
|
||
log_message "Updateable candidates: $updateable_candidates"
|
||
log_message "=========================="
|
||
}
|
||
|
||
# Main function to remove Prometheus type migration
|
||
remove_prometheus_type_migration() {
|
||
log_message "Starting remove Azure Prometheus migration"
|
||
log_message "Log file: $LOG_FILE"
|
||
log_message "Grafana URL: $GRAFANA_URL"
|
||
|
||
response=$(curl -s -w "\n%{http_code}" -X GET \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer $BEARER_TOKEN" \
|
||
"$GRAFANA_URL/api/datasources/")
|
||
|
||
http_code=$(echo "$response" | tail -n1)
|
||
response_body=$(echo "$response" | sed '$d')
|
||
|
||
if [[ "$http_code" -ge 200 && "$http_code" -lt 300 ]]; then
|
||
log_message "Successfully fetched data sources"
|
||
get_summary_stats "$response_body"
|
||
update_data_source_type "$response_body"
|
||
log_message "Migration process completed"
|
||
else
|
||
log_message "error fetching data sources: HTTP $http_code - $response_body"
|
||
fi
|
||
}
|
||
|
||
# Function to initialize log file
|
||
initialize_log() {
|
||
echo "=== Grafana Azure Prometheus Migration Log ===" > "$LOG_FILE"
|
||
echo "Started at: $(date)" >> "$LOG_FILE"
|
||
echo "=============================================" >> "$LOG_FILE"
|
||
echo "" >> "$LOG_FILE"
|
||
}
|
||
|
||
# Check if jq is installed
|
||
if ! command -v jq &> /dev/null; then
|
||
echo "Error: jq is required but not installed. Please install jq to run this script."
|
||
exit 1
|
||
fi
|
||
|
||
# Check if required variables are set
|
||
if [[ -z "$GRAFANA_URL" || -z "$BEARER_TOKEN" ]]; then
|
||
echo "Error: Please set GRAFANA_URL and BEARER_TOKEN variables at the top of the script."
|
||
exit 1
|
||
fi
|
||
|
||
# Initialize log file
|
||
initialize_log
|
||
|
||
# Execute main function
|
||
log_message "Script started"
|
||
remove_prometheus_type_migration
|
||
log_message "Script completed"
|
||
|
||
# Final log message
|
||
echo ""
|
||
echo "Migration completed. Full log available at: $LOG_FILE"
|
||
```
|
||
|
||
If you continue to experience issues, check the Grafana server logs for detailed error messages and contact [Grafana Support](https://grafana.com/help/) with your troubleshooting results.
|