OpenTelemetry auto-instrumentation for ThinkPHP
请阅读 https://opentelemetry.io/docs/instrumentation/php/automatic/ 来知晓如何安装扩展和配置 SDK。
Auto-instrumentation hooks 通过 composer 注册,并且 spans 会自动被创建。 当前版本不支持指标的自动上报。
该扩展可以被禁用 runtime configuration:
OTEL_PHP_DISABLED_INSTRUMENTATIONS=thinkphp
首先,参考 openobserver 快速开始 在本地或者服务器上部署 一套openobserver 程序。
然后登录后台,在“采集”-> “日志”-> “自定义”-> “OTLP Collector” 中复制 出 endpoint 和 Authorization
在composer.json
中配置 extra log 的driver 文件 用于临时修复TP var_export 获得引用对象变量报错的bug。等官方修复了我再把这段检测去掉。
"extra": {
"include_files": [
"vendor/yangweijie/opentelemetry-auto-thinkphp/src/polyfill/log/driver/File.php"
]
},
参考 包根目录下的 otlp.bat
(win)和 otlp.sh
,可以将其拷贝至项目根目录, 然后将配置里的endpoint 替换为复制出来的。
当然是在.env 里配置了。
OTEL_PHP_AUTOLOAD_ENABLED=true
OTEL_SERVICE_NAME=default
OTEL_TRACES_EXPORTER=otlp
OTEL_LOGS_EXPORTER=otlp
OTEL_METRICS_EXPORTER=none
OTEL_PHP_DETECTORS=env,os,process,host
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:5080/api/default
OTEL_PROPAGATORS=baggage,tracecontext
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic OTE3NjQ3Mjg4QHFxLmNvbTpPa3BYMlp1MVIzTVRnUFhO,stream-name=default"
记得和APP_DEBUG 同级 不要放在 [XXX] 后面
然后正常 php think help
和 php think run
都行
跟上面说的一样:
- 在根目录下
otlp.bat run
或otlp.sh run
- 或者 配了.env
php think run
后浏览器直接 ip+端口或 nginx 配反向代理访问
官方的做法是在 修改php.ini,这样我觉的不妥,全部的应用都开启了(当然可以开启后,在单个项目的nginx config里配置 SERVER变量来关闭)。
我实践出来的最佳方法(nginx):
fastcgi_param OTEL_PHP_DETECTORS env,os,process,host;
fastcgi_param OTEL_PHP_LOG_DESTINATION psr3;
# fastcgi_param OTEL_PHP_LOG_DESTINATION error_log;
fastcgi_param OTEL_PHP_AUTOLOAD_ENABLED true;
fastcgi_param OTEL_SERVICE_NAME default;
fastcgi_param OTEL_TRACES_EXPORTER otlp;
fastcgi_param OTEL_METRICS_EXPORTER none;
fastcgi_param OTEL_LOGS_EXPORTER otlp;
fastcgi_param OTEL_EXPORTER_OTLP_ENDPOINT http://localhost:5080/api/default;
fastcgi_param OTEL_EXPORTER_OTLP_HEADERS 'Authorization=Basic OTE3NjQ3Mjg4QHFxLmNvbTpPa3BYMlp1MVIzTVRnUFhO,stream-name=default';
将这段内容替换调ENDPOINT 和 HEADERS 后,放置在 nginx 的 config/php
目录下 然后,在 自己域名配置的php部分包含这个文件
location ~ [^/]\.php(/|$)
{
fastcgi_pass 127.0.0.1:9013;
fastcgi_index index.php;
include pathinfo.conf;
include fastcgi.conf;
include php/open_observe.conf;
}
试过直接放在server段 无效的。
所以如果结合php.ini 的修改,就是将通用的放在ini里。
在nginx配置里配一下 fastcgi_param OTEL_PHP_DISABLED_INSTRUMENTATIONS thinkphp
禁用 和 header 来区分 上报的项目和用户
deployment.environment.name
开发环境
通过 APP_DEBUG 和 ENV_NAME 非空(就是在入口.env.xxx 文件来作为环境变量文件) 来 判断 满足一个就是test 不满足 就是prod
match_all('error')
match_all_raw('error')
match_all_raw_ignore_case('error')
str_match(fieldname, 'error')
str_match_ignore_case(fieldname, 'error')
code=200
code='200'
stream='stderr'
extract_ip(log) | code=200
SELECT * FROM "default" WHERE trace_id='7613688775511defb36d27f7869e612d'
trace 主要是同一个请求内 不同span 的组合 同属于一个trace_id。
每个span 会 记录耗时。
可以认为是 Span 的结构化日志 何时使用span event , 当一个事件发生 无需记录开始和结束,反正用 Span。
SpanKind |
调用方向 | 通信风格 |
---|---|---|
CLIENT |
发起 | request/response |
SERVER |
进入 | request/response |
PRODUCER |
发起 | deferred execution |
CONSUMER |
进入 | deferred execution |
INTERNAL |
{
"name": "/v1/sys/health",
"context": {
"trace_id": "7bba9f33312b3dbb8b2c2c62bb7abe2d",
"span_id": "086e83747d0e381e"
},
"parent_id": "",
"start_time": "2021-10-22 16:04:01.209458162 +0000 UTC",
"end_time": "2021-10-22 16:04:01.209514132 +0000 UTC",
"status_code": "STATUS_CODE_OK",
"status_message": "",
"attributes": {
"net.transport": "IP.TCP",
"net.peer.ip": "172.17.0.1",
"net.peer.port": "51820",
"net.host.ip": "10.177.2.152",
"net.host.port": "26040",
"http.method": "GET",
"http.target": "/v1/sys/health",
"http.server_name": "mortar-gateway",
"http.route": "/v1/sys/health",
"http.user_agent": "Consul Health Check",
"http.scheme": "http",
"http.host": "10.177.2.152:26040",
"http.flavor": "1.1"
},
"events": [
{
"name": "",
"message": "OK",
"timestamp": "2021-10-22 16:04:01.209512872 +0000 UTC"
}
]
}