HoneyHive versions four customer Helm charts independently:
hive-control-plane, hive-data-plane, honeyhive-clickhouse-keeper, and chi-installation. Entries on or after July 28, 2026, name the applicable chart. Earlier entries use one shared version for the self-hosting bundle. Releases with no customer-visible changes do not appear in this changelog. A chart version does not track the bundled software version. Check the chart’s appVersion for its software version.chi-installation v1.10.1
- Fixed the restore job failing to list a backup’s tables when
backup.image.tagis set to aclickhouse-backup2.8 release. The job now works with both the default2.6.33and 2.8 releases. - Fixed the restore job’s log including the
clickhouse-backupsidecar’s API username and password when listing a backup’s tables failed. These credentials are now redacted.
chi-installation v1.10.0
- New
restore.modeselects how the restore job treats existing tables.fill(default) never drops a table: it creates missing tables with the chart’s bootstrap scripts and attaches the backup’s data. Backups taken before and after the v1.8.1session_aggregateschange both restore into a current cluster, including a fresh cluster on ClickHouse 26.7 or later. restore.mode: replacedrops the backup’s tables on every replica, after checking that all replicas are reachable, then restores asfilldoes. Any other value fails at render time.- New
restore.allowNonEmpty(default:false). Infillmode the job stops before changing anything if a table already holds rows. Set it totrueonly when the tables do not already hold rows from the backup; otherwiseproject_event_details,session_aggregates, andevent_schemasare double-counted. - Before changing anything, the restore job checks that every ClickHouse pod is reachable and that no
clickhouse-backupsidecar runs in--watchmode (backup.schedule.watch, default:true). A watching sidecar blocks every restore action, so the job now fails immediately instead of waiting forever. - The restore job restores only the
defaultdatabase, which holds the chart’s tables. It resumes a restore action already running on the sidecar instead of starting a second one, and logs per-table row counts while it runs. - Fixed scheduled backups failing once new rows arrived after the v1.9.0 column conversion or after restoring an older backup. The conversion is metadata-only, so existing
session_aggregatesparts kept the oldinsertion_timetype, andclickhouse-backuprejects a table whose parts disagree. The init script and the restore job now rewrite those parts with a replicated background mutation, and the restore job waits for it to finish on every replica. - Fixed the
ClickHouseInstallationfailing to apply when neitherserver.service.labelsnorserver.service.annotationsis set, because its CRD rejected the empty service metadata. If you added a placeholder service label or annotation to work around this, you can remove it. - The restore job no longer drops and recreates existing tables by default. To keep the previous behavior, set
restore.mode: replace. - To run a restore: set
backup.schedule.watch: false, upgrade, and wait for the ClickHouse pods to restart. Then setrestore.enabled: trueand, if needed,restore.backupName(empty restores the latest backup),restore.mode, orrestore.allowNonEmpty, and upgrade. When the job completes, setrestore.enabled: falseandbackup.schedule.watch: true, and upgrade. - Action Required (only if your
session_aggregatestable predates v1.8.1 and a ClickHouse pod restarted on v1.9.0, or you restored an older backup on v1.9.0): scheduled backups keep failing until the old-type parts are rewritten.helm upgradedoes not restart ClickHouse pods, so after the upgrade restart one ClickHouse pod per shard to start the rewrite. - Otherwise, if you are not restoring, no action is required. Any remaining old-type
session_aggregatesparts are rewritten the next time a ClickHouse pod in each shard restarts.
hive-control-plane v1.12.0
- This release ships HoneyHive platform v1.18.0, up from v1.17.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.18.0. See the Product changelog for the platform changes. - The
cp-writer-serviceDeployment now setsOTEL_LOGS_EXPORTERfromcommon.observability.otel.logsExporter(default:"none"), ascp-backend-service,cp-notification-service, and the control plane jobs already do. It renders only whencommon.observability.otel.enabledistrue(default:true). With the default, writer logs are not exported. - If you already set
common.observability.otel.logsExporter: "otlp", the writer service also starts sending its logs tocommon.observability.otel.collectorEndpointafter the upgrade.
hive-data-plane v1.13.1
- This release ships HoneyHive platform v1.18.0, up from v1.17.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.18.0. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
chi-installation v1.9.0
- New optional
PrometheusRulenamedclickhouse-alertswith three ClickHouse Keeper alerts. Setprometheus.prometheusRule.enabled: trueto render it (default:false). It requires the Prometheus Operator CRDs. The resource carries the labelrelease: <prometheus.prometheusRule.release>(default:monitoring), which must match theruleSelectoron your Prometheus. ClickHouseReadonlyReplicafires when a replica is read-only, usually because its Keeper session did not re-establish (defaults:5m,critical).ClickHouseZooKeeperSessionLostfires when a pod that held a Keeper session in the last hour has none (defaults:5m,critical).ClickHouseZooKeeperHardwareExceptionsfires when Keeper connection errors rise by more than 5 in 10 minutes (defaults:0m,warning).- Configure each alert under
prometheus.prometheusRule.rules.<name>withenabled,for, andseverity. The names arereadonlyReplica,zooKeeperSessionLost, andzooKeeperHardwareExceptions. The alerts overlap with Altinity’s upstream alert manifests, so enable only one set. - Fixed a replica that starts on an empty volume crash-looping with
Code: 122when the cluster’ssession_aggregatestable predates v1.8.1. This covers a replica rebuilt after volume loss and a replica added by raisingserver.replica_count. The init script now creates the table with theinsertion_timetype that ClickHouse Keeper already records. - The init script converts a pre-v1.8.1
insertion_timecolumn toSimpleAggregateFunction(max, DateTime64(3)). The conversion runs once, is metadata-only, and replicates to the other replicas in the shard. If two replicas convert at the same time, one logsCode: 517and continues to start. - This corrects the v1.8.1 note, which said no action was required. Under v1.8.1, a replica that starts on an empty volume crash-loops in the case above. Upgrade to v1.9.0 before you rebuild or add replicas.
- Action Required (only if a replica already crash-loops with
Code: 122): upgrade to v1.9.0, then delete that replica’s pod. helm upgradedoes not restart ClickHouse pods. Existing tables convert the next time a ClickHouse pod in each shard restarts. Until then, a rebuilt or added replica still starts, because v1.9.0 creates the table with the column type ClickHouse Keeper records. To convert immediately, restart one ClickHouse pod per shard.
hive-control-plane v1.11.3
- This release ships HoneyHive platform v1.17.0, up from v1.16.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.17.0. See the Product changelog for the platform changes. - The default nginx sidecar image tag
common.nginxSidecar.image.tagchanges from1.27-alpineto1.30-alpine(repositorynginxinc/nginx-unprivileged). This affects only services with the sidecar enabled throughcommon.nginxSidecar.enabled(default:false) or a per-servicenginxSidecar.enabled. Their pods restart onto the new image during the upgrade. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-data-plane v1.13.0
- This release ships HoneyHive platform v1.17.0, up from v1.16.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.17.0. See the Product changelog for the platform changes. - The default nginx sidecar image tag
common.nginxSidecar.image.tagchanges from1.27-alpineto1.30-alpine(repositorynginxinc/nginx-unprivileged). This affects only services with the sidecar enabled throughcommon.nginxSidecar.enabled(default:false) or a per-servicenginxSidecar.enabled. Their pods restart onto the new image during the upgrade. - New opt-in
jobs.sessionDeletionCronJob (session-deletion-dp) processes session deletion requests. Each run deletes the queued sessions’ blob store objects and Redis cache entries, has the control plane hide the sessions, and purges them from ClickHouse once a day. Runs exit quickly when the queue is empty. It renders only when bothjobs.enabledandjobs.sessionDeletion.enabledaretrue, and both default tofalse. It runs on the sharedjobs.imagewithconcurrencyPolicy: Forbidand usesjobs.serviceAccount. jobs.sessionDeletion.scheduledefaults to"*/15 * * * *". Run it at least hourly: the ClickHouse purge runs duringjobs.sessionDeletion.purgeHourUtc(UTC hour 0..23, job default8), and a slower schedule delays the purge until the job’s overdue catch-up runs it outside that hour.jobs.sessionDeletion.jobTimeoutMsdefaults to"900000". It must stay belowjobs.sessionDeletion.staleClaimMs(job default1800000), or the job refuses to start. Keep it above600000(10 minutes) to leave room for the job’s worst-case startup time.- Other settings and defaults:
jobs.sessionDeletion.activeDeadlineSeconds(1200),backoffLimit(0),startingDeadlineSeconds(600),batchSize(job default100, range 1..1000),objectConcurrency(job default8), andenv([], extra env vars merged after the built-in env). - When the job is enabled, rendering fails if any of
jobs.image.repository,common.region,common.blobStore.bucket,common.controlPlane.apiPublicUrl, orcommon.encryption.keyIdis unset. Rendering also fails unlessactiveDeadlineSeconds × 1000exceeds(backoffLimit + 1) × jobTimeoutMs + 60000. - The
dp-backend-serviceDeployment now setsSESSION_DELETION_ENABLED:"true"only when bothjobs.enabledandjobs.sessionDeletion.enabledaretrue, and"false"otherwise. With the defaults, the data plane API rejects new session deletion requests with a501error (Session deletion is not enabled on this data plane). - To serve session deletion requests: in the IAM role set in
jobs.serviceAccount.roleArn(set one if the value is empty), grants3:DeleteObjecton the blob store bucket, and allow the role to use thecommon.encryption.keyIdkey if you use KMS encryption. Make sure the required values above are set, then set bothjobs.enabled: trueandjobs.sessionDeletion.enabled: trueand runhelm upgrade.
hive-control-plane v1.11.2
- This release ships HoneyHive platform v1.16.0, up from v1.15.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.16.0. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-data-plane v1.12.0
- This release ships HoneyHive platform v1.16.0, up from v1.15.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.16.0. See the Product changelog for the platform changes, including Python evaluators now running on Python 3.14. - New optional
dpLlmproxyService.bedrockApplicationInferenceProfilesmap (default:{}) routes Bedrock models through AWS Bedrock application inference profiles. Use it when your AWS account allows Bedrock calls only through application inference profiles. Keys are Bedrock catalog model IDs (for example,anthropic.claude-sonnet-4-5-20250929-v1:0), and values are application inference profile ARNs (arn:aws:bedrock:<region>:<account-id>:application-inference-profile/<profile-id>). - The map takes effect only when
dp-llmproxy-serviceruns withDISABLE_SECRETS=true, set throughdpLlmproxyService.env. That setting applies to every provider: the service stops using provider keys saved in HoneyHive and calls Bedrock with the deployment’s own AWS credentials. Don’t turn it on just for this map if your workspaces rely on saved provider keys. - Once the map has at least one valid entry, requests for Bedrock models missing from it fail with a
400error (application_inference_profile_not_configured). Entries whose value is not an application inference profile ARN are ignored, and the service logs a warning. - Requests that use a profile go to the AWS region in the profile ARN, which overrides
common.regionanddpLlmproxyService.assumedRole.region. - With the default empty map, the rendered Deployment and the service’s behavior are unchanged. No configuration or template migration is required.
hive-control-plane v1.11.1
- This release ships HoneyHive platform v1.15.0, up from v1.14.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.15.0. See the Product changelog for the platform changes. - The top-level
licenseblock accepts a new optionallicense.license_policy.controlplane_admin_sso_group. Set it to an identity provider group name to grant control plane admin access to that group’s members. It is matched against the claim named bylicense.license_policy.sso_group_fieldand replaces the built-in admin entitlement groups. It requireslicense.license_policy.sso_group_scheme: entitlement-roles-2026-8and cannot be combined withlicense.license_policy.controlplane_admin_emails. A license that breaks either rule stops cp-backend-service from starting. Licenses that set neither field are unaffected. - No template migration is required.
- Action Required (only if your license sets
license.license_policy.sso_group_scheme: entitlement-roles-2026-8andlicense.license_policy.controlplane_admin_emails): reviewcontrolplane_admin_emailsbefore you upgrade and remove stale entries. After the upgrade, every listed address and wildcard pattern keeps control plane admin access after sign-in.
hive-data-plane v1.11.1
- This release ships HoneyHive platform v1.15.0, up from v1.14.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.15.0. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-control-plane v1.11.0
- This release ships HoneyHive platform v1.14.0, up from v1.13.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.14.0. See the Product changelog for the platform changes. - New opt-in
jobs.postgresCleanupCronJob deletes expired auth sessions from the control-plane Postgres database. It renders only when bothjobs.enabled(default:true) andjobs.postgresCleanup.enabled(default:false) aretrue, so nothing new is deployed unless you turn it on. It runs on the sharedjobs.imagewithconcurrencyPolicy: Forbidand deletes in batches. - The schedule, retention, batching, and
dryRunsettings, with their defaults, are underjobs.postgresCleanupinhive-control-plane/values.yaml. - When the job metrics exporter is enabled (
jobs.statsdExporter.enabled), it also exposes the cleanup job’shh_postgres_cleanup_task_duration_secondshistogram. - Graceful shutdown for every control-plane Deployment (
cp-backend-service,cp-controller-service,cp-frontend-service,cp-notification-service,cp-writer-service): each application container now has apreStophook that waits 10 seconds before the container receivesSIGTERM, so the pod is removed from Service endpoints and ingress before it stops accepting connections. When the nginx sidecar is enabled (common.nginxSidecar.enabledor<service>.nginxSidecar.enabled, default:false), the sidecar gets the same 10-second wait. - The pods also set
terminationGracePeriodSecondsexplicitly:40forcp-writer-serviceand30(the Kubernetes default) for the others. These values are fixed in the templates and are not configurable. Pods take about 10 seconds longer to terminate during rollouts, scale-downs, and node drains. - Action Required (only if your cluster runs Kubernetes older than 1.30): upgrade the cluster to Kubernetes 1.30 or later before you upgrade to this chart version. The
preStophooks use the native Kubernetessleeplifecycle action, which older API servers reject, so the Deployments fail to apply.
hive-data-plane v1.11.0
- This release ships HoneyHive platform v1.14.0, up from v1.13.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.14.0. See the Product changelog for the platform changes. - Graceful shutdown for every data-plane Deployment (
dp-backend-service,dp-controller-service,dp-evaluation-service,dp-ingestion-service,dp-llmproxy-service,dp-pythonmetric-service): each application container now has apreStophook that waits 10 seconds before the container receivesSIGTERM, so the pod is removed from Service endpoints and ingress before it stops accepting connections. When the nginx sidecar is enabled (common.nginxSidecar.enabledor<service>.nginxSidecar.enabled, default:false), the sidecar gets the same 10-second wait. - The pods also set
terminationGracePeriodSecondsexplicitly:190fordp-evaluation-serviceanddp-llmproxy-service,70fordp-ingestion-service, and30(the Kubernetes default) for the others. Fordp-llmproxy-service, 190 seconds covers the 10-second wait plus the 180-second LLM request timeout, so rollouts no longer cut off in-flight LLM requests. These values are fixed in the templates and are not configurable. Pods take at least 10 seconds longer to terminate during rollouts, scale-downs, and node drains, and up to the full grace period while they finish in-flight requests. - When the nginx sidecar is enabled for
dp-llmproxy-service, itsproxy_read_timeoutandproxy_send_timeoutare now fixed at180sto match the LLM request timeout.common.nginxSidecar.proxyReadTimeoutandcommon.nginxSidecar.proxySendTimeout(default:300s) no longer apply todp-llmproxy-service, but still apply to every other data-plane sidecar. - Action Required (only if your cluster runs Kubernetes older than 1.30): upgrade the cluster to Kubernetes 1.30 or later before you upgrade to this chart version. The
preStophooks use the native Kubernetessleeplifecycle action, which older API servers reject, so the Deployments fail to apply.
hive-control-plane v1.10.3
- This release ships HoneyHive platform v1.13.0, up from v1.12.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.13.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-data-plane v1.10.0
- This release ships HoneyHive platform v1.13.0, up from v1.12.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.13.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-control-plane v1.10.2
- This release ships HoneyHive platform v1.12.0, up from v1.11.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.12.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-data-plane v1.9.3
- This release ships HoneyHive platform v1.12.0, up from v1.11.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.12.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - No configuration or template migration is required. A standard
helm upgraderolls the pods that use the chart defaults.
hive-control-plane v1.10.1
- This release ships HoneyHive platform v1.11.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.11.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - cp-backend-service now always reads its license from a file. The license ConfigMap (
hive-control-plane-license-config, or<nameOverride>-license-configif you setnameOverride) is rendered on every install from the top-levellicenseblock, mounted read-only at/var/hh, and the container always setsLICENSE_PATH=/var/hh/license.yaml. Previously the ConfigMap, its volume, and the mount were rendered only whenlicensewas non-empty, and cp-backend-service otherwise received aLICENSEenvironment variable taken fromcommon.license. licenseinvalues.yamlnow ships a complete, renderable example instead of an entirely commented-out block:title,version,description,license_id,license_type: selfhost, andlicense_policy: {}(withlicense_policy.controlplane_admin_emailsshown as a commented example). The shipped values are placeholders so a default render succeeds; replace the whole block, in particularlicense_id, with the license HoneyHive issued for your deployment before you install or upgrade.common.licenseis no longer read by any template, so setting it has no effect. The key is still accepted so existing values files keep rendering, and it will be removed in a future release.- Every PodDisruptionBudget the chart renders (cp-backend, cp-controller, cp-frontend, cp-notification, and cp-writer, each behind
<service>.pdb.enabled, default:false) now setsunhealthyPodEvictionPolicy: AlwaysAllow. Pods that are running but notReadycan then be evicted even while the budget is already at its limit, so a node drain or cluster upgrade is no longer blocked by a pod that is itself unhealthy. Healthy pods stay protected bypdb.minAvailable/pdb.maxUnavailableexactly as before. Kubernetes 1.27 and later honor the field; earlier API servers ignore it. No values change is required. - Job and CronJob containers (both alert-transition CronJobs, the post-deploy alert-transition Job, and the legacy federated migration Job) now set
HOST_IPfrom the pod’sstatus.hostIPwhenevercommon.observability.otel.enabledistrue(the default), declared ahead ofOTEL_EXPORTER_OTLP_ENDPOINT. This makes it possible to pointcommon.observability.otel.collectorEndpoint(default:http://otel-collector.opentelemetry-system.svc.cluster.local:4317) at a node-local collector withhttp://$(HOST_IP):4317. Kubernetes substitutes the reference only whenHOST_IPis defined earlier in the same container, so such an endpoint previously reached these jobs as a literal string and their telemetry was dropped. Endpoints that do not use$(HOST_IP)are unaffected. Service Deployments are unchanged and do not defineHOST_IP. - Action Required (unless you already populate the top-level
licenseblock): before upgrading, put the license HoneyHive issued for your deployment in the top-levellicenseblock (title,version,description,license_id,license_type, and anylicense_policyentries such ascontrolplane_admin_emails), and deletecommon.licensefrom your values, which is now ignored. Thelicenseblock ships placeholder content rather than being empty, so an upgrade that leaves it unset starts cp-backend-service against the placeholder instead of failing: the control plane comes up, but under a placeholderlicense_idand with nocontrolplane_admin_emails, so no user is granted controlplane admin permissions and nothing reports an error. Check this explicitly rather than waiting for a failure.
hive-data-plane v1.9.2
- This release ships HoneyHive platform v1.11.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.11.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - Every PodDisruptionBudget the chart renders (dp-backend, dp-controller, dp-evaluation, dp-ingestion, dp-llmproxy, and dp-pythonmetric, each behind
<service>.pdb.enabled, default:false, exceptdpControllerService.pdb.enabled, which istrue) now setsunhealthyPodEvictionPolicy: AlwaysAllow. Pods that are running but notReadycan then be evicted even while the budget is already at its limit, so a node drain or cluster upgrade is no longer blocked by a pod that is itself unhealthy. Healthy pods stay protected bypdb.minAvailable/pdb.maxUnavailableexactly as before. Kubernetes 1.27 and later honor the field; earlier API servers ignore it. No values change is required. - Job containers (the S3 time-window backfill Job,
jobs.s3TimeWindowBackfill.enabled, and the legacy federated migration Job,jobs.legacyFederatedMigration.enabled) now setHOST_IPfrom the pod’sstatus.hostIPwhenevercommon.observability.otel.enabledistrue(the default), declared ahead ofOTEL_EXPORTER_OTLP_ENDPOINT. This makes it possible to pointcommon.observability.otel.collectorEndpoint(default:otel-collector.opentelemetry-system.svc.cluster.local:4317) at a node-local collector with$(HOST_IP):4317. Kubernetes substitutes the reference only whenHOST_IPis defined earlier in the same container, so such an endpoint previously reached these jobs as a literal string and their telemetry was dropped. Endpoints that do not use$(HOST_IP)are unaffected. Service Deployments are unchanged and do not defineHOST_IP.
hive-control-plane v1.10.0
- This release ships HoneyHive platform v1.10.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.10.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - New
cpFrontendService.providersConfigMapserves your own AI provider catalog in place of the one bundled in the frontend image. Use it to restrict which providers and models appear in the UI, or to add a provider the bundled catalog omits. - New
cpFrontendService.providersConfigMap.enabled(default:false). Whenfalse, nothing is rendered and the bundled catalog is served, so existing installs are unchanged. - New
cpFrontendService.providersConfigMap.providers(default:[]) holds provider entries in the same schema as the bundled catalog. An empty list falls back to the bundled catalog. - When enabled, the chart renders a ConfigMap named
<cpFrontendService.name>-providers-config(default:cp-frontend-service-providers-config) and mounts it read-only into the frontend container asproviders-config.yamlunder the app’spublicdirectory. The frontend prefers that file over the bundled catalog. - The frontend Deployment gains a
checksum/providers-configpod annotation derived fromcpFrontendService.providersConfigMap, so editing the catalog rolls the frontend pods. This is required: the mount is asubPath, which the kubelet never refreshes in place, and the frontend reads itspublicfile list once at startup. - Setting
providerswhile leavingenabled: falsenow fails rendering with an explicit message instead of silently discarding your catalog. - Two things to know when authoring entries. A provider whose credentials come from the pod’s IAM role rather than from stored secrets must mark those secret keys
required: false, or the UI treats the provider as unconfigured and hides its models. The catalog is served from the frontend’s public directory, so name credential keys only, never credential values, which operators enter in the UI and which are stored server-side.
hive-data-plane v1.9.1
- This release ships HoneyHive platform v1.10.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.10.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - This release makes it possible to run two data planes in one Kubernetes cluster. Values that previously hard-coded a single plane’s identity are now configurable, and the objects the chart renders now all land in
global.namespace. Single-plane installs that leaveglobal.namespaceat its default see no change beyond the image pin. - New
serviceMonitor.namePrefix(default:"") is prepended to the name andapplabel of every ServiceMonitor the chart renders. ServiceMonitors are created in the sharedserviceMonitor.namespace(default:monitoring) rather than in the plane’s own namespace, so their names are the only thing separating two planes. Leave it empty for a single plane; give each additional plane its own prefix. - New
ingress.alb.groupName(default:data-plane-alb, the previously hard-coded value) sets thealb.ingress.kubernetes.io/group.nameannotation on every data-plane ALB Ingress. The AWS Load Balancer Controller treats this name as cluster-wide, so two planes sharing it merge into one ALB. A distinct value provisions a separate ALB with its own DNS name, which then needs its own DNS record and its own ACM certificate; neither is created by this chart. The per-Ingressgroup.ordervalues are unchanged; they order rules within a group, and separate groups do not contend. - Every
common.serviceUrls.*entry (dpBackendService,ingestionService,evaluationService,pythonMetricService,llmProxyService,dpController) now defaults to""instead of a literalhttp://<service>.data-plane.svc.cluster.local:<port>URL. When an entry is empty, the chart derives the URL from that service’s own name, port, andglobal.namespace, so inter-service traffic follows the namespace you install into. A non-empty entry still wins verbatim, which is what mesh gateways and egress proxies rely on. If you set these values explicitly, note that they are namespace-specific: reusing them for a second plane points that plane’s traffic at the first one without any error. - Every object the chart renders now sets
metadata.namespacefromglobal.namespace(default:data-plane) rather than inheriting the release namespace. This affects the dp-backend, dp-llmproxy, and dp-pythonmetric ServiceAccounts and the JetStreamevaluation-streamStream andevaluation-consumerConsumer; other objects already set it.global.namespacenow decides on its own where an install lands. dpControllerService.pdbnow rendersmaxUnavailable: 1instead ofminAvailable: 1. At the defaultdpControllerService.replicas: 1,minAvailable: 1permitted zero voluntary disruptions, so the API rejected evictions of the controller pod and node drains (cluster upgrades, node consolidation, node-termination handling) never completed.maxUnavailable: 1accepts a brief controller outage while the pod reschedules, and becomes a real budget once the service runs multiple replicas.minAvailableis commented out invalues.yaml; it takes precedence overmaxUnavailablewhen set, so leave it unset whilereplicasis1.common.dataplane.id(default:dp-prod),common.blobStore.bucket,common.encryption.keyId, andingress.tls.hostsare per-plane values, not per-environment ones. A second plane that inherits them registers with the control plane as the first plane, writes to the first plane’s bucket, encrypts under the first plane’s key, or requests the first plane’s certificate, none of which collide at the object level or report unhealthy. Only the documentation changed here; the defaults are the same.- Fixed ServiceAccounts rendering the
eks.amazonaws.com/role-arnannotation with a null value when the corresponding<service>.serviceAccount.roleArnis empty. The annotation is now omitted entirely, so leavingroleArnunset, for example on a plane that does not use IAM Roles for Service Accounts, produces a clean ServiceAccount. - Action Required (only if your release namespace differs from
global.namespace): before upgrading, reconcile the two, either by installing into the namespace named byglobal.namespaceor by settingglobal.namespaceto your current release namespace. The JetStreamevaluation-streamStream andevaluation-consumerConsumer previously inherited the release namespace and now render intoglobal.namespace. Helm identifies a resource by kind, namespace, and name, so it deletes the old objects and creates new ones; the NATS controller’s finalizer removes the underlying JetStream stream and its durable consumer as part of that deletion, dropping in-flight evaluation messages. Nothing fails loudly if you skip this, so check it explicitly. Installs where the two already match, the normal case, are unaffected.
chi-installation v1.8.1
- Fixed fresh installs with empty ClickHouse volumes crash-looping on ClickHouse 26.7 and later. Creating the
session_aggregatestable failed withCode: 36 (BAD_ARGUMENTS), so the ClickHouse pods never started. New installations now get the corrected table schema automatically. - Only affects deployments that override the chart’s default ClickHouse image to 26.7 or later. Clusters on the chart defaults (
server.image.tagandrestore.image.tag, both25.7.3.13) were never affected. - No migration required. Existing deployments keep the previous table definition after
helm upgradewith no impact, and the table continues to read and write normally if you later upgrade the ClickHouse image to 26.7 or later.
hive-control-plane v1.9.0
- This release ships HoneyHive platform v1.9.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.9.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - New
common.containerSecurityContextapplies a hardened containersecurityContextto every HoneyHive service, init, and job container. Defaults:allowPrivilegeEscalation: false,runAsNonRoot: true,runAsUser: 65532,runAsGroup: 65532,readOnlyRootFilesystem: true,capabilities.drop: [ALL], andseccompProfile.type: RuntimeDefault. The HoneyHive images run as UID 65532 and write nothing to their own filesystem, so no scratch volume is needed (cp-frontend-service’s Next.js cache already has its ownemptyDir). - New per-workload overrides via
<service>.containerSecurityContext, for examplecpBackendService.containerSecurityContext,cpFrontendService.containerSecurityContext,jobs.containerSecurityContext, andjobs.statsdExporter.containerSecurityContext. Keys merge one at a time and the per-service value wins, so you can relax a single field (for examplereadOnlyRootFilesystem: false) without restating the whole map. Settingcommon.containerSecurityContext: {}with no per-service override renders no containersecurityContextat all. - Every ServiceAccount the chart creates (cp-backend, cp-controller, cp-frontend, cp-notification, cp-writer, and the shared jobs ServiceAccount) now sets
automountServiceAccountToken: false, and the statsd exporter Deployment sets the same field on its pod spec. Pods no longer receive the default Kubernetes API credential at/var/run/secrets/kubernetes.io/serviceaccount. No HoneyHive workload calls the Kubernetes API, and IAM Roles for Service Accounts is unaffected because the EKS webhook injects its own projected token volume. - Every workload now sets both
AWS_REGIONandAWS_DEFAULT_REGIONfromcommon.region(default:us-west-2), instead of only some containers settingAWS_REGION. This stops AWS SDKs, in particular Python’s botocore/boto3, which ignoresAWS_REGION, from falling back to the instance metadata service to discover a region. Ifcommon.regionis overridden to an empty string, neither variable is rendered at all (previously an emptyAWS_REGIONwas rendered on some workloads and treated by the SDKs as a real, invalid region), which leaves the SDKs’ normal region resolution intact. - The nginx sidecar security context (
common.nginxSidecar.securityContext) now also setsseccompProfile.type: RuntimeDefault. - Fixed alert notification emails omitting their dashboard, alert, and alert-settings links. cp-notification-service now receives
FRONTEND_PUBLIC_URLfromcommon.auth.frontendPublicUrl, which is already required for login (default:""). If it is unset, emails still send but their links remain omitted. - Action Required (only if you have added a sidecar or a mutating webhook to these pods that relies on the automounted Kubernetes API token): mount it explicitly with a
serviceAccountTokenprojected volume.
hive-data-plane v1.9.0
- This release ships HoneyHive platform v1.9.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.9.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - New
common.containerSecurityContextapplies a hardened containersecurityContextto every HoneyHive service, init, and job container. Defaults:allowPrivilegeEscalation: false,runAsNonRoot: true,runAsUser: 65532,runAsGroup: 65532,readOnlyRootFilesystem: true,capabilities.drop: [ALL], andseccompProfile.type: RuntimeDefault. The HoneyHive images run as UID 65532 and write nothing to their own filesystem, with one exception handled by the chart: dp-pythonmetric-service now mounts anemptyDirat/tmpfor gunicorn’s worker heartbeat files and the Prometheus multiprocess registry. - New per-workload overrides via
<service>.containerSecurityContext, for exampledpBackendService.containerSecurityContext,dpPythonmetricService.containerSecurityContext, andjobs.containerSecurityContext(covers the S3 time-window backfill Job and the legacy federated migration Job). Theprepare-certsinit container inherits the security context of the service it runs in, so override it underdpLlmproxyService.containerSecurityContextordpPythonmetricService.containerSecurityContext. Per-service keys merge into the global map one key at a time and win on conflict, so you can relax a single field (for examplereadOnlyRootFilesystem: false) without restating the whole map. Settingcommon.containerSecurityContext: {}with no per-service override renders no containersecurityContextat all. - Every ServiceAccount the chart creates (dp-backend, dp-controller, dp-evaluation, dp-ingestion, dp-llmproxy, dp-pythonmetric, and the shared jobs ServiceAccount) now sets
automountServiceAccountToken: false. Pods no longer receive the default Kubernetes API credential at/var/run/secrets/kubernetes.io/serviceaccount. No HoneyHive workload calls the Kubernetes API, and IAM Roles for Service Accounts is unaffected because the EKS webhook injects its own projected token volume. - Every workload, including all jobs, now sets both
AWS_REGIONandAWS_DEFAULT_REGIONfromcommon.region(default:us-west-2), instead of only some containers settingAWS_REGION. This stops AWS SDKs, in particular Python’s botocore/boto3, which ignoresAWS_REGION, from falling back to the instance metadata service to discover a region. Ifcommon.regionis overridden to an empty string, neither variable is rendered at all (previously an emptyAWS_REGIONwas rendered on some workloads and treated by the SDKs as a real, invalid region), which leaves the SDKs’ normal region resolution intact. - dp-pythonmetric-service no longer receives the Postgres connection URL, the
REDIS_MASTER_HOST/REDIS_REPLICAS_HOST/REDIS_MASTER_PORT/REDIS_REPLICAS_PORT/REDIS_PASSWORDvariables, or theHH_ENCRYPTION_KEY_ID/HH_ENCRYPTION_SECRETvariables. The service reads none of them, so it no longer depends on the Secrets named bycommon.externalSecrets.postgres,common.externalSecrets.redis, andcommon.externalSecrets.encryption; its pods now start even when those Secrets are absent. Other data-plane services still consume all three, so keepcommon.externalSecrets.*,redis.*, andcommon.encryption.*configured as before. No values change is required. - The nginx sidecar security context (
common.nginxSidecar.securityContext) now also setsseccompProfile.type: RuntimeDefault. - Fixed the
prepare-certsinit container that builds the merged CA bundle for dp-llmproxy-service and dp-pythonmetric-service whencommon.tls.caCertsis set. It no longer requires a shell orcatin the service image, so it works on shell-less (distroless) images where it previously failed immediately and blocked the pod from starting. It builds the same/certs/ca-bundle.pem(the image’s system trust store followed by each*.crtfrom yourcommon.tls.caCertsConfigMap, consumed viaSSL_CERT_FILEandREQUESTS_CA_BUNDLE) and now fails with a clear error if the image’s system CA bundle is missing rather than emitting a bundle without it. The init container also declares resources (requests:10mCPU /32Mimemory; limits:50mCPU /64Mimemory). Kubernetes schedules on the larger of the init container’s request and the app containers’ combined request, so at the chart’s default service requests your pods’ scheduling footprint does not change. - Action Required (only if you have added a sidecar or a mutating webhook to these pods that relies on the automounted Kubernetes API token): mount it explicitly with a
serviceAccountTokenprojected volume.
hive-control-plane v1.8.0
- This release ships HoneyHive platform v1.8.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-control-plane/values.yamlare nowv1.8.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - New
common.auth.scopes(unset by default) for additional space-separated OAuth scopes requested at login, rendered as theAUTH_SCOPESenv var on the frontend Deployment.openid email profileis always requested, so list only extra scopes. Leaving the key unset renders noAUTH_SCOPESvariable and preserves existing behavior. - Identity providers that scope access tokens per resource (for example Microsoft Entra ID) must also request the scope of the API exposed for this deployment; otherwise the access token is issued for the provider’s own API and fails verification. For Entra ID, set
common.auth.scopes: "api://<client-id>/access_as_user". - When
ingress.tls.enabled: true, the HTTP and gRPC ALB Ingress resources now carry thealb.ingress.kubernetes.io/ssl-policyannotation taken fromingress.tls.sslPolicy(default:ELBSecurityPolicy-TLS13-1-2-2021-06). These two listeners previously fell back to the AWS Load Balancer Controller’s default policy, so the negotiated TLS versions and ciphers may change on upgrade. - Every service and job container now sets
HH_SERVICE_NAMEto its service name, so structured logs keep their service name even whencommon.observability.otel.enabled: false. When OpenTelemetry is enabled,OTEL_SERVICE_NAMEstill takes precedence. No values change is required. - Fixed the
wait-for-cp-backendinit container of thecron-alert-transitions-long-range-on-deployJob. On job images without a shell, the init container failed immediately and the post-deploy job never ran. It now pollshttp://<cpBackendService.name>:<cpBackendService.port>/healthcheckfor up to 20 attempts with a 5s request timeout and 10s between attempts (about 290s). - Action Required (only if you override
ingress.tls.sslPolicyto an empty string): set it to a non-empty AWS policy name. With TLS enabled, an empty value now fails rendering withingress.tls.sslPolicy is required when ingress.tls.enabled is true. - Action Required (only if you raise
jobs.alertTransitionsLongRange.jobTimeoutMs, default:600000): raisejobs.alertTransitionsLongRange.activeDeadlineSeconds(default:900) by at least as much. The deadline runs from the Job’s start time and covers the backend wait; exceeding it fails the Job with no retry.
hive-data-plane v1.8.0
- This release ships HoneyHive platform v1.8.0. The chart’s
appVersionand the default HoneyHive workload and job image tags inhive-data-plane/values.yamlare nowv1.8.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - When
ingress.tls.enabled: true, every ALB Ingress rendered by the chart now carries thealb.ingress.kubernetes.io/ssl-policyannotation taken fromingress.tls.sslPolicy(default:ELBSecurityPolicy-TLS13-1-2-2021-06). These listeners previously fell back to the AWS Load Balancer Controller’s default policy, so the negotiated TLS versions and ciphers may change on upgrade. - Every service and job container now sets
HH_SERVICE_NAMEto its service name, so structured logs keep their service name even whencommon.observability.otel.enabled: false. When OpenTelemetry is enabled,OTEL_SERVICE_NAMEstill takes precedence. No values change is required. - Removed the Sentry Secret and the
secrets.sentryblock (secrets.sentry.enabled,secrets.sentry.dsns.*) fromhive-data-plane/values.yaml. The Secret was disabled by default and its contents were never consumed by any data-plane workload, so no data-plane service loses configuration. If you still setsecrets.sentry.*in your own values, the keys are now ignored and can be deleted. hive-data-plane/values.yamlnow documents supported keys that previously existed only in the templates, as commented-out entries with their defaults. Rendering behavior is unchanged; these keys already worked. Newly documented:nameOverride,fullnameOverride,global.labels,global.org,global.env,global.sregion,global.deployment,common.image.pullSecret,<service>.pdb.maxUnavailable,dpEvaluationService.resources,dpLlmproxyService.assumedRole(roleArn,roleSessionName,externalId,region),config, andsecrets.postgres.useExternalSecret/host/port/database/username.- Action Required (only if you override
ingress.tls.sslPolicyto an empty string): set it to a non-empty AWS policy name. With TLS enabled, an empty value now fails rendering withingress.tls.sslPolicy is required when ingress.tls.enabled is true.
chi-installation v1.8.0
- New opt-in coordination-aware readiness probe for the ClickHouse server container, configured under
server.readinessProbeinchi-installation/values.yaml. Whenserver.readinessProbe.useReplicaCheckistrue, the chart sets anexecreadiness probe that queriessystem.replicasand marks the pod unready while any replicated table in an application database is read-only or has lost its ClickHouse Keeper session. This catches degraded replicas that still answer/pingwith HTTP 200, so traffic is withheld until coordination recovers. ClickHouse’s ownsystem,information_schema, andINFORMATION_SCHEMAdatabases are excluded from the check. - New probe timing keys, applied only when
server.readinessProbe.useReplicaCheckis enabled:server.readinessProbe.initialDelaySeconds(default:30),server.readinessProbe.periodSeconds(default:10),server.readinessProbe.timeoutSeconds(default:5),server.readinessProbe.failureThreshold(default:3), andserver.readinessProbe.successThreshold(default:1). - No default behavior change:
server.readinessProbe.useReplicaCheckdefaults tofalse, in which case the chart sets noreadinessProbeon the ClickHouse container and the ClickHouse Operator continues to inject its own default/ping-based probe. Disabling the flag reverts to that operator default rather than turning readiness checking off, so a standardhelm upgraderequires no action. - Enabling the probe changes the ClickHouse container’s pod spec, so the ClickHouse pods roll on the next
helm upgrade. Schedule the upgrade accordingly. A pod that restores a backup fails the replica check until the restore completes, so it stays unready during the restore. Take this into account on clusters that perform in-place restores.
hive-control-plane v1.7.2
- This release ships HoneyHive platform v1.7.0. The chart’s
appVersionand default HoneyHive workload image tags inhive-control-plane/values.yamlare nowv1.7.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - A standard
helm upgraderolls the pods that use the chart defaults. No configuration or template migration is required.
hive-data-plane v1.7.2
- This release ships HoneyHive platform v1.7.0. The chart’s
appVersionand default HoneyHive workload image tags inhive-data-plane/values.yamlare nowv1.7.0. Third-party image tags are unchanged. See the Product changelog for the platform changes. - A standard
helm upgraderolls the pods that use the chart defaults. No configuration or template migration is required.
v1.6.3
- No customer-facing chart changes. The packaged
hive-control-planeandhive-data-planeservice charts (values.yaml,templates/, andChart.yaml) are unchanged, so a standardhelm upgraderequires no action.
v1.6.2
- New custom annotations on service Deployment metadata in
hive-control-planeandhive-data-plane. Setcommon.deploymentAnnotations(default:{}) to apply a map of annotations to every service Deployment’smetadata.annotations, or<service>.deploymentAnnotations(default:{}) for a single service, which merges over the common map with per-service keys winning on conflict. Useful for GitOps controllers, config-reloaders, cost-allocation, and similar Deployment-level integrations. Both default empty and render identically to before when unset, so a standardhelm upgraderequires no action. - New per-service resource overrides in
hive-control-plane/values.yamlandhive-data-plane/values.yaml. Each service can now set its ownresourcesblock (CPU/memory requests and limits) instead of sharingcommon.resources. Newly configurable:dpBackendService.resources,cpBackendService.resources,cpFrontendService.resources,cpWriterService.resources, andcpNotificationService.resources(each default:{}, falling back tocommon.resources). Set any in your values overlay to override only that service, e.g.dpBackendService.resources.limits.memory: 4Gi. No action required for a standard upgrade. - New file-based license configuration in
hive-control-plane. Set the structured license document issued by HoneyHive under the top-levellicensekey (default: empty, feature off when unset). When set, the chart renders it into a newhive-control-plane-license-configConfigMap, mounts it into the cp-backend pod at/var/hh/license.yaml, and points the backend at it via theLICENSE_PATHenv var. See the annotated example block inhive-control-plane/values.yamlfor the full structure (title,version,license_id,license_type, andlicense_policyholdingcontrolplane_admin_emailsand allowedidentity_providers). - Deprecated
common.license(the inline key injected as theLICENSEenv var) in favor oflicense. It still works, but only as a fallback whenlicenseis unset, and will be removed in a future release. Recommended (not required): move your license into the newlicenseblock and removecommon.license. Whilelicenseis set it takes precedence andcommon.licenseis ignored; iflicenseis left empty the chart falls back tocommon.license, so existing deployments keep working until you migrate.
v1.6.0
- No customer-facing chart changes. The packaged
hive-control-planeandhive-data-planeservice charts (values.yaml,templates/, andChart.yaml) are unchanged, so a standardhelm upgraderequires no action.
v1.5.0
- Documented dozens of previously-undeclared configuration knobs in
hive-control-plane/values.yaml(name overrides,global.*,common.*, cp-controller tuning, per-service PDB alternates, frontend TLS policy, and a legacy config block). These are surfaced as commented, render-neutral documentation; merged values are unchanged, so a standardhelm upgraderequires no action. - Fixed the cp-controller PodDisruptionBudget so setting
cpControllerService.pdb.minAvailableorcpControllerService.pdb.maxUnavailabletonullnow omits the field instead of rendering an invalid empty value.maxUnavailable: 0still works, and default values render identically to v1.4.1. - Removed a dead beekeeper Sentry DSN block from the control-plane secrets template (the beekeeper service was retired). Template-only change, applied automatically on
helm upgrade.
v1.4.1
- No customer-facing chart changes. The packaged
hive-control-planeandhive-data-planeservice charts are unchanged, so a standardhelm upgraderequires no action.
v1.4.0
- New optional generic ALB backend Service overrides in
hive-control-plane/values.yamlandhive-data-plane/values.yaml, letting you route individual ALB backends to a mesh gateway or customer-managed reverse proxy Service instead of the HoneyHive app Services. All disabled by default, so no action is required for a standard upgrade. - Control-plane override keys:
ingress.backendServices.http.*(HTTP backend),ingress.backendServices.grpc.*(gRPC backend), andfrontendIngress.backendService.*(frontend backend), each withenabled,name,port,protocol, andhealthcheck.*fields. - Data-plane override keys:
ingress.backendServices.ingestion.*,ingress.backendServices.backend.*, andingress.backendServices.controller.*. When any data-plane override is enabled, the chart splits the data-plane ALB rules into separate Ingress resources so each target class gets its own backend protocol and health check annotations. - Each configured Service must be in the same namespace as the rendered ALB Ingress. With the default
healthcheck.port: status-port, the gateway Service must expose a port namedstatus-port; otherwise overridehealthcheck.portto match the gateway Service. Example: setingress.backendServices.http.enabled: truewithname: cp-http-gatewayandport: 443. - New optional gzip-capable nginx sidecars for
hive-control-planeandhive-data-planeservice pods, controlled bycommon.nginxSidecar.enabled(default:false). When enabled, HTTP Service traffic targets the nginx sidecar, which proxies to the app container over localhost and gzip-compresses responses; gRPC and metrics ports are unchanged. - nginx sidecar tuning keys and defaults:
common.nginxSidecar.port(default:18080),common.nginxSidecar.image.repository(default:nginxinc/nginx-unprivileged),common.nginxSidecar.image.tag(default:1.27-alpine),common.nginxSidecar.proxyReadTimeoutandproxySendTimeout(default:300s),common.nginxSidecar.clientMaxBodySize(default:64m),common.nginxSidecar.workerProcesses(default:1),common.nginxSidecar.upstreamKeepalive(default:16),common.nginxSidecar.gzip.compLevel(default:5),common.nginxSidecar.gzip.minLength(default:1024), plusgzip.types,securityContext, andresources(requests 100m CPU / 128Mi memory, limits 500m CPU / 512Mi memory). The sidecar runs non-root with a read-only root filesystem and anemptyDirat/tmp. To enable, setcommon.nginxSidecar.enabled: truein each chart where compression is needed.
v1.3.0
- New configurable ClickHouse connection pool size for control-plane services in
hive-control-plane/values.yaml:cpBackendService.clickhouseMaxOpenConnections,cpWriterService.clickhouseMaxOpenConnections,cpControllerService.clickhouseMaxOpenConnections, andcpNotificationService.clickhouseMaxOpenConnections(all default:50). Each sets the service’sCLICKHOUSE_MAX_OPEN_CONNECTIONSenv var; previously the pool size was not configurable from Helm values. No action required for a standard upgrade; override any of these keys in your values overlay if a service needs a different pool size. - New data-plane ALB route for
/v1/tracesinhive-data-plane, which now forwards to ingestion alongside the existing ingestion routes. - Fixed method-aware data-plane ALB routing for overlapping
/v1event and session paths.POST /v1/events,POST /v1/events/batch,POST /v1/sessions,POST /v1/sessions/{session_id}/events/batch, andPUT /v1/events/{event_id}route to ingestion;GET /v1/events/{event_id}andGET /v1/sessions/{session_id}now fall through to the data-plane backend instead of being captured by broader ingestion prefix routes;PUTandOPTIONSto/v1/events/{event_id}/enrichroute to the data-plane backend from the primary ingress (the separate wildcard ingress was removed). Template-only change, applied automatically onhelm upgrade. - Action Required (data-plane ALB ingress only): before upgrading environments with
ingress.enabled: truefor the data-plane chart, verify the AWS Load Balancer Controller is v2.4.3 or newer. The new ALB ingress relies on the controller preserving manifest order forImplementationSpecificpaths; on older controllers the overlapping/v1/eventsand/v1/sessionsroutes may be prioritized incorrectly afterhelm upgrade. Upgrade the controller first if needed. Standard values overlays need no changes.
v1.2.1
- No customer-facing chart changes. The packaged
hive-control-planeandhive-data-planeservice charts are unchanged, so a standardhelm upgraderequires no action.
v1.2.0
- No customer-facing chart changes. The packaged
hive-control-planeandhive-data-planeservice charts are unchanged, so a standardhelm upgraderequires no action.
v1.1.0
- New optional
prom/statsd-exporterdeployment for cp-jobs that bridges StatsD metrics emitted by job pods to a Prometheus/metricsscrape endpoint. Disabled by default, so no action is required unless you want to enable job metrics. - New
jobs.statsdExporter.enabled(default:false) inhive-control-plane/values.yaml. Set totrueto deploy the exporter. All new resources are gated on this key. - New
jobs.statsdExporter.name(default:"cp-jobs-statsd-exporter"),jobs.statsdExporter.image.repository(default:prom/statsd-exporter), andjobs.statsdExporter.image.tag(default:"v0.28.0"). - New
jobs.statsdExporter.statsdPort(default:9125, UDP port job pods send metrics to) andjobs.statsdExporter.metricsPort(default:9102, TCP port Prometheus or the Datadog Agent scrapes). - New
jobs.statsdExporter.podAnnotations(default:{}) for Datadog Agent autodiscovery checks, andjobs.statsdExporter.resources(requests: 10m CPU / 32Mi memory; limits: 100m CPU / 64Mi memory). - To enable job metrics scraping, set
jobs.statsdExporter.enabled: true. For Prometheus Operator, also setserviceMonitor.enabled: trueto auto-create a ServiceMonitor for themetricsport (9102). For Datadog, add anad.datadoghq.com/statsd-exporter.checksopenmetrics annotation tojobs.statsdExporter.podAnnotationspointing athttp://%%host%%:9102/metrics. - Fixed a manifest rendering bug that produced invalid YAML when
jobs.statsdExporter.enabled: true. Template-only fix, applied automatically onhelm upgradewith no values changes required.
v1.0.0
Initial 1.0.0 stable release. The federatedhive-control-plane and hive-data-plane chart layout is now GA. This release adds ACM cert auto-discovery support, dedicated metrics ports for dp-pythonmetric and dp-llmproxy, and two values key changes that may require overlay updates.Upgrade steps:- If you override
dpIngestionService.ports.metrics, rename the key todpIngestionService.metricsPortin your data-plane values overlay. The old nestedports.metricskey no longer exists; if you don’t rename, the dp-ingestion metrics port silently reverts to the default (9091). - If you use Prometheus Operator and relied on the default
serviceMonitor.enabled: true, addserviceMonitor.enabled: trueto both your control-plane and data-plane values overlays. The default was changed tofalseto avoid CRD-missing errors for customers who do not run Prometheus Operator. Without it, ServiceMonitor resources are not created and Prometheus stops scraping HoneyHive pods. - (Optional) To opt into ACM cert auto-discovery on the control-plane frontend ALB, leave
frontendIngress.tls.certificateArnempty (withfrontendIngress.tls.enabled: true) and setfrontendIngress.tls.hoststo the hostname(s) the ALB must serve. - (Optional) To opt into ACM cert auto-discovery on the data-plane ALB (primary + wildcard), leave
ingress.tls.certificateArnempty (withingress.tls.enabled: true) and setingress.tls.hoststo your data-plane hostname(s).
- Action Required:
serviceMonitor.enableddefault changed fromtruetofalsein bothhive-control-plane/values.yamlandhive-data-plane/values.yaml. The default wastruein v0.104.0, which caused Helm to render ServiceMonitor resources even when the Prometheus Operator CRDs were not installed, failing the deploy. If you use Prometheus Operator and relied on the default, addserviceMonitor.enabled: trueto both your control-plane and data-plane values overlays. Without it, ServiceMonitor resources are not created and Prometheus stops scraping HoneyHive pods. - Action Required:
dpIngestionService.ports.metricsrenamed todpIngestionService.metricsPortinhive-data-plane/values.yaml. The nestedports.metricskey was the only service using that structure; all other services use a flatmetricsPortkey. The old key no longer exists; if you don’t rename, the dp-ingestion metrics port silently reverts to the default (9091). - New
dpPythonmetricService.metricsPort(default:9091) anddpLlmproxyService.metricsPort(default:9091) inhive-data-plane/values.yamlfor dedicated Prometheus metrics ports on dp-pythonmetric and dp-llmproxy. WhenserviceMonitor.enabled: true, ServiceMonitors are now also created for these two services. - New
frontendIngress.tls.hosts(default:[]) inhive-control-plane/values.yamlandingress.tls.hosts(default:[]) inhive-data-plane/values.yamlfor ACM certificate auto-discovery.frontendIngress.tls.hostscontrols the control-plane frontend ALB;ingress.tls.hostscontrols the data-plane API ALB (applied to both the primary and wildcard Ingresses). Rendered asspec.tls[*].hostsso the AWS Load Balancer Controller can match an ACM cert by SNI/SAN whencertificateArnis empty. LeavecertificateArnempty (withtls.enabled: true) and settls.hoststo your hostname(s). - Fixed ACM certificate auto-discovery on the data-plane wildcard Ingress and control-plane frontend Ingress. Previously, leaving
certificateArnblank emitted an emptyalb.ingress.kubernetes.io/certificate-arnannotation that ArgoCD rejected with a nil-annotation error. The annotation is now omitted entirely whencertificateArnis empty. The control-plane frontend Ingress now contributes aspec.tls[*].hostscert-discovery hint whenfrontendIngress.tls.hostsis set, so HTTPS listener creation no longer fails on overlays that rely on auto-discovery. Overlays that set an explicitcertificateArncontinue to render identically.
v0.104.0
- Action Required:
common.dataplane.dpPublicUrldefault changed to""indata-plane/services/values.yaml. Set this to your environment’s public data plane URL (e.g.,"https://api.my-dp.example.com"). Without it, the Admin Center Data Planes view and/settings/project/keyspage show no URL. - Action Required:
dpIngestionServiceHPA defaults changed indata-plane/services/values.yaml.targetCPUUtilizationPercentageis now60(was80), and a newtargetMemoryUtilizationPercentage(default:60) was added. To keep prior behavior, set CPU to80and memory to0. - Action Required:
ingress.maxBodySizeremoved from bothcontrol-plane/services/values.yamlanddata-plane/services/values.yaml. Remove any overrides for this key. - Action Required:
ingress.authHostremoved fromcontrol-plane/services/values.yaml. Remove any overrides for this key. - Action Required:
jobs.serviceAccount.createnow defaults totruein both planes. Set tofalseif you manage the jobs ServiceAccount externally. - Action Required (ArgoCD users): Deployments omit
spec.replicaswhen autoscaling is enabled. AddignoreDifferenceswithjsonPointers: ["/spec/replicas"]for Deployment kind in your ArgoCD Application spec. - New
<service>.affinity(default:{}) for all CP/DP services andjobs.affinityfor CronJobs/batch jobs. SupportspodAffinity,podAntiAffinity, andnodeAffinity. - New
<service>.autoscaling.enabled(default:true) for all 11 CP/DP services. Set tofalseto disable HPA and pin replicas via<service>.replicas. - New
frontendIngress.tls.redirect(default:false) incontrol-plane/services/values.yaml. Whentrue, the ALB listens on HTTP:80 and redirects to HTTPS. - New
dpIngestionService.resources(default:{}) indata-plane/services/values.yamlfor per-service resource overrides on ingestion. - New
dpPythonmetricService.gunicornWorkers(default:4) anddpPythonmetricService.pythonExecutionTimeout(default:0.1) indata-plane/services/values.yamlfor tuning custom metric concurrency and per-metric runtime. - New
cpNotificationService.ses.domain,.ses.rps(default:14),.ses.senderRoleArn,.ses.senderRoleDurationSeconds(default:3600) incontrol-plane/services/values.yamlfor SES email sender configuration. - New
serviceMonitor.enabled(default:true),serviceMonitor.namespace(default:"monitoring"),serviceMonitor.labels(default:{release: monitoring}),serviceMonitor.interval(default:"30s"),serviceMonitor.scrapeTimeout(default:"10s") in both planes for Prometheus Operator ServiceMonitor support. - New
<service>.metricsPort(default:9091), a dedicated Prometheus metrics port for all CP/DP services. ingress.hostandingress.grpcHostnow accept a string or a list of strings for multi-host ingress support.- Deployments no longer reset replica count on
helm upgradewhen autoscaling is enabled. - Fixed NATS anti-affinity selector to correctly distinguish nats-box from nats server pods.
- Custom CA certs from
common.tls.caCertsnow apply to the DP S3 backfill Job. - Added
app.kubernetes.io/versionlabel and OTelservice.versionattribute to all CP/DP services. - Distributed tracing is now correctly emitted from
dp-backend,dp-llmproxy, anddp-controller(theOTEL_ENABLED=trueenv var was previously missing on these deployments). - Ingress routing improvements:
/v1/events/*/annotateroutes to dp-backend,/v1/*ingestion paths route to ingestion-service, API and frontend traffic use separate ALBs. - Fixed PDB template to correctly handle
minAvailable: 0andmaxUnavailable: 0.
v0.103.0
- New
jobsconfiguration block incontrol-plane/services/values.yamlfor Kubernetes CronJobs that process alert transitions - New
jobsconfiguration block indata-plane/services/values.yamlfor operator-triggered S3 time-window backfill batch workloads - New per-service keys:
<service>.service.annotations(default:{}),<service>.service.labels(default:{}),<service>.service.type(default:"ClusterIP") now exposed oncpWriterService,cpControllerService,cpNotificationService,dpControllerService,dpIngestionService,dpEvaluationService,dpLlmproxyService,dpPythonmetricService— previously hardcoded - Service port protocol hints (
name: http,protocol: TCP,appProtocol: http/grpc) added to all service templates for correct L7 traffic classification by service meshes (Istio, Linkerd) appProtocoladded to ClickHouse instance Service ports (http,interserver,metrics:appProtocol: http;native:appProtocol: tcp)- ClickHouse instances
chi-installationchart version bumped from1.1.6to1.1.7 - No breaking changes — fully backward-compatible with v0.102.0 configurations
v0.102.0
- New
podAnnotations(default:{}) incontrol-plane/infrastructure/clickhouse/clickhouse_instances/values.yamlfor arbitrary annotations on ClickHouse pods (useful for Datadog autodiscovery, Prometheus scraping) - Fixed missing
DP_DATABASE_URLenv var in dp-pythonmetric-service deployment template, now reads fromcommon.externalSecrets.postgres.secretName/uriKeylike all other data-plane services - No breaking changes — fully backward-compatible with v0.101.0 configurations
v0.101.0
- Disabled ClickHouse replica check before attaching backup parts (
CLICKHOUSE_CHECK_REPLICAS_BEFORE_ATTACHset to"false"in backup container) - prevents backup restore failures in environments where replica availability cannot be confirmed - ClickHouse instances
chi-installationchart version bumped from1.1.5to1.1.6 - No breaking changes — fully backward-compatible with v0.100.0 configurations
v0.100.0
- New
ingress.albClassName(default:"alb") andfrontendIngress.albClassName(default:"alb") in control-plane and data-plane services for configurable ALB ingress class- Useful for shared CP+DP cluster scenarios where each plane needs its own ALB IngressClass (e.g.,
"cp-alb","dp-alb") - Existing deployments using the default
"alb"class require no changes
- Useful for shared CP+DP cluster scenarios where each plane needs its own ALB IngressClass (e.g.,
- New scheduling config for CP prometheus-nats-exporter in
control-plane/infrastructure/nats/values.yaml:prometheusExporter.tolerations,prometheusExporter.nodeSelector,prometheusExporter.affinity,prometheusExporter.additionalLabels common.extraLabelsnow propagated to all Service, ServiceAccount, HPA, and Ingress resources across both planes (previously only applied to Deployments)
v0.99.3
- Action Required: Add
common.controlPlane.idindata-plane/services/values.yaml- set it to matchcommon.controlPlane.idfrom your control-plane values. Without this,dp-controller-servicecannot identify its parent control plane, causing data-plane-to-control-plane communication failures - New
global.labels(default:{}) incontrol-plane/infrastructure/nats/values.yamlanddata-plane/infrastructure/nats/values.yaml- applied to all NATS-generated Kubernetes resources (StatefulSet, Service, PVC, ConfigMap, PDB, etc.) - New
nack.additionalLabels,nack.tolerations,nack.nodeSelector,nack.affinityin control-plane NATS values for JetStream Controller scheduling prometheusExporter.additionalLabelsnow propagated to Prometheus NATS Exporter Deployment, Service, and ServiceMonitor labels in both planes- Fixed
topologySpreadConstraintstypo in control-plane NATS values (topolicySpreadConstraints→topologySpreadConstraints)
v0.99.2
- ClickHouse instances
chi-installationchart version bumped from1.1.4to1.1.5incontrol-plane/infrastructure/clickhouse/clickhouse_instances/Chart.yaml
v0.99.1
- Fixed cp-notification-service healthcheck port - renamed env var from
EXPRESS_PORTtoPORTin deployment template - Control plane
hive-control-planechart version bumped from0.2.0to0.2.1
v0.99.0
- Added readiness and liveness probes (
GET /healthcheck) to all 9 service deployments across control-plane and data-plane cp-backend-serviceanddp-backend-serviceinclude a startup probe (allows up to 310s for Prisma migrations before liveness checks begin)- Eliminates intermittent 502 errors during rolling updates caused by traffic routing to pods not yet ready to serve
- No values.yaml changes required - probes use hardcoded values in deployment templates
v0.98.9
- Unified encryption configuration for cp-controller, dp-controller, and dp-llmproxy-service
- Supports at-rest encryption for identity management and provider secrets via KMS or environment variable mode
- New
common.encryption.keyIdvalue in both control-plane and data-plane services - New ExternalSecret templates for encryption in both control-plane and data-plane secret-store charts
- Replaced
dpLlmproxyService.kmsKeyIdwith unifiedHH_ENCRYPTION_KEY_IDandHH_ENCRYPTION_SECRETenv vars in dp-llmproxy-service - Fixed perpetual ArgoCD OutOfSync caused by Redis PDB
enabled: truein control-plane Redis - Action Required: Remove
dpLlmproxyService.kmsKeyIdfrom data-plane values and addcommon.encryption.keyIdin both control-plane and data-plane values
v0.98.1
- Added
common.extraLabelsfor custom governance/compliance labels on all Kubernetes resources (control-plane, data-plane, shared dependencies) - Added
common.observability.otel.exporterProtocol(default:"grpc") for OTLP exporter protocol configuration in data-plane - Added
dpLlmproxyService.kmsKeyId(default:"alias/hh-provider-secrets") for AWS KMS encryption of LLM provider secrets - Removed duplicate
common.observabilityblock in data-plane services values - Fixed Next.js cache permission errors in cp-frontend-service with
nextjs-cacheemptyDir volume - Fixed OTEL service name in cp-frontend-service (was hardcoded to
cp-controller-service) - Added custom CA certificate support (
SSL_CERT_FILE,REQUESTS_CA_BUNDLE) for dp-llmproxy-service and dp-pythonmetric-service - Added
DP_DATABASE_URLenv var and KMS config to dp-llmproxy-service - Fixed ClickHouse logging configuration (moved to
config.d/99-logger.xmlwithreplace="1") - Action Required: Set
common.extraLabelsif your organization requires specific labels on all resources
v0.90.17
- Added kube-prometheus-stack monitoring for both control-plane and data-plane (Prometheus, Grafana, Alertmanager with 30-day retention)
- Added Tempo for distributed tracing in both control-plane and data-plane
- Added Loki and Promtail for centralized log aggregation in control-plane
- Added legacy
nats-oldchart for backward compatibility - Added Datadog integration support for OTEL collectors (disabled by default, set
datadog.enabled: true) - Added
common.tls.caCertsdictionary for custom root CA certificates in data-plane - Added
common.controlPlane.apiPublicUrlfor data-plane to call control-plane API - Added resource limits for dp-llmproxy-service and dp-pythonmetric-service (500m/512Mi requests, 1000m/1Gi limits)
- Added persistent storage for ClickHouse Keeper (
storage.enabled: true,storage.size: "10Gi") - Updated ClickHouse Keeper image to
altinity/clickhouse-keeper:25.3.6.10034.altinitystable-alpine - Simplified ClickHouse Operator values from 903 lines to 29 lines
- Updated ExternalSecret API version from
v1beta1tov1(requires External Secrets Operator 0.9.0+) - Moved OTEL collector
nodeSelector/affinity/tolerationsunderopentelemetry-collectorkey - Action Required: Set
common.controlPlane.apiPublicUrlto your control-plane API endpoint - Action Required: Ensure ClickHouse Keeper persistent storage is enabled for production
- Action Required: Update External Secrets Operator to 0.9.0+ if not already
- Removed OpenUnison authentication infrastructure (all charts, operators, CRDs)
- Removed Nginx ingress infrastructure
- Added NATS infrastructure for data-plane with independent cluster deployment (3 replicas, JetStream, PDB)
- Disabled S3 DLQ and disk spool in writer service (
cpWriterService.dlq.enabled: false) - Added
frontendIngress.alb.annotationsfor custom ALB annotations - Removed PVC functionality from cp-writer-service
- Changed cp-frontend-service
NEXTJS_PORTenv var toPORT - Added auth config env vars (
AUTH_ISSUER_DOMAIN,AUTH_CLIENT_ID,AUTH_CLIENT_SECRET) to cp-frontend-service - Added NATS connection settings for data-plane services (dp-evaluation-service, dp-ingestion-service)
- Enabled Redis authentication in control-plane (
auth: true,existingSecret: redis-secrets) - Removed gRPC ingress from data-plane services
- Switched from NLB to ALB for both control-plane and data-plane ingress
- Added NATS HA streams configuration with configurable replicas
- Added
common.dataPlane.dpPublicUrlandcommon.controlPlane.frontendPublicUrlfor cross-plane communication - Added Prometheus monitoring for NATS (exporter on port 7777) and ClickHouse (built-in on port 9363)
- Added Redis authentication for data-plane (
auth: true,existingSecret: redis-secrets) - Fixed Redis PDB in data-plane (removed invalid
enabledfield) - Action Required: Remove any NLB-related values overrides and switch to ALB configuration
- Action Required: Remove any OpenUnison or Beekeeper-related overrides from values files
- Action Required: Configure auth secrets in AWS Secrets Manager with
client-secretandcp-jwt-private-key