SkyWalking
skywalking 插件将 APISIX 和 API7 网关的分布式追踪发送到 Apache SkyWalking。
SkyWalking 使用其原生 NGINX Lua 追踪器,从服务和 URI 两个视角提供追踪、拓扑分析和指标。网关通过 HTTP 与 SkyWalking 服务器通信 。
追踪会增加每个采样请求的处理开销。使用 sample_ratio 在追踪覆盖率和额外开销之间取得平衡;当高吞吐量路由不需要全量采样时,请使用较低的采样比例。未被选中采样的请求会跳过追踪创建,但具体性能影响取决于工作负载和收集器配置。
示例
以下示例使用 SkyWalking OAP 11.0.0、BanyanDB 0.11.0 和 Horizon 1.0.0。请在与网关相同的环境中启动 SkyWalking 服务:
- Docker
- Kubernetes
创建 SkyWalking 容器使用的网络:
docker network create gateway-skywalking-net
如果网关也在 Docker 中运行,请设置 GATEWAY_CONTAINER 并将其连接到该网络。如果网关安装在主机上,请跳过此步骤:
export GATEWAY_CONTAINER=replace-with-gateway-container-name
docker network connect gateway-skywalking-net "$GATEWAY_CONTAINER"
创建以下 Docker Compose 文件:
services:
banyandb:
image: apache/skywalking-banyandb:0.11.0
command: standalone
networks:
- skywalking
oap:
image: apache/skywalking-oap-server:11.0.0
environment:
SW_STORAGE: banyandb
SW_STORAGE_BANYANDB_TARGETS: banyandb:17912
ports:
- "127.0.0.1:12800:12800"
depends_on:
- banyandb
networks:
skywalking:
aliases:
- skywalking-oap
horizon:
image: apache/skywalking-ui:horizon-1.0.0
environment:
HORIZON_OAP_QUERY_URL: http://skywalking-oap:12800
HORIZON_OAP_ADMIN_URL: http://skywalking-oap:17128
HORIZON_AUTH_LOCAL_USERS: '[{"username":"admin","passwordHash":"$$argon2id$$v=19$$m=65536,t=3,p=4$$eemqy1r72oSXR58y8VpRqw$$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM","roles":["admin"]}]'
ports:
- "127.0.0.1:8081:8081"
depends_on:
- oap
networks:
- skywalking
networks:
skywalking:
name: gateway-skywalking-net
external: true
启动服务:
docker compose -f skywalking-compose.yaml up -d
Horizon 可通过 http://localhost:8081 访问。使用用户名 admin 和密码 admin 登录。
本示例中的本地用户使用公开的演示凭证。请仅在可信的本地评估环境中使用这些凭证。将 Horizon 暴露到本地环境之外前,请配置身份提供商或生成唯一的密码哈希。
创建命名空间以及包含 Horizon 本地用户配置的 Secret:
kubectl create namespace skywalking
kubectl create secret generic horizon-auth -n skywalking \
--from-literal='HORIZON_AUTH_LOCAL_USERS=[{"username":"admin","passwordHash":"$argon2id$v=19$m=65536,t=3,p=4$eemqy1r72oSXR58y8VpRqw$Bn/dULrmJTHEi3263KfgWDEwQmUsqNLi3xwyv/DekHM","roles":["admin"]}]'
创建 values 文件,固定兼容的 SkyWalking 组件版本并使用 BanyanDB 作为存储:
fullnameOverride: skywalking
oap:
image:
tag: 11.0.0
storageType: banyandb
ui:
image:
tag: horizon-1.0.0
envFromSecret: horizon-auth
elasticsearch:
enabled: false
banyandb:
enabled: true
image:
tag: 0.11.0
安装官方 SkyWalking Helm Chart:
helm upgrade --install skywalking oci://docker.io/apache/skywalking-helm \
--version 5.0.0 \
--namespace skywalking \
-f skywalking-values.yaml
网关可通过 skywalking-oap.skywalking.svc.cluster.local:12800 访问 OAP 服务器。若要在本地访问 Horizon,请转发其服务端口并打开 http://localhost:8081:
kubectl port-forward -n skywalking service/skywalking-ui 8081:80
使用用户名 admin 和密码 admin 登录。将 Horizon 开放到本地环境之外前,请将公开的演示凭证替换为唯一的密码哈希。
下文 Admin API 和 ADC 示例配置 OAP 端点时,使用 Docker 网络中的地址 http://skywalking-oap:12800。对于安装在主机上的网关,请改用 http://127.0.0.1:12800。如果 网关通过 Kubernetes 访问 OAP,请使用 http://skywalking-oap.skywalking.svc.cluster.local:12800。Ingress Controller 示例已使用 Kubernetes Service 地址。
SkyWalking OAP 服务器可用后,请根据网关的部署方式配置网关。在 API7 网关中,Dashboard 和 Admin API 默认提供 skywalking。对于 APISIX 部署,请先在网关插件列表中加载 skywalking,再设置 SkyWalking OAP 服务器的端点地址。
- Host
- Docker
- Kubernetes (Helm)
对于 APISIX 主机部署,请保留 config.yaml 中现有的插件列表,添加 skywalking,并将 plugin_attr.skywalking.endpoint_addr 设置为主机上公开的 OAP 端口:
plugins:
# Keep the complete plugin list used by your gateway.
- skywalking
plugin_attr:
skywalking:
report_interval: 3
service_name: APISIX
service_instance_name: APISIX Instance
endpoint_addr: http://127.0.0.1:12800
重新加载网关,使配置变更生效。
对于 APISIX Docker 部署,请保留 config.yaml 中现有的插件列表,添加 skywalking,并使用共享网络中的 OAP 容器别名:
plugins:
# Keep the complete plugin list used by your gateway.
- skywalking
plugin_attr:
skywalking:
report_interval: 3
service_name: APISIX
service_instance_name: APISIX Instance
endpoint_addr: http://skywalking-oap:12800
重新加载网关,使配置变更生效。
对于 Helm 部署,请更新用于渲染 SkyWalking 插件属性的值。对于 APISIX,还需更新用于渲染网关插件列表的值。保持 values 文件中的其他内容不变。
对于 APISIX Helm Chart,apisix.plugins 会替换已加载的插件列表。请以网关使用的完整插件列表为基础,添加 skywalking,并在 apisix.pluginAttrs 下配置插件属性:
apisix:
plugins:
# Keep the complete plugin list used by your gateway.
- skywalking
pluginAttrs:
skywalking:
report_interval: 3
service_name: APISIX
service_instance_name: APISIX Instance
endpoint_addr: http://skywalking-oap.skywalking.svc.cluster.local:12800
对于 API7 网关 Helm Chart,请设置以下值:
pluginAttrs:
skywalking:
report_interval: 3
service_name: APISIX
service_instance_name: APISIX Instance
endpoint_addr: http://skywalking-oap.skywalking.svc.cluster.local:12800
然后使用此网关版本对应的 Chart 应用 values 文件:
helm upgrade <release-name> <chart-name> -n <namespace> -f values.yaml
追踪所有请求
以下示例追踪经过某一路由的每个请求。
创建启用 skywalking 的路由,并将采 样比例配置为 1,以追踪所有请求:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "skywalking-route",
"uri": "/anything",
"plugins": {
"skywalking": {
"sample_ratio": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
services:
- name: httpbin
labels:
docs-example: skywalking-tracing
routes:
- uris:
- /anything
name: skywalking-route
plugins:
skywalking:
sample_ratio: 1
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览带有示例标签的服务变更:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=skywalking-tracing
同步已检查的变更:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=skywalking-tracing
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: skywalking-plugin-config
spec:
plugins:
- name: skywalking
config:
sample_ratio: 1
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: skywalking-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /anything
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: skywalking-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: skywalking-route
spec:
ingressClassName: apisix
http:
- name: skywalking-route
match:
paths:
- /anything
upstreams:
- name: httpbin-external-domain
plugins:
- name: skywalking
enable: true
config:
sample_ratio: 1
将配置应用到集群:
kubectl apply -f skywalking-ic.yaml
向路由发送几次请求:
curl -i "http://127.0.0.1:9080/anything"
你应收到 HTTP/1.1 200 OK 响应。
在 Horizon 中,前往 General Service → Traces 并运行查询。你应看到 APISIX 服务的追踪:

将追踪与日志关联
以下示例将已追踪路由的请求日志发送到 SkyWalking,使 Horizon 能够将每条日志与其追踪关联。
创建启用 skywalking-logger 插件的路由,并使用 OAP 服务器 URI 配置该插件:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "skywalking-logger-route",
"uri": "/anything",
"plugins": {
"skywalking": {
"sample_ratio": 1
},
"skywalking-logger": {
"endpoint_addr": "http://skywalking-oap:12800"
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
services:
- name: httpbin
labels:
docs-example: skywalking-tracing
routes:
- uris:
- /anything
name: skywalking-logger-route
plugins:
skywalking:
sample_ratio: 1
skywalking-logger:
endpoint_addr: "http://skywalking-oap:12800"
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览带有示例标签的服务变更:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=skywalking-tracing
同步已检查的变更:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=skywalking-tracing
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: skywalking-logs-config
spec:
plugins:
- name: skywalking
config:
sample_ratio: 1
- name: skywalking-logger
config:
endpoint_addr: "http://skywalking-oap.skywalking.svc.cluster.local:12800"
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: skywalking-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /anything
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: skywalking-logs-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: skywalking-route
spec:
ingressClassName: apisix
http:
- name: skywalking-route
match:
paths:
- /anything
upstreams:
- name: httpbin-external-domain
plugins:
- name: skywalking
enable: true
config:
sample_ratio: 1
- name: skywalking-logger
enable: true
config:
endpoint_addr: "http://skywalking-oap.skywalking.svc.cluster.local:12800"
将配置应用到集群:
kubectl apply -f skywalking-logs-ic.yaml
向路由发送几次请求:
curl -i "http://127.0.0.1:9080/anything"
你应收到 HTTP/1.1 200 OK 响应。
在 Horizon 中,前往 General Service → Logs 并运行查询。关联的请求日志包含一个 trace 链接,单击该链接可打开对应的追踪:
