25 August 2025 - v5.5.0

Row-level access control, ip and uuid datatypes, column alias management in UI

Notable new features

Row-level access control

  • Data can now be filtered for users based on the contents of the row and users' assigned roles.
  • Each filter is implemented as a row policy.
  • RBAC roles control which users are affected by which row policies.
  • Learn more in Row-Level Access Control

Column alias management for data tables

You can now create and manage column aliases directly from the UI. Tabs are fully synchronized to preserve input when switching.

  • Column alias list
    • In the UI data/tables/{table_id}/column-management/: View existing aliases with columns for Alias and Expression
  • Create new alias
    • In the UI /data/tables/{table_id}/column-management/new-column-alias/
      • Alias form: Add a name and expression
      • Analyze expression:
        • Select optional columns to preview with the alias
        • See generated SQL, copy it, and set row limits
        • Run a test query to preview results
  • Edit alias
    • In the UI /data/tables/{table_id}/column-management/{alias_id}/: Edit or delete existing aliases

Support for new ip and uuid datatypes

IP addresses and UUIDs may now be used as a first-class datatype in transforms, ingest, and queries.

  • The ip datatype supports both IPv4 and IPv6 addresses. Here's an example of field definitions in a transform:

    {
      "name": "ipv4_field",
      "datatype": {
        "type": "ip",
        "default": "127.0.0.1"
      }
    }
    
    {
      "name": "ipv6_field",
      "datatype": {
        "type": "ip",
        "default": "fe80::22bb:2ebd:da90:3439"
      }
    }
    
  • The uuid datatype supports standard 128-bit UUIDs. Here's an example of a field definition in a transform:

    {
      "name": "uuid_field",
      "datatype": {
        "type": "uuid",
        "default": "88a7bdff-ce1f-4ce6-ae6f-f506937e315c"
      }
    }
    

Upgrade instructions (update the Hydrolix version number in the links below)

  1. Apply the new Hydrolix operator

    If you have a self-managed installation, apply the new operator directly with the kubectl command examples below. If you're using Hydrolix-supplied tools to manage your installation, follow the procedure prescribed by those tools.

    GKE

    kubectl apply -f "https://www.hydrolix.io/operator/v5.5.0/operator-resources?namespace=${HDX_KUBERNETES_NAMESPACE}&gcp-storage-sa=${GCP_STORAGE_SA}"
    

    EKS

    kubectl apply -f "https://www.hydrolix.io/operator/v5.5.0/operator-resources?namespace=${HDX_KUBERNETES_NAMESPACE}&aws-storage-role=${AWS_STORAGE_ROLE}"
    

    LKE and AKS

    kubectl apply -f "https://www.hydrolix.io/operator/v5.5.0/operator-resources?namespace=${HDX_KUBERNETES_NAMESPACE}"
    
  2. Monitor the upgrade process

    Kubernetes jobs named init-cluster and init-turbine-api will automatically run to upgrade your entire installation to match the new operator's version number. This will take a few minutes, during which time you can observe your pods' restarts with your favorite Kubernetes monitor tool.

    Ensure both the init-cluster and init-turbine-api jobs have completed successfully and that the turbine-api pod has restarted without errors. After that, view the UI and use the API of your new installation as a final check.

    If the turbine-api pod doesn't restart properly or other functionality is missing, check the logs of the init-cluster and init-turbine-api jobs for details about failures. This can be done using the k9s utility or with the kubectl command:

    % kubectl logs -l app=init-cluster
    % kubectl logs -l app=init-turbine-api
    

    If you still need help, contact Hydrolix support.

Changelog

Updates

These changes include version upgrades and internal dependency bumps.

Cluster Operations

  • Upgraded gunicorn from 20.0.4 -> 20.1.0 to prevent cluster problems. See more information about the bugfix here: https://github.com/benoitc/gunicorn/issues/1913
  • Upgraded kopf and update operator RBAC from v0.0.0-20220102113305-2298ace6d09d to v0.0.0-20250630131328-58d95d85e994.
  • Upgraded HTTP Proxy to version 0.4.0.
  • Switched from pycryptodome to pycryptodomex version 3.23.0 to eliminate a security vulnerability.

