From 4ef2c4a2b4feb2fd4b9184b79a69596c0d39ab3c Mon Sep 17 00:00:00 2001 From: Phuc NH Date: Thu, 4 Dec 2025 11:20:00 +0700 Subject: [PATCH 1/3] adding Holistics.io to ClickHouse docs --- .../holistics-and-clickhouse.md | 108 ++++++++++++++++++ docs/integrations/data-visualization/index.md | 2 + .../data-visualization/holistics_01.png | Bin 0 -> 64617 bytes .../data-visualization/holistics_02.png | Bin 0 -> 380384 bytes .../data-visualization/holistics_03.png | Bin 0 -> 191758 bytes .../data-visualization/holistics_04.png | Bin 0 -> 248395 bytes .../data-visualization/holistics_05.png | Bin 0 -> 454354 bytes .../data-visualization/holistics_06.png | Bin 0 -> 393961 bytes static/integrations-fallback.json | 2 +- 9 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 docs/integrations/data-visualization/community_integrations/holistics-and-clickhouse.md create mode 100644 static/images/integrations/data-visualization/holistics_01.png create mode 100644 static/images/integrations/data-visualization/holistics_02.png create mode 100644 static/images/integrations/data-visualization/holistics_03.png create mode 100644 static/images/integrations/data-visualization/holistics_04.png create mode 100644 static/images/integrations/data-visualization/holistics_05.png create mode 100644 static/images/integrations/data-visualization/holistics_06.png diff --git a/docs/integrations/data-visualization/community_integrations/holistics-and-clickhouse.md b/docs/integrations/data-visualization/community_integrations/holistics-and-clickhouse.md new file mode 100644 index 00000000000..70947704188 --- /dev/null +++ b/docs/integrations/data-visualization/community_integrations/holistics-and-clickhouse.md @@ -0,0 +1,108 @@ +--- +sidebar_label: 'Holistics' +slug: /integrations/holistics +keywords: ['clickhouse', 'Holistics', 'AI', 'integrate', 'bi', 'data visualization'] +description: 'Holistics is an AI-powered platform for self-service BI and embedded analytics that helps everyone make better decisions with governed, easily accessible metrics.' +title: 'Connect ClickHouse to Holistics' +doc_type: 'guide' +--- + +import Image from '@theme/IdealImage'; +import CommunityMaintainedBadge from '@theme/badges/CommunityMaintained'; +import holistics_01 from '@site/static/images/integrations/data-visualization/holistics_01.png'; +import holistics_02 from '@site/static/images/integrations/data-visualization/holistics_02.png'; +import holistics_03 from '@site/static/images/integrations/data-visualization/holistics_03.png'; +import holistics_04 from '@site/static/images/integrations/data-visualization/holistics_04.png'; +import holistics_05 from '@site/static/images/integrations/data-visualization/holistics_05.png'; +import holistics_06 from '@site/static/images/integrations/data-visualization/holistics_06.png'; + +# Connecting ClickHouse to Holistics + + + +[Holistics](https://www.holistics.io/) is an AI-native self-service BI platform with a programmable semantic layer for consistent, trustworthy metrics. + +By connecting ClickHouse to Holistics, your teams get a fast, reliable AI-powered self-service experience grounded in a code-based semantic layer. Business users can explore data confidently with drag-and-drop and AI, while you keep metric definitions reusable, composable, and version-controlled in Git. + +## Prerequisites {#prerequisites} + +Before connecting, ensure you have the following: + +- **Permissions:** You must be an Admin in Holistics to add new Data Sources. +- **Network Access:** Your ClickHouse server must be accessible from [Holistics' IP addresses](/docs/connect/ip-whitelisting). +- **Database User:** Create a dedicated, read-only user for Holistics rather than using an admin account. + +### Recommended Privileges {#recommended-privileges} + +The dedicated user requires `SELECT` privileges on the tables you wish to query, as well as the `system` tables (for schema detection). + +```sql +-- Example: Grant read access to a specific database +GRANT SELECT ON my_database.* TO holistics_user; + +-- Grant access to system metadata +GRANT SELECT ON system.* TO holistics_user; +``` + +## Step 1: Gather Connection Details {#step-1-gather-connection-details} + +To connect to ClickHouse with HTTP(S) you will need this information: + +| **Parameter** | **Description** | +| ----------------- | ----------------------------------------------------------------------------------------- | +| **Host** | The hostname of your ClickHouse server (e.g., `mz322.eu-central-1.aws.clickhouse.cloud`). | +| **Port** | **8443** for ClickHouse Cloud (SSL/TLS). **8123** for self-managed instances without SSL. | +| **Database Name** | The name of the database you want to connect to. The default is usually `default`. | +| **Username** | The database user. The default is `default`. | +| **Password** | The password for the database user. | + +You can find these details by clicking the **Connect** button in your ClickHouse Cloud console and selecting **HTTPS**. + +Location of the Connect button in the ClickHouse Cloud console + +## Step 2: Configure Network Access {#step-2-configure-network-access} + +Since Holistics is a cloud-based application, its servers must be able to reach your database. You have two options: + +1. **Direct Connection (Recommended):** Allowlist Holistics' IP addresses in your firewall or ClickHouse Cloud IP Access List. You can find the list of IPs in the [IP Whitelisting guide](/docs/connect/ip-whitelisting). + + Example of IP allowlisting in ClickHouse Cloud + +2. **Reverse SSH Tunnel:** If your database is in a private network (VPC) and cannot be exposed publicly, use a [Reverse SSH Tunnel](/docs/connect/connect-tunnel). + +## Step 3: Add Data Source in Holistics {#step-3-add-data-source-in-holistics} + +1. In Holistics, go to **Settings → Data Sources**. + + Navigating to Data Sources in Holistics settings + +2. Click **New Data Source** and select **ClickHouse**. + + Selecting ClickHouse from the list of new data sources + +3. Fill in the form with the details gathered in Step 1. + + | **Field** | **Setting** | + | ----------------- | ----------------------------------------------------------------- | + | **Host** | Your ClickHouse Hostname | + | **Port** | `8443` (or `8123`) | + | **Require SSL** | Toggle **ON** if using port 8443 (Required for ClickHouse Cloud). | + | **Database Name** | `default` (or your specific DB) | + + Filling in ClickHouse connection details in Holistics + +4. Click **Test Connection**. + + Successful ClickHouse connection test in Holistics + + - **Success:** Click **Save**. + - **Failure:** Check your username/password and ensure the [Holistics IPs are allowlisted](/docs/connect/ip-whitelisting). + +## Known Limitations {#known-limitations} + +Holistics supports most standard SQL features in ClickHouse, with the following exceptions: + +- **Running Total:** This analytic function currently has limited support on ClickHouse. +- **Nested Data Types:** Deeply nested JSON or Array structures may require flattening via SQL models before visualization. + +For a full list of supported features, please refer to the [Database-specific Limitations page](/docs/connect/faqs/clickhouse-limitations). diff --git a/docs/integrations/data-visualization/index.md b/docs/integrations/data-visualization/index.md index 6a34ac3417c..ee3754d7c90 100644 --- a/docs/integrations/data-visualization/index.md +++ b/docs/integrations/data-visualization/index.md @@ -46,6 +46,7 @@ Now that your data is in ClickHouse, it's time to analyze it, which often involv - [Rocket BI](./community_integrations/rocketbi-and-clickhouse.md) - [Tableau](./tableau/tableau-and-clickhouse.md) - [Zing Data](./community_integrations/zingdata-and-clickhouse.md) +- [Holistics BI](./community_integrations/holistics-and-clickhouse.md) ## ClickHouse Cloud compatibility with data visualization tools {#clickhouse-cloud-compatibility-with-data-visualization-tools} @@ -62,6 +63,7 @@ Now that your data is in ClickHouse, it's time to analyze it, which often involv | [Fabi.ai](./community_integrations/fabi-and-clickhouse.md) | Native connector | ✅ | ✅ | | | [Grafana](./grafana/index.md) | ClickHouse official connector | ✅ | ✅ | | | [Hashboard](./community_integrations/hashboard-and-clickhouse.md) | Native connector | ✅ | ✅ | | +| [Holistics](./community_integrations/holistics-and-clickhouse.md) | Native connector | ✅ | ✅ | | | [Lightdash](./lightdash-and-clickhouse.md) | Native connector | ✅ | ✅ | | | [Looker](./looker-and-clickhouse.md) | Native connector | ✅ | ✅ | Works with some limitations, see [the documentation](./looker-and-clickhouse.md) for more details | diff --git a/static/images/integrations/data-visualization/holistics_01.png b/static/images/integrations/data-visualization/holistics_01.png new file mode 100644 index 0000000000000000000000000000000000000000..ea316ed8894c5cc5155a1a56054073a04388190b GIT binary patch literal 64617 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