一、簡介
關於molten的介紹網上有很多,是一個全鏈路追蹤的工具,Molten可以看做是phptrace的的升級版(流行的php問題定位工具譬如phptrace,xhprof,這些工具可以自行Google,看看如何使用)
Molten能干啥
molten追蹤php核心調用庫運行時信息並且按照zipkin/optracing格式輸出信息。
可以追蹤`curl,pdo,mysqli,redis,mongodb,memcached` 這么多的運行信息。
你可以直接看到你耗時比較久的接口的運行信息,調用信息,一眼就能看到哪個地方慢
二、安裝
zipkin 開源分布式系統調用跟蹤工具(java寫的工具),所以系統需要安裝Java或者docker
molten為php作對應的數據收集
1、安裝Java
最簡單的方式rpm 安裝,我這里可以直接安裝
yum -y install java
查看Java安裝情況
[root@localhost~]# java -version openjdk version "1.8.0_212" OpenJDK Runtime Environment (build 1.8.0_212-b04) OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
2、安裝依賴
yum -y install libevent-devel
3、安裝molten
cd /usr/local/src git clone https://github.com/chuan-yun/Molten.git cd Molten phpize ./configure --enable-zipkin-header=yes make && make install
4、配置molte.ini
[molten] extension="molten.so" molten.enable="1" molten.service_name="local" molten.tracing_cli=1 molten.open_report=1 molten.sampling_type=2 molten.sampling_rate=1 molten.notify_uri="http://127.0.0.1:9411/zipkin/" molten.sink_http_uri="http://127.0.0.1:9411/api/v1/spans" molten.sink_type=4 molten.sink_log_path="/tmp/logs/"
5、下載並啟動zipkin
curl -sSL https://zipkin.apache.org/quickstart.sh | bash -s java -jar zipkin.jar --logging.level.zipkin=DEBUG 2>&1 >/dev/null &
啟動界面
******** ** ** * * ** ** ** ** ** ** ** ** ******** **** **** **** **** ****** **** *** **************************************************************************** ******* **** *** **** **** ** ** ***** ** ***** ** ** ** ** ** ** ** ** * *** ** **** ** ** ** ***** **** ** ** *** ****** ** ** ** ** ** ** ** :: Powered by Spring Boot :: (v2.1.5.RELEASE) 2019-05-21 22:26:30.113 INFO 19403 --- [ main] z.s.ZipkinServer : Starting ZipkinServer v2.14.0 on iZwz9ccq9xttkykppxhkwtZ with PID 19403 2019-05-21 22:26:30.123 DEBUG 19403 --- [ main] z.s.ZipkinServer : Running with Spring Boot v2.1.5.RELEASE, Spring v5.1.7.RELEASE 2019-05-21 22:26:30.123 INFO 19403 --- [ main] z.s.ZipkinServer : The following profiles are active: shared 2019-05-21 22:26:34.586 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.verboseExceptions: false (default) 2019-05-21 22:26:34.587 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.verboseSocketExceptions: false (default) 2019-05-21 22:26:34.587 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.verboseResponses: false (default) 2019-05-21 22:26:34.667 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.useEpoll: true (default) 2019-05-21 22:26:34.927 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.useOpenSsl: true (default) 2019-05-21 22:26:34.930 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.maxNumConnections: 2147483647 (default) 2019-05-21 22:26:34.930 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.numCommonWorkers: 2 (default) 2019-05-21 22:26:34.931 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.numCommonBlockingTaskThreads: 200 (default) 2019-05-21 22:26:34.941 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultMaxRequestLength: 10485760 (default) 2019-05-21 22:26:34.942 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultMaxResponseLength: 10485760 (default) 2019-05-21 22:26:34.942 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultRequestTimeoutMillis: 10000 (default) 2019-05-21 22:26:34.942 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultResponseTimeoutMillis: 15000 (default) 2019-05-21 22:26:34.943 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultConnectTimeoutMillis: 3200 (default) 2019-05-21 22:26:34.943 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultWriteTimeoutMillis: 1000 (default) 2019-05-21 22:26:34.947 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultServerIdleTimeoutMillis: 15000 (default) 2019-05-21 22:26:34.948 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultClientIdleTimeoutMillis: 10000 (default) 2019-05-21 22:26:34.948 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2InitialConnectionWindowSize: 1048576 (default) 2019-05-21 22:26:34.949 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2InitialStreamWindowSize: 1048576 (default) 2019-05-21 22:26:34.951 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2MaxFrameSize: 16384 (default) 2019-05-21 22:26:34.952 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2MaxStreamsPerConnection: 2147483647 (default) 2019-05-21 22:26:34.952 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2MaxHeaderListSize: 8192 (default) 2019-05-21 22:26:34.956 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp1MaxInitialLineLength: 4096 (default) 2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp1MaxHeaderSize: 8192 (default) 2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp1MaxChunkSize: 8192 (default) 2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultUseHttp2Preface: true (default) 2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultUseHttp1Pipelining: false (default) 2019-05-21 22:26:34.958 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultBackoffSpec: exponential=200:10000,jitter=0.2 (default) 2019-05-21 22:26:34.958 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultMaxTotalAttempts: 10 (default) 2019-05-21 22:26:34.965 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.routeCache: maximumSize=4096 (default) 2019-05-21 22:26:34.966 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.compositeServiceCache: maximumSize=256 (default) 2019-05-21 22:26:34.966 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.parsedPathCache: maximumSize=4096 (default) 2019-05-21 22:26:34.966 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.headerValueCache: maximumSize=4096 (default) 2019-05-21 22:26:34.967 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.cachedHeaders: :authority,:scheme,:method,accept-encoding,content-type (default) 2019-05-21 22:26:34.974 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.annotatedServiceExceptionVerbosity: unhandled (default) 2019-05-21 22:26:34.979 INFO 19403 --- [ main] c.l.a.c.Flags : Using /dev/epoll 2019-05-21 22:26:34.979 INFO 19403 --- [ main] c.l.a.c.Flags : Using OpenSSL: BoringSSL, 0x1010007f 2019-05-21 22:26:35.504 INFO 19403 --- [ main] c.l.a.s.d.DocStringExtractor : Using com.linecorp.armeria.thrift.jsonDir: META-INF/armeria/thrift 2019-05-21 22:26:35.538 INFO 19403 --- [ main] c.l.a.c.u.SystemInfo : Hostname: izwz9ccq9xttkykppxhkwtz (from /proc/sys/kernel/hostname) 2019-05-21 22:26:36.036 INFO 19403 --- [oss-http-*:9411] c.l.a.s.Server : Serving HTTP at /0.0.0.0:9411 - http://127.0.0.1:9411/ 2019-05-21 22:26:36.037 INFO 19403 --- [ main] c.l.a.s.ArmeriaAutoConfiguration : Armeria server started at ports: {/0.0.0.0:9411=ServerPort(/0.0.0.0:9411, [http])} 2019-05-21 22:26:36.139 INFO 19403 --- [ main] c.d.d.core : DataStax Java driver 3.7.1 for Apache Cassandra 2019-05-21 22:26:36.166 INFO 19403 --- [ main] c.d.d.c.GuavaCompatibility : Detected Guava >= 19 in the classpath, using modern compatibility layer 2019-05-21 22:26:37.149 INFO 19403 --- [ main] c.d.d.c.ClockFactory : Using native clock to generate timestamps. 2019-05-21 22:26:37.577 INFO 19403 --- [ main] z.s.ZipkinServer : Started ZipkinServer in 9.103 seconds (JVM running for 11.001)
6、分析數據
可以打開 http://127.0.0.1:9411/zipkin/ 進行數據分析了
三、功能
現在Molten提供curl、pdo、mysqli、redis、mongodb、memcached等組件的攔截,這些信息攔截都是應用透明,開箱即用,輸出zipkin格式非常方便。
查看molten是否正常啟動了,可以訪問:http://your.domain/molten/status:
輸出內容格式讓人感到疑惑,其實這個是prometheus監控exporter輸出格式,輸出這種格式方便和prometheus集成。
還可以通過POST http://your.domain/molten/status修改探針采樣的方式,內容如下:
{"enable":1,"samplingType":2,"samplingRate":20,"samplingRequest":100}
其中samplingType是采樣類型:1是根據采樣率采樣,2是根據每分鍾的請求數。
samplingRate是采樣率,即多少個請求采樣一個,samplingRequest是每分鍾的前多少個請求被采樣。采樣是降低性能損耗的有效方式,通過還能夠根據系統的承載量動態的調整。
還可通過molten.sink_type設置數據輸出方式, 1是輸出到文件中, 2輸出到標准輸出,4 通過http發送。
Molten在phptrace數據分析的基礎上進行大量的開發, 本身性能在開啟采樣率的情況下影響較小。
應用影響如下:
四、增加trace方法
分析源碼文件 molten_intercept.c
可以看到在 `mo_intercept_ctor` 方法中,通過在 MINIT 階段注入相關的方法實現了對調用的監控。
其中 PDO
PDOStatement@execute PDO@exec PDO@query PDO@commit PDO@prepare
其中 mysqli
mysqli_connect mysqli@__construct mysqli_real_connect mysqli@real_connect mysqli_query mysqli@query mysqli_prepare mysqli@prepare mysqli_stmt_prepare mysqli_stmt@prepare mysqli_stmt_execute mysqli_stmt@execute mysqli@commit
其中 curl
curl_setopt curl_exec curl_setopt_array curl_reset
可以看到 molten 對 PHP 常用的遠程調用服務方法都做了監控,但還不夠全面,更新也不夠及時,如果我們想對其他方法監控(比如 rpc、predis、kafka 等)可以做一些改造。
參考其他的方法追加代碼
/* predis */ { ADD_INTERCEPTOR_TAG(pit, Predis\\Client); INIT_INTERCEPTOR_ELE(Predis\\Client@__construct, &default_capture, &default_predis_record); INIT_INTERCEPTOR_ELE(Predis\\Client@__call, &default_capture, &default_predis_record); }
針對 predis 編寫predis_request_record
方法
/* {{{ predis default method record */ static void default_predis_record(mo_interceptor_t *pit, mo_frame_t *frame) { zval *span = build_com_record(pit, frame, 0); merge_span_extra(span, frame); pit->psb->span_add_ba_ex(span, "componet", "Predis\\Client", frame->exit_time, pit->pct, BA_NORMAL); pit->psb->span_add_ba_ex(span, "db.type", "redis", frame->exit_time, pit->pct, BA_NORMAL); /* check exception */ SET_DEFAULT_EXCEPTION(frame, pit); /* add span */ mo_chain_add_span(pit->pct->pcl, span); }