Intake and Merge

  • Updated Goja dependency from v0.0.0-20220102113305-2298ace6d09d to v0.0.0-20250630131328-58d95d85e994.
  • Updated the following crates: fake to version 4.3.0 and rand to version 0.9.1
  • Upgraded the golang.org/x/oauth2 library from version 0.23 to 0.27 to resolve a high-severity vulnerability (CVE-2025-22868). The issue allowed attackers to send malformed tokens that could cause excessive memory consumption during parsing.
    Related advisory: GHSA-6v2p-p543-phr9
  • Updated go runtime from version 1.23.0 to 1.23.3 to address a segfault during autoingest.

UI

  • Upgraded form-data library to Upgrades 2.5.4, 3.0.4, 4.0.4 or above to prevent Math.random()-related security vulnerability.

Improvements

Config API

  • Added /download endpoint to DictionaryFile resource that downloads the dictionary file using the same permissions as view_dictionaryfile
  • Implemented service account token generation within the config API. This allows more fine-grained control over token generation, TTLs, and revocations.
  • Updated the /defaults Config API endpoint to return updated default settings values. Updated schema for multiple endpoints for more clarity on the 'settings' field. Changed the batch job default max_minutes_per_partitions from 360 to 60.
  • Support for new ip and uuid datatypes has been added. See Support for new ip and uuid datatypes for more information.
  • Enabled storing HDX Deployment ID (deployment_id) on multi-tenant Project resources.
  • API query string parameter values for the /project endpoint are no longer converted to lowercase, preserving case-sensitivity.

