You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2021/04/21 14:08:33 UTC
[skywalking-kong] branch master updated: setup e2e test (#2)
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking-kong.git
The following commit(s) were added to refs/heads/master by this push:
new e0fdc96 setup e2e test (#2)
e0fdc96 is described below
commit e0fdc9626e94f88752e2b2d600aa97a0913eea7b
Author: Daming <zt...@foxmail.com>
AuthorDate: Wed Apr 21 22:08:24 2021 +0800
setup e2e test (#2)
---
.github/workflows/e2e.yml | 8 +
.licenserc.yaml | 1 +
.mvn/wrapper/MavenWrapperDownloader.java | 117 ++
.mvn/wrapper/maven-wrapper.properties | 3 +
{plugins => kong/plugins}/skywalking/handler.lua | 2 +-
{plugins => kong/plugins}/skywalking/schema.lua | 0
mvnw | 310 +++++
mvnw.cmd | 182 +++
rockspec/kong-plugin-skywalking-master-0.rockspec | 2 +-
.../e2e/agent-test-tools/bin/fetch-code.sh | 36 +-
test/e2e/agent-test-tools/docker/Dockerfile | 29 +
test/e2e/agent-test-tools/docker/run.sh | 81 ++
test/e2e/agent-test-tools/pom.xml | 99 ++
test/e2e/e2e-test-kong/docker/conf/kong.conf | 1410 ++++++++++++++++++++
test/e2e/e2e-test-kong/docker/entrypoint.sh | 41 +
test/e2e/e2e-test-kong/pom.xml | 159 +++
.../apache/skywalking/e2e/DataAssertITCase.java | 201 +++
.../src/test/resources/expectedData.yaml | 113 ++
test/e2e/pom.xml | 235 ++++
19 files changed, 3011 insertions(+), 18 deletions(-)
diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index f181ee9..a4df6c3 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -37,3 +37,11 @@ jobs:
run: |
git submodule sync --recursive
git -c protocol.version=2 submodule update --init --force --recursive --depth=1
+ - uses: actions/setup-java@v1
+ with:
+ java-version: 8
+ - name: Set environment
+ run: export MAVEN_OPTS='-Dmaven.repo.local=~/.m2/repository -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit -Xmx3g'
+ - name: Build E2E Docker
+ run: ./mvnw -f ./test/e2e/pom.xml package verify
+
\ No newline at end of file
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 0308848..c6da853 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -28,5 +28,6 @@ header:
- 'rockspec'
- '.gitignore'
- '.luacheckrc'
+ - '.mvn'
comment: on-failure
\ No newline at end of file
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..187216f
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.5";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if(mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if(mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if(!outputFile.getParentFile().exists()) {
+ if(!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..54ab0bc
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,3 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar
+
diff --git a/plugins/skywalking/handler.lua b/kong/plugins/skywalking/handler.lua
similarity index 100%
rename from plugins/skywalking/handler.lua
rename to kong/plugins/skywalking/handler.lua
index 11516cc..df740ec 100644
--- a/plugins/skywalking/handler.lua
+++ b/kong/plugins/skywalking/handler.lua
@@ -55,8 +55,8 @@ end
function SkyWalkingHandler:body_filter(config)
if ngx.arg[2] and kong.ctx.plugin.skywalking_sample then
local entrySpan = ngx.ctx.entrySpan
- Span.setComponentId(entrySpan, 6001)
Span.tag(entrySpan, 'kong.node', kong.node.get_hostname())
+ Span.setComponentId(entrySpan, 6001)
local service = kong.router.get_service()
if service and service.id then
diff --git a/plugins/skywalking/schema.lua b/kong/plugins/skywalking/schema.lua
similarity index 100%
rename from plugins/skywalking/schema.lua
rename to kong/plugins/skywalking/schema.lua
diff --git a/mvnw b/mvnw
new file mode 100755
index 0000000..a3925bb
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ if [ -n "$MVNW_REPOURL" ]; then
+ jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+ fi
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+ if $cygwin; then
+ wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+ fi
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget "$jarUrl" -O "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl -o "$wrapperJarPath" "$jarUrl" -f
+ else
+ curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+ fi
+
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaClass=`cygpath --path --windows "$javaClass"`
+ fi
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100755
index 0000000..6a64c97
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/rockspec/kong-plugin-skywalking-master-0.rockspec b/rockspec/kong-plugin-skywalking-master-0.rockspec
index b3257af..d6e1e6f 100644
--- a/rockspec/kong-plugin-skywalking-master-0.rockspec
+++ b/rockspec/kong-plugin-skywalking-master-0.rockspec
@@ -12,7 +12,7 @@ description = {
}
dependencies = {
- "skywalking-nginx-lua >= 0.4-1"
+ "skywalking-nginx-lua >= master"
}
build = {
diff --git a/.licenserc.yaml b/test/e2e/agent-test-tools/bin/fetch-code.sh
similarity index 70%
copy from .licenserc.yaml
copy to test/e2e/agent-test-tools/bin/fetch-code.sh
index 0308848..5189a45 100644
--- a/.licenserc.yaml
+++ b/test/e2e/agent-test-tools/bin/fetch-code.sh
@@ -1,3 +1,5 @@
+#!/usr/bin/env bash
+
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
@@ -14,19 +16,21 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-header:
- license:
- spdx-id: Apache-2.0
- copyright-owner: Apache Software Foundation
-
- paths-ignore:
- - 'dist'
- - 'licenses'
- - '**/*.md'
- - 'LICENSE'
- - 'NOTICE'
- - 'rockspec'
- - '.gitignore'
- - '.luacheckrc'
-
- comment: on-failure
\ No newline at end of file
+WORK_DIRECTORY=$1
+RESPOSITORY=$2
+COMMIT_ID=$3
+DIST_DIRECTORY=$4
+
+HOME_DIR="$(cd "$(dirname $0)"; pwd)"
+
+git clone $RESPOSITORY $WORK_DIRECTORY
+
+cd $WORK_DIRECTORY
+
+git checkout $COMMIT_ID
+
+mvn -B package -DskipTests
+
+[[ -d $DIST_DIRECTORY ]] || mkdir -p $DIST_DIRECTORY
+
+cp $WORK_DIRECTORY/dist/* $DIST_DIRECTORY/
\ No newline at end of file
diff --git a/test/e2e/agent-test-tools/docker/Dockerfile b/test/e2e/agent-test-tools/docker/Dockerfile
new file mode 100644
index 0000000..ec78c24
--- /dev/null
+++ b/test/e2e/agent-test-tools/docker/Dockerfile
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+FROM openjdk:8
+
+WORKDIR /usr/local/skywalking-nginx-lua
+
+COPY run.sh /
+RUN chmod +x /run.sh
+
+COPY skywalking-validator.jar ./agent-test-tools/skywalking-validator-tool.jar
+ADD skywalking-mock-collector.tar.gz agent-test-tools/
+RUN chmod +x ./agent-test-tools/skywalking-mock-collector/bin/collector-startup.sh
+
+CMD ["./agent-test-tools/skywalking-mock-collector/bin/collector-startup.sh"]
\ No newline at end of file
diff --git a/test/e2e/agent-test-tools/docker/run.sh b/test/e2e/agent-test-tools/docker/run.sh
new file mode 100644
index 0000000..de08a66
--- /dev/null
+++ b/test/e2e/agent-test-tools/docker/run.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# The variable names in UPPERCASE ltter represent that they are injected from outside.
+
+base_home="$(cd "$(dirname $0)"; pwd)"
+
+function exitOnError() {
+ echo -e "\033[31m[ERROR] $1\033[0m">&2
+ exitAndClean 1
+}
+
+function healthCheck() {
+ HEALTH_CHECK_URL=$1
+
+ STATUS_CODE="-1"
+ TIMES=${TIMES:-150}
+ for ((i=1; i<=${TIMES}; i++));
+ do
+ STATUS_CODE="$(curl --max-time 3 -Is ${HEALTH_CHECK_URL} | head -n 1)"
+ if [[ $STATUS_CODE == *"200"* ]]; then
+ echo "${HEALTH_CHECK_URL}: ${STATUS_CODE}"
+ return 0
+ fi
+ sleep 2
+ done
+
+ exitOnError "$2 url=${HEALTH_CHECK_URL}, status=${STATUS_CODE} health check failed!"
+}
+
+if [[ -z "${TESTCASE_STARTUP_SCRIPT}" ]]; then
+ exitOnError "The name of startup script cannot be empty!"
+fi
+
+tools_home=/usr/local/skywalking-nginx-lua/agent-test-tools
+testcase_home=/usr/local/skywalking-nginx-lua/testcase
+
+echo "To start mock collector"
+${tools_home}/skywalking-mock-collector/bin/collector-startup.sh 1>/dev/null &
+healthCheck http://localhost:12800/receiveData
+
+healthCheck http://localhost:12800/status
+
+echo "To visit entry service"
+curl -s --max-time 3 ${TESTCASE_SERVICE_ENTRY}
+sleep 5
+
+echo "To receive actual data"
+curl -s --max-time 3 http://localhost:12800/receiveData > ${testcase_home}/data/actualData.yaml
+[[ ! -f ${testcase_home}/data/actualData.yaml ]] && exitOnError "${TESTCASE_NAME}, 'actualData.yaml' Not Found!"
+
+echo "To validate"
+java -jar \
+ -Xmx256m -Xms256m \
+ -DcaseName="${TESTCASE_NAME}" \
+ -DtestCasePath=${testcase_home}/data/ \
+ ${tools_home}/skywalking-validator-tool.jar 1>/dev/null
+status=$?
+
+if [[ $status -eq 0 ]]; then
+ echo "Scenario[${TESTCASE_NAME}] passed!" >&2
+else
+ cat ${testcase_home}/data/actualData.yaml >&2
+ exitOnError "Scenario[${TESTCASE_NAME}] failed!"
+fi
+exitAndClean $status
diff --git a/test/e2e/agent-test-tools/pom.xml b/test/e2e/agent-test-tools/pom.xml
new file mode 100644
index 0000000..413a00c
--- /dev/null
+++ b/test/e2e/agent-test-tools/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You under the Apache License, Version 2.0
+ ~ (the "License"); you may not use this file except in compliance with
+ ~ the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ ~
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.skywalking.plugin.nginx-lua</groupId>
+ <artifactId>e2e</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <artifactId>agent-test-tools</artifactId>
+
+ <name>SkyWalking Agent Test Tools</name>
+ <packaging>jar</packaging>
+
+ <properties>
+ <docker.image.name>skywalking-collector</docker.image.name>
+ <docker-maven-plugin.version>0.4.13</docker-maven-plugin.version>
+ <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
+ <agent-test-tools.version>ed896e044f146cf607441d375da4830e8d0547f8</agent-test-tools.version>
+ <agent-test-tools.workingDirectory>${project.basedir}/target/agent-test-tools</agent-test-tools.workingDirectory>
+ <agent-test-tools.repos>https://github.com/apache/skywalking-agent-test-tool.git</agent-test-tools.repos>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>${exec-maven-plugin.version}</version>
+ <executions>
+ <execution>
+ <phase>initialize</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <executable>bash</executable>
+ <arguments>
+ <argument>${project.basedir}/bin/fetch-code.sh</argument>
+ <argument>${agent-test-tools.workingDirectory}</argument>
+ <argument>${agent-test-tools.repos}</argument>
+ <argument>${agent-test-tools.version}</argument>
+ <argument>${project.basedir}/dist</argument>
+ </arguments>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>com.spotify</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>${docker-maven-plugin.version}</version>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <imageName>${docker.image.name}:${project.version}</imageName>
+ <dockerDirectory>${project.basedir}/docker</dockerDirectory>
+ <resources>
+ <resource>
+ <targetPath>/</targetPath>
+ <directory>${project.basedir}/../agent-test-tools/dist</directory>
+ <include>skywalking-mock-collector.tar.gz</include>
+ <include>skywalking-validator.jar</include>
+ </resource>
+ </resources>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
\ No newline at end of file
diff --git a/test/e2e/e2e-test-kong/docker/conf/kong.conf b/test/e2e/e2e-test-kong/docker/conf/kong.conf
new file mode 100644
index 0000000..b7f678a
--- /dev/null
+++ b/test/e2e/e2e-test-kong/docker/conf/kong.conf
@@ -0,0 +1,1410 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# -----------------------
+# Kong configuration file
+# -----------------------
+#
+# The commented-out settings shown in this file represent the default values.
+#
+# This file is read when `kong start` or `kong prepare` are used. Kong
+# generates the Nginx configuration with the settings specified in this file.
+#
+# All environment variables prefixed with `KONG_` and capitalized will override
+# the settings specified in this file.
+# Example:
+# `log_level` setting -> `KONG_LOG_LEVEL` env variable
+#
+# Boolean values can be specified as `on`/`off` or `true`/`false`.
+# Lists must be specified as comma-separated strings.
+#
+# All comments in this file can be removed safely, including the
+# commented-out properties.
+# You can verify the integrity of your settings with `kong check <conf>`.
+
+#------------------------------------------------------------------------------
+# GENERAL
+#------------------------------------------------------------------------------
+
+#prefix = /usr/local/kong/ # Working directory. Equivalent to Nginx's
+ # prefix path, containing temporary files
+ # and logs.
+ # Each Kong process must have a separate
+ # working directory.
+
+#log_level = notice # Log level of the Nginx server. Logs are
+ # found at `<prefix>/logs/error.log`.
+
+# See http://nginx.org/en/docs/ngx_core_module.html#error_log for a list
+# of accepted values.
+
+#proxy_access_log = logs/access.log # Path for proxy port request access
+ # logs. Set this value to `off` to
+ # disable logging proxy requests.
+ # If this value is a relative path,
+ # it will be placed under the
+ # `prefix` location.
+
+#proxy_error_log = logs/error.log # Path for proxy port request error
+ # logs. The granularity of these logs
+ # is adjusted by the `log_level`
+ # property.
+
+#admin_access_log = logs/admin_access.log # Path for Admin API request access
+ # logs. If Hybrid Mode is enabled
+ # and the current node is set to be
+ # the Control Plane, then the
+ # connection requests from Data Planes
+ # are also written to this file with
+ # server name "kong_cluster_listener".
+ #
+ # Set this value to `off` to
+ # disable logging Admin API requests.
+ # If this value is a relative path,
+ # it will be placed under the
+ # `prefix` location.
+
+#admin_error_log = logs/error.log # Path for Admin API request error
+ # logs. The granularity of these logs
+ # is adjusted by the `log_level`
+ # property.
+
+#status_access_log = off # Path for Status API request access
+ # logs. The default value of `off`
+ # implies that loggin for this API
+ # is disabled by default.
+ # If this value is a relative path,
+ # it will be placed under the
+ # `prefix` location.
+
+#status_error_log = logs/status_error.log # Path for Status API request error
+ # logs. The granularity of these logs
+ # is adjusted by the `log_level`
+ # property.
+
+plugins = bundled,skywalking # Comma-separated list of plugins this node
+ # should load. By default, only plugins
+ # bundled in official distributions are
+ # loaded via the `bundled` keyword.
+ #
+ # Loading a plugin does not enable it by
+ # default, but only instructs Kong to load its
+ # source code, and allows to configure the
+ # plugin via the various related Admin API
+ # endpoints.
+ #
+ # The specified name(s) will be substituted as
+ # such in the Lua namespace:
+ # `kong.plugins.{name}.*`.
+ #
+ # When the `off` keyword is specified as the
+ # only value, no plugins will be loaded.
+ #
+ # `bundled` and plugin names can be mixed
+ # together, as the following examples suggest:
+ #
+ # - `plugins = bundled,custom-auth,custom-log`
+ # will include the bundled plugins plus two
+ # custom ones
+ # - `plugins = custom-auth,custom-log` will
+ # *only* include the `custom-auth` and
+ # `custom-log` plugins.
+ # - `plugins = off` will not include any
+ # plugins
+ #
+ # **Note:** Kong will not start if some
+ # plugins were previously configured (i.e.
+ # have rows in the database) and are not
+ # specified in this list. Before disabling a
+ # plugin, ensure all instances of it are
+ # removed before restarting Kong.
+ #
+ # **Note:** Limiting the amount of available
+ # plugins can improve P99 latency when
+ # experiencing LRU churning in the database
+ # cache (i.e. when the configured
+ # `mem_cache_size`) is full.
+
+#pluginserver_names = # Comma-separated list of names for pluginserver
+ # processes. The actual names are used for
+ # log messages and to relate the actual settings.
+
+#pluginserver_XXX_socket = <prefix>/<XXX>.socket # Path to the unix socket
+ # used by the <XXX> pluginserver.
+#pluginserver_XXX_start_cmd = /usr/local/bin/<XXX> # Full command (including
+ # any needed arguments) to
+ # start the <XXX> pluginserver
+#pluginserver_XXX_query_cmd = /usr/local/bin/query_<XXX> # Full command to "query" the
+ # <XXX> pluginserver. Should
+ # produce a JSON with the
+ # dump info of all plugins it
+ # manages
+
+#port_maps = # With this configuration parameter, you can
+ # let the Kong to know about the port from
+ # which the packets are forwarded to it. This
+ # is fairly common when running Kong in a
+ # containerized or virtualized environment.
+ # For example, `port_maps=80:8000, 443:8443`
+ # instructs Kong that the port 80 is mapped
+ # to 8000 (and the port 443 to 8443), where
+ # 8000 and 8443 are the ports that Kong is
+ # listening to.
+ #
+ # This parameter helps Kong set a proper
+ # forwarded upstream HTTP request header or to
+ # get the proper forwarded port with the Kong PDK
+ # (in case other means determining it has
+ # failed). It changes routing by a destination
+ # port to route by a port from which packets
+ # are forwarded to Kong, and similarly it
+ # changes the default plugin log serializer to
+ # use the port according to this mapping
+ # instead of reporting the port Kong is
+ # listening to.
+
+#anonymous_reports = on # Send anonymous usage data such as error
+ # stack traces to help improve Kong.
+
+#------------------------------------------------------------------------------
+# HYBRID MODE
+#------------------------------------------------------------------------------
+
+#role = traditional # Use this setting to enable Hybrid Mode,
+ # This allows running some Kong nodes in a
+ # control plane role with a database and
+ # have them deliver configuration updates
+ # to other nodes running to DB-less running in
+ # a Data Plane role.
+ #
+ # Valid values to this setting are:
+ #
+ # - `traditional`: do not use Hybrid Mode.
+ # - `control_plane`: this node runs in a
+ # control plane role. It can use a database
+ # and will deliver configuration updates
+ # to data plane nodes.
+ # - `data_plane`: this is a data plane node.
+ # It runs DB-less and receives configuration
+ # updates from a control plane node.
+
+#cluster_mtls = shared # Sets the verification between nodes of the
+ # cluster.
+ #
+ # Valid values to this setting are:
+ #
+ # - `shared`: use a shared certificate/key
+ # pair specified with the `cluster_cert`
+ # and `cluster_cert_key` settings.
+ # Note that CP and DP nodes have to present
+ # the same certificate to establish mTLS
+ # connections.
+ # - `pki`: use `cluster_ca_cert`,
+ # `cluster_server_name` and `cluster_cert`
+ # for verification.
+ # These are different certificates for each
+ # DP node, but issued by a cluster-wide
+ # common CA certificate: `cluster_ca_cert`.
+
+#cluster_cert = # Filename of the cluster certificate to use
+ # when establishing secure communication
+ # between control and data plane nodes.
+ # You can use the `kong hybrid` command to
+ # generate the certificate/key pair.
+ # Under `shared` mode, it must be the same
+ # for all nodes. Under `pki` mode it
+ # should be a different certificate for each
+ # DP node.
+
+#cluster_cert_key = # Filename of the cluster certificate key to
+ # use when establishing secure communication
+ # between control and data plane nodes.
+ # You can use the `kong hybrid` command to
+ # generate the certificate/key pair.
+ # Under `shared` mode, it must be the same
+ # for all nodes. Under `pki` mode it
+ # should be a different certificate for each
+ # DP node.
+
+#cluster_ca_cert = # The trusted CA certificate file in PEM
+ # format used to verify the `cluster_cert`.
+ # Required if `cluster_mtls` is set to `pki`,
+ # ignored otherwise.
+
+#------------------------------------------------------------------------------
+# HYBRID MODE DATA PLANE
+#------------------------------------------------------------------------------
+
+#cluster_server_name = # The server name used in the SNI of the TLS
+ # connection from a DP node to a CP node.
+ # Must match the Common Name (CN) or Subject
+ # Alternative Name (SAN) found in the CP
+ # certificate.
+ # If `cluster_mtls` is set to
+ # `shared`, this setting is ignored and
+ # `kong_clustering` is used.
+
+#cluster_control_plane = # To be used by data plane nodes only:
+ # address of the control plane node from
+ # which configuration updates will be fetched,
+ # in `host:port` format.
+
+#------------------------------------------------------------------------------
+# HYBRID MODE CONTROL PLANE
+#------------------------------------------------------------------------------
+
+#cluster_listen = 0.0.0.0:8005
+ # Comma-separated list of addresses and ports on
+ # which the cluster control plane server should listen
+ # for data plane connections.
+ # The cluster communication port of the control plane
+ # must be accessible by all the data planes
+ # within the same cluster. This port is mTLS protected
+ # to ensure end-to-end security and integrity.
+ #
+ # This setting has no effect if `role` is not set to
+ # `control_plane`.
+ #
+ # Connection made to this endpoint are logged
+ # to the same location as Admin API access logs.
+ # See `admin_access_log` config description for more
+ # information.
+
+#cluster_data_plane_purge_delay = 1209600
+ # How many seconds must pass from the time a DP node
+ # becomes offline to the time its entry gets removed
+ # from the database, as returned by the
+ # /clustering/data-planes Admin API endpoint.
+ #
+ # This is to prevent the cluster data plane table from
+ # growing indefinitely. The default is set to
+ # 14 days. That is, if CP haven't heard from a DP for
+ # 14 days, its entry will be removed.
+
+#------------------------------------------------------------------------------
+# NGINX
+#------------------------------------------------------------------------------
+
+#proxy_listen = 0.0.0.0:8000 reuseport backlog=16384, 0.0.0.0:8443 http2 ssl reuseport backlog=16384
+ # Comma-separated list of addresses and ports on
+ # which the proxy server should listen for
+ # HTTP/HTTPS traffic.
+ # The proxy server is the public entry point of Kong,
+ # which proxies traffic from your consumers to your
+ # backend services. This value accepts IPv4, IPv6, and
+ # hostnames.
+ #
+ # Some suffixes can be specified for each pair:
+ #
+ # - `ssl` will require that all connections made
+ # through a particular address/port be made with TLS
+ # enabled.
+ # - `http2` will allow for clients to open HTTP/2
+ # connections to Kong's proxy server.
+ # - `proxy_protocol` will enable usage of the
+ # PROXY protocol for a given address/port.
+ # - `deferred` instructs to use a deferred accept on
+ # Linux (the TCP_DEFER_ACCEPT socket option).
+ # - `bind` instructs to make a separate bind() call
+ # for a given address:port pair.
+ # - `reuseport` instructs to create an individual
+ # listening socket for each worker process
+ # allowing the Kernel to better distribute incoming
+ # connections between worker processes
+ # - `backlog=N` sets the maximum length for the queue
+ # of pending TCP connections. This number should
+ # not be too small in order to prevent clients
+ # seeing "Connection refused" error connecting to
+ # a busy Kong instance.
+ # **Note:** on Linux, this value is limited by the
+ # setting of `net.core.somaxconn` Kernel parameter.
+ # In order for the larger `backlog` set here to take
+ # effect it is necessary to raise
+ # `net.core.somaxconn` at the same time to match or
+ # exceed the `backlog` number set.
+ #
+ # This value can be set to `off`, thus disabling
+ # the HTTP/HTTPS proxy port for this node.
+ # If stream_listen is also set to `off`, this enables
+ # 'control-plane' mode for this node
+ # (in which all traffic proxying capabilities are
+ # disabled). This node can then be used only to
+ # configure a cluster of Kong
+ # nodes connected to the same datastore.
+ #
+ # Example:
+ # `proxy_listen = 0.0.0.0:443 ssl, 0.0.0.0:444 http2 ssl`
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
+ # for a description of the accepted formats for this
+ # and other `*_listen` values.
+ #
+ # See https://www.nginx.com/resources/admin-guide/proxy-protocol/
+ # for more details about the `proxy_protocol`
+ # parameter.
+ #
+ # Not all `*_listen` values accept all formats
+ # specified in nginx's documentation.
+
+#stream_listen = off
+ # Comma-separated list of addresses and ports on
+ # which the stream mode should listen.
+ #
+ # This value accepts IPv4, IPv6, and hostnames.
+ # Some suffixes can be specified for each pair:
+ # - `ssl` will require that all connections made
+ # through a particular address/port be made with TLS
+ # enabled.
+ # - `proxy_protocol` will enable usage of the
+ # PROXY protocol for a given address/port.
+ # - `bind` instructs to make a separate bind() call
+ # for a given address:port pair.
+ # - `reuseport` instructs to create an individual
+ # listening socket for each worker process
+ # allowing the Kernel to better distribute incoming
+ # connections between worker processes
+ # - `backlog=N` sets the maximum length for the queue
+ # of pending TCP connections. This number should
+ # not be too small in order to prevent clients
+ # seeing "Connection refused" error connecting to
+ # a busy Kong instance.
+ # **Note:** on Linux, this value is limited by the
+ # setting of `net.core.somaxconn` Kernel parameter.
+ # In order for the larger `backlog` set here to take
+ # effect it is necessary to raise
+ # `net.core.somaxconn` at the same time to match or
+ # exceed the `backlog` number set.
+ #
+ # **Note:** The `ssl` suffix is not supported,
+ # and each address/port will accept TCP with or
+ # without TLS enabled.
+ #
+ # Examples:
+ #
+ # ```
+ # stream_listen = 127.0.0.1:7000 reuseport backlog=16384
+ # stream_listen = 0.0.0.0:989 reuseport backlog=65536, 0.0.0.0:20
+ # stream_listen = [::1]:1234 backlog=16384
+ # ```
+ #
+ # By default this value is set to `off`, thus
+ # disabling the stream proxy port for this node.
+
+# See http://nginx.org/en/docs/stream/ngx_stream_core_module.html#listen
+# for a description of the formats that Kong might accept in stream_listen.
+
+#admin_listen = 127.0.0.1:8001 reuseport backlog=16384, 127.0.0.1:8444 http2 ssl reuseport backlog=16384
+ # Comma-separated list of addresses and ports on
+ # which the Admin interface should listen.
+ # The Admin interface is the API allowing you to
+ # configure and manage Kong.
+ # Access to this interface should be *restricted*
+ # to Kong administrators *only*. This value accepts
+ # IPv4, IPv6, and hostnames.
+ #
+ # Some suffixes can be specified for each pair:
+ #
+ # - `ssl` will require that all connections made
+ # through a particular address/port be made with TLS
+ # enabled.
+ # - `http2` will allow for clients to open HTTP/2
+ # connections to Kong's proxy server.
+ # - `proxy_protocol` will enable usage of the
+ # PROXY protocol for a given address/port.
+ # - `deferred` instructs to use a deferred accept on
+ # Linux (the TCP_DEFER_ACCEPT socket option).
+ # - `bind` instructs to make a separate bind() call
+ # for a given address:port pair.
+ # - `reuseport` instructs to create an individual
+ # listening socket for each worker process
+ # allowing the Kernel to better distribute incoming
+ # connections between worker processes
+ # - `backlog=N` sets the maximum length for the queue
+ # of pending TCP connections. This number should
+ # not be too small in order to prevent clients
+ # seeing "Connection refused" error connecting to
+ # a busy Kong instance.
+ # **Note:** on Linux, this value is limited by the
+ # setting of `net.core.somaxconn` Kernel parameter.
+ # In order for the larger `backlog` set here to take
+ # effect it is necessary to raise
+ # `net.core.somaxconn` at the same time to match or
+ # exceed the `backlog` number set.
+ #
+ # This value can be set to `off`, thus disabling
+ # the Admin interface for this node, enabling a
+ # 'data-plane' mode (without configuration
+ # capabilities) pulling its configuration changes
+ # from the database.
+ #
+ # Example: `admin_listen = 127.0.0.1:8444 http2 ssl`
+
+#status_listen = off # Comma-separated list of addresses and ports on
+ # which the Status API should listen.
+ # The Status API is a read-only endpoint
+ # allowing monitoring tools to retrieve metrics,
+ # healthiness, and other non-sensitive information
+ # of the current Kong node.
+ #
+ # The following suffix can be specified for each pair:
+ #
+ # - `ssl` will require that all connections made
+ # through a particular address/port be made with TLS
+ # enabled.
+ #
+ # This value can be set to `off`, disabling
+ # the Status API for this node.
+ #
+ # Example: `status_listen = 0.0.0.0:8100`
+
+
+#nginx_user = kong kong # Defines user and group credentials used by
+ # worker processes. If group is omitted, a
+ # group whose name equals that of user is
+ # used.
+ #
+ # Example: `nginx_user = nginx www`
+ #
+ # **Note**: If the `kong` user and the `kong`
+ # group are not available, the default user
+ # and group credentials will be
+ # `nobody nobody`.
+
+#nginx_worker_processes = auto # Determines the number of worker processes
+ # spawned by Nginx.
+ #
+ # See http://nginx.org/en/docs/ngx_core_module.html#worker_processes
+ # for detailed usage of the equivalent Nginx
+ # directive and a description of accepted
+ # values.
+
+#nginx_daemon = on # Determines whether Nginx will run as a daemon
+ # or as a foreground process. Mainly useful
+ # for development or when running Kong inside
+ # a Docker environment.
+ #
+ # See http://nginx.org/en/docs/ngx_core_module.html#daemon.
+
+#mem_cache_size = 128m # Size of each of the two in-memory caches
+ # for database entities. The accepted units are
+ # `k` and `m`, with a minimum recommended value of
+ # a few MBs.
+ #
+ # **Note**: As this option controls the size of two
+ # different cache entries, the total memory Kong
+ # uses to cache entities might be double this value.
+
+#ssl_cipher_suite = intermediate # Defines the TLS ciphers served by Nginx.
+ # Accepted values are `modern`,
+ # `intermediate`, `old`, or `custom`.
+ #
+ # See https://wiki.mozilla.org/Security/Server_Side_TLS
+ # for detailed descriptions of each cipher
+ # suite.
+
+#ssl_ciphers = # Defines a custom list of TLS ciphers to be
+ # served by Nginx. This list must conform to
+ # the pattern defined by `openssl ciphers`.
+ # This value is ignored if `ssl_cipher_suite`
+ # is not `custom`.
+
+#ssl_protocols = TLSv1.1 TLSv1.2 TLSv1.3
+ # Enables the specified protocols for
+ # client-side connections. The set of
+ # supported protocol versions also depends
+ # on the version of OpenSSL Kong was built
+ # with. This value is ignored if
+ # `ssl_cipher_suite` is not `custom`.
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
+
+#ssl_prefer_server_ciphers = on # Specifies that server ciphers should be
+ # preferred over client ciphers when using
+ # the SSLv3 and TLS protocols. This value is
+ # ignored if `ssl_cipher_suite` is not `custom`.
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers
+
+#ssl_dhparam = # Defines DH parameters for DHE ciphers from the
+ # predefined groups: `ffdhe2048`, `ffdhe3072`,
+ # `ffdhe4096`, `ffdhe6144`, `ffdhe8192`, or
+ # from the absolute path to a parameters file.
+ #
+ # This value is ignored if `ssl_cipher_suite`
+ # is `modern` or `intermediate`. The reason is
+ # that `modern` has no ciphers that needs this,
+ # and `intermediate` uses `ffdhe2048`.
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam
+
+#ssl_session_tickets = on # Enables or disables session resumption through
+ # TLS session tickets. This has no impact when
+ # used with TLSv1.3.
+ #
+ # Kong enables this by default for performance
+ # reasons, but it has security implications:
+ # https://github.com/mozilla/server-side-tls/issues/135
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_tickets
+
+#ssl_session_timeout = 1d # Specifies a time during which a client may
+ # reuse the session parameters. See the rationale:
+ # https://github.com/mozilla/server-side-tls/issues/198
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout
+
+#ssl_cert = # The absolute path to the SSL certificate for
+ # `proxy_listen` values with SSL enabled.
+
+#ssl_cert_key = # The absolute path to the SSL key for
+ # `proxy_listen` values with SSL enabled.
+
+#client_ssl = off # Determines if Nginx should send client-side
+ # SSL certificates when proxying requests.
+
+#client_ssl_cert = # If `client_ssl` is enabled, the absolute
+ # path to the client SSL certificate for the
+ # `proxy_ssl_certificate` directive. Note that
+ # this value is statically defined on the
+ # node, and currently cannot be configured on
+ # a per-API basis.
+
+#client_ssl_cert_key = # If `client_ssl` is enabled, the absolute
+ # path to the client SSL key for the
+ # `proxy_ssl_certificate_key` address. Note
+ # this value is statically defined on the
+ # node, and currently cannot be configured on
+ # a per-API basis.
+
+#admin_ssl_cert = # The absolute path to the SSL certificate for
+ # `admin_listen` values with SSL enabled.
+
+#admin_ssl_cert_key = # The absolute path to the SSL key for
+ # `admin_listen` values with SSL enabled.
+
+#status_ssl_cert = # The absolute path to the SSL certificate for
+ # `status_listen` values with SSL enabled.
+
+#status_ssl_cert_key = # The absolute path to the SSL key for
+ # `status_listen` values with SSL enabled.
+
+#headers = server_tokens, latency_tokens
+ # Comma-separated list of headers Kong should
+ # inject in client responses.
+ #
+ # Accepted values are:
+ # - `Server`: Injects `Server: kong/x.y.z`
+ # on Kong-produced response (e.g. Admin
+ # API, rejected requests from auth plugin).
+ # - `Via`: Injects `Via: kong/x.y.z` for
+ # successfully proxied requests.
+ # - `X-Kong-Proxy-Latency`: Time taken
+ # (in milliseconds) by Kong to process
+ # a request and run all plugins before
+ # proxying the request upstream.
+ # - `X-Kong-Response-Latency`: time taken
+ # (in millisecond) by Kong to produce
+ # a response in case of e.g. plugin
+ # short-circuiting the request, or in
+ # in case of an error.
+ # - `X-Kong-Upstream-Latency`: Time taken
+ # (in milliseconds) by the upstream
+ # service to send response headers.
+ # - `X-Kong-Admin-Latency`: Time taken
+ # (in milliseconds) by Kong to process
+ # an Admin API request.
+ # - `X-Kong-Upstream-Status`: The HTTP status
+ # code returned by the upstream service.
+ # This is particularly useful for clients to
+ # distinguish upstream statuses if the
+ # response is rewritten by a plugin.
+ # - `server_tokens`: Same as specifying both
+ # `Server` and `Via`.
+ # - `latency_tokens`: Same as specifying
+ # `X-Kong-Proxy-Latency`,
+ # `X-Kong-Response-Latency`,
+ # `X-Kong-Admin-Latency` and
+ # `X-Kong-Upstream-Latency`
+ #
+ # In addition to those, this value can be set
+ # to `off`, which prevents Kong from injecting
+ # any of the above headers. Note that this
+ # does not prevent plugins from injecting
+ # headers of their own.
+ #
+ # Example: `headers = via, latency_tokens`
+
+#trusted_ips = # Defines trusted IP addresses blocks that are
+ # known to send correct `X-Forwarded-*`
+ # headers.
+ # Requests from trusted IPs make Kong forward
+ # their `X-Forwarded-*` headers upstream.
+ # Non-trusted requests make Kong insert its
+ # own `X-Forwarded-*` headers.
+ #
+ # This property also sets the
+ # `set_real_ip_from` directive(s) in the Nginx
+ # configuration. It accepts the same type of
+ # values (CIDR blocks) but as a
+ # comma-separated list.
+ #
+ # To trust *all* /!\ IPs, set this value to
+ # `0.0.0.0/0,::/0`.
+ #
+ # If the special value `unix:` is specified,
+ # all UNIX-domain sockets will be trusted.
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_realip_module.html#set_real_ip_from
+ # for examples of accepted values.
+
+#real_ip_header = X-Real-IP # Defines the request header field whose value
+ # will be used to replace the client address.
+ # This value sets the `ngx_http_realip_module`
+ # directive of the same name in the Nginx
+ # configuration.
+ #
+ # If this value receives `proxy_protocol`:
+ #
+ # - at least one of the `proxy_listen` entries
+ # must have the `proxy_protocol` flag
+ # enabled.
+ # - the `proxy_protocol` parameter will be
+ # appended to the `listen` directive of the
+ # Nginx template.
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_header
+ # for a description of this directive.
+
+#real_ip_recursive = off # This value sets the `ngx_http_realip_module`
+ # directive of the same name in the Nginx
+ # configuration.
+ #
+ # See http://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_recursive
+ # for a description of this directive.
+
+#error_default_type = text/plain # Default MIME type to use when the request
+ # `Accept` header is missing and Nginx
+ # is returning an error for the request.
+ # Accepted values are `text/plain`,
+ # `text/html`, `application/json`, and
+ # `application/xml`.
+
+#upstream_keepalive_pool_size = 60 # Sets the default size of the upstream
+ # keepalive connection pools.
+ # Upstream keepalive connection pools
+ # are segmented by the `dst ip/dst
+ # port/SNI` attributes of a connection.
+ # A value of `0` will disable upstream
+ # keepalive connections by default, forcing
+ # each upstream request to open a new
+ # connection.
+
+#upstream_keepalive_max_requests = 100 # Sets the default maximum number of
+ # requests than can be proxied upstream
+ # through one keepalive connection.
+ # After the maximum number of requests
+ # is reached, the connection will be
+ # closed.
+ # A value of `0` will disable this
+ # behavior, and a keepalive connection
+ # can be used to proxy an indefinite
+ # number of requests.
+
+#upstream_keepalive_idle_timeout = 60 # Sets the default timeout (in seconds)
+ # for which an upstream keepalive
+ # connection should be kept open. When
+ # the timeout is reached while the
+ # connection has not been reused, it
+ # will be closed.
+ # A value of `0` will disable this
+ # behavior, and an idle keepalive
+ # connection may be kept open
+ # indefinitely.
+
+#------------------------------------------------------------------------------
+# NGINX injected directives
+#------------------------------------------------------------------------------
+
+# Nginx directives can be dynamically injected in the runtime nginx.conf file
+# without requiring a custom Nginx configuration template.
+#
+# All configuration properties respecting the naming scheme
+# `nginx_<namespace>_<directive>` will result in `<directive>` being injected in
+# the Nginx configuration block corresponding to the property's `<namespace>`.
+# Example:
+# `nginx_proxy_large_client_header_buffers = 8 24k`
+#
+# Will inject the following directive in Kong's proxy `server {}` block:
+#
+# `large_client_header_buffers 8 24k;`
+#
+# The following namespaces are supported:
+#
+# - `nginx_main_<directive>`: Injects `<directive>` in Kong's configuration
+# `main` context.
+# - `nginx_events_<directive>`: Injects `<directive>` in Kong's `events {}`
+# block.
+# - `nginx_http_<directive>`: Injects `<directive>` in Kong's `http {}` block.
+# - `nginx_proxy_<directive>`: Injects `<directive>` in Kong's proxy
+# `server {}` block.
+# - `nginx_upstream_<directive>`: Injects `<directive>` in Kong's proxy
+# `upstream {}` block.
+# - `nginx_admin_<directive>`: Injects `<directive>` in Kong's Admin API
+# `server {}` block.
+# - `nginx_status_<directive>`: Injects `<directive>` in Kong's Status API
+# `server {}` block (only effective if `status_listen` is enabled).
+# - `nginx_stream_<directive>`: Injects `<directive>` in Kong's stream module
+# `stream {}` block (only effective if `stream_listen` is enabled).
+# - `nginx_sproxy_<directive>`: Injects `<directive>` in Kong's stream module
+# `server {}` block (only effective if `stream_listen` is enabled).
+# - `nginx_supstream_<directive>`: Injects `<directive>` in Kong's stream
+# module `upstream {}` block.
+#
+# As with other configuration properties, Nginx directives can be injected via
+# environment variables when capitalized and prefixed with `KONG_`.
+# Example:
+# `KONG_NGINX_HTTP_SSL_PROTOCOLS` -> `nginx_http_ssl_protocols`
+#
+# Will inject the following directive in Kong's `http {}` block:
+#
+# `ssl_protocols <value>;`
+#
+# If different sets of protocols are desired between the proxy and Admin API
+# server, you may specify `nginx_proxy_ssl_protocols` and/or
+# `nginx_admin_ssl_protocols`, both of which taking precedence over the
+# `http {}` block.
+
+#nginx_main_worker_rlimit_nofile = auto
+ # Changes the limit on the maximum number of open files
+ # for worker processes.
+ #
+ # The special and default value of `auto` sets this
+ # value to `ulimit -n` with the upper bound limited to
+ # 16384 as a measure to protect against excess memory use.
+ #
+ # See http://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile
+
+#nginx_events_worker_connections = auto
+ # Sets the maximum number of simultaneous
+ # connections that can be opened by a worker process.
+ #
+ # The special and default value of `auto` sets this
+ # value to `ulimit -n` with the upper bound limited to
+ # 16384 as a measure to protect against excess memory use.
+ #
+ # See http://nginx.org/en/docs/ngx_core_module.html#worker_connections
+
+#nginx_http_client_header_buffer_size = 1k # Sets buffer size for reading the
+ # client request headers.
+ # See http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size
+
+#nginx_http_large_client_header_buffers = 4 8k # Sets the maximum number and
+ # size of buffers used for
+ # reading large clients
+ # requests headers.
+ # See http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers
+
+#nginx_http_client_max_body_size = 0 # Defines the maximum request body size
+ # allowed by requests proxied by Kong,
+ # specified in the Content-Length request
+ # header. If a request exceeds this
+ # limit, Kong will respond with a 413
+ # (Request Entity Too Large). Setting
+ # this value to 0 disables checking the
+ # request body size.
+ # See http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
+
+#nginx_admin_client_max_body_size = 10m # Defines the maximum request body size for
+ # Admin API.
+
+#nginx_http_client_body_buffer_size = 8k # Defines the buffer size for reading
+ # the request body. If the client
+ # request body is larger than this
+ # value, the body will be buffered to
+ # disk. Note that when the body is
+ # buffered to disk, Kong plugins that
+ # access or manipulate the request
+ # body may not work, so it is
+ # advisable to set this value as high
+ # as possible (e.g., set it as high
+ # as `client_max_body_size` to force
+ # request bodies to be kept in
+ # memory). Do note that
+ # high-concurrency environments will
+ # require significant memory
+ # allocations to process many
+ # concurrent large request bodies.
+ # See http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size
+
+#nginx_admin_client_body_buffer_size = 10m # Defines the buffer size for reading
+ # the request body on Admin API.
+
+#------------------------------------------------------------------------------
+# DATASTORE
+#------------------------------------------------------------------------------
+
+# Kong can run with a database to store coordinated data between Kong nodes in
+# a cluster, or without a database, where each node stores its information
+# independently in memory.
+#
+# When using a database, Kong will store data for all its entities (such as
+# Routes, Services, Consumers, and Plugins) in either Cassandra or PostgreSQL,
+# and all Kong nodes belonging to the same cluster must connect themselves
+# to the same database.
+#
+# Kong supports the following database versions:
+# - **PostgreSQL**: 9.5 and above.
+# - **Cassandra**: 2.2 and above.
+#
+# When not using a database, Kong is said to be in "DB-less mode": it will keep
+# its entities in memory, and each node needs to have this data entered via a
+# declarative configuration file, which can be specified through the
+# `declarative_config` property, or via the Admin API using the `/config`
+# endpoint.
+#
+# When using Postgres as the backend storage, you can optionally enable Kong
+# to serve read queries from a separate database instance.
+# When the number of proxies is large, this can greatly reduce the load
+# on the main Postgres instance and achieve better scalability. It may also
+# reduce the latency jitter if the Kong proxy node's latency to the main
+# Postgres instance is high.
+#
+# The read-only Postgres instance only serves read queries and write
+# queries still goes to the main connection. The read-only Postgres instance
+# can be eventually consistent while replicating changes from the main
+# instance.
+#
+# At least the `pg_ro_host` config is needed to enable this feature.
+# By default, all other database config for the read-only connection are
+# inherited from the corresponding main connection config described above but
+# may be optionally overwritten explicitly using the `pg_ro_*` config below.
+
+#database = postgres # Determines which of PostgreSQL or Cassandra
+ # this node will use as its datastore.
+ # Accepted values are `postgres`,
+ # `cassandra`, and `off`.
+
+#pg_host = 127.0.0.1 # Host of the Postgres server.
+#pg_port = 5432 # Port of the Postgres server.
+#pg_timeout = 5000 # Defines the timeout (in ms), for connecting,
+ # reading and writing.
+
+#pg_user = kong # Postgres user.
+#pg_password = # Postgres user's password.
+#pg_database = kong # The database name to connect to.
+
+#pg_schema = # The database schema to use. If unspecified,
+ # Kong will respect the `search_path` value of
+ # your PostgreSQL instance.
+
+#pg_ssl = off # Toggles client-server TLS connections
+ # between Kong and PostgreSQL.
+ # Because PostgreSQL uses the same port for TLS
+ # and non-TLS, this is only a hint. If the
+ # server does not support TLS, the established
+ # connection will be a plain one.
+
+#pg_ssl_verify = off # Toggles server certificate verification if
+ # `pg_ssl` is enabled.
+ # See the `lua_ssl_trusted_certificate`
+ # setting to specify a certificate authority.
+
+#pg_max_concurrent_queries = 0 # Sets the maximum number of concurrent queries
+ # that can be executing at any given time. This
+ # limit is enforced per worker process; the
+ # total number of concurrent queries for this
+ # node will be will be:
+ # `pg_max_concurrent_queries * nginx_worker_processes`.
+ #
+ # The default value of 0 removes this
+ # concurrency limitation.
+
+#pg_semaphore_timeout = 60000 # Defines the timeout (in ms) after which
+ # PostgreSQL query semaphore resource
+ # acquisition attempts will fail. Such
+ # failures will generally result in the
+ # associated proxy or Admin API request
+ # failing with an HTTP 500 status code.
+ # Detailed discussion of this behavior is
+ # available in the online documentation.
+
+#pg_ro_host = # Same as `pg_host`, but for the
+ # read-only connection.
+ # **Note:** Refer to the documentation
+ # section above for detailed usage.
+
+#pg_ro_port = <pg_port> # Same as `pg_port`, but for the
+ # read-only connection.
+
+#pg_ro_timeout = <pg_timeout> # Same as `pg_timeout`, but for the
+ # read-only connection.
+
+#pg_ro_user = <pg_user> # Same as `pg_user`, but for the
+ # read-only connection.
+
+#pg_ro_password = <pg_password> # Same as `pg_password`, but for the
+ # read-only connection.
+
+#pg_ro_database = <pg_database> # Same as `pg_database`, but for the
+ # read-only connection.
+
+#pg_ro_schema = <pg_schema> # Same as `pg_schema`, but for the
+ # read-only connection.
+
+#pg_ro_ssl = <pg_ssl> # Same as `pg_ssl`, but for the
+ # read-only connection.
+
+#pg_ro_ssl_verify = <pg_ssl_verify>
+ # Same as `pg_ssl_verify`, but for the
+ # read-only connection.
+
+#pg_ro_max_concurrent_queries = <pg_max_concurrent_queries>
+ # Same as `pg_max_concurrent_queries`, but for
+ # the read-only connection.
+ # Note: read-only concurrency is not shared
+ # with the main (read-write) connection.
+
+#pg_ro_semaphore_timeout = <pg_semaphore_timeout>
+ # Same as `pg_semaphore_timeout`, but for the
+ # read-only connection.
+
+#cassandra_contact_points = 127.0.0.1 # A comma-separated list of contact
+ # points to your cluster.
+ # You may specify IP addresses or
+ # hostnames. Note that the port
+ # component of SRV records will be
+ # ignored in favor of `cassandra_port`.
+ # When connecting to a multi-DC cluster,
+ # ensure that contact points from the
+ # local datacenter are specified first
+ # in this list.
+
+#cassandra_port = 9042 # The port on which your nodes are listening
+ # on. All your nodes and contact points must
+ # listen on the same port. Will be created if
+ # it doesn't exist.
+
+#cassandra_keyspace = kong # The keyspace to use in your cluster.
+
+#cassandra_write_consistency = ONE # Consistency setting to use when
+ # writing to the Cassandra cluster.
+
+#cassandra_read_consistency = ONE # Consistency setting to use when
+ # reading from the Cassandra cluster.
+
+#cassandra_timeout = 5000 # Defines the timeout (in ms) for reading
+ # and writing.
+
+#cassandra_ssl = off # Toggles client-to-node TLS connections
+ # between Kong and Cassandra.
+
+#cassandra_ssl_verify = off # Toggles server certificate verification if
+ # `cassandra_ssl` is enabled.
+ # See the `lua_ssl_trusted_certificate`
+ # setting to specify a certificate authority.
+
+#cassandra_username = kong # Username when using the
+ # `PasswordAuthenticator` scheme.
+
+#cassandra_password = # Password when using the
+ # `PasswordAuthenticator` scheme.
+
+#cassandra_lb_policy = RequestRoundRobin # Load balancing policy to use when
+ # distributing queries across your
+ # Cassandra cluster.
+ # Accepted values are:
+ # `RoundRobin`, `RequestRoundRobin`,
+ # `DCAwareRoundRobin`, and
+ # `RequestDCAwareRoundRobin`.
+ # Policies prefixed with "Request"
+ # make efficient use of established
+ # connections throughout the same
+ # request.
+ # Prefer "DCAware" policies if and
+ # only if you are using a
+ # multi-datacenter cluster.
+
+#cassandra_local_datacenter = # When using the `DCAwareRoundRobin`
+ # or `RequestDCAwareRoundRobin` load
+ # balancing policy, you must specify the name
+ # of the local (closest) datacenter for this
+ # Kong node.
+
+#cassandra_refresh_frequency = 60 # Frequency (in seconds) at which
+ # the cluster topology will be
+ # checked for new or decommissioned
+ # nodes.
+ # A value of `0` will disable this
+ # check, and the cluster topology
+ # will never be refreshed.
+
+#cassandra_repl_strategy = SimpleStrategy # When migrating for the first time,
+ # Kong will use this setting to
+ # create your keyspace.
+ # Accepted values are
+ # `SimpleStrategy` and
+ # `NetworkTopologyStrategy`.
+
+#cassandra_repl_factor = 1 # When migrating for the first time, Kong
+ # will create the keyspace with this
+ # replication factor when using the
+ # `SimpleStrategy`.
+
+#cassandra_data_centers = dc1:2,dc2:3 # When migrating for the first time,
+ # will use this setting when using the
+ # `NetworkTopologyStrategy`.
+ # The format is a comma-separated list
+ # made of `<dc_name>:<repl_factor>`.
+
+#cassandra_schema_consensus_timeout = 10000 # Defines the timeout (in ms) for
+ # the waiting period to reach a
+ # schema consensus between your
+ # Cassandra nodes.
+ # This value is only used during
+ # migrations.
+
+#declarative_config = # The path to the declarative configuration
+ # file which holds the specification of all
+ # entities (Routes, Services, Consumers, etc.)
+ # to be used when the `database` is set to
+ # `off`.
+ #
+ # Entities are stored in Kong's in-memory cache,
+ # so you must ensure that enough memory is
+ # allocated to it via the `mem_cache_size`
+ # property. You must also ensure that items
+ # in the cache never expire, which means that
+ # `db_cache_ttl` should preserve its default
+ # value of 0.
+
+#------------------------------------------------------------------------------
+# DATASTORE CACHE
+#------------------------------------------------------------------------------
+
+# In order to avoid unnecessary communication with the datastore, Kong caches
+# entities (such as APIs, Consumers, Credentials...) for a configurable period
+# of time. It also handles invalidations if such an entity is updated.
+#
+# This section allows for configuring the behavior of Kong regarding the
+# caching of such configuration entities.
+
+#db_update_frequency = 5 # Frequency (in seconds) at which to check for
+ # updated entities with the datastore.
+ #
+ # When a node creates, updates, or deletes an
+ # entity via the Admin API, other nodes need
+ # to wait for the next poll (configured by
+ # this value) to eventually purge the old
+ # cached entity and start using the new one.
+
+#db_update_propagation = 0 # Time (in seconds) taken for an entity in the
+ # datastore to be propagated to replica nodes
+ # of another datacenter.
+ #
+ # When in a distributed environment such as
+ # a multi-datacenter Cassandra cluster, this
+ # value should be the maximum number of
+ # seconds taken by Cassandra to propagate a
+ # row to other datacenters.
+ #
+ # When set, this property will increase the
+ # time taken by Kong to propagate the change
+ # of an entity.
+ #
+ # Single-datacenter setups or PostgreSQL
+ # servers should suffer no such delays, and
+ # this value can be safely set to 0.
+
+#db_cache_ttl = 0 # Time-to-live (in seconds) of an entity from
+ # the datastore when cached by this node.
+ #
+ # Database misses (no entity) are also cached
+ # according to this setting if you do not
+ # configure `db_cache_neg_ttl`.
+ #
+ # If set to 0 (default), such cached entities
+ # or misses never expire.
+
+#db_cache_neg_ttl = # Time-to-live (in seconds) of a datastore
+ # miss (no entity).
+ #
+ # If not specified (default), `db_cache_ttl`
+ # value will be used instead.
+ #
+ # If set to 0, misses will never expire.
+
+#db_resurrect_ttl = 30 # Time (in seconds) for which stale entities
+ # from the datastore should be resurrected for
+ # when they cannot be refreshed (e.g., the
+ # datastore is unreachable). When this TTL
+ # expires, a new attempt to refresh the stale
+ # entities will be made.
+
+#db_cache_warmup_entities = services
+ # Entities to be pre-loaded from the datastore
+ # into the in-memory cache at Kong start-up.
+ # This speeds up the first access of endpoints
+ # that use the given entities.
+ #
+ # When the `services` entity is configured
+ # for warmup, the DNS entries for values in
+ # its `host` attribute are pre-resolved
+ # asynchronously as well.
+ #
+ # Cache size set in `mem_cache_size` should
+ # be set to a value large enough to hold all
+ # instances of the specified entities.
+ # If the size is insufficient, Kong will log
+ # a warning.
+
+#------------------------------------------------------------------------------
+# DNS RESOLVER
+#------------------------------------------------------------------------------
+
+# By default, the DNS resolver will use the standard configuration files
+# `/etc/hosts` and `/etc/resolv.conf`. The settings in the latter file will be
+# overridden by the environment variables `LOCALDOMAIN` and `RES_OPTIONS` if
+# they have been set.
+#
+# Kong will resolve hostnames as either `SRV` or `A` records (in that order, and
+# `CNAME` records will be dereferenced in the process).
+# In case a name was resolved as an `SRV` record it will also override any given
+# port number by the `port` field contents received from the DNS server.
+#
+# The DNS options `SEARCH` and `NDOTS` (from the `/etc/resolv.conf` file) will
+# be used to expand short names to fully qualified ones. So it will first try
+# the entire `SEARCH` list for the `SRV` type, if that fails it will try the
+# `SEARCH` list for `A`, etc.
+#
+# For the duration of the `ttl`, the internal DNS resolver will loadbalance each
+# request it gets over the entries in the DNS record. For `SRV` records the
+# `weight` fields will be honored, but it will only use the lowest `priority`
+# field entries in the record.
+
+#dns_resolver = # Comma separated list of nameservers, each
+ # entry in `ip[:port]` format to be used by
+ # Kong. If not specified the nameservers in
+ # the local `resolv.conf` file will be used.
+ # Port defaults to 53 if omitted. Accepts
+ # both IPv4 and IPv6 addresses.
+
+#dns_hostsfile = /etc/hosts # The hosts file to use. This file is read
+ # once and its content is static in memory.
+ # To read the file again after modifying it,
+ # Kong must be reloaded.
+
+#dns_order = LAST,SRV,A,CNAME # The order in which to resolve different
+ # record types. The `LAST` type means the
+ # type of the last successful lookup (for the
+ # specified name). The format is a (case
+ # insensitive) comma separated list.
+
+#dns_valid_ttl = # By default, DNS records are cached using
+ # the TTL value of a response. If this
+ # property receives a value (in seconds), it
+ # will override the TTL for all records.
+
+#dns_stale_ttl = 4 # Defines, in seconds, how long a record will
+ # remain in cache past its TTL. This value
+ # will be used while the new DNS record is
+ # fetched in the background.
+ # Stale data will be used from expiry of a
+ # record until either the refresh query
+ # completes, or the `dns_stale_ttl` number of
+ # seconds have passed.
+
+#dns_not_found_ttl = 30 # TTL in seconds for empty DNS responses and
+ # "(3) name error" responses.
+
+#dns_error_ttl = 1 # TTL in seconds for error responses.
+
+#dns_no_sync = off # If enabled, then upon a cache-miss every
+ # request will trigger its own dns query.
+ # When disabled multiple requests for the
+ # same name/type will be synchronised to a
+ # single query.
+
+#------------------------------------------------------------------------------
+# TUNING & BEHAVIOR
+#------------------------------------------------------------------------------
+
+#worker_consistency = strict
+ # Defines whether this node should rebuild its
+ # state synchronously or asynchronously (the
+ # balancers and the router are rebuilt on
+ # updates that affects them, e.g., updates to
+ # Routes, Services or Upstreams, via the Admin
+ # API or loading a declarative configuration
+ # file).
+ #
+ # Accepted values are:
+ #
+ # - `strict`: the router will be rebuilt
+ # synchronously, causing incoming requests to
+ # be delayed until the rebuild is finished.
+ # - `eventual`: the router will be rebuilt
+ # asynchronously via a recurring background
+ # job running every second inside of each
+ # worker.
+ #
+ # Note that `strict` ensures that all workers
+ # of a given node will always proxy requests
+ # with an identical router, but that increased
+ # long tail latency can be observed if
+ # frequent Routes and Services updates are
+ # expected.
+ # Using `eventual` will help preventing long
+ # tail latency issues in such cases, but may
+ # cause workers to route requests differently
+ # for a short period of time after Routes and
+ # Services updates.
+
+#worker_state_update_frequency = 5
+ # Defines how often the worker state changes are
+ # checked with a background job. When a change
+ # is detected, a new router or balancer will be
+ # built, as needed. Raising this value will
+ # decrease the load on database servers and
+ # result in less jitter in proxy latency, but
+ # it might take more time to propagate changes
+ # to each individual worker.
+
+#------------------------------------------------------------------------------
+# MISCELLANEOUS
+#------------------------------------------------------------------------------
+
+# Additional settings inherited from lua-nginx-module allowing for more
+# flexibility and advanced usage.
+#
+# See the lua-nginx-module documentation for more information:
+# https://github.com/openresty/lua-nginx-module
+
+
+#lua_ssl_trusted_certificate = # Comma-separated list of paths to certificate
+ # authority files for Lua cosockets in PEM format.
+ #
+ # The special value `system` attempts to search for the
+ # "usual default" provided by each distro, according
+ # to an arbitrary heuristic. In the current implementation,
+ # The following pathnames will be tested in order,
+ # and the first one found will be used:
+ #
+ # - /etc/ssl/certs/ca-certificates.crt (Debian/Ubuntu/Gentoo)
+ # - /etc/pki/tls/certs/ca-bundle.crt (Fedora/RHEL 6)
+ # - /etc/ssl/ca-bundle.pem (OpenSUSE)
+ # - /etc/pki/tls/cacert.pem (OpenELEC)
+ # - /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem (CentOS/RHEL 7)
+ # - /etc/ssl/cert.pem (OpenBSD, Alpine)
+ #
+ # If no file is found on any of these paths, an error will
+ # be raised.
+ #
+ # `system` can be used by itself or in conjunction with other
+ # CA filepaths.
+ #
+ # When `pg_ssl_verify` or `cassandra_ssl_verify`
+ # are enabled, these certificate authority files will be
+ # used for verifying Kong's database connections.
+ #
+ # See https://github.com/openresty/lua-nginx-module#lua_ssl_trusted_certificate
+
+#lua_ssl_verify_depth = 1 # Sets the verification depth in the server
+ # certificates chain used by Lua cosockets,
+ # set by `lua_ssl_trusted_certificate`.
+ # This includes the certificates configured
+ # for Kong's database connections.
+ # If the maximum depth is reached before
+ # reaching the end of the chain, verification
+ # will fail. This helps mitigate certificate
+ # based DoS attacks.
+ #
+ # See https://github.com/openresty/lua-nginx-module#lua_ssl_verify_depth
+
+lua_package_path = /home/kong/.luarocks/share/lua/5.1/?.lua;;
+#lua_package_path = ./?.lua;./?/init.lua; # Sets the Lua module search path
+ # (LUA_PATH). Useful when developing
+ # or using custom plugins not stored
+ # in the default search path.
+ #
+ # See https://github.com/openresty/lua-nginx-module#lua_package_path
+
+#lua_package_cpath = # Sets the Lua C module search path
+ # (LUA_CPATH).
+ #
+ # See https://github.com/openresty/lua-nginx-module#lua_package_cpath
+
+#lua_socket_pool_size = 30 # Specifies the size limit for every cosocket
+ # connection pool associated with every remote
+ # server.
+ #
+ # See https://github.com/openresty/lua-nginx-module#lua_socket_pool_size
+
+#untrusted_lua = sandbox
+ # Accepted values are:
+ #
+ # - `off`: disallow any loading of Lua functions
+ # from admin supplied sources (such as via the Admin API).
+ #
+ # Note using the `off` option will render plugins such as
+ # Serverless Functions unusable.
+ # - `sandbox`: allow loading of Lua functions from admin
+ # supplied sources, but use a sandbox when
+ # executing them. The sandboxed
+ # function will have restricted access
+ # to the global environment and only
+ # have access to standard Lua functions
+ # that will generally not cause harm to
+ # the Kong node.
+ #
+ # In this mode, the `require` function inside
+ # the sandbox only allows loading external Lua
+ # modules that are explicitly listed in
+ # `untrusted_lua_sandbox_requires` below.
+ #
+ # LuaJIT bytecode loading is disabled.
+ #
+ # Warning: LuaJIT is not designed as a secure
+ # runtime for running malicious code, therefore,
+ # you should properly protect your Admin API endpoint
+ # even with sandboxing enabled. The sandbox only
+ # provides protection against trivial attackers or
+ # unintentional modification of the Kong global
+ # environment.
+ # - `on`: allow loading of Lua functions from admin
+ # supplied sources and do not use a sandbox when
+ # executing them. Functions will have unrestricted
+ # access to global environment and able to load any
+ # Lua modules. This is similar to the behavior in Kong
+ # prior to 2.3.0.
+ #
+ # LuaJIT bytecode loading is disabled.
+
+#untrusted_lua_sandbox_requires =
+ # Comma-separated list of modules allowed to be loaded
+ # with `require` inside the sandboxed environment. Ignored
+ # if `untrusted_lua` is not `sandbox`.
+ #
+ # Note: certain modules, when allowed, may cause sandbox
+ # escaping trivial.
+
+#untrusted_lua_sandbox_environment =
+ # Comma-separated list of global Lua variables
+ # that should be made available inside the sandboxed
+ # environment. Ignored if `untrusted_lua` is not `sandbox`.
+ #
+ # Note: certain variables, when made available,
+ # may cause sandbox escaping trivial.
diff --git a/test/e2e/e2e-test-kong/docker/entrypoint.sh b/test/e2e/e2e-test-kong/docker/entrypoint.sh
new file mode 100755
index 0000000..1aca7d2
--- /dev/null
+++ b/test/e2e/e2e-test-kong/docker/entrypoint.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+set -ex
+
+# export KONG_NGINX_HTTP_LUA_SHARED_DICT="tracing_buffer 128m"
+
+COMMIT_ID="39686396ae23d7d341a8ff2212888f02d0b19f6d"
+
+mkdir ~/skywalking-nginx-lua
+cd ~/skywalking-nginx-lua
+
+git init
+git remote add origin https://github.com/apache/skywalking-nginx-lua
+git fetch origin ${COMMIT_ID}
+git checkout ${COMMIT_ID}
+
+luarocks make ./rockspec/skywalking-nginx-lua-master-0.rockspec --local
+
+cd /skywalking-kong
+
+luarocks make ./rockspec/kong-plugin-skywalking-master-0.rockspec --local
+
+kong migrations bootstrap
+
+kong start -c /docker/conf/kong.conf --vv
diff --git a/test/e2e/e2e-test-kong/pom.xml b/test/e2e/e2e-test-kong/pom.xml
new file mode 100644
index 0000000..67d117a
--- /dev/null
+++ b/test/e2e/e2e-test-kong/pom.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You under the Apache License, Version 2.0
+ ~ (the "License"); you may not use this file except in compliance with
+ ~ the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ ~
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.skywalking.plugin.nginx-lua</groupId>
+ <artifactId>e2e</artifactId>
+ <version>1.0.0</version>
+ </parent>
+
+ <artifactId>e2e-test-kong</artifactId>
+
+ <name>SkyWalking Kong Agent Test</name>
+ <packaging>jar</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <configuration>
+ <autoCreateCustomNetworks>true</autoCreateCustomNetworks>
+ <images>
+ <image>
+ <name>postgres:9.6</name>
+ <alias>kong-database</alias>
+ <run>
+ <env>
+ <POSTGRES_DB>kong</POSTGRES_DB>
+ <POSTGRES_USER>kong</POSTGRES_USER>
+ <POSTGRES_PASSWORD>kong</POSTGRES_PASSWORD>
+ </env>
+ <hostname>kong-database</hostname>
+ <ports>
+ <port>+pg.host:pg.port:5432</port>
+ </ports>
+ <wait>
+ <log>.*PostgreSQL init process complete; ready for start up.*</log>
+ </wait>
+ <net>custom</net>
+ </run>
+ </image>
+ <image>
+ <name>skywalking-collector:${project.version}</name>
+ <alias>skywalking-collector</alias>
+ <run>
+ <ports>
+ <port>+collector.host:collector.port:12800</port>
+ </ports>
+ <wait>
+ <http>
+ <url>http://${docker.host.address}:${collector.port}/receiveData</url>
+ </http>
+ <time>30000</time>
+ </wait>
+ <net>custom</net>
+ <hostname>skywalking-collector</hostname>
+ </run>
+ </image>
+ <image>
+ <name>kong:2.3.3</name>
+ <alias>kong-with-skywalking</alias>
+ <run>
+ <volumes>
+ <bind>
+ <volume>${project.basedir}/docker:/docker</volume>
+ <volume>${project.basedir}/../../..:/skywalking-kong</volume>
+ </bind>
+ </volumes>
+ <ports>
+ <port>kong.port:8000</port>
+ <port>admin.port:8001</port>
+ </ports>
+ <env>
+ <KONG_DATABASE>postgres</KONG_DATABASE>
+ <KONG_PG_HOST>kong-database</KONG_PG_HOST>
+ <KONG_PG_PASSWORD>kong</KONG_PG_PASSWORD>
+ <KONG_CASSANDRA_CONTACT_POINTS>kong-database</KONG_CASSANDRA_CONTACT_POINTS>
+ <KONG_NGINX_HTTP_LUA_SHARED_DICT>tracing_buffer 128m
+ </KONG_NGINX_HTTP_LUA_SHARED_DICT>
+ <KONG_ADMIN_LISTEN>0.0.0.0:8001, 0.0.0.0:8444 ssl</KONG_ADMIN_LISTEN>
+ </env>
+ <net>custom</net>
+ <dependsOn>
+ <container>kong-database</container>
+ <container>skywalking-collector</container>
+ </dependsOn>
+ <links>
+ <link>kong-database</link>
+ </links>
+ <wait>
+ <http>
+ <url>
+ http://${docker.host.address}:${admin.port}
+ </url>
+ </http>
+ <time>1800000</time>
+ </wait>
+ <cmd>/docker/entrypoint.sh</cmd>
+ </run>
+ </image>
+ </images>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>${maven-failsafe-plugin.version}</version>
+ <configuration>
+ <systemPropertyVariables>
+ <kong.admin.baseURL>http://${docker.host.address}:${admin.port}</kong.admin.baseURL>
+ <service.entry>http://${docker.host.address}:${kong.port}/mock</service.entry>
+ <collector.baseURL>http://${collector.host}:${collector.port}</collector.baseURL>
+ <collector.in.baseURL>http://skywalking-collector:12800</collector.in.baseURL>
+ </systemPropertyVariables>
+ </configuration>
+ <executions>
+ <execution>
+ <id>integration-test</id>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ <configuration>
+ <excludes>
+ <exclude>none</exclude>
+ </excludes>
+ <includes>
+ <include>**/*ITCase.java</include>
+ </includes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/test/e2e/e2e-test-kong/src/test/java/org/apache/skywalking/e2e/DataAssertITCase.java b/test/e2e/e2e-test-kong/src/test/java/org/apache/skywalking/e2e/DataAssertITCase.java
new file mode 100644
index 0000000..a9f423b
--- /dev/null
+++ b/test/e2e/e2e-test-kong/src/test/java/org/apache/skywalking/e2e/DataAssertITCase.java
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.e2e;
+
+import com.google.common.collect.Lists;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.io.ByteStreams;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.InputStreamEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.message.BasicNameValuePair;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class DataAssertITCase {
+ private final CloseableHttpClient client = HttpClientBuilder.create().build();
+ private static final int MAX_RETRY_TIMES = 5;
+ private String collectorBaseURL;
+ private String serviceEntry;
+ private String collectorInBaseURL;
+
+ private String kongAdminBaseUrl;
+
+ @Before
+ public void setup() throws IOException {
+ serviceEntry = System.getProperty("service.entry");
+ collectorBaseURL = System.getProperty("collector.baseURL");
+ collectorInBaseURL = System.getProperty("collector.in.baseURL");
+
+ kongAdminBaseUrl = System.getProperty("kong.admin.baseURL");
+ try (CloseableHttpResponse response = client.execute(new HttpGet(kongAdminBaseUrl))) {
+ Assert.assertEquals(200, response.getStatusLine().getStatusCode());
+ }
+ createBackendService();
+ createMockService();
+ addRouteForUpstream();
+ addRouteForMock();
+ enablePlugin();
+ }
+
+ @Test(timeout = 180_000)
+ public void verify() throws IOException, InterruptedException {
+ int times = 0;
+
+ do {
+ TimeUnit.SECONDS.sleep(2L); // Wait Nginx Lua Agent available.
+
+ try (CloseableHttpResponse response = client.execute(new HttpGet(collectorBaseURL + "/status"))) {
+ if (response.getStatusLine().getStatusCode() == 200) {
+ break;
+ }
+ }
+ }
+ while (++times <= MAX_RETRY_TIMES);
+
+ TimeUnit.SECONDS.sleep(3L);
+ visitServiceEntry();
+
+ TimeUnit.SECONDS.sleep(5L); // Wait Agent reported TraceSegment.
+ times = 0;
+ boolean success = false;
+ do {
+ try (CloseableHttpResponse response = client.execute(new HttpGet(collectorBaseURL + "/receiveData"))) {
+ String content = new String(ByteStreams.toByteArray(response.getEntity().getContent()));
+ if (!"segmentItems: []".equals(content)) {
+ success = true;
+ break;
+ }
+ TimeUnit.SECONDS.sleep(1);
+ }
+ } while (++times <= MAX_RETRY_TIMES);
+
+ if (!success) {
+ visitServiceEntry();
+ }
+
+ times = 0;
+ do {
+
+ HttpPost post = new HttpPost(collectorBaseURL + "/dataValidate");
+ InputStream input = DataAssertITCase.class.getResourceAsStream("/expectedData.yaml");
+ post.setEntity(new InputStreamEntity(input));
+ try (CloseableHttpResponse response = client.execute(post)) {
+ if (response.getStatusLine().getStatusCode() == 200) {
+ break;
+ }
+ }
+ post.abort();
+ TimeUnit.SECONDS.sleep(5000L); // Wait Agent reported TraceSegment.
+ }
+ while (++times <= MAX_RETRY_TIMES);
+
+ Assert.assertTrue("Test failed.", times <= MAX_RETRY_TIMES);
+ }
+
+ private void visitServiceEntry() throws IOException {
+ try (CloseableHttpResponse response = client.execute(new HttpGet(serviceEntry))) {
+ final int statusCode = response.getStatusLine().getStatusCode();
+ Assert.assertTrue(statusCode >= 200 && statusCode <= 400);
+ }
+ }
+
+ private void createBackendService() throws IOException {
+ HttpPost post = new HttpPost(kongAdminBaseUrl + "/services");
+ List<BasicNameValuePair> basicNameValuePairs = Lists.newArrayList(
+ new BasicNameValuePair("name", "upstream-service"),
+ new BasicNameValuePair("url", "http://mockbin.org")
+ );
+ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(basicNameValuePairs);
+ post.setEntity(entity);
+ try (CloseableHttpResponse response = client.execute(post)) {
+ Assert.assertEquals(201, response.getStatusLine().getStatusCode());
+ }
+ }
+
+ private void createMockService() throws IOException {
+ HttpPost post = new HttpPost(kongAdminBaseUrl + "/services");
+ List<BasicNameValuePair> basicNameValuePairs = Lists.newArrayList(
+ new BasicNameValuePair("name", "mock-service"),
+ new BasicNameValuePair("url", "http://localhost:8000/backend")
+ );
+ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(basicNameValuePairs);
+ post.setEntity(entity);
+ try (CloseableHttpResponse response = client.execute(post)) {
+ Assert.assertEquals(201, response.getStatusLine().getStatusCode());
+ }
+ }
+
+ private void addRouteForUpstream() throws IOException {
+ HttpPost post = new HttpPost(kongAdminBaseUrl + "/services/upstream-service/routes");
+ List<BasicNameValuePair> basicNameValuePairs = Lists.newArrayList(
+ new BasicNameValuePair("name", "upstream"),
+ new BasicNameValuePair("paths[]", "/backend")
+ );
+ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(basicNameValuePairs);
+ post.setEntity(entity);
+ try (CloseableHttpResponse response = client.execute(post)) {
+ Assert.assertEquals(201, response.getStatusLine().getStatusCode());
+ }
+ }
+
+ private void addRouteForMock() throws IOException {
+ HttpPost post = new HttpPost(kongAdminBaseUrl + "/services/mock-service/routes");
+ List<BasicNameValuePair> basicNameValuePairs = Lists.newArrayList(
+ new BasicNameValuePair("name", "mocking"),
+ new BasicNameValuePair("paths[]", "/mock")
+ );
+ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(basicNameValuePairs);
+ post.setEntity(entity);
+ try (CloseableHttpResponse response = client.execute(post)) {
+ Assert.assertEquals(201, response.getStatusLine().getStatusCode());
+ }
+ }
+
+ private void enablePlugin() throws IOException {
+ HttpPost post = new HttpPost(kongAdminBaseUrl + "/plugins");
+ List<BasicNameValuePair> basicNameValuePairs = Lists.newArrayList(
+ new BasicNameValuePair("name", "skywalking"),
+ new BasicNameValuePair("config.backend_http_uri", collectorInBaseURL),
+ new BasicNameValuePair("config.service_name", "kong"),
+ new BasicNameValuePair("config.service_instance_name", "kong-with-skywalking"),
+ new BasicNameValuePair("config.sample_ratio", "100")
+ );
+ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(basicNameValuePairs);
+ post.setEntity(entity);
+ try (CloseableHttpResponse response = client.execute(post)) {
+ Assert.assertEquals(201, response.getStatusLine().getStatusCode());
+ }
+ }
+
+ @After
+ public void cleanup() throws IOException {
+ client.close();
+ }
+}
diff --git a/test/e2e/e2e-test-kong/src/test/resources/expectedData.yaml b/test/e2e/e2e-test-kong/src/test/resources/expectedData.yaml
new file mode 100644
index 0000000..a737b33
--- /dev/null
+++ b/test/e2e/e2e-test-kong/src/test/resources/expectedData.yaml
@@ -0,0 +1,113 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+segmentItems:
+ - serviceName: kong
+ segmentSize: '2'
+ segments:
+ - segmentId: not null
+ spans:
+ - operationName: "/backend"
+ operationId: '0'
+ parentSpanId: '0'
+ spanId: '1'
+ spanLayer: Http
+ tags:
+ - key: http.status
+ value: '200'
+ startTime: gt 0
+ endTime: gt 0
+ componentId: '6001'
+ spanType: Exit
+ peer: localhost
+ skipAnalysis: 'false'
+ - operationName: "/backend"
+ operationId: '0'
+ parentSpanId: "-1"
+ spanId: '0'
+ spanLayer: Http
+ tags:
+ - key: http.method
+ value: GET
+ - key: http.params
+ value: http://localhost/backend
+ - key: kong.node
+ value: not null
+ - key: kong.service
+ value: not null
+ - key: kong.route
+ value: not null
+ - key: kong.service_name
+ value: upstream-service
+ - key: http.status
+ value: '200'
+ refs:
+ - parentEndpoint: "/mock"
+ networkAddress: localhost
+ refType: CrossProcess
+ parentSpanId: 1
+ parentTraceSegmentId: not null
+ parentServiceInstance: kong-with-skywalking
+ parentService: kong
+ traceId: not null
+ startTime: gt 0
+ endTime: gt 0
+ componentId: '6001'
+ spanType: Entry
+ peer: ''
+ skipAnalysis: 'false'
+ - segmentId: not null
+ spans:
+ - operationName: "/mock"
+ operationId: '0'
+ parentSpanId: '0'
+ spanId: '1'
+ spanLayer: Http
+ tags:
+ - key: http.status
+ value: '200'
+ startTime: gt 0
+ endTime: gt 0
+ componentId: '6001'
+ spanType: Exit
+ peer: localhost
+ skipAnalysis: 'false'
+ - operationName: "/mock"
+ operationId: '0'
+ parentSpanId: "-1"
+ spanId: '0'
+ spanLayer: Http
+ tags:
+ - key: http.method
+ value: GET
+ - key: http.params
+ value: http://localhost/mock
+ - key: kong.node
+ value: not null
+ - key: kong.service
+ value: not null
+ - key: kong.route
+ value: not null
+ - key: kong.service_name
+ value: mock-service
+ - key: http.status
+ value: '200'
+ startTime: gt 0
+ endTime: gt 0
+ componentId: '6001'
+ spanType: Entry
+ peer: ''
+ skipAnalysis: 'false'
diff --git a/test/e2e/pom.xml b/test/e2e/pom.xml
new file mode 100644
index 0000000..d707ad4
--- /dev/null
+++ b/test/e2e/pom.xml
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You under the Apache License, Version 2.0
+ ~ (the "License"); you may not use this file except in compliance with
+ ~ the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ ~
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.skywalking.plugin.nginx-lua</groupId>
+ <artifactId>e2e</artifactId>
+ <version>1.0.0</version>
+
+ <name>SkyWalking Nginx Lua E2E Tests</name>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>agent-test-tools</module>
+ <module>e2e-test-kong</module>
+ </modules>
+
+ <properties>
+ <java.version>1.8</java.version>
+
+ <junit.version>4.11</junit.version>
+ <slf4j.version>1.7.25</slf4j.version>
+ <log4j.version>2.9.0</log4j.version>
+ <gson.version>2.8.6</gson.version>
+ <guava.version>28.1-jre</guava.version>
+ <lombok.version>1.18.10</lombok.version>
+ <snakeyaml.version>1.18</snakeyaml.version>
+ <httpclient.version>4.5.6</httpclient.version>
+
+ <maven.compiler.source>${java.version}</maven.compiler.source>
+ <maven.compiler.target>${java.version}</maven.compiler.target>
+
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+ <maven-failsafe-plugin.version>3.0.0-M4</maven-failsafe-plugin.version>
+ <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
+ <docker-maven-plugin.version>0.30.0</docker-maven-plugin.version>
+ <surefire.version>3.0.0-M4</surefire.version>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>${httpclient.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>${guava.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.yaml</groupId>
+ <artifactId>snakeyaml</artifactId>
+ <version>${snakeyaml.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>${gson.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <version>${lombok.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>log4j-over-slf4j</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>${log4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>${log4j.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.yaml</groupId>
+ <artifactId>snakeyaml</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>log4j-over-slf4j</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>${log4j.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ </dependencies>
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>${maven-failsafe-plugin.version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven.surefire</groupId>
+ <artifactId>surefire-junit4</artifactId>
+ <version>${maven-failsafe-plugin.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>${docker-maven-plugin.version}</version>
+ <configuration>
+ <sourceMode>all</sourceMode>
+ <showLogs>true</showLogs>
+ <logDate>default</logDate>
+ <imagePullPolicy>IfNotPresent</imagePullPolicy>
+ </configuration>
+ <executions>
+ <execution>
+ <id>start</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>start</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>stop</id>
+ <phase>post-integration-test</phase>
+ <goals>
+ <goal>stop</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${surefire.version}</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>${maven-compiler-plugin.version}</version>
+ <configuration>
+ <source>${java.version}</source>
+ <target>${java.version}</target>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>