未验证 提交 e7db35f1 编写于 作者: w60514603's avatar w60514603 提交者: GitHub

Merge branch 'master' into feature/add_grpc_support

......@@ -24,6 +24,8 @@ Host in Beijing. Go to [demo](http://106.75.237.45:8080/).
1. Mysqli
1. Yar Client ([Yar](https://www.php.net/manual/en/book.yar.php))
1. GRPC Client ([GRPC](https://github.com/grpc/grpc-php))
1. Predis Client ([Predis](https://packagist.org/packages/predis/predis))
1. Redis Extension ([Redis Extension](https://github.com/phpredis/phpredis))
## Contact Us
* Submit an [issue](https://github.com/SkyAPM/SkyAPM-php-sdk/issues)
......
......@@ -21,6 +21,8 @@
* php mysqli扩展发出的请求
* php yar扩展(client)发出的请求
* php [grpc/grpc](https://github.com/grpc/grpc-php) 发出的请求
* php redis扩展发出的请求
* php predis库发出的请求
1. skywalking_get_trace_info()函数的返回值格式?
* 返回值为数组。如果扩展加载但是未启用(`skywalking.enable=0`), 则返回空数组
......
......@@ -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_opt_for_string_key(char *fnamewall);
void sky_curl_exec_handler(INTERNAL_FUNCTION_PARAMETERS);
void sky_curl_setopt_handler(INTERNAL_FUNCTION_PARAMETERS);
......
......@@ -153,6 +153,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_opt_for_string_key(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) {
......@@ -218,11 +240,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)) {
......@@ -232,15 +250,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_opt_for_string_key(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));
......@@ -394,6 +404,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_opt_for_string_key(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) {
......@@ -532,6 +554,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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册