Cluster Operations

  • Hydrolix now includes both cluster-level and project-level deployment IDs in all usage reports, logs, and monitoring data.

    • This ensures traceability across usage.meter, hydro.logs, and alerting pipelines.
    • Deployment ID sources:
      • HDX_DEPLOYMENT_ID: cluster-wide, env var or CLI flag
      • project.hdx_deployment_id: per project, config data
  • Improved initialization logic to ensure the hydro.logs transform includes the deployment_id column, allowing logs to be filtered by deployment.

    • Added a service to guarantee a transform contains specific output_columns.
    • Updated init_ci to use this service to ensure deployment_id is present.
    • Refactored transform business logic into TransformSerializer for reuse and clarity.
    • Creates or updates the transform and settings only if deployment_id is missing.
    • Leaves other transform settings untouched.
    • Raises clear errors if a conflicting datatype for the column exists.
  • Include Hydrolix deployment ID in logs and metrics emitted by a cluster. The deployment ID is propogated to various workloads by the operator. If the operator can't obtain a deployment ID, it defaults to propagating the namespace.

  • When Grafana is enabled in-cluster, the operator creates a default Hydrolix datasource in Grafana, replacing the default ClickHouse datasource.

  • Added two metrics: fqdn_cert_expiry, which indicates the fqdn cert expiry time in seconds, and fqdn_tls_cert_expiry_diff, which indicates if the fqdn cert and the tls.crt in traefik-tls secret differ (which should not be the case).

  • Introduced multiple enhancements to the hdx-scaler autoscaler to support more responsive and stable scaling:

    • Separate cooldowns: cool_up_seconds and cool_down_seconds now control scale-up and scale-down cooldowns independently.
    • Range-based scaling: metric_min and metric_max define bounds for a metric; autoscaling adjusts pod count relative to that range.
    • Scaling throttles: New scale_up_throttle and scale_down_throttle options limit how quickly scale adjustments are made (as a percentage).
    • Tolerance window: tolerance_up and tolerance_down define a dead zone around the target where no scaling is triggered.
  • Added an interactive help window to the hdx-scaler terminal UI. Improves usability for users managing scaling settings from the TUI.

    • Press h to open the help panel, which explains available configuration fields.
    • Press ESC or q to close it.
  • The hdx-scaler service now exposes detailed Prometheus metrics to improve the observability of autoscaling behavior.

    These metrics include:

    • hdxscaler_total_scalers: The total number of autoscalers running
    • hdxscaler_ratio: The calculated ratio based on abs(normalized metric - normalized target) if using Metric Range mode or target metric / observed metric if using Metric Target mode
    • hdxscaler_current_replicas: The current number of replicas
    • hdxscaler_target_count: The number of targets the measured value is being averaged from
    • hdxscaler_measured_value: The measured average value of the target group metrics
    • hdxscaler_desired_replicas: The calculated number of replicas to scale to before applying any bounds checks, sensitizing, or throttling
    • hdxscaler_bounded_replicas: What desired replicas are set to after applying all bounds checks, sensitizing, and throttling
    • hdxscaler_normalized_metric: What the measured value is normalized to if using Metric Range as the scaling mode
    • hdxscaler_normalized_target: What the target value is normalized to if using Metric Range as the scaling mode
    • hdxscaler_delta: The difference between the normalized metric and normalized target, used in Metric Range mode
    • hdxscaler_sensitivity_calc: The value calculated by the sensitizer, used in Metric Range scaling mode to calculated the desired replicas
    • hdxscaler_throttle_up_calc: If scaling up, the max number of pods to scale up to, will be used instead of desired replicas if smaller
    • hdxscaler_throttle_down_calc: If scaling down, the number of pods to scale down by, will be used if larger than desired replicas

    Each metric (except hdxscaler_total_scalers) has the following labels:

    • deployment: the Deployment being scaled
    • alias: if that deployment has an alias, i.e. intake-head, alias="stream-head"
    • app: the service or pool name being scraped for metrics to watch
    • title: The name for this autoscaler which includes deployment name and metric / metric labels that are being used for scale calculations
  • HDX Scaler now supports loading its config from a Kubernetes ConfigMap using the CONFIG_MODE=k8s environment variable.

    • Faster config changes
    • Default remains unchanged
    • Improves deployment stability
  • HDX Scaler now ignores services when the scale_off:true tunable is set. This prevents accidental restarts of pods that should be scaled off.

    • To fully shut down the cluster, HDX Scaler must be scaled to zero manually.
  • HDX Scaler now supports loading its config from a Kubernetes ConfigMap using the CONFIG_MODE=k8s environment variable.

    • Faster config changes
    • Default remains unchanged
    • Improves deployment stability
  • HDX Scaler now ignores services when the scale_off:true tunable is set. This prevents accidental restarts of pods that should be scaled off.

    • To fully shut down the cluster, HDX Scaler must be scaled to zero manually.
  • Added regular expressions (regex) for header and query-based dynamic ingest routing. To enable regex matching, prefix the value with regex|. See the example below:

    routing:
      headers:
        x-hdx-table: regex|staging-project-(alpha|beta|gamma)
        x-hdx-transform: shared-staging-transform
      query_params:
        table: regex|customer_[0-9]+
        transform: tenant-transform
    
  • Quesma can now be exposed externally to operate with an existing Kibana deployment using the enable_public_access tunable. See Enable public access to Quesma for more information.

  • Gunicorn will now scale up async workers in accordance with the number of CPUs available to the hdx-traefik-auth container, saving administrators time when adding or removing resources from Traefik. This behavior is overrideable using the hdx_traefik_auth_workers tunable.

  • Improved how email is handled during cluster creation and password resets, especially for customer-deployed environments.

    • Cluster creation emails are now only sent to ADMIN_EMAIL (if set). If not set, no email is sent.
    • Prevented all emails (invites, access codes, password resets) from being sent to CI_USER_EMAIL (e.g. [email protected] or [email protected]).
    • Invite logic now matches password reset logic for email suppression.
    • Added support for custom SMTP configuration to allow customer-managed delivery.
  • Added support for updating the patch-level of third party software in internal images. Added patch_date tunable.

Intake and Merge

  • Added support to the Vector software inside the cluster allowing specification of Bearer tokens to accompany messages sent to logs_sink_remote endpoints. This facilitates the use of service accounts to send logs to remote endpoints.
  • Support for new ip and uuid datatypes has been added. See Support for new ip and uuid datatypes for more information.
  • Removed the Serialize derivation from objects in the common crate, reducing redundancy in the code.
  • Added a new kafka_sasl_plain credential type for use with Kafka ingest. The kafka-peer can now authenticate with SASL_SSL using username and password credentials.

