[FEAT MERGE]Query Interface Enhancement
Co-authored-by: chinaxing <chen.yack@gmail.com>
This commit is contained in:
@ -16,41 +16,12 @@
|
||||
#include "sql/monitor/flt/ob_flt_extra_info.h"
|
||||
#include "sql/monitor/flt/ob_flt_control_info_mgr.h"
|
||||
#include "sql/session/ob_sql_session_info.h"
|
||||
#include "lib/json_type/ob_json_base.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace sql
|
||||
{
|
||||
int ObFLTUtils::init_flt_show_trace_env(sql::ObSQLSessionInfo &session) {
|
||||
int ret = OB_SUCCESS;
|
||||
// if use trace log, init trace framework
|
||||
if (session.is_inner()) {
|
||||
// inner sql will reuse trace framework, do nothing
|
||||
} else {
|
||||
if (session.is_use_trace_log()) {
|
||||
// query level trace
|
||||
if (session.is_query_trc_granuality()) {
|
||||
FLT_BEGIN_TRACE();
|
||||
FLT_SET_TRACE_LEVEL(1);
|
||||
FLT_SET_AUTO_FLUSH(true);
|
||||
// transaction level trace
|
||||
} else {
|
||||
if (session.is_server_status_in_transaction()) {
|
||||
// do nothing
|
||||
} else {
|
||||
FLT_BEGIN_TRACE();
|
||||
FLT_SET_TRACE_LEVEL(1);
|
||||
FLT_SET_AUTO_FLUSH(true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FLT_SET_TRACE_LEVEL(0);
|
||||
FLT_SET_AUTO_FLUSH(false);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::record_flt_last_trace_id(sql::ObSQLSessionInfo &session) {
|
||||
int ret = OB_SUCCESS;
|
||||
trace::UUID trc_uuid = OBTRACE->get_trace_id();
|
||||
@ -185,7 +156,7 @@ namespace sql
|
||||
}
|
||||
con.print_sample_pct_ = ((double)(sess.get_tenant_print_sample_ppm()))/1000000;
|
||||
con.slow_query_thres_ = GCONF.trace_log_slow_query_watermark;
|
||||
|
||||
con.show_trace_enable_ = sess.is_use_trace_log();
|
||||
sess.set_flt_control_info(con);
|
||||
|
||||
if (OB_FAIL(con.serialize(buf, size, pos))) {
|
||||
@ -306,15 +277,13 @@ namespace sql
|
||||
break;
|
||||
}
|
||||
case FLT_TYPE_QUERY_INFO: {
|
||||
// skip
|
||||
// this extra info is written by server, and driver/proxy cannot send this to server;
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("invalid extra_type", K(extra_type), K(ret));
|
||||
break;
|
||||
}
|
||||
case FLT_TYPE_CONTROL_INFO: {
|
||||
// skip
|
||||
// this extra info is written by server, and driver/proxy cannot send this to server;
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("invalid extra_type", K(extra_type), K(ret));
|
||||
break;
|
||||
}
|
||||
case FLT_TYPE_SPAN_INFO: {
|
||||
@ -334,21 +303,38 @@ namespace sql
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FLT_TYPE_SHOW_TRACE: {
|
||||
case FLT_TYPE_SHOW_TRACE_SPAN: {
|
||||
FLTShowTrace trace;
|
||||
if (OB_FAIL(trace.deserialize(buf, pos+v_len, pos))) {
|
||||
LOG_WARN("failed to deserialize full link trace extra info", KP(buf), K(ret), K(pos), K(v_len));
|
||||
} else {
|
||||
// add to span
|
||||
ObString empty_str;
|
||||
empty_str.reset();
|
||||
sess.set_last_flt_span_id(empty_str);
|
||||
if (!trace.show_trace_span_.empty() || !trace.show_trace_drv_span_.empty()) {
|
||||
ObString empty_str;
|
||||
empty_str.reset();
|
||||
sess.set_last_flt_span_id(empty_str);
|
||||
ObSEArray<ObFLTSpanData, 4> rec_list;
|
||||
|
||||
LOG_TRACE("rec show trace drv span",
|
||||
K(ObString(trace.show_trace_drv_span_.length(), trace.show_trace_drv_span_.ptr())),
|
||||
KPHEX(trace.show_trace_drv_span_.ptr(), trace.show_trace_drv_span_.length()));
|
||||
|
||||
if (OB_FAIL(process_flt_span_rec(trace.show_trace_span_.ptr(),
|
||||
trace.show_trace_span_.length()))) {
|
||||
LOG_WARN("failed to generate flt span record from string", K(ret));
|
||||
} else if (OB_FAIL(process_flt_span_rec(trace.show_trace_drv_span_.ptr(),
|
||||
trace.show_trace_drv_span_.length()))) {
|
||||
LOG_WARN("failed to generate flt span record from string", K(ret));
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
ret = OB_NOT_SUPPORTED;
|
||||
LOG_WARN("invalid extra_type", K(extra_type), K(ret));
|
||||
// skip
|
||||
pos += v_len;
|
||||
break;
|
||||
}
|
||||
} // switch ends
|
||||
@ -412,12 +398,20 @@ namespace sql
|
||||
tid.deserialize(trace_id.ptr(), trace_id.length(), pos);
|
||||
pos = 0;
|
||||
sid.deserialize(span_id.ptr(), span_id.length(), pos);
|
||||
if (sess.is_use_trace_log()) {
|
||||
sess.set_auto_flush_trace(true);
|
||||
}
|
||||
|
||||
char buf[40];
|
||||
pos = 0;
|
||||
tid.tostring(buf, 40, pos);
|
||||
OBTRACE->init(tid, sid);
|
||||
FLT_SET_TRACE_LEVEL(sess.get_control_info().level_);
|
||||
FLT_SET_AUTO_FLUSH(sess.is_auto_flush_trace() || sess.is_use_trace_log());
|
||||
}
|
||||
// update trace_id by server self
|
||||
} else {
|
||||
LOG_INFO("chestelew cleint not support flt");
|
||||
// update trace_id in query granularity
|
||||
if (sess.is_query_trc_granuality()) {
|
||||
FLT_BEGIN_TRACE();
|
||||
@ -430,6 +424,9 @@ namespace sql
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
if (sess.is_use_trace_log()) {
|
||||
sess.set_auto_flush_trace(true);
|
||||
}
|
||||
FLT_SET_TRACE_LEVEL(sess.get_control_info().level_);
|
||||
FLT_SET_AUTO_FLUSH(sess.is_auto_flush_trace() || sess.is_use_trace_log());
|
||||
}
|
||||
@ -497,6 +494,182 @@ namespace sql
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::process_flt_span_rec(const char *buf, const int64_t len) {
|
||||
int ret = OB_SUCCESS;
|
||||
if (len == 0) {
|
||||
// do nothing
|
||||
} else {
|
||||
ObArenaAllocator allocator;
|
||||
ObIJsonBase *j_tree = NULL;
|
||||
if (OB_FAIL(ObJsonBaseFactory::get_json_base(&allocator, buf, len,
|
||||
ObJsonInType::JSON_TREE, ObJsonInType::JSON_TREE, j_tree))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("fail to parse j_text", K(ret), K(ObString(len, buf)));
|
||||
} else if (j_tree->json_type() != ObJsonNodeType::J_ARRAY) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(j_tree->json_type()));
|
||||
} else {
|
||||
ObIJsonBase *jobject_ptr = NULL;
|
||||
ObIJsonBase *jval_ptr = NULL;
|
||||
//ObString key = "str";
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < j_tree->element_count(); i++) {
|
||||
if (OB_FAIL(j_tree->get_array_element(i, jobject_ptr))) {
|
||||
LOG_WARN("failed to get array element", K(ret), K(i));
|
||||
} else if (OB_ISNULL(jobject_ptr)) {
|
||||
ret = OB_ERR_NULL_VALUE;
|
||||
LOG_WARN("fail to get array child dom", K(ret), K(i));
|
||||
} else if (jobject_ptr->json_type() != ObJsonNodeType::J_OBJECT) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(jobject_ptr->json_type()));
|
||||
} else if (OB_FAIL(resolve_flt_span_rec(jobject_ptr, allocator))) {
|
||||
LOG_WARN("fail to resolve array child dom", K(ret));
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::resolve_flt_span_rec(ObIJsonBase *j_tree, ObArenaAllocator& alloc)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObFLTSpanData data;
|
||||
if (OB_ISNULL(j_tree) || j_tree->json_type() != ObJsonNodeType::J_OBJECT) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(j_tree->json_type()));
|
||||
} else {
|
||||
const char* keys[] = {"trace_id", "name", "id", "start_ts", "end_ts",
|
||||
"parent_id", "is_follow", "tags", "logs"};
|
||||
data.tenant_id_ = MTL_ID();
|
||||
if (OB_FAIL(set_json_str_val(keys[0], j_tree, data.trace_id_))) {
|
||||
LOG_WARN("failed to set str val", K(keys[0]), K(ret));
|
||||
} else if (OB_FAIL(set_json_str_val(keys[1], j_tree, data.span_name_))) {
|
||||
LOG_WARN("failed to set str val", K(keys[1]), K(ret));
|
||||
} else if (OB_FAIL(set_json_str_val(keys[2], j_tree, data.span_id_))) {
|
||||
LOG_WARN("failed to set str val", K(keys[2]), K(ret));
|
||||
} else if (OB_FAIL(set_json_num_val(keys[3], j_tree, data.start_ts_))) {
|
||||
LOG_WARN("failed to set int val", K(keys[3]), K(ret));
|
||||
} else if (OB_FAIL(set_json_num_val(keys[4], j_tree, data.end_ts_))) {
|
||||
LOG_WARN("failed to set int val", K(keys[4]), K(ret));
|
||||
} else if (OB_FAIL(set_json_str_val(keys[5], j_tree, data.parent_span_id_))) {
|
||||
LOG_WARN("failed to set str val", K(keys[5]), K(ret));
|
||||
} else if (OB_FAIL(set_json_bool_val(keys[6], j_tree, data.ref_type_))) {
|
||||
LOG_WARN("failed to set bool val", K(keys[6]), K(ret));
|
||||
} else if (OB_FAIL(set_json_obj_val(keys[7], j_tree, data.tags_, alloc))) {
|
||||
LOG_WARN("failed to set str val", K(keys[7]), K(ret));
|
||||
} else if (OB_FAIL(set_json_obj_val(keys[8], j_tree, data.logs_, alloc))) {
|
||||
LOG_WARN("failed to set str val", K(keys[8]), K(ret));
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(get_flt_span_manager()->record_span(data, true))) {
|
||||
if (OB_SIZE_OVERFLOW == ret || OB_ALLOCATE_MEMORY_FAILED == ret) {
|
||||
LOG_TRACE("cannot allocate mem for record", K(ret));
|
||||
ret = OB_SUCCESS;
|
||||
} else {
|
||||
if (REACH_TIME_INTERVAL(100 * 1000)) { // in case logging is too frequent
|
||||
LOG_WARN("failed to record request info in request manager", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::set_json_str_val(ObString key, ObIJsonBase *jobject_ptr, ObString& val) {
|
||||
int ret = OB_SUCCESS;
|
||||
ObIJsonBase *jstr_ptr = NULL;
|
||||
if (OB_FAIL(jobject_ptr->get_object_value(key, jstr_ptr))) {
|
||||
if (ret == OB_SEARCH_NOT_FOUND) {
|
||||
ret = OB_SUCCESS;
|
||||
val.reset();
|
||||
} else {
|
||||
LOG_WARN("failed to get object element", K(ret), K(key));
|
||||
}
|
||||
} else if (OB_ISNULL(jstr_ptr)) {
|
||||
// skip
|
||||
} else if (jstr_ptr->json_type() != ObJsonNodeType::J_STRING) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(jstr_ptr->json_type()));
|
||||
} else {
|
||||
val.assign_ptr(const_cast<char *>(jstr_ptr->get_data()), jstr_ptr->get_data_length());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::set_json_obj_val(ObString key, ObIJsonBase *jobject_ptr,
|
||||
ObString& val, ObArenaAllocator& alloc) {
|
||||
int ret = OB_SUCCESS;
|
||||
ObIJsonBase *jo_ptr = NULL;
|
||||
ObJsonBuffer j_buf(&alloc);
|
||||
if (OB_FAIL(jobject_ptr->get_object_value(key, jo_ptr))) {
|
||||
if (ret == OB_SEARCH_NOT_FOUND) {
|
||||
ret = OB_SUCCESS;
|
||||
val.reset();
|
||||
} else {
|
||||
LOG_WARN("failed to get object element", K(ret), K(key));
|
||||
}
|
||||
} else if (OB_ISNULL(jo_ptr)) {
|
||||
//ret = OB_ERR_NULL_VALUE;
|
||||
//LOG_WARN("fail to get array child dom", K(ret));
|
||||
// skip
|
||||
} else if (jo_ptr->json_type() != ObJsonNodeType::J_OBJECT &&
|
||||
jo_ptr->json_type() != ObJsonNodeType::J_ARRAY) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(jo_ptr->json_type()));
|
||||
} else if (OB_FAIL(jo_ptr->print(j_buf, true, false, 0))) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("fail to convert json to string", K(ret));
|
||||
} else {
|
||||
val.assign_ptr(j_buf.ptr(), j_buf.length());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::set_json_num_val(ObString key, ObIJsonBase *jobject_ptr, int64_t& val) {
|
||||
int ret = OB_SUCCESS;
|
||||
ObIJsonBase *jint_ptr = NULL;
|
||||
if (OB_FAIL(jobject_ptr->get_object_value(key, jint_ptr))) {
|
||||
if (ret == OB_SEARCH_NOT_FOUND) {
|
||||
ret = OB_SUCCESS;
|
||||
val = 0;
|
||||
} else {
|
||||
LOG_WARN("failed to get object element", K(ret), K(key));
|
||||
}
|
||||
} else if (OB_ISNULL(jint_ptr)) {
|
||||
ret = OB_ERR_NULL_VALUE;
|
||||
LOG_WARN("fail to get array child dom", K(ret));
|
||||
} else if (jint_ptr->json_type() != ObJsonNodeType::J_UINT) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(jint_ptr->json_type()));
|
||||
} else {
|
||||
val = jint_ptr->get_int();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObFLTUtils::set_json_bool_val(ObString key, ObIJsonBase *jobject_ptr, int64_t& val) {
|
||||
int ret = OB_SUCCESS;
|
||||
ObIJsonBase *jbool_ptr = NULL;
|
||||
if (jobject_ptr->get_object_value(key, jbool_ptr)) {
|
||||
LOG_WARN("failed to get object element", K(ret), K(key));
|
||||
} else if (OB_ISNULL(jbool_ptr)) {
|
||||
ret = OB_ERR_NULL_VALUE;
|
||||
LOG_WARN("fail to get array child dom", K(ret));
|
||||
} else if (jbool_ptr->json_type() != ObJsonNodeType::J_BOOLEAN) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid json type", K(ret), K(jbool_ptr->json_type()));
|
||||
} else {
|
||||
val = jbool_ptr->get_boolean();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int handle_span_record(ObFLTSpanMgr *flt_span_manager, char* tag_buf, int64_t tag_len, ::oceanbase::trace::ObSpanCtx* span)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -571,7 +744,7 @@ namespace sql
|
||||
// record span
|
||||
if (OB_FAIL(ret)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(flt_span_manager->record_span(data))) {
|
||||
} else if (OB_FAIL(flt_span_manager->record_span(data, false))) {
|
||||
if (OB_SIZE_OVERFLOW == ret || OB_ALLOCATE_MEMORY_FAILED == ret) {
|
||||
LOG_TRACE("cannot allocate mem for record", K(ret));
|
||||
ret = OB_SUCCESS;
|
||||
|
||||
Reference in New Issue
Block a user