Files
ljwx-k8s/import-mysql-performance-dashboards.sh
2026-02-20 22:50:45 +08:00

171 lines
5.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 导入 MySQL 高级性能监控 Dashboards
# 包含 Performance Schema, InnoDB, 慢查询等高级指标
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_error() { echo -e "${RED}[✗]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[!]${NC} $1"; }
# Grafana 配置
GRAFANA_URL="http://localhost:30300"
GRAFANA_USER="admin"
GRAFANA_PASS="admin123"
# 检查 Grafana
log_info "检查 Grafana 连接..."
if ! curl -sf "${GRAFANA_URL}/api/health" > /dev/null; then
log_error "无法连接到 Grafana: ${GRAFANA_URL}"
exit 1
fi
log_success "Grafana 连接正常"
# 获取 Prometheus 数据源
log_info "获取 Prometheus 数据源..."
DATASOURCE_UID=$(curl -sf -u "${GRAFANA_USER}:${GRAFANA_PASS}" \
"${GRAFANA_URL}/api/datasources" | \
jq -r '.[] | select(.type=="prometheus") | .uid' | head -1)
if [ -z "$DATASOURCE_UID" ]; then
log_error "未找到 Prometheus 数据源"
exit 1
fi
log_success "Prometheus 数据源 UID: ${DATASOURCE_UID}"
# 导入函数
import_dashboard() {
local dashboard_id=$1
local dashboard_name=$2
log_info "导入: ${dashboard_name} (ID: ${dashboard_id})"
# 下载 dashboard JSON
local dashboard_json=$(curl -sf "https://grafana.com/api/dashboards/${dashboard_id}/revisions/latest/download")
if [ -z "$dashboard_json" ]; then
log_error "下载失败: Dashboard ${dashboard_id}"
return 1
fi
# 准备导入 payload
local import_payload=$(echo "$dashboard_json" | jq -c --arg ds_uid "$DATASOURCE_UID" '{
dashboard: (. |
.id = null |
.uid = null |
walk(
if type == "object" and has("datasource") then
if .datasource | type == "object" then
.datasource = {"type": "prometheus", "uid": $ds_uid}
elif .datasource | type == "string" then
if (.datasource == "${DS_PROMETHEUS}" or .datasource == "Prometheus") then
.datasource = {"type": "prometheus", "uid": $ds_uid}
else
.
end
else
.
end
else
.
end
)
),
overwrite: true,
inputs: [{
name: "DS_PROMETHEUS",
type: "datasource",
pluginId: "prometheus",
value: $ds_uid
}]
}')
# 导入 dashboard
local response=$(curl -sf -X POST \
-H "Content-Type: application/json" \
-u "${GRAFANA_USER}:${GRAFANA_PASS}" \
-d "$import_payload" \
"${GRAFANA_URL}/api/dashboards/import" 2>&1)
if echo "$response" | jq -e '.uid' > /dev/null 2>&1; then
local uid=$(echo "$response" | jq -r '.uid')
log_success "成功导入: ${dashboard_name}"
log_info "访问: ${GRAFANA_URL}/d/${uid}"
return 0
else
log_error "导入失败: ${dashboard_name}"
echo "$response" | jq . 2>/dev/null || echo "$response"
return 1
fi
}
echo ""
log_info "开始导入 MySQL 高级性能 Dashboards..."
echo ""
# Dashboard 列表
SUCCESS_COUNT=0
FAILED_COUNT=0
# Dashboard 1: MySQL Overview (Performance Schema)
if import_dashboard "7362" "MySQL Overview (Performance Schema + InnoDB)"; then
((SUCCESS_COUNT++))
else
((FAILED_COUNT++))
fi
echo ""
sleep 2
# Dashboard 2: MySQL Overview (Prometheus)
if import_dashboard "7991" "MySQL Overview (Prometheus Exporter)"; then
((SUCCESS_COUNT++))
else
((FAILED_COUNT++))
fi
echo ""
sleep 2
# Dashboard 3: MySQL InnoDB Metrics
if import_dashboard "6239" "MySQL InnoDB Metrics"; then
((SUCCESS_COUNT++))
else
((FAILED_COUNT++))
fi
echo ""
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log_info "导入完成统计"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo " ✅ 成功: ${SUCCESS_COUNT}"
echo " ❌ 失败: ${FAILED_COUNT}"
echo ""
if [ $SUCCESS_COUNT -gt 0 ]; then
log_success "已成功导入 ${SUCCESS_COUNT} 个高级性能 Dashboard!"
echo ""
log_info "访问 Grafana 查看:"
echo " URL: ${GRAFANA_URL}/dashboards"
echo " 用户: ${GRAFANA_USER}"
echo " 密码: ${GRAFANA_PASS}"
echo ""
log_info "新 Dashboard 包含的高级指标:"
echo " • Performance Schema - SQL 性能分析"
echo " • InnoDB Buffer Pool - 缓冲池详细统计"
echo " • InnoDB Transactions - 事务和锁"
echo " • Table/Index IO Waits - IO 等待分析"
echo " • Query Response Time - 查询响应时间分布"
echo " • Slow Queries - 慢查询详情"
fi
exit 0