| #!/usr/bin/env bash |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| # usage: get_query_profiles.sh -q query_id -o output_dir |
| |
| FE_HOST="127.0.0.1" |
| FE_QUERY_PORT=9939 |
| USER=root |
| PASSWORD="" |
| QUERY_ID="" |
| OUTPUT_DIR="" |
| |
| SHOW_QUERY_PROFILE="show query profile" |
| MYSQL_CMD_ARGS=(-h"${FE_HOST}" -u"${USER}" -P"${FE_QUERY_PORT}") |
| if [[ -n "${PASSWORD}" ]]; then |
| MYSQL_CMD_ARGS+=(-p"${PASSWORD}") |
| fi |
| |
| while getopts ":q:o:" opt; do |
| case "${opt}" in |
| q) |
| QUERY_ID="${OPTARG}" |
| ;; |
| o) |
| OUTPUT_DIR="${OPTARG}" |
| ;; |
| *) ;; |
| |
| esac |
| done |
| |
| if [[ -z "${QUERY_ID}" ]]; then |
| # QUERY_ID=$(mysql -h$FE_HOST -u$USER -P$FE_QUERY_PORT -e"show query profile '/'" | cut -f 1 | sed -n '3p') |
| echo "no query id" |
| exit |
| fi |
| if [[ -z "${OUTPUT_DIR}" ]]; then |
| echo "no output dir" |
| exit |
| fi |
| |
| echo "get profiles for query ${QUERY_ID}, output dir: ${OUTPUT_DIR}" |
| |
| mkdir -p "${OUTPUT_DIR}" |
| |
| PLAN_GRAPH_FILE=${OUTPUT_DIR}/${QUERY_ID}_plan_graph |
| FRAGS_FILE=${OUTPUT_DIR}/${QUERY_ID}_frags |
| FRAG_IDS_FILE=${OUTPUT_DIR}/${QUERY_ID}_frag_ids |
| |
| mysql "${MYSQL_CMD_ARGS[@]}" -e "${SHOW_QUERY_PROFILE} '/${QUERY_ID}'" | sed 's/\\n/\n/g' >"${PLAN_GRAPH_FILE}" |
| |
| grep "Fragment: " "${PLAN_GRAPH_FILE}" | sort | uniq >"${FRAGS_FILE}" |
| sed 's/Fragment: \{1,\}\([0-9]\{1,\}\)/\n\1\n/g' "${PLAN_GRAPH_FILE}" | grep -E "^[0-9]{1,}$" | sort | uniq >"${FRAG_IDS_FILE}" |
| |
| # frag inst ids |
| while read -r frag_id; do |
| sql="${SHOW_QUERY_PROFILE} '/${QUERY_ID}/${frag_id}'" |
| frag_inst_ids_outfile="${OUTPUT_DIR}/frag_${frag_id}_instances" |
| |
| echo "sql: ${sql}" |
| mysql "${MYSQL_CMD_ARGS[@]}" -e "${sql}" | sed -n '2,$p' >"${frag_inst_ids_outfile}" |
| while read -r line; do |
| frag_inst_id=$(echo "${line}" | cut -f1) |
| frag_inst_profile="${OUTPUT_DIR}/frag_${frag_id}_${frag_inst_id}" |
| sql="${SHOW_QUERY_PROFILE} '/${QUERY_ID}/${frag_id}/${frag_inst_id}'" |
| mysql "${MYSQL_CMD_ARGS[@]}" -e "${sql}" | sed 's/\\n/\n/g' >"${frag_inst_profile}" |
| done <"${frag_inst_ids_outfile}" |
| done <"${FRAG_IDS_FILE}" |