
深入解析API網關策略:認證、授權、安全、流量處理與可觀測性
上圖 Content 為日志內容,這里使用了 Apache APISIX metadata 配置來收集 Request 相關信息。后續可通過 Plugin Metadata 修改 Log Format 定制日志內容,具體可以參考官方文檔。
在使用該插件時,由于 SkyWalking 插件默認為「不開啟」,所以需要手動修改 conf/default-apisix.yaml
文件中 plugins
章節來解開SkyWalking 注釋從而啟用插件。
plugins:
...
- skywalking
...
之后便可使用 SkyWalking Tracing 插件直接得到 Tracing 數據,以便接下來驗證 Logging 插件相關功能是否能夠正常開啟與工作。
接下來創建一個路由,并綁定 SkyWalking Tracing 插件和 SkyWalking Logging 插件。關于插件具體配置細節可以參考 Apache APISIX 官方文檔,這里不再贅述。
curl -X PUT 'http://192.168.0.108:9080/apisix/admin/routes/1001' \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-H 'Content-Type: application/json' \
-d '{
"uri": "/get",
"plugins": {
"skywalking": {
"sample_ratio": 1
},
"skywalking-logger": {
"endpoint_addr": "http://127.0.0.1:12800"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
在 Apache SkyWalking 側,可以使用 LAL(Logger Analysis Language)腳本進行日志處理,比如 Tag 提取、SkyWalking 元數據修正等。
這里進行 Tag 提取主要是為了后續檢索方便,以及在 Metrics 統計時添加相關依賴。可使用如下代碼進行 SkyWalking LAL 腳本配置來完成 Tag 提取,更多關于 SkyWalking LAL 腳本使用方法可以參考 Apache SkyWalking 官方文檔。
# The default LAL script to save all logs, behaving like the versions before 8.5.0.
rules:
- name: default
dsl: |
filter {
json {
abortOnFailure false
}
extractor {
tag routeId: parsed.route_id
tag upstream: parsed.upstream
tag clientIp: parsed.client_ip
tag latency: parsed.latency
}
sink {
}
}
在 SkyWalking OAP Server 配置上述 LAL 腳本后將顯示如下日志:
展開日志詳情如下:
通過上述操作可以看到,將 routeId
,upstream
和 clientIp
以鍵值對形式展示,比在日志正文中直接查找要方便許多,還能用于 MAL 統計生成相關的度量指標。
目前 error-log-logger 插件已支持 SkyWalking 日志格式,現在可以使用 error-log-logger 插件將 Apache APISIX 錯誤日志快捷接入到 Apache SkyWalking 中。目前,錯誤日志還無法獲取 SkyWalking Tracing Context 信息,因此無法直接與 SkyWalking Tracing 產生關聯。
關于 Error Log 接入 SkyWalking 主要是為了能集中管理 Apache APISIX 的日志數據,同時也方便在 SkyWalking 內查看所有可觀測性數據。
由于 error-log-logger 插件默認「不開啟」,所以仍需要上文中提到的方法進行插件開啟。
plugins:
...
- error-log-logger
...
啟用之后,需要將插件綁定到路由或者 global rules
上,這里我們以「綁定路由」為例。
curl -X PUT 'http://192.168.0.108:9080/apisix/admin/plugin_metadata/error-log-logger' \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-H 'Content-Type: application/json' \
-d '{
"inactive_timeout": 10,
"level": "ERROR",
"skywalking": {
"endpoint_addr": "http://127.0.0.1:12800/v3/logs"
}
}'
注意這里 endpoint_addr
是 SkyWalking OAP Server 地址,需要帶上 URI(即 /v3/logs
)。
與 Access Log 處理方式基本一樣,日志在送達 SkyWalking OAP Server 時,同樣會經過 LAL 處理。因此,我們依然可以使用 SkyWalking LAL 腳本來分析處理日志信息。
需要注意的是,Error Log 日志消息體使用文本格式。如果進行 Tags 提取,則需要使用正則表達式來完成。與 Access Log 處理消息正文的方式略有不同,Acces Log 使用 JSON 格式,可以直接使用 JSON 解析后引用 JSON 對象的字段,其他處理流程則大體一致。
同時也可以利用 Tags 來優化顯示效果與檢索,方便后續使用 SkyWalking MAL 進行 Metrics 計算。
rules:
- name: apisix-errlog
dsl: |
filter {
text {
regexp "(?<datetime>\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}) \\[(?<level>\\w+)\\] \\d+\\#\\d+:( \\*\\d+ \\[(?<module>\\w+)\\] (?<position>.*\\.lua:\\d+): (?<function>\\w+\\(\\)):)* (?<msg>.+)"
}
extractor {
tag level: parsed.level
if (parsed?.module) {
tag module: parsed.module
tag position: parsed.position
tag function: parsed.function
}
}
sink {
}
}
在 SkyWalking OAP Server 使用的 LAL 腳本之后,將會在日志中提取部分 Tags,效果如下圖。
本文主要介紹了兩款 Apache APISIX 集成 SkyWalking 的日志插件,為之后大家在 Apache APISIX 中進行日志處理提供更方便的操作與環境。希望通過本篇內容,大家可以對新功能有了更充分的理解,后續可以更方便地利用 Apache APISIX 進行可觀測數據的集中管理。
文章來源:API gateway integrates SkyWalking to create comprehensive log processing