Query

  • Replaced the use of min_timestamp and max_timestamp in catalog queries to use a more specific SQL condition. This prevents contradictory conditions from fetching any partitions. (For example, WHERE primary < timestamp AND primary > timestamp should return no results)
  • Fixed incorrect table name in log messages like the following: db='{db_name}' Storage='TurbineStorage' removed (TurbineStorage being incorrect)
  • Columns in the GROUP BY clause in summary table SQL may now be removed from the summary table SQL. This allows a high-cardinality column to be removed from a summary table without dropping and re-creating the summary table.
  • Support for new ip and uuid datatypes has been added. See Support for new ip and uuid datatypes for more information.

Security

  • Set a HYDROLIX_TOKEN cookie using API using the attributes secure, httponly, and samesite. Use /users/current API endpoint to determine expired tokens and clear cookies.
  • Support for row-level access control. See Notable new features for details.

UI

  • Support for row-level access control. See Notable new features for details.
  • The UI's browser tab title is now set to the cluster hostname to ease the managment of multiple clusters.
  • Added a "Column Management" sidebar to the UI in Advanced Options. This feature is only available for non-summary tables.
    • View and edit current and past column names
    • Optionally set an alias as the current display name
    • Add new aliases to existing columns

Bug Fixes

Config API

  • The add_names endpoint now adds column names, rather than returning an HTTP 500 error.
  • Pools-related RBAC permissions are now checked properly so only authorized users can edit resource pools in the API and UI.

Intake and Merge

  • Added the ability to split merge target bounds into smaller chunks. This is an attempt to address an issue with slow merges for late-arriving data in Era 3.
  • The active field in transform is now optional.
  • Support for new ip and uuid datatypes has been added.
  • The new merge controller used to expect strings for the min and max settings for field limits. It now expects integers.
  • The merge controller now properly handles null or empty shard_key columns in the catalog.
  • Reattached the duplicate_partitions metric, which was unintentionally disconnected when the AdaptivePartitionSource abstraction was introduced. The metric now tracks duplicate partitions during sourcing and consistently updates in telemetry.
  • Changed a misleading WARNING message in intake-head to INFO during rejector startup. This reduces noise in logs and prevents confusion during troubleshooting.
    No functional changes or documentation impact.
  • Added a safeguard to prevent a rare buffer overrun panic in the custom CSV reader used by intake-head.
    • The panic was triggered by an out-of-bounds write during CSV ingestion, likely due to a misaligned buffer size and input row length.
    • A pre-write check was added to grow the destination buffer as needed.
    • The patch does not fix the root cause of the excessive buffer size, but avoids the crash and allows the ingestion to recover gracefully.
    • Also improved support for custom-sized buffer requests by configuring bufio.Scanner to handle larger token lengths as needed.

Cluster Operations

  • hdx-scaler now recognizes its configuration settings.
  • Fixed the install for hdx-scaler, putting it in /usr/local/bin/ where it's on the system $PATH.
  • The new cluster login invitation e-mail now give the user the correct URL to log into the cluster.
  • The ACME init job no longer performs a separate, unneeded DNS resolution check before attempting certificate issuance. This resolves issues where DNS records existed but pods couldn’t see them due to stale cache.
    • Removed the standalone DNS check from the init-acme container.
    • Consolidated route verification into the start-lego script using HTTP-based validation.
    • Mounted the acme-account secret in init-acme to enable reuse of existing account data.
    • Restructured the ACME logic to be more modular and resilient for both job and cronjob execution.

UI

  • Fixed a bug with disappearing data in the Transform SQL field.
  • Updated the total volume, compression ratio and compression percent calculations for table details used in UI analysis to correctly use raw_size instead of mem_size.
  • The Hydrolix UI no longer relies on HYDROLIX_USER_ID and HYDROLIX_ORGANIZATION_ID cookies. Instead, session continuity uses only HYDROLIX_TOKEN,
    with user details from the authenticated /current endpoint.
    This fixes an issue where the UI would fail to load properly if only the session token cookie was present.
  • Error messages for bad requests to alter/batch jobs are more descriptive.
  • Pages that don't use API pagination now show full lists of items.