fix: ash report print imcomplete.

This commit is contained in:
rolandqi 2023-10-23 10:39:49 +00:00 committed by ob-robot
parent e8c3c5a2e0
commit e9af7f1b1e
2 changed files with 41 additions and 47 deletions

View File

@ -561,7 +561,7 @@ int ObDbmsWorkloadRepository::usec_to_string(
const char *NULL_CHAR = "";
const int NULL_CHAR_LENGTH = 0;
const char *FILTER_EVENT_STR =
"CASE WHEN wait_class_id = 100 OR TIME_WAITED != 0 THEN 1 ELSE 0 END";
"1";
const char *ASH_VIEW_SQL =
"SELECT * FROM ( SELECT a.sample_id, a.sample_time, a.svr_ip, "
" a.svr_port, a.con_id, a.user_id, a.session_id, a.session_type, a.session_state, "
@ -811,25 +811,25 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info(
} else {
common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_;
const uint64_t tenant_id = MTL_ID();
const char *table_top[] = {"-", "-", "-", "-"};
const int64_t column_widths[] = {40, 20, 10, 9};
const char *column_headers[] = {"Event", "WAIT_CLASS", "EVENT_CNT", "% Event"};
const char *table_top[] = {"-", "-", "-"};
const int64_t column_widths[] = {40, 20, 9};
const char *column_headers[] = {"Event", "WAIT_CLASS", "% Event"};
HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string))
{
ObMySQLResult *result = nullptr;
if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) {
if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) {
LOG_WARN("failed to format row", K(ret));
} else if (OB_FAIL(format_row(
4 /*column_size*/, column_headers, column_widths, " ", "|", buff))) {
3 /*column_size*/, column_headers, column_widths, " ", "|", buff))) {
LOG_WARN("failed to format row", K(ret));
} else if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) {
} else if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) {
LOG_WARN("failed to format row", K(ret));
} else if (OB_FAIL(sql_string.append("SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1)"
" EVENT_CNT FROM ("))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) {
LOG_WARN("failed to append fmt ash view sql", K(ret));
} else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS"))) {
} else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC"))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) {
LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id),
@ -851,7 +851,6 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info(
int64_t event_cnt = 0;
char event[64] = "";
char wait_class[64] = "";
char event_cnt_char[64] = "";
char event_radio_char[64] = "";
EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len);
EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(
@ -859,13 +858,12 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info(
EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t);
double event_radio = static_cast<double>(event_cnt) / num_events;
event_radio = round(10000 * event_radio) / 100;
sprintf(event_cnt_char, "%ld", event_cnt);
sprintf(event_radio_char, "%.2f%%", event_radio);
if (OB_SUCC(ret)) {
const char *column_content[] = {event, wait_class, event_cnt_char, event_radio_char};
const char *column_content[] = {event, wait_class, event_radio_char};
if (OB_FAIL(format_row(
4 /*column_size*/, column_content, column_widths, " ", "|", buff))) {
3 /*column_size*/, column_content, column_widths, " ", "|", buff))) {
LOG_WARN("failed to format row", K(ret));
}
}
@ -873,7 +871,7 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info(
} // end while
if (OB_SUCC(ret)) {
if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) {
if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) {
LOG_WARN("failed to format row", K(ret));
}
}
@ -1591,13 +1589,13 @@ int ObDbmsWorkloadRepository::print_ash_top_session_info(const AshReportParams &
} else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) {
LOG_WARN("failed to append fmt ash view sql", K(ret));
} else if (OB_FAIL(sql_string.append(
") top_event GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / "))) {
") top_event GROUP BY SESSION_ID, USER_ID, EVENT "))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_string.append_fmt(
"%ld > 0.005 ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash ", num_samples))) {
"ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_string.append(
" LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID"))) {
" LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) {
LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id),
@ -1727,11 +1725,10 @@ int ObDbmsWorkloadRepository::print_ash_top_blocking_session_info(
"SESSION_ID, USER_ID, EVENT "))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_string.append_fmt(
"HAVING COUNT(1) / %ld > 0.005 ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash ",
num_samples))) {
"ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_string.append(
" LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID"))) {
" LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) {
LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id),
@ -1843,9 +1840,8 @@ int ObDbmsWorkloadRepository::print_ash_top_latches_info(
} else if (OB_FAIL(sql_string.append(" ) top_event WHERE wait_class_id = 104 AND"
" SUBSTR(event, 1, 6) = 'latch:' "))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT HAVING COUNT(1) / %ld > 0.005 "
"ORDER BY SAMPLE_CNT DESC) LIMIT 100",
num_samples))) {
} else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT "
"ORDER BY SAMPLE_CNT DESC) LIMIT 100"))) {
LOG_WARN("append sql failed", K(ret));
} else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) {
LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id),

View File

@ -145,7 +145,7 @@ IS
NUM_SAMPLES Number;
NUM_EVENTS Number; -- One event may cross many samples
FILTER_EVENT_STR CONSTANT VARCHAR2(100) := 'CASE WHEN wait_class_id = 100 OR TIME_WAITED != 0 THEN 1 ELSE 0 END';
FILTER_EVENT_STR CONSTANT VARCHAR2(100) := '1';
BEGIN
REPORT_CLEANUP();
@ -192,7 +192,7 @@ BEGIN
APPEND_ROW(' ----------');
APPEND_ROW(' Analysis Begin Time: ' || TO_CHAR(ASH_BEGIN_TIME, 'yyyy-mm-dd HH24:MI:SS'));
APPEND_ROW(' Analysis End Time: ' || TO_CHAR(ASH_END_TIME, 'yyyy-mm-dd HH24:MI:SS'));
APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED)); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)');
APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED) || '(secs)'); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)');
APPEND_ROW(' Num of Sample: ' || TO_CHAR(NUM_SAMPLES));
APPEND_ROW(' Num of Events: ' || TO_CHAR(NUM_EVENTS));
APPEND_ROW('Average Active Sessions: ' || TO_CHAR(ROUND(NUM_SAMPLES/DUR_ELAPSED,2), DIG_3_FM));
@ -215,14 +215,14 @@ BEGIN
APPEND_ROW(' ');
APPEND_ROW('## Top User Events:');
column_widths := COLUMN_WIDTH_ARRAY(40, 20, 10, 9);
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-');
column_widths := COLUMN_WIDTH_ARRAY(40, 20, 9);
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-');
APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+'));
column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', 'EVENT_CNT', '% Event');
column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', '% Event');
APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|'));
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-');
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-');
APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+'));
DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS';
DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -238,12 +238,11 @@ BEGIN
APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY(
top_event_rec.EVENT,
top_event_rec.WAIT_CLASS,
TO_CHAR(top_event_rec.EVENT_CNT),
TO_CHAR(ROUND(100 * top_event_rec.EVENT_CNT/NUM_EVENTS,2), DIG_2_FM) || '%'
), column_widths, ' ', '|'));
END LOOP;
CLOSE top_event_cv;
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-');
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-');
APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+'));
@ -408,7 +407,7 @@ BEGIN
'FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' ||
DBMS_ASH_INTERNAL.ASH_VIEW_SQL ||
') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' ||
'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 100';
'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 20';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -422,9 +421,9 @@ BEGIN
FETCH top_event_cv INTO top_sql_rec;
EXIT WHEN top_event_cv%NOTFOUND;
APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY(
top_sql_rec.SQL_ID,
TO_CHAR(top_sql_rec.PLAN_ID),
TO_CHAR(top_sql_rec.EVENT_CNT),
NVL(top_sql_rec.SQL_ID, ' '),
NVL(TO_CHAR(top_sql_rec.PLAN_ID), ' '),
NVL(TO_CHAR(top_sql_rec.EVENT_CNT), ' '),
top_sql_rec.EVENT,
TO_CHAR(ROUND(100 * top_sql_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%',
NVL(top_sql_rec.QUERY_SQL, ' ')
@ -453,7 +452,7 @@ BEGIN
' FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' ||
DBMS_ASH_INTERNAL.ASH_VIEW_SQL ||
' ) top_event WHERE wait_class_id != 100 GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' ||
'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 100';
'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 20';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -484,7 +483,7 @@ BEGIN
APPEND_ROW('## Complete List of SQL Text');
DYN_SQL := 'SELECT SQL_ID, PLAN_ID, QUERY_SQL FROM (SELECT pc.SQL_ID SQL_ID, pc.PLAN_ID, pc.QUERY_SQL QUERY_SQL ' ||
'FROM (SELECT SQL_ID, PLAN_ID, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' ||
'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 100';
'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 20';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -517,8 +516,8 @@ BEGIN
APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+'));
DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' ||
' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' ||
' GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100) ash ' ||
' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID';
' GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' ||
' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -527,7 +526,7 @@ BEGIN
WAIT_CLASS, WAIT_CLASS,
NULL_CHAR, NULL_CHAR,
NULL_CHAR, NULL_CHAR,
NULL_CHAR, NULL_CHAR, NUM_SAMPLES;
NULL_CHAR, NULL_CHAR;
LOOP
FETCH top_event_cv INTO top_sess_rec;
EXIT WHEN top_event_cv%NOTFOUND;
@ -561,8 +560,8 @@ BEGIN
APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+'));
DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' ||
' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' ||
' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100) ash ' ||
' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID';
' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' ||
' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -571,18 +570,17 @@ BEGIN
WAIT_CLASS, WAIT_CLASS,
NULL_CHAR, NULL_CHAR,
NULL_CHAR, NULL_CHAR,
NULL_CHAR, NULL_CHAR, NUM_SAMPLES;
NULL_CHAR, NULL_CHAR;
LOOP
FETCH top_event_cv INTO top_sess_rec;
EXIT WHEN top_event_cv%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(top_sess_rec.EVENT_CNT));
APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY(
TO_CHAR(top_sess_rec.SESSION_ID),
TO_CHAR(ROUND(100 * top_sess_rec.SAMPLE_CNT/NUM_SAMPLES, 2), DIG_2_FM) || '%',
top_sess_rec.EVENT,
TO_CHAR(top_sess_rec.EVENT_CNT),
TO_CHAR(ROUND(100 * top_sess_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%',
top_sess_rec.USER_NAME,
NVL(top_sess_rec.USER_NAME, ' '),
TO_CHAR(top_sess_rec.EVENT_CNT) || '/' || TO_CHAR(DUR_ELAPSED) || '[' || TO_CHAR(ROUND(100*top_sess_rec.EVENT_CNT/DUR_ELAPSED, 2), DIG_2_FM) || '%]'
), column_widths, ' ', '|'));
END LOOP;
@ -602,7 +600,7 @@ BEGIN
column_content := COLUMN_CONTENT_ARRAY('-', '-', '-');
APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+'));
DYN_SQL := 'SELECT * FROM (SELECT EVENT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' ||
' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100';
' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100';
OPEN top_event_cv FOR DYN_SQL
USING ASH_BEGIN_TIME, ASH_END_TIME,
ASH_BEGIN_TIME, ASH_END_TIME,
@ -611,7 +609,7 @@ BEGIN
WAIT_CLASS, WAIT_CLASS,
NULL_CHAR, NULL_CHAR,
NULL_CHAR, NULL_CHAR,
NULL_CHAR, NULL_CHAR, NUM_SAMPLES;
NULL_CHAR, NULL_CHAR;
LOOP
FETCH top_event_cv INTO top_latch_rec;
EXIT WHEN top_event_cv%NOTFOUND;