未验证 提交 7fed459b 编写于 作者: 何延龙 提交者: GitHub

Merge pull request #92 from bostin/feature/bostin_20190722

支持Mysqli::query(); 完善中文文档
...@@ -21,6 +21,7 @@ Host in Beijing. Go to [demo](http://106.75.237.45:8080/). ...@@ -21,6 +21,7 @@ Host in Beijing. Go to [demo](http://106.75.237.45:8080/).
## Support List ## Support List
1. CURL 1. CURL
1. PDO 1. PDO
1. Mysqli
## Contact Us ## Contact Us
* Submit an [issue](https://github.com/SkyAPM/SkyAPM-php-sdk/issues) * Submit an [issue](https://github.com/SkyAPM/SkyAPM-php-sdk/issues)
......
# 20190722
## SkyWalking 扩展修改
1. 支持对mysqli扩展的支持(目前暂时仅支持`mysqli::query()`)
# 20190719 # 20190719
## Agent 修改 ## Agent 修改
1. agent创建的文件权限修改为0666, 文件的类型修改为sock类型。修复php与sock文件进行通信时提示"Permission Deny"的问题 1. agent创建的文件权限修改为0666, 文件的类型修改为sock类型。修复php与sock文件进行通信时提示"Permission Deny"的问题
2. agent的参数接收方式修改, 执行`sky_php_agent -h` 查看可用参数 2. agent的参数接收方式修改, 执行`sky_php_agent -h` 查看可用参数
3. agent支持在参数中指定sock文件的路径 3. agent支持在参数中指定sock文件的路径
## SkyWalking 扩展修改 ## SkyWalking 扩展修改
1. 新增 skywalking_get_trace_info():array 方法,获取trace数据,以方便业务日志获取当前请求trace信息。 1. 新增 skywalking_get_trace_info():array 方法,获取trace数据,以方便业务日志获取当前请求trace信息。
2. 删除无用的skywalking.log_path及skywalking.grpc配置项 2. 删除无用的skywalking.log_path及skywalking.grpc配置项
......
...@@ -50,7 +50,7 @@ skywalking.enable=1 ...@@ -50,7 +50,7 @@ skywalking.enable=1
# skywalking的版本:5或者6(默认值为6) # skywalking的版本:5或者6(默认值为6)
skywalking.version=6 skywalking.version=6
# app_code代码,不要含特殊字符,请使用数字、字母、下换线。(默认为:hello_skywalking) # app_code代码,不要含特殊字符,请使用数字、字母、下换线。(默认为:hello_skywalking)
skywalking.app_code=dada_www_001 skywalking.app_code=hello_skywalking
# sock文件路径(默认值为/tmp/sky_agent.sock) # sock文件路径(默认值为/tmp/sky_agent.sock)
skywalking.sock_path=/tmp/sky_agent.sock skywalking.sock_path=/tmp/sky_agent.sock
``` ```
......
# 常见问题 # 常见问题
-----
1.linux下php不能读取/tmp文件夹下文件,即php无法与/tmp目录下的sock文件进行通信。 1. linux下php不能读取/tmp文件夹下文件,即php无法与/tmp目录下的sock文件进行通信。
该问题一般是由`systemd`服务的`PrivateTmp`属性配置导致的。 该问题一般是由`systemd`服务的`PrivateTmp`属性配置导致的。
`systemd`中服务的配置文件都在目录`/lib/systemd/system/`中: `systemd`中服务的配置文件都在目录`/lib/systemd/system/`中:
* 检查SELinux配置,可尝试关闭SELinux * 检查SELinux配置,可尝试关闭SELinux
* `apache`的配置文件为`apache2.service` * `apache`的配置文件为`apache2.service`
* `php-fpm`的配置文件为`php-fpm.service` (可能会存在版本号,例如`php7.2-fpm.service`) * `php-fpm`的配置文件为`php-fpm.service` (可能会存在版本号,例如`php7.2-fpm.service`)
修改`PrivateTmp`属性的取值为`false`, 再执行`sudo systemctl daemon-reload`, 最后再重启`apache`或者`php-fpm` 修改`PrivateTmp`属性的取值为`false`, 再执行`sudo systemctl daemon-reload`, 最后再重启`apache`或者`php-fpm`
1. 对于已经安装并启用了`SkyWalking`扩展的PHP环境的主机,所发送的trace信息在哪里?
2.对于已经安装并启用了`SkyWalking`扩展的PHP环境的主机,所发送的trace信息在哪里? * 如果`skywalking.version=5`, 则`http`请求的`header`中会加入一个名为`SW3`的数据。PHP可使用`$_SERVER['HTTP_SW3']`获取。[协议文档](https://github.com/apache/skywalking/blob/master/docs/en/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v1.md)
* 如果`skywalking.version=5`, 则`http`请求的`header`中会加入一个名为`SW3`的数据。PHP可使用`$_SERVER['HTTP_SW3']`获取。 * 如果`skywalking.version=6`, 则`http`请求的`header`中会加入一个名为`SW6`的数据。PHP可使用`$_SERVER['HTTP_SW6']`获取。[协议文档](https://github.com/apache/skywalking/blob/master/docs/en/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v2.md)
* 如果`skywalking.version=6`, 则`http`请求的`header`中会加入一个名为`SW6`的数据。PHP可使用`$_SERVER['HTTP_SW6']`获取。 * SW6值格式为:`1-{distributedTraceIdEncode}-{traceSegmentIdEncode}-{span_id}-{application_instance}-{entryApplicationInstance}-{peerHostEncode}-{entryEndpointNameEncode}-{parentEndpointNameEncode}`, Encode算法为base64_encode()。示例取值为:`1-OTQuMjIyMzUuMTU2MjkxMDg1MzAwMDM=-OTQuMjIyMzUuMTU2MjkxMDg1MzAwMDM=-1-94-94-IwE6NDQz-Iy9pbmRleC5waHA/ZGRkZGRkZA==-IwE=`
* 值格式为:`1-{distributedTraceIdEncode}-{traceSegmentIdEncode}-{span_id}-{application_instance}-{entryApplicationInstance}-{peerHostEncode}-{entryEndpointNameEncode}-{parentEndpointNameEncode}`, Encode算法为base64_encode()。示例取值为:`1-OTQuMjIyMzUuMTU2MjkxMDg1MzAwMDM=-OTQuMjIyMzUuMTU2MjkxMDg1MzAwMDM=-1-94-94-IwE6NDQz-Iy9pbmRleC5waHA/ZGRkZGRkZA==-IwE=`
* 值中`distributedTraceId`即下方的`globalTraceIds[0]`的取值 * 值中`distributedTraceId`即下方的`globalTraceIds[0]`的取值
1. 会传递trace信息的请求类型有哪些?
3.会传递trace信息的请求类型有哪些?
* php curl扩展发出的请求 * php curl扩展发出的请求
* php PDO扩展发出的请求 * php PDO扩展发出的请求
* php mysqli扩展发出的请求
4.skywalking_get_trace_info()函数的返回值格式? 1. skywalking_get_trace_info()函数的返回值格式?
* 返回值为数组。如果扩展加载但是未启用(`skywalking.enable=0`), 则返回空数组 * 返回值为数组。如果扩展加载但是未启用(`skywalking.enable=0`), 则返回空数组
```php ```php
# skywalking_get_trace_info 返回值格式如下: # skywalking_get_trace_info 返回值格式如下:
...@@ -65,4 +64,7 @@ ...@@ -65,4 +64,7 @@
'94.22235.15629108530003', '94.22235.15629108530003',
], ],
] ]
``` ```
\ No newline at end of file
1. mysqli有过程式风格和对象式风格,上报的数据有何不同?
* 目前扩展仅监控mysqli_query()、mysqli::query()方法, 并记录对应执行的sql, 在上报到oapServer的时候,统一按照mysqli->query()的格式进行上报
\ No newline at end of file
...@@ -248,6 +248,7 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return ...@@ -248,6 +248,7 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return
zf->common.scope->name) : NULL; zf->common.scope->name) : NULL;
const char *function_name = zf->common.function_name == NULL ? NULL : ZSTR_VAL(zf->common.function_name); const char *function_name = zf->common.function_name == NULL ? NULL : ZSTR_VAL(zf->common.function_name);
int is_procedural_mysqli = 0; // "Procedural style" or "Object oriented style" ?
char *operationName = NULL; char *operationName = NULL;
char *component = NULL; char *component = NULL;
if (class_name != NULL) { if (class_name != NULL) {
...@@ -272,8 +273,29 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return ...@@ -272,8 +273,29 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return
strcat(operationName, "->"); strcat(operationName, "->");
strcat(operationName, function_name); strcat(operationName, function_name);
} }
} else if (strcmp(class_name, "mysqli") == 0) {
if (strcmp(function_name, "query") == 0) {
component = (char *) emalloc(strlen("mysqli") + 1);
strcpy(component, "mysqli");
operationName = (char *) emalloc(strlen(class_name) + strlen(function_name) + 3);
strcpy(operationName, class_name);
strcat(operationName, "->");
strcat(operationName, function_name);
}
} }
} else if (function_name != NULL) { } else if (function_name != NULL) {
if (strcmp(function_name, "mysqli_query") == 0) {
class_name = "mysqli";
function_name = "query";
component = (char *) emalloc(strlen(class_name) + 1);
strcpy(component, class_name);
operationName = (char *) emalloc(strlen(class_name) + strlen(function_name) + 3);
strcpy(operationName, class_name);
strcat(operationName, "->");
strcat(operationName, function_name);
is_procedural_mysqli = 1;
}
} }
if (operationName != NULL) { if (operationName != NULL) {
...@@ -323,8 +345,25 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return ...@@ -323,8 +345,25 @@ ZEND_API void sky_execute_internal(zend_execute_data *execute_data, zval *return
add_assoc_string(&tags, "db.data_source", (char *) stmt->dbh->data_source); add_assoc_string(&tags, "db.data_source", (char *) stmt->dbh->data_source);
} }
} }
} else if (function_name != NULL) {
if (strcmp(class_name, "mysqli") == 0 && strcmp(function_name, "query") == 0) {
add_assoc_string(&tags, "db.type", "mysqli");
// params
uint32_t arg_count = ZEND_CALL_NUM_ARGS(execute_data);
if (arg_count) {
zval *p = is_procedural_mysqli ? ZEND_CALL_ARG(execute_data, 2) : ZEND_CALL_ARG(execute_data, 1);
//db.statement
switch (Z_TYPE_P(p)) {
case IS_STRING:
add_assoc_string(&tags, "db.statement", Z_STRVAL_P(p));
break;
}
}
}
} }
zval temp; zval temp;
zval *spans = NULL; zval *spans = NULL;
zval *span_id = NULL; zval *span_id = NULL;
...@@ -1303,9 +1342,11 @@ PHP_MINIT_FUNCTION (skywalking) { ...@@ -1303,9 +1342,11 @@ PHP_MINIT_FUNCTION (skywalking) {
return SUCCESS; return SUCCESS;
} }
// 用户自定义函数执行器(php脚本定义的类、函数)
ori_execute_ex = zend_execute_ex; ori_execute_ex = zend_execute_ex;
zend_execute_ex = sky_execute_ex; zend_execute_ex = sky_execute_ex;
// 内部函数执行器(c语言定义的类、函数)
ori_execute_internal = zend_execute_internal; ori_execute_internal = zend_execute_internal;
zend_execute_internal = sky_execute_internal; zend_execute_internal = sky_execute_internal;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册