ClickHouse / metabase-clickhouse-driver

ClickHouse database driver for the Metabase business intelligence front-end
Apache License 2.0
461 stars 84 forks source link

Unable to connect to another docker container running clickhouse #214

Closed sindhubb closed 2 months ago

sindhubb commented 5 months ago

Describe the bug

Steps to reproduce

  1. Run Metabase with Clickhouse driver plugin
  2. Try to add clickhouse as database
  3. Error

Expected behaviour

Expect to connect to clickhouse running on Docker container via Metabase container. I have made metabase part of the docker network locally as well with docker network connect <local-network-name>.

Error log

I see the following error in logs of metabase container:

2024-01-10 14:36:05     at com.clickhouse.jdbc.SqlExceptionUtils.handle(SqlExceptionUtils.java:85)
2024-01-10 14:36:05     at com.clickhouse.jdbc.SqlExceptionUtils.create(SqlExceptionUtils.java:31)
2024-01-10 14:36:05     at com.clickhouse.jdbc.SqlExceptionUtils.handle(SqlExceptionUtils.java:90)
2024-01-10 14:36:05     at com.clickhouse.jdbc.internal.ClickHouseConnectionImpl.getServerInfo(ClickHouseConnectionImpl.java:131)
2024-01-10 14:36:05     at com.clickhouse.jdbc.internal.ClickHouseConnectionImpl.<init>(ClickHouseConnectionImpl.java:335)
2024-01-10 14:36:05     at com.clickhouse.jdbc.internal.ClickHouseConnectionImpl.<init>(ClickHouseConnectionImpl.java:288)
2024-01-10 14:36:05     at com.clickhouse.jdbc.ClickHouseDriver.connect(ClickHouseDriver.java:157)
2024-01-10 14:36:05     at com.clickhouse.jdbc.ClickHouseDriver.connect(ClickHouseDriver.java:41)
2024-01-10 14:36:05     at metabase.plugins.jdbc_proxy$proxy_driver$reify__87458.connect(jdbc_proxy.clj:37)
2024-01-10 14:36:05     at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
2024-01-10 14:36:05     at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
2024-01-10 14:36:05     at clojure.java.jdbc$get_driver_connection.invokeStatic(jdbc.clj:271)
2024-01-10 14:36:05     at clojure.java.jdbc$get_driver_connection.invoke(jdbc.clj:250)
2024-01-10 14:36:05     at clojure.java.jdbc$get_connection.invokeStatic(jdbc.clj:411)
2024-01-10 14:36:05     at clojure.java.jdbc$get_connection.invoke(jdbc.clj:274)
2024-01-10 14:36:05     at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111)
2024-01-10 14:36:05     at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093)
2024-01-10 14:36:05     at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182)
2024-01-10 14:36:05     at clojure.java.jdbc$query.invoke(jdbc.clj:1144)
2024-01-10 14:36:05     at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1160)
2024-01-10 14:36:05     at clojure.java.jdbc$query.invoke(jdbc.clj:1144)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invokeStatic(connection.clj:326)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invoke(connection.clj:323)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$can_connect_QMARK_$fn__50299.invoke(connection.clj:335)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$do_with_connection_spec_for_testing_connection$fn__50281.invoke(connection.clj:311)
2024-01-10 14:36:05     at metabase.util.ssh$do_with_ssh_tunnel.invokeStatic(ssh.clj:162)
2024-01-10 14:36:05     at metabase.util.ssh$do_with_ssh_tunnel.invoke(ssh.clj:151)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$do_with_connection_spec_for_testing_connection.invokeStatic(connection.clj:309)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$do_with_connection_spec_for_testing_connection.invoke(connection.clj:305)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invokeStatic(connection.clj:334)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invoke(connection.clj:330)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc$fn__109967.invokeStatic(sql_jdbc.clj:53)
2024-01-10 14:36:05     at metabase.driver.sql_jdbc$fn__109967.invoke(sql_jdbc.clj:51)
2024-01-10 14:36:05     at clojure.lang.MultiFn.invoke(MultiFn.java:234)
2024-01-10 14:36:05     at metabase.driver.util$can_connect_with_details_QMARK_$fn__58428.invoke(util.clj:147)
2024-01-10 14:36:05     at clojure.core$binding_conveyor_fn$fn__5823.invoke(core.clj:2047)
2024-01-10 14:36:05     at clojure.lang.AFn.call(AFn.java:18)
2024-01-10 14:36:05     at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
2024-01-10 14:36:05     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
2024-01-10 14:36:05     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
2024-01-10 14:36:05     ... 1 more
2024-01-10 14:36:05 Caused by: java.net.UnknownHostException: clickhouse
2024-01-10 14:36:05     at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source)
2024-01-10 14:36:05     at java.base/java.net.Socket.connect(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.NetworkClient.doConnect(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.http.HttpClient.openServer(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.http.HttpClient.<init>(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.http.HttpClient.New(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(Unknown Source)
2024-01-10 14:36:05     at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
2024-01-10 14:36:05     at com.clickhouse.client.http.HttpUrlConnectionImpl.post(HttpUrlConnectionImpl.java:225)
2024-01-10 14:36:05     at com.clickhouse.client.http.ClickHouseHttpClient.send(ClickHouseHttpClient.java:124)
2024-01-10 14:36:05     at com.clickhouse.client.AbstractClient.execute(AbstractClient.java:280)
2024-01-10 14:36:05     at com.clickhouse.client.ClickHouseClientBuilder$Agent.sendOnce(ClickHouseClientBuilder.java:282)
2024-01-10 14:36:05     at com.clickhouse.client.ClickHouseClientBuilder$Agent.send(ClickHouseClientBuilder.java:294)
2024-01-10 14:36:05     at com.clickhouse.client.ClickHouseClientBuilder$Agent.execute(ClickHouseClientBuilder.java:349)
2024-01-10 14:36:05     at com.clickhouse.client.ClickHouseClient.executeAndWait(ClickHouseClient.java:1056)
2024-01-10 14:36:05     at com.clickhouse.client.ClickHouseRequest.executeAndWait(ClickHouseRequest.java:2154)
2024-01-10 14:36:05     at com.clickhouse.jdbc.internal.ClickHouseConnectionImpl.getServerInfo(ClickHouseConnectionImpl.java:128)
2024-01-10 14:36:05     ... 37 more
2024-01-10 14:36:05 2024-01-10 09:06:05,174 DEBUG middleware.log :: POST /api/database 400 30.8 ms (0 DB calls) 
2024-01-10 14:36:05 {:message
2024-01-10 14:36:05  "clickhouse, server ClickHouseNode [uri=http://clickhouse:8125/default, options={use_server_time_zone_for_dates=true,use_no_proxy=false,product_name=metabase/1.2.2}]@-1732969528"}

Configuration

Environment

ClickHouse server

sindhubb commented 5 months ago

I am able to add postgres database (to metabase ui) which is also running as a container in my docker.

slvrtrn commented 5 months ago

That's how I run it for the tests and local development as well (please ignore clickhouse_tls): https://github.com/ClickHouse/metabase-clickhouse-driver/blob/master/docker-compose.yml. Paths are assuming that the root folder is the Metabase repo, and the driver repo is checked out to modules/drivers/clickhouse.

If we reduce docker-compose.yml to something like:

version: '3.8'
services:
  clickhouse:
    image: 'clickhouse/clickhouse-server:23.12-alpine'
    container_name: 'metabase-driver-clickhouse-server'
    ports:
      - '8123:8123'
      - '9000:9000'
    ulimits:
      nofile:
        soft: 262144
        hard: 262144

  metabase:
    image: metabase/metabase:v0.48.1
    container_name: metabase-with-clickhouse-driver
    environment:
      'MB_HTTP_TIMEOUT': '5000'
      'JAVA_TIMEZONE': 'UTC'
    ports:
      - '3000:3000'
    volumes:
      - './clickhouse.metabase-driver.jar:/plugins/clickhouse.jar'

Having clickhouse.metabase-driver.jar next to it, does it work for you? This should not require docker network connect cause they will be in the same network already, and I suspect something might go wrong with that command.