Skip to content

skywalking

本文将介绍 API 网关 APIX 如何通过 skywalking 插件将 metrics 上报到 Apache SkyWalking(一个开源的 APM)。

描述

skywalking 插件用于与 Apache SkyWalking 集成。

SkyWalking 使用其原生的 NGINX Lua tracer 从服务和 URI 角度提供了分布式追踪、拓扑分析以及 metrics 。

服务端目前支持 HTTP 和 gRPC 两种协议,在 APIX 中目前只支持 HTTP 协议。

属性

名称类型必选项默认值有效值描述
sample_rationumber1[0.00001, 1]采样的比例。设置为 1 时,将对所有请求进行采样。

如何设置 Endpoint

你可以在配置文件(./conf/config.yaml)中配置以下属性:

名称类型默认值描述
service_namestring"APISIX"SkyWalking 上报的服务名称。
service_instance_namestring"APISIX Instance Name"SkyWalking 上报的服务实例名。设置为 $hostname 时,将获取本机主机名。
endpoint_addrstring"http://127.0.0.1:12800"SkyWalking 的 HTTP endpoint 地址,例如:http://127.0.0.1:12800
report_intervalintegerSkyWalking 客户端内置的值上报间隔时间,单位为秒。

以下是配置示例:

yaml
plugin_attr:
  skywalking:
    service_name: APISIX
    service_instance_name: "APISIX Instance Name"
    endpoint_addr: http://127.0.0.1:12800

上游服务示例代码

java
package com.lenovo.ai.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;

/**
 * @author cyxinda
 * @create 2020-05-29 14:02
 * @desc skywalking test controller
 **/
@RestController
public class TestController {
    @RequestMapping("/uid/{count}")
    public String getUidList(@PathVariable("count") String countStr, HttpServletRequest request) {
        System.out.println("counter:::::"+countStr);
       return "OK";
    }
}

在启动服务前,需要配置 SkyWalking agent:

shell
agent.service_name=yourservername
collector.backend_service=10.110.149.175:11800

使用以下命令启动服务脚本:

shell
nohup java -javaagent:/root/skywalking/app/agent/skywalking-agent.jar \
-jar /root/skywalking/app/app.jar \
--server.port=8089 \
2>&1 > /root/skywalking/app/logs/nohup.log &

启用插件

该插件默认是禁用状态,你需要将其添加到配置文件(./conf/config.yaml)中才可以启用它:

yaml
plugins:
  - ...
  - skywalking

配置完成后,重新加载 APISIX,此时 APIX 会创建一个后台定时器,向 SkyWalking OAP 服务定期上报数据。

以下示例展示了如何在指定路由中启用 skywalking 插件:

shell
curl http://127.0.0.1:9180/apix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "methods": ["GET"],
    "uris": [
        "/uid/*"
    ],
    "plugins": {
        "skywalking": {
            "sample_ratio": 1
        }
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "10.110.149.175:8089": 1
        }
    }
}'

测试插件

首先你可以通过 Docker Compose 启动 SkyWalking OAP 和 SkyWalking UI:

  • 在 usr/local 中创建 skywalking.yaml 文件。

    yaml
    version: "3"
    services:
    oap:
        image: apache/skywalking-oap-server:8.9.1
        restart: always
        ports:
        - "12800:12800/tcp"
    
    ui:
        image: apache/skywalking-ui:8.9.1
        restart: always
        ports:
        - "8080:8080/tcp"
        environment:
        SW_OAP_ADDRESS: http://oap:12800
  • 使用以下命令启动上述创建的文件:

    shell
    docker-compose -f skywalking.yaml up -d

    完成上述操作后,就已经启动了 SkyWalking 以及 SkyWalking Web UI。你可以使用以下命令确认容器是否正常运行:

    shell
    docker ps

接下来你可以通过以下命令访问 APISIX:

shell
curl -v http://10.110.149.192:9080/uid/12
HTTP/1.1 200 OK
OK
...

完成上述步骤后,打开浏览器,访问 SkyWalking 的 UI 页面,你可以看到如下服务拓扑图:

plugin_skywalking

并且可以看到服务追踪列表:

plugin_skywalking

禁用插件

当你需要禁用 skywalking 插件时,可通过以下命令删除相应的 JSON 配置,APISIX 将会自动重新加载相关配置,无需重启服务:

shell
curl http://127.0.0.1:9180/apix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "methods": ["GET"],
    "uris": [
        "/uid/*"
    ],
    "plugins": {
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "10.110.149.175:8089": 1
        }
    }
}'

如果你想完全禁用 skywalking 插件,即停掉后台上报数据的定时器,就需要从配置文件(./conf/config.yaml)注释该插件:

yaml
plugins:
  - ...
  #- skywalking