From 040df5bb43e0566e82e883b6be2488df4725c46e Mon Sep 17 00:00:00 2001 From: "Bostin.wang" Date: Fri, 2 Aug 2019 13:45:21 +0800 Subject: [PATCH] add redis c extension support --- php_skywalking.h | 2 ++ skywalking.c | 83 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/php_skywalking.h b/php_skywalking.h index 4a461dd..7b04cbb 100644 --- a/php_skywalking.h +++ b/php_skywalking.h @@ -151,6 +151,8 @@ static void write_log( char *text); static void request_init(); static void zval_b64_encode(zval *out, char *in); static void zval_b64_decode(zval *out, char *in); +static char *sky_redis_fnamewall(const char *function_name); +static int sky_redis_key_func(char *fnamewall); void sky_curl_exec_handler(INTERNAL_FUNCTION_PARAMETERS); void sky_curl_setopt_handler(INTERNAL_FUNCTION_PARAMETERS); diff --git a/skywalking.c b/skywalking.c index 81a4552..f9cf0ed 100644 --- a/skywalking.c +++ b/skywalking.c @@ -154,6 +154,28 @@ static char *pcre_match(char *pattern, int len, char *subject) { } +static char *sky_redis_fnamewall(const char *function_name) { + char *fnamewall = (char *) emalloc(strlen(function_name) + 3); + sprintf(fnamewall, "|%s|", function_name); + fnamewall = php_strtolower(fnamewall, strlen(fnamewall)); + return fnamewall; +} + +static int sky_redis_key_func(char *fnamewall) { + if (strstr(REDIS_KEY_STRING, fnamewall) + || strstr(REDIS_KEY_KEY, fnamewall) + || strstr(REDIS_KEY_HASH, fnamewall) + || strstr(REDIS_KEY_LIST, fnamewall) + || strstr(REDIS_KEY_SET, fnamewall) + || strstr(REDIS_KEY_SORT, fnamewall) + || strstr(REDIS_KEY_HLL, fnamewall) + || strstr(REDIS_KEY_GEO, fnamewall) + ) { + return 1; + } + return 0; +} + ZEND_API void sky_execute_ex(zend_execute_data *execute_data) { if (application_instance == 0) { @@ -205,11 +227,7 @@ ZEND_API void sky_execute_ex(zend_execute_data *execute_data) { smart_str command = {0}; ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(pam), num_key, entry) { - char *fnamewall = (char *) emalloc(strlen(Z_STRVAL_P(fname)) + 3); - sprintf(fnamewall, "|%s|", Z_STRVAL_P(fname)); - - // strtolower for matching redis key - fnamewall = php_strtolower(fnamewall, strlen(fnamewall)); + char *fnamewall = sky_redis_fnamewall(Z_STRVAL_P(fname)); // first params if (num_key == 0) { switch (Z_TYPE_P(entry)) { @@ -219,15 +237,7 @@ ZEND_API void sky_execute_ex(zend_execute_data *execute_data) { smart_str_appends(&command, " "); // string - if (strstr(REDIS_KEY_STRING, fnamewall) - || strstr(REDIS_KEY_KEY, fnamewall) - || strstr(REDIS_KEY_HASH, fnamewall) - || strstr(REDIS_KEY_LIST, fnamewall) - || strstr(REDIS_KEY_SET, fnamewall) - || strstr(REDIS_KEY_SORT, fnamewall) - || strstr(REDIS_KEY_HLL, fnamewall) - || strstr(REDIS_KEY_GEO, fnamewall) - ) { // add tag key + if (sky_redis_key_func(fnamewall) == 1) { // add tag key add_assoc_string(&tags, "redis.key", Z_STRVAL_P(entry)); } else if (strstr(REDIS_OPERATION_STRING, fnamewall)) { // add tag operation add_assoc_string(&tags, "redis.operation", Z_STRVAL_P(entry)); @@ -370,6 +380,18 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return } } } + } else if (strcmp(class_name, "Redis") == 0 || strcmp(class_name, "RedisCluster") == 0) { + char *fnamewall = sky_redis_fnamewall(function_name); + if (sky_redis_key_func(fnamewall) == 1) { + componentId = COMPONENT_JEDIS; + component = (char *) emalloc(strlen("Redis") + 1); + strcpy(component, "Redis"); + operationName = (char *) emalloc(strlen(class_name) + strlen(function_name) + 3); + strcpy(operationName, class_name); + strcat(operationName, "->"); + strcat(operationName, function_name); + } + efree(fnamewall); } } else if (function_name != NULL) { if (strcmp(function_name, "mysqli_query") == 0) { @@ -508,6 +530,39 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return } } } + } else if (strcmp(class_name, "Redis") == 0 || strcmp(class_name, "RedisCluster") == 0) { + add_assoc_string(&tags, "db.type", "redis"); + uint32_t arg_count = ZEND_CALL_NUM_ARGS(execute_data); + + smart_str command = {0}; + smart_str_appends(&command, php_strtolower((char *) function_name, strlen((char *) function_name))); + smart_str_appends(&command, " "); + + int is_string_command = 1; + int i; + for (i = 1; i < arg_count + 1; ++i) { + zval *p = ZEND_CALL_ARG(execute_data, i); + if (Z_TYPE_P(p) == IS_ARRAY) { + is_string_command = 0; + break; + } + if (Z_TYPE_P(p) != IS_STRING) { + convert_to_string(p); + } + if (i == 1) { + add_assoc_string(&tags, "redis.key", Z_STRVAL_P(p)); + } + smart_str_appends(&command, php_strtolower(Z_STRVAL_P(p), Z_STRLEN_P(p))); + smart_str_appends(&command, " "); + } + // store command to tags + if (command.s) { + smart_str_0(&command); + if (is_string_command) { + add_assoc_string(&tags, "redis.command", ZSTR_VAL(php_trim(command.s, NULL, 0, 3))); + } + smart_str_free(&command); + } } zval temp; -- GitLab