From 5c856007f345b4db73280c1d3f1899ccffbf6327 Mon Sep 17 00:00:00 2001 From: hxy7yx <1595670487@qq.com> Date: Wed, 1 Nov 2023 09:44:31 +0800 Subject: [PATCH] log api supports independent core log --- include/neuron/adapter.h | 3 + plugins/restful/adapter_handle.c | 3 + plugins/restful/log_handle.c | 54 ++++++++--------- src/adapter/adapter.c | 13 +++-- src/core/manager.c | 99 ++++++++++++++++++++++++++------ src/parser/neu_json_log.c | 33 ++++++++--- src/parser/neu_json_log.h | 1 + src/parser/neu_json_node.c | 18 ++++-- src/parser/neu_json_node.h | 2 + 9 files changed, 165 insertions(+), 61 deletions(-) diff --git a/include/neuron/adapter.h b/include/neuron/adapter.h index ef6c87c8..b8dfdbad 100644 --- a/include/neuron/adapter.h +++ b/include/neuron/adapter.h @@ -602,6 +602,7 @@ typedef struct neu_req_get_node_state { typedef struct neu_resp_get_node_state { neu_node_state_t state; uint16_t rtt; // round trip time in milliseconds + char core_level[NEU_LOG_LEVEL_LEN]; } neu_resp_get_node_state_t; typedef struct neu_req_get_nodes_state { @@ -621,6 +622,7 @@ inline static UT_icd neu_nodes_state_t_icd() } typedef struct { UT_array *states; // array of neu_nodes_state_t + char core_level[NEU_LOG_LEVEL_LEN]; } neu_resp_get_nodes_state_t, neu_reqresp_nodes_state_t; typedef struct { @@ -1063,6 +1065,7 @@ typedef struct { typedef struct neu_req_update_log_level { char node[NEU_NODE_NAME_LEN]; char log_level[NEU_LOG_LEVEL_LEN]; + bool core; } neu_req_update_log_level_t; void neu_msg_gen(neu_reqresp_head_t *header, void *data); diff --git a/plugins/restful/adapter_handle.c b/plugins/restful/adapter_handle.c index 8ce716d1..2ca0249c 100644 --- a/plugins/restful/adapter_handle.c +++ b/plugins/restful/adapter_handle.c @@ -334,6 +334,7 @@ void handle_get_node_state_resp(nng_aio *aio, neu_resp_get_node_state_t *state) res.running = state->state.running; res.rtt = state->rtt; res.log_level = state->state.log_level; + strcpy(res.core_level, state->core_level); neu_json_encode_by_fn(&res, neu_json_encode_get_node_state_resp, &result); @@ -361,6 +362,8 @@ void handle_get_nodes_state_resp(nng_aio * aio, states_res.nodes[index].log_level = state->state.log_level; } + strcpy(states_res.core_level, states->core_level); + neu_json_encode_by_fn(&states_res, neu_json_encode_get_nodes_state_resp, &result); diff --git a/plugins/restful/log_handle.c b/plugins/restful/log_handle.c index 90d0978e..ac9460ca 100644 --- a/plugins/restful/log_handle.c +++ b/plugins/restful/log_handle.c @@ -116,10 +116,7 @@ void handle_log_level(nng_aio *aio) int ret = 0; neu_reqresp_head_t header = { 0 }; neu_req_update_log_level_t cmd = { 0 }; - zlog_category_t * ct = zlog_get_category(req->node_name); - zlog_category_t * neuron = zlog_get_category("neuron"); int log_level; - static int log_level_neuron = 60; if (0 == strcmp(req->log_level, NEU_LOG_LEVEL_DEBUG)) { log_level = ZLOG_LEVEL_DEBUG; @@ -149,36 +146,39 @@ void handle_log_level(nng_aio *aio) }); goto end; } - - ret = zlog_level_switch(ct, log_level); - if (ret != 0) { - nlog_error( - "Failed to modify log_level of the node, node_name:%s, " - "ret: %d,", - req->node_name, ret); - NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, { - neu_http_response(aio, error_code.error, result_error); - }); + if (req->core) { + zlog_category_t *neuron = zlog_get_category("neuron"); + ret = zlog_level_switch(neuron, log_level); + if (ret != 0) { + nlog_error( + "Failed to modify log_level of the core, ret: %d", ret); + NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, { + neu_http_response(aio, error_code.error, result_error); + }); + goto end; + } } - if (log_level > log_level_neuron) { - log_level_neuron = log_level; - } - - ret = zlog_level_switch(neuron, log_level_neuron); - if (ret != 0) { - nlog_error("Failed to modify log_level of the node, ret: %d", - ret); - NEU_JSON_RESPONSE_ERROR(NEU_ERR_EINTERNAL, { - neu_http_response(aio, error_code.error, result_error); - }); + if (req->node_name) { + zlog_category_t *ct = zlog_get_category(req->node_name); + strcpy(cmd.node, req->node_name); + ret = zlog_level_switch(ct, log_level); + if (ret != 0) { + nlog_error( + "Failed to modify log_level of the node, node_name:%s, " + "ret: %d,", + req->node_name, ret); + NEU_JSON_RESPONSE_ERROR(0, { + neu_http_response(aio, error_code.error, result_error); + }); + goto end; + } } header.ctx = aio; header.type = NEU_REQ_UPDATE_LOG_LEVEL; - strcpy(cmd.node, req->node_name); - - ret = neu_plugin_op(plugin, header, &cmd); + cmd.core = req->core; + ret = neu_plugin_op(plugin, header, &cmd); if (ret != 0) { NEU_JSON_RESPONSE_ERROR(NEU_ERR_IS_BUSY, { neu_http_response(aio, NEU_ERR_IS_BUSY, result_error); diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 64e5c396..575b83e5 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -471,7 +471,9 @@ static int adapter_command(neu_adapter_t *adapter, neu_reqresp_head_t header, } case NEU_REQ_UPDATE_LOG_LEVEL: { neu_req_update_log_level_t *cmd = (neu_req_update_log_level_t *) data; - strcpy(pheader->receiver, cmd->node); + if (cmd->node != NULL) { + strcpy(pheader->receiver, cmd->node); + } break; } default: @@ -758,17 +760,18 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } case NEU_REQ_GET_NODE_STATE: { - neu_resp_get_node_state_t resp = { 0 }; + neu_resp_get_node_state_t *resp = + (neu_resp_get_node_state_t *) &header[1]; neu_metric_entry_t *e = NULL; if (NULL != adapter->metrics) { HASH_FIND_STR(adapter->metrics->entries, NEU_METRIC_LAST_RTT_MS, e); } - resp.rtt = NULL != e ? e->value : 0; - resp.state = neu_adapter_get_state(adapter); + resp->rtt = NULL != e ? e->value : 0; + resp->state = neu_adapter_get_state(adapter); header->type = NEU_RESP_GET_NODE_STATE; neu_msg_exchange(header); - reply(adapter, header, &resp); + reply(adapter, header, resp); break; } case NEU_REQ_GET_GROUP: { diff --git a/src/core/manager.c b/src/core/manager.c index f3898174..662b2ed6 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -787,6 +787,10 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) neu_resp_get_nodes_state_t resp = { 0 }; UT_array *states = neu_node_manager_get_state(manager->node_manager); + neu_adapter_t *adapter_core = + neu_node_manager_find(manager->node_manager, "default-dashboard"); + strcpy(resp.core_level, + neu_plugin_to_plugin_common(adapter_core->plugin)->log_level); resp.states = utarray_clone(states); strcpy(header->receiver, header->sender); @@ -812,7 +816,6 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) case NEU_REQ_GET_GROUP: case NEU_REQ_GET_NODE_SETTING: - case NEU_REQ_GET_NODE_STATE: case NEU_REQ_READ_GROUP: case NEU_REQ_WRITE_TAG: case NEU_REQ_WRITE_TAGS: @@ -834,6 +837,27 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) break; } + case NEU_REQ_GET_NODE_STATE: { + if (neu_node_manager_find(manager->node_manager, header->receiver) == + NULL) { + neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST }; + header->type = NEU_RESP_ERROR; + neu_msg_exchange(header); + reply(manager, header, &e); + } else { + neu_resp_get_node_state_t *resp = + (neu_resp_get_node_state_t *) &header[1]; + neu_adapter_t *adapter_core = neu_node_manager_find( + manager->node_manager, "default-dashboard"); + strcpy( + resp->core_level, + neu_plugin_to_plugin_common(adapter_core->plugin)->log_level); + forward_msg(manager, header, header->receiver); + } + + break; + } + case NEU_RESP_NODE_RENAME: { neu_resp_node_rename_t *resp = (neu_resp_node_rename_t *) &header[1]; if (0 == resp->error) { @@ -1088,25 +1112,68 @@ static int manager_loop(enum neu_event_io_type type, int fd, void *usr_data) } break; } - case NEU_REQ_UPDATE_LOG_LEVEL: - if (neu_node_manager_find(manager->node_manager, header->receiver) == - NULL) { - neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST }; - header->type = NEU_RESP_ERROR; - neu_msg_exchange(header); - reply(manager, header, &e); - } else { - neu_req_update_log_level_t *cmd = - (neu_req_update_log_level_t *) &header[1]; - neu_adapter_t *adapter_log = - neu_node_manager_find(manager->node_manager, header->receiver); - strcpy(neu_plugin_to_plugin_common(adapter_log->plugin)->log_level, - cmd->log_level); + case NEU_REQ_UPDATE_LOG_LEVEL: { + neu_req_update_log_level_t *cmd = + (neu_req_update_log_level_t *) &header[1]; - forward_msg(manager, header, header->receiver); + if (cmd->core) { + if (strcmp(header->receiver, "") == 0) { + neu_adapter_t *adapter_core = neu_node_manager_find( + manager->node_manager, "default-dashboard"); + strcpy(neu_plugin_to_plugin_common(adapter_core->plugin) + ->log_level, + cmd->log_level); + neu_resp_error_t error = { 0 }; + neu_msg_exchange(header); + header->type = NEU_RESP_ERROR; + reply(manager, header, &error); + } else { + if (neu_node_manager_find(manager->node_manager, + header->receiver) == NULL) { + neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST }; + header->type = NEU_RESP_ERROR; + neu_msg_exchange(header); + reply(manager, header, &e); + } else { + neu_adapter_t *adapter_core = neu_node_manager_find( + manager->node_manager, "default-dashboard"); + strcpy(neu_plugin_to_plugin_common(adapter_core->plugin) + ->log_level, + cmd->log_level); + neu_adapter_t *adapter_log = neu_node_manager_find( + manager->node_manager, header->receiver); + strcpy(neu_plugin_to_plugin_common(adapter_log->plugin) + ->log_level, + cmd->log_level); + forward_msg(manager, header, header->receiver); + } + } + } else { + if (strcmp(header->receiver, "") == 0) { + neu_resp_error_t e = { .error = NEU_ERR_PARAM_IS_WRONG }; + header->type = NEU_RESP_ERROR; + neu_msg_exchange(header); + reply(manager, header, &e); + } else { + if (neu_node_manager_find(manager->node_manager, + header->receiver) == NULL) { + neu_resp_error_t e = { .error = NEU_ERR_NODE_NOT_EXIST }; + header->type = NEU_RESP_ERROR; + neu_msg_exchange(header); + reply(manager, header, &e); + } else { + neu_adapter_t *adapter_log = neu_node_manager_find( + manager->node_manager, header->receiver); + strcpy(neu_plugin_to_plugin_common(adapter_log->plugin) + ->log_level, + cmd->log_level); + forward_msg(manager, header, header->receiver); + } + } } break; + } default: assert(false); break; diff --git a/src/parser/neu_json_log.c b/src/parser/neu_json_log.c index d354e742..5ac653a2 100644 --- a/src/parser/neu_json_log.c +++ b/src/parser/neu_json_log.c @@ -42,14 +42,24 @@ int neu_json_decode_update_log_level_req( return -1; } - neu_json_elem_t req_elems[] = { { - .name = "node", - .t = NEU_JSON_STR, - }, - { - .name = "level", - .t = NEU_JSON_STR, - } }; + req->node_name = NULL; + req->core = true; + + neu_json_elem_t req_elems[] = { + { + .name = "node", + .t = NEU_JSON_STR, + .attribute = NEU_JSON_ATTRIBUTE_OPTIONAL, + }, + { + .name = "level", + .t = NEU_JSON_STR, + }, + { + .name = "core", + .attribute = NEU_JSON_ATTRIBUTE_OPTIONAL, + } + }; ret = neu_json_decode_by_json(json_obj, NEU_JSON_ELEM_SIZE(req_elems), req_elems); @@ -57,8 +67,13 @@ int neu_json_decode_update_log_level_req( goto decode_fail; } - req->node_name = req_elems[0].v.val_str; + if (req_elems[0].v.val_str != NULL) { + req->node_name = req_elems[0].v.val_str; + } req->log_level = req_elems[1].v.val_str; + if (req_elems[2].t == NEU_JSON_BOOL) { + req->core = req_elems[2].v.val_bool; + } *result = req; goto decode_exit; diff --git a/src/parser/neu_json_log.h b/src/parser/neu_json_log.h index 46c0c830..c11bf10c 100644 --- a/src/parser/neu_json_log.h +++ b/src/parser/neu_json_log.h @@ -36,6 +36,7 @@ typedef char *neu_json_get_log_resp_row_t; typedef struct { char *node_name; char *log_level; + bool core; } neu_json_update_log_level_req_t; typedef struct { diff --git a/src/parser/neu_json_node.c b/src/parser/neu_json_node.c index ca137ccb..52ebfa4f 100644 --- a/src/parser/neu_json_node.c +++ b/src/parser/neu_json_node.c @@ -189,6 +189,11 @@ int neu_json_encode_get_node_state_resp(void *json_object, void *param) .name = "log_level", .t = NEU_JSON_STR, .v.val_str = resp->log_level, + }, + { + .name = "neuron_core", + .t = NEU_JSON_STR, + .v.val_str = resp->core_level, } }; ret = neu_json_encode_field(json_object, resp_elems, NEU_JSON_ELEM_SIZE(resp_elems)); @@ -236,10 +241,15 @@ int neu_json_encode_get_nodes_state_resp(void *json_object, void *param) } neu_json_elem_t resp_elems[] = { { - .name = "states", - .t = NEU_JSON_OBJECT, - .v.val_object = node_array, - } }; + .name = "states", + .t = NEU_JSON_OBJECT, + .v.val_object = node_array, + }, + { + .name = "neuron_core", + .t = NEU_JSON_STR, + .v.val_str = resp->core_level, + } }; ret = neu_json_encode_field(json_object, resp_elems, NEU_JSON_ELEM_SIZE(resp_elems)); diff --git a/src/parser/neu_json_node.h b/src/parser/neu_json_node.h index 1476315f..e3268701 100644 --- a/src/parser/neu_json_node.h +++ b/src/parser/neu_json_node.h @@ -54,6 +54,7 @@ typedef struct { int64_t link; int64_t rtt; char * log_level; + char core_level[NEU_LOG_LEVEL_LEN]; } neu_json_get_node_state_resp_t; int neu_json_encode_get_node_state_resp(void *json_object, void *param); @@ -69,6 +70,7 @@ typedef struct { typedef struct { uint16_t n_node; neu_json_get_nodes_state_t *nodes; + char core_level[NEU_LOG_LEVEL_LEN]; } neu_json_get_nodes_state_resp_t; int neu_json_encode_get_nodes_state_resp(void *json_object, void *param);