Skip to main content
Version: Next

skywalking

Description#

The skywalking Plugin is used to integrate with Apache SkyWalking.

SkyWalking uses its native Nginx Lua tracer to provide tracing, topology analysis, and metrics from both service and URI perspectives.

APISIX supports HTTP protocol to interact with the SkyWalking server.

Attributes#

NameTypeRequiredDefaultValid valuesDescription
sample_rationumberTrue1[0.00001, 1]How often to sample the requests. Setting to 1 will sample all requests.

Configuring the endpoint#

You can configure these attributes on your configuration file (conf/config.yaml):

NameTypeDefaultDescription
service_namestring"APISIX"Service name for SkyWalking reporter.
service_instance_namestring"APISIX Instance Name"Service instance name for SkyWalking reporter. Set to $hostname to get the local hostname.
endpoint_addrstring"http://127.0.0.1:12800"SkyWalking HTTP endpoint. For example, http://127.0.0.1:12800.
report_intervalintegerValue in the SkyWalking client libraryReporting interval time in seconds.

You can configure these as shown below:

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

Sample code for upstream configuration#

Java with Spring Boot
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;

@RestController
public class TestController {
@RequestMapping("/uid/{count}")
public String getUidList(@PathVariable("count") String countStr, HttpServletRequest request) {
return "OK";
}
}

You can configure the SkyWalking agent while starting your service:

agent/config/agent.config
agent.service_name=yourservername
collector.backend_service=10.110.149.175:11800

Then, run the script:

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 &

Enable Plugin#

To enable the Plugin, you have to add it to your configuration file (conf/config.yaml):

conf/config.yaml
plugins:
- ...
- skywalking

Once you do this, a background timer will be created to report data to the SkyWalking OAP server.

Now, you can enable the Plugin on a specific Route:

note

You can fetch the admin_key from config.yaml and save to an environment variable with the following command:

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')
curl http://127.0.0.1:9180/apisix/admin/routes/1  -H "X-API-KEY: $admin_key" -X PUT -d '
{
"methods": ["GET"],
"uris": [
"/uid/*"
],
"plugins": {
"skywalking": {
"sample_ratio": 1
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"10.110.149.175:8089": 1
}
}
}'

Example usage#

First, you need to have your SkyWalking server running.

You can run it on Docker by:

sudo docker run --name skywalking -d -p 1234:1234 -p 12800:12800 --restart always apache/skywalking-oap-server:8.7.0-es6
tip

By default, SkyWalking uses H2 storage. You can also use Elasticsearch storage instead.

First, install Elasticsearch. You can do it on Docker by running:

sudo docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 --restart always -e "discovery.type=single-node" elasticsearch:6.7.2

Optionally, you can install Elasticsearch management page, elasticsearch-hq:

sudo docker run -d --name elastic-hq -p 5000:5000 --restart always elastichq/elasticsearch-hq

Once you have Elasticsearch installed, you can start a SkyWalking server by running:

sudo docker run --name skywalking -d -p 1234:1234 -p 12800:12800 --restart always --link elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:8.7.0-es6

You can also install SkyWalking UI to view the data. To run it on Docker:

sudo docker run --name skywalking-ui -d -p 8080:8080 --link skywalking:skywalking -e SW_OAP_ADDRESS=skywalking:12800 --restart always apache/skywalking-ui

You should be able to access the UI from your browser:

Now if you make requests to APISIX:

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

You should be able to see the topology of all services in your SkyWalking UI:

You should also be able to see traces from all services:

Delete Plugin#

To remove the skywalking Plugin, you can delete the corresponding JSON configuration from the Plugin configuration. APISIX will automatically reload and you do not have to restart for this to take effect.

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

To completely disable the skywalking Plugin, i.e to stop the background report timer, you need to remove the Plugin from your configuration file (conf/config.yaml):

plugins:
- ...
# - skywalking