diff --git a/Dockerfile b/Dockerfile index 4f7e295..5c9e272 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,8 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -FROM adoptopenjdk/openjdk8-openj9:jre8u322-b06_openj9-0.30.0-ubuntu +ARG platform=linux/amd64 +FROM --platform=$platform adoptopenjdk/openjdk8-openj9:jre8u322-b06_openj9-0.30.0-ubuntu ARG revision=latest ARG repository=ClickHouse/clickhouse-jdbc-bridge diff --git a/NOTICE b/NOTICE index 2ba3b45..f7b9e41 100755 --- a/NOTICE +++ b/NOTICE @@ -35,10 +35,17 @@ This project includes: Jackson-core under The Apache Software License, Version 2.0 jackson-databind under The Apache Software License, Version 2.0 Java Native Access under LGPL, version 2.1 or Apache License v2.0 + JavaBeans Activation Framework (JAF) under Common Development and Distribution License (CDDL) v1.0 + JavaMail API under CDDL/GPLv2+CE jcommander under Apache 2.0 JetBrains Java Annotations under The Apache Software License, Version 2.0 JUnit under Eclipse Public License 1.0 LatencyUtils under Public Domain, per Creative Commons CC0 + Logback Classic Module under Eclipse Public License - v 1.0 or GNU Lesser General Public License + Logback Contrib :: Jackson under Eclipse Public License - v 1.0 or GNU Lesser General Public License + Logback Contrib :: JSON :: Classic under Eclipse Public License - v 1.0 or GNU Lesser General Public License + Logback Contrib :: JSON :: Core under Eclipse Public License - v 1.0 or GNU Lesser General Public License + Logback Core Module under Eclipse Public License - v 1.0 or GNU Lesser General Public License micrometer-core under The Apache Software License, Version 2.0 micrometer-registry-prometheus under The Apache Software License, Version 2.0 Netty/Buffer under Apache License, Version 2.0 @@ -57,7 +64,6 @@ This project includes: Prometheus Java Simpleclient under The Apache Software License, Version 2.0 Prometheus Java Simpleclient Common under The Apache Software License, Version 2.0 SLF4J API Module under MIT License - SLF4J JDK14 Binding under MIT License Testcontainers Core under MIT testng under Apache 2.0 Vert.x Bridge Common under The Apache Software License, Version 2.0 or Eclipse Public License - v 1.0 diff --git a/README.md b/README.md index da1fdde..2fca266 100644 --- a/README.md +++ b/README.md @@ -286,7 +286,13 @@ Assuming you started a test environment using docker-compose, please refer to ex * Logging - You can customize logging configuration in [logging.properties](docker/logging.properties). + You can customize logging configuration in [logback.xml](docker/logback.xml). See the [logback documentation](https://logback.qos.ch/manual/configuration.html) for details about the contents of this file. + + Note that the default logging level is `trace` -- you may wish to set this to `info` or `warning` for less verbose logs in production. + + Note also that the default logging format is the default plaintext format suggested by logback. We also provide (by way of example) a structured log appender named `JSON_STDOUT`; to use it you will need to change the `appender-ref` property of the root logger to point to it. + + WARNING: because the shaded jar build process relocates most classes to the `com.clickhouse.jdbcbridge.internal` path, using the default class paths offered in the logback documentation will result in import errors. If building your own logback.xml file, you will need to replace all references to `ch.qos.logback` with `com.clickhouse.jdbcbridge.internal.qos.logback` -- the included logback.xml file does this for you. * Vert.x diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index cba0ec8..cd8ec28 100644 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -3,39 +3,39 @@ set -e start_server() { - local base_url="${MAVEN_REPO_URL:="https://repo1.maven.org/maven2"}" - local driver_dir="$JDBC_BRIDGE_HOME/drivers" - local jdbc_drivers="${JDBC_DRIVERS:=""}" + local base_url="${MAVEN_REPO_URL:="https://repo1.maven.org/maven2"}" + local driver_dir="$JDBC_BRIDGE_HOME/drivers" + local jdbc_drivers="${JDBC_DRIVERS:=""}" - # change work directory explicitly - cd $JDBC_BRIDGE_HOME + # change work directory explicitly + cd $JDBC_BRIDGE_HOME - if [ "$jdbc_drivers" != "" ] && [ "$(ls -A $driver_dir)" == "" ]; then - echo "Downloading JDBC drivers to directory [$driver_dir]..." - for i in $(echo "$jdbc_drivers" | sed "s/,/ /g"); do - if [ "$i" != "" ]; then - echo " => [$base_url/$i]..." - wget -q -P "$driver_dir" "$base_url/$i" - fi - done - fi + if [ "$jdbc_drivers" != "" ] && [ "$(ls -A $driver_dir)" == "" ]; then + echo "Downloading JDBC drivers to directory [$driver_dir]..." + for i in $(echo "$jdbc_drivers" | sed "s/,/ /g"); do + if [ "$i" != "" ]; then + echo " => [$base_url/$i]..." + wget -q -P "$driver_dir" "$base_url/$i" + fi + done + fi - if [ "$(echo ${CUSTOM_DRIVER_LOADER:="true"} | tr '[:upper:]' '[:lower:]')" != "true" ]; then - local classpath="./clickhouse-jdbc-bridge-shaded.jar:$(echo $(ls ${DRIVER_DIR:="drivers"}/*.jar) | tr ' ' ':'):." - java -XX:+UseContainerSupport -XX:+IdleTuningCompactOnIdle -XX:+IdleTuningGcOnIdle \ - -Xdump:none -Xdump:tool:events=systhrow+throw,filter=*OutOfMemoryError,exec="kill -9 %pid" \ - -Djava.util.logging.config.file=$JDBC_BRIDGE_HOME/logging.properties -Dnashorn.args=--language=es6 \ - ${JDBC_BRIDGE_JVM_OPTS:=""} -cp $classpath com.clickhouse.jdbcbridge.JdbcBridgeVerticle - else - java -XX:+UseContainerSupport -XX:+IdleTuningCompactOnIdle -XX:+IdleTuningGcOnIdle \ - -Xdump:none -Xdump:tool:events=systhrow+throw,filter=*OutOfMemoryError,exec="kill -9 %pid" \ - -Djava.util.logging.config.file=$JDBC_BRIDGE_HOME/logging.properties -Dnashorn.args=--language=es6 \ - ${JDBC_BRIDGE_JVM_OPTS:=""} -jar clickhouse-jdbc-bridge-shaded.jar - fi + if [ "$(echo ${CUSTOM_DRIVER_LOADER:="true"} | tr '[:upper:]' '[:lower:]')" != "true" ]; then + local classpath="./clickhouse-jdbc-bridge-shaded.jar:$(echo $(ls ${DRIVER_DIR:="drivers"}/*.jar) | tr ' ' ':'):." + java -XX:+UseContainerSupport -XX:+IdleTuningCompactOnIdle -XX:+IdleTuningGcOnIdle \ + -Xdump:none -Xdump:tool:events=systhrow+throw,filter=*OutOfMemoryError,exec="kill -9 %pid" \ + -Dlogback.configurationFile=$JDBC_BRIDGE_HOME/logback.xml -Dnashorn.args=--language=es6 \ + ${JDBC_BRIDGE_JVM_OPTS:=""} -cp $classpath com.clickhouse.jdbcbridge.JdbcBridgeVerticle + else + java -XX:+UseContainerSupport -XX:+IdleTuningCompactOnIdle -XX:+IdleTuningGcOnIdle \ + -Xdump:none -Xdump:tool:events=systhrow+throw,filter=*OutOfMemoryError,exec="kill -9 %pid" \ + -Dlogback.configurationFile=$JDBC_BRIDGE_HOME/logback.xml -Dnashorn.args=--language=es6 \ + ${JDBC_BRIDGE_JVM_OPTS:=""} -jar clickhouse-jdbc-bridge-shaded.jar + fi } if [ $# -eq 0 ]; then - start_server + start_server else - exec "$@" + exec "$@" fi diff --git a/docker/logback.xml b/docker/logback.xml new file mode 100644 index 0000000..9939ba9 --- /dev/null +++ b/docker/logback.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + true + yyyy-MM-dd'T'HH:mm:ss.SSSX + Etc/UTC + + + + + + + + + \ No newline at end of file diff --git a/docker/logging.properties b/docker/logging.properties deleted file mode 100644 index 380dfdf..0000000 --- a/docker/logging.properties +++ /dev/null @@ -1,14 +0,0 @@ -handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler - -java.util.logging.ConsoleHandler.level=DEBUG -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter -java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n - -java.util.logging.FileHandler.level=INFO -java.util.logging.FileHandler.pattern=/var/log/clickhouse-jdbc-bridge/console.log -java.util.logging.FileHandler.limit=10000000 -java.util.logging.FileHandler.count=5 -java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter -java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n - -.level=DEBUG diff --git a/pom.xml b/pom.xml index ac76191..ca25dff 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ 3.5.0 3.9.13 1.1.19 - 1.7.36 + 2.0.1 3.4.5 2022 UTF-8 @@ -28,6 +28,7 @@ 1.6 1.5.3 2.11 + 1.3.4 1.1.0 3.8.1 3.2.1 @@ -35,6 +36,10 @@ 3.2.0 3.0.0-M5 3.0.0-M5 + 0.1.5 + 0.1.5 + 2.13.4 + 2.13.4.1 3.2.4 com.clickhouse.jdbcbridge.internal 1.0.20 @@ -79,6 +84,12 @@ com.zaxxer HikariCP ${hikaricp.version} + + + org.slf4j + slf4j-api + + @@ -86,6 +97,12 @@ dnsjava dnsjava ${dnsjava.version} + + + org.slf4j + slf4j-api + + @@ -93,6 +110,12 @@ io.vertx vertx-core ${vertx.version} + + + com.fasterxml.jackson.core + jackson-core + + io.vertx @@ -124,14 +147,29 @@ - org.slf4j - slf4j-api - ${slf4j.version} + ch.qos.logback + logback-classic + ${logback.version} + + + ch.qos.logback.contrib + logback-json-classic + ${logback-json.version} + + + ch.qos.logback.contrib + logback-jackson + ${logback-jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} - org.slf4j - slf4j-jdk14 - ${slf4j.version} + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} @@ -300,7 +338,7 @@ root - docker/logging.properties + docker/logback.xml docker/set-env.sh.example @@ -565,6 +603,10 @@ org.LatencyUtils ${shade.base}.LatencyUtils + + ch.qos + ${shade.base}.qos + diff --git a/src/main/bin/clickhouse-jdbc-bridge b/src/main/bin/clickhouse-jdbc-bridge index 0c10dd2..9d735b4 100644 --- a/src/main/bin/clickhouse-jdbc-bridge +++ b/src/main/bin/clickhouse-jdbc-bridge @@ -25,45 +25,45 @@ INIT_SCRIPT="/etc/clickhouse-jdbc-bridge/set-env.sh" JAVA_CMD="java" init_env() { - if [ -f $INIT_SCRIPT ]; then - echo "Executing [$INIT_SCRIPT] to set environment variables..." - . $INIT_SCRIPT - else - echo "[$INIT_SCRIPT] is not found, will use default environment variables" - fi + if [ -f $INIT_SCRIPT ]; then + echo "Executing [$INIT_SCRIPT] to set environment variables..." + . $INIT_SCRIPT + else + echo "[$INIT_SCRIPT] is not found, will use default environment variables" + fi - # check if we have JRE - if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then - JAVA_CMD="$JAVA_HOME/bin/java" - elif ! type -p java > /dev/null; then - echo "ERROR: Java needs to be installed first" - exit 1 - fi + # check if we have JRE + if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then + JAVA_CMD="$JAVA_HOME/bin/java" + elif ! type -p java >/dev/null; then + echo "ERROR: Java needs to be installed first" + exit 1 + fi } start_server() { - # override below environment variables as needed in $INIT_SCRIPT - : ${APP_PACKAGE:="/usr/local/lib/java/clickhouse-jdbc-bridge-shaded.jar"} - : ${JVM_ARGS:="-Xmx512m"} - : ${WORK_DIRECTORY:=$(dirname "$INIT_SCRIPT")} + # override below environment variables as needed in $INIT_SCRIPT + : ${APP_PACKAGE:="/usr/local/lib/java/clickhouse-jdbc-bridge-shaded.jar"} + : ${JVM_ARGS:="-Xmx512m"} + : ${WORK_DIRECTORY:=$(dirname "$INIT_SCRIPT")} - # kill server if it's running - kill -9 $(ps -ef | grep java | grep "$APP_PACKAGE" | awk '{print $2}') 2>/dev/null || true + # kill server if it's running + kill -9 $(ps -ef | grep java | grep "$APP_PACKAGE" | awk '{print $2}') 2>/dev/null || true - if [ ! -f "$APP_PACKAGE" ]; then - echo "ERROR: ClickHouse JDBC Bridge could not start because [$APP_PACKAGE] is missing" - exit 1 - fi + if [ ! -f "$APP_PACKAGE" ]; then + echo "ERROR: ClickHouse JDBC Bridge could not start because [$APP_PACKAGE] is missing" + exit 1 + fi - if [ ! -d "$WORK_DIRECTORY" ]; then - echo "WARN: Work directory [$WORK_DIRECTORY] does not exist" - WORK_DIRECTORY=$(dirname "$INIT_SCRIPT") - fi + if [ ! -d "$WORK_DIRECTORY" ]; then + echo "WARN: Work directory [$WORK_DIRECTORY] does not exist" + WORK_DIRECTORY=$(dirname "$INIT_SCRIPT") + fi - echo "Work directory is set to [$WORK_DIRECTORY]" - cd "$WORK_DIRECTORY" - java $JVM_ARGS -Djava.util.logging.config.file=$WORK_DIRECTORY/logging.properties \ - -Duser.dir="$WORK_DIRECTORY" -jar "$APP_PACKAGE" + echo "Work directory is set to [$WORK_DIRECTORY]" + cd "$WORK_DIRECTORY" + java $JVM_ARGS -Dlogback.configurationFile=$WORK_DIRECTORY/logback.xml \ + -Duser.dir="$WORK_DIRECTORY" -jar "$APP_PACKAGE" } init_env diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..4b007d5 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + true + yyyy-MM-dd'T'HH:mm:ss.SSSX + Etc/UTC + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/logging.properties b/src/main/resources/logging.properties deleted file mode 100644 index 89c5d7f..0000000 --- a/src/main/resources/logging.properties +++ /dev/null @@ -1,7 +0,0 @@ -handlers=java.util.logging.ConsoleHandler - -java.util.logging.ConsoleHandler.level=DEBUG -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter -java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n - -.level=DEBUG diff --git a/test.Dockerfile b/test.Dockerfile new file mode 100644 index 0000000..92daf2e --- /dev/null +++ b/test.Dockerfile @@ -0,0 +1,48 @@ +# +# This dockerfile will create a deployable docker image out of a locally built jar, e.g.: +# `mvn -DskipTests clean package && docker build -f test.Dockerfile -t clickhouse-jdbc-bridge:$(git rev-parse --short head) .` +# +ARG revision=latest +ARG platform=linux/amd64 +FROM --platform=$platform adoptopenjdk/openjdk8-openj9:jre8u322-b06_openj9-0.30.0-ubuntu + +# Labels +LABEL app_name="ClickHouse JDBC Bridge" + +# Environment variables +ENV JDBC_BRIDGE_HOME=/app +WORKDIR $JDBC_BRIDGE_HOME + +COPY LICENSE NOTICE pom.xml ${JDBC_BRIDGE_HOME}/ +COPY --chown=root:root docker/ $JDBC_BRIDGE_HOME/ + +# Update system and install additional packages for troubleshooting +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -qq --allow-unauthenticated apache2-utils \ + apt-transport-https curl htop iftop iptraf iputils-ping jq lsof net-tools tzdata wget \ + && apt-get clean \ + && wget -P $JDBC_BRIDGE_HOME/drivers \ + https://repo1.maven.org/maven2/com/clickhouse/clickhouse-jdbc/0.3.2-patch8/clickhouse-jdbc-0.3.2-patch8-all.jar \ + https://repo1.maven.org/maven2/org/mariadb/jdbc/mariadb-java-client/3.0.4/mariadb-java-client-3.0.4.jar \ + https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar \ + https://repo1.maven.org/maven2/org/neo4j/neo4j-jdbc-driver/4.0.5/neo4j-jdbc-driver-4.0.5.jar \ + https://repo1.maven.org/maven2/com/amazon/opendistroforelasticsearch/client/opendistro-sql-jdbc/1.13.0.0/opendistro-sql-jdbc-1.13.0.0.jar \ + https://repo1.maven.org/maven2/org/postgresql/postgresql/42.3.4/postgresql-42.3.4.jar \ + https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.36.0.3/sqlite-jdbc-3.36.0.3.jar \ + https://repo1.maven.org/maven2/io/trino/trino-jdbc/377/trino-jdbc-377.jar \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +ARG version=2.1.0-SNAPSHOT +COPY target/clickhouse-jdbc-bridge-${version}-shaded.jar /app/clickhouse-jdbc-bridge-shaded.jar + +RUN chmod +x $JDBC_BRIDGE_HOME/*.sh \ + && mkdir -p $JDBC_BRIDGE_HOME/logs /usr/local/lib/java \ + && ln -s $JDBC_BRIDGE_HOME/logs /var/log/clickhouse-jdbc-bridge \ + && ln -s $JDBC_BRIDGE_HOME /etc/clickhouse-jdbc-bridge \ + && ln -s $JDBC_BRIDGE_HOME/clickhouse-jdbc-bridge-shaded.jar /usr/local/lib/java/clickhouse-jdbc-bridge-shaded.jar + +EXPOSE 9019 + +VOLUME ["${JDBC_BRIDGE_HOME}/drivers", "${JDBC_BRIDGE_HOME}/extensions", "${JDBC_BRIDGE_HOME}/logs", "${JDBC_BRIDGE_HOME}/scripts"] + +CMD "./docker-entrypoint.sh"