171 lines
5.0 KiB
Bash
Executable File
171 lines
5.0 KiB
Bash
Executable File
#!/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
|