Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

HyperDX V2 Helm Charts

Welcome to the official HyperDX Helm charts repository. This guide provides instructions on how to install, configure, and manage your HyperDX V2 deployment using Helm.

Table of Contents

Quick Start

Prerequisites

  • Helm v3+
  • Kubernetes cluster (v1.20+ recommended)
  • kubectl configured to interact with your cluster

Install HyperDX (Full Stack)

# Add the HyperDX Helm repository
helm repo add hyperdx https://hyperdxio.github.io/helm-charts
helm repo update
# Install with default values (includes ClickHouse, OTEL collector, MongoDB)
helm install my-hyperdx hyperdx/hdx-oss-v2
# Get the external IP (for cloud deployments)
kubectl get services
# Access the UI at http://<EXTERNAL-IP>:3000

That's it! HyperDX is now running with all components included.

Deployment Options

Full Stack (Default)

By default, this Helm chart deploys the complete HyperDX stack including:

  • HyperDX Application (API, UI, and OpAMP server)
  • ClickHouse (for storing logs, traces, and metrics)
  • OTEL Collector (for receiving and processing telemetry data)
  • MongoDB (for application metadata)

To install the full stack with default values:

helm install my-hyperdx hyperdx/hdx-oss-v2

External ClickHouse

If you have an existing ClickHouse cluster:

# values-external-clickhouse.yamlclickhouse:
enabled: false # Disable the built-in ClickHouseotel:
clickhouseEndpoint: "tcp://your-clickhouse-server:9000"clickhousePrometheusEndpoint: "http://your-clickhouse-server:9363"# Optionalhyperdx:
defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

External OTEL Collector

If you have an existing OTEL collector setup:

# values-external-otel.yamlotel:
enabled: false # Disable the built-in OTEL collectorhyperdx:
# Point to your external OTEL collector endpointotelExporterEndpoint: "http://your-otel-collector:4318"

Configuring Ingress for OTEL Collector

For instructions on exposing your OTEL collector endpoints via ingress (including example configuration and best practices), see the OTEL Collector Ingress section in the Ingress Setup chapter above.

Minimal Deployment

For organizations with existing infrastructure:

# values-minimal.yamlclickhouse:
enabled: falseotel:
enabled: falsehyperdx:
otelExporterEndpoint: "http://your-otel-collector:4318"defaultConnections: | [ { "name": "External ClickHouse", "host": "http://your-clickhouse-server:8123", "port": 8123, "username": "your-username", "password": "your-password" } ]

Configuration

API Key Setup

After successfully deploying HyperDX, you'll need to configure the API key to enable the app's telemetry data collection:

  1. Access your HyperDX instance via the configured ingress or service endpoint
  2. Log into the HyperDX dashboard and navigate to Team settings to generate or retrieve your API key
  3. Update your deployment with the API key using one of the following methods:

Method 1: Update via Helm upgrade with values file

Add the API key to your values.yaml:

hyperdx:
apiKey: "your-api-key-here"

Then upgrade your deployment:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

Method 2: Update via Helm upgrade with --set flag

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 --set hyperdx.apiKey="your-api-key-here"

Important: After updating the API key, you need to restart the pods to pick up the new configuration:

kubectl rollout restart deployment my-hyperdx-hdx-oss-v2-app my-hyperdx-hdx-oss-v2-otel-collector

Note: The chart automatically creates a Kubernetes secret (<release-name>-app-secrets) with your API key. No additional secret configuration is needed unless you want to use an external secret.

Using Secrets

For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.

Using Pre-Configured Secrets

The Helm chart includes a default secret template located at charts/hdx-oss-v2/templates/secrets.yaml. This file provides a base structure for managing secrets.

If you need to manually apply a secret, modify and apply the provided secrets.yaml template:

apiVersion: v1kind: Secretmetadata:
name: hyperdx-secretannotations:
"helm.sh/resource-policy": keeptype: Opaquedata:
API_KEY: <base64-encoded-api-key>

Apply the secret to your cluster:

kubectl apply -f secrets.yaml

Creating a Custom Secret

If you prefer, you can create a custom Kubernetes secret manually:

kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-key

Referencing a Secret in values.yaml

hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secretkey: API_KEY

Task Configuration

By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:

ParameterDescriptionDefault
tasks.enabledEnable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks intra process. Change to true if you'd rather use a separate cron task in the cluster.false
tasks.checkAlerts.scheduleCron schedule for the check-alerts task*/1 * * * *
tasks.checkAlerts.resourcesResource requests and limits for the check-alerts taskSee values.yaml

Ingress Setup

General Ingress Setup

To expose the HyperDX UI and API via a domain name, enable ingress in your values.yaml:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"# Set this to your desired domain

Configuring ingress.host and hyperdx.appUrl

  • hyperdx.ingress.host: Set to the domain you want to use for accessing HyperDX (e.g., hyperdx.yourdomain.com).
  • hyperdx.appUrl: Should match the ingress host and include the protocol (e.g., https://hyperdx.yourdomain.com).

Example:

hyperdx:
appUrl: "https://hyperdx.yourdomain.com"ingress:
enabled: truehost: "hyperdx.yourdomain.com"

This ensures that all generated links, cookies, and redirects work correctly.

Enabling TLS (HTTPS)

To secure your deployment with HTTPS, enable TLS in your ingress configuration:

hyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: truetlsSecretName: "hyperdx-tls"# Name of the Kubernetes TLS secret
  • Create a Kubernetes TLS secret with your certificate and key:
    kubectl create secret tls hyperdx-tls \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key
  • The ingress will reference this secret to terminate HTTPS connections.

Example Minimal Ingress YAML

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:
name: hyperdx-app-ingressannotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/use-regex: "true"spec:
ingressClassName: nginxrules:
- host: hyperdx.yourdomain.comhttp:
paths:
- path: /(.*)pathType: ImplementationSpecificbackend:
service:
name: <service-name>port:
number: 3000tls:
- hosts:
- hyperdx.yourdomain.comsecretName: hyperdx-tls

Common Pitfalls

  • Path and Rewrite Configuration:
    • For Next.js and other SPAs, always use a regex path and rewrite annotation as shown above. Do not use just path: / without a rewrite, as this will break static asset serving.
  • Mismatched appUrl and ingress.host:
    • If these do not match, you may experience issues with cookies, redirects, and asset loading.
  • TLS Misconfiguration:
    • Ensure your TLS secret is valid and referenced correctly in the ingress.
    • Browsers may block insecure content if you access the app over HTTP when TLS is enabled.
  • Ingress Controller Version:
    • Some features (like regex paths and rewrites) require recent versions of nginx ingress controller. Check your version with:
      kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath="{.items[0].spec.containers[0].image}"

OTEL Collector Ingress

If you need to expose your OTEL collector endpoints (for traces, metrics, logs) through ingress, you can use the additionalIngresses configuration. This is useful for organizations that want to send telemetry data from outside the cluster or use a custom domain for the collector.

Example configuration:

hyperdx:
ingress:
enabled: trueadditionalIngresses:
- name: otel-collectorannotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/force-ssl-redirect: "false"nginx.ingress.kubernetes.io/use-regex: "true"ingressClassName: nginxhosts:
- host: collector.yourdomain.compaths:
- path: /v1/(traces|metrics|logs)pathType: Prefixport: 4318tls:
- hosts:
- collector.yourdomain.comsecretName: collector-tls
  • This creates a separate ingress resource for the OTEL collector endpoints.
  • You can use a different domain, configure specific TLS settings, and apply custom annotations for the collector ingress.
  • The regex path rule allows you to route all OTLP signals (traces, metrics, logs) through a single rule.

Note:

  • If you do not need to expose the OTEL collector externally, you can skip this section.
  • For most users, the general ingress setup is sufficient.

Troubleshooting Ingress

  • Check Ingress Resource:
    kubectl get ingress -A
    kubectl describe ingress <ingress-name>
  • Check Pod Logs:
    kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx
  • Test Asset URLs: Use curl to verify static assets are served as JS, not HTML:
    curl -I https://hyperdx.yourdomain.com/_next/static/chunks/main-xxxx.js
    # Should return Content-Type: application/javascript
  • Browser DevTools:
    • Check the Network tab for 404s or assets returning HTML instead of JS.
    • Look for errors like "Unexpected token <" in the console (indicates HTML returned for JS).
  • Check for Path Rewrites:
    • Ensure the ingress is not stripping or incorrectly rewriting asset paths.
  • Clear Browser and CDN Cache:
    • After changes, clear your browser cache and any CDN/proxy cache to avoid stale assets.

Operations

Upgrading the Chart

To upgrade to a newer version:

helm upgrade my-hyperdx hyperdx/hdx-oss-v2 -f values.yaml

To check available chart versions:

helm search repo hyperdx

Uninstalling HyperDX

To remove the deployment:

helm uninstall my-hyperdx

This will remove all resources associated with the release, but persistent data (if any) may remain.

Cloud Deployment

Google Kubernetes Engine (GKE)

When deploying to GKE, you may need to override certain values due to cloud-specific networking behavior:

LoadBalancer DNS Resolution Issue

GKE's LoadBalancer service can cause internal DNS resolution issues where pod-to-pod communication resolves to external IPs instead of staying within the cluster network. This specifically affects the OTEL collector's connection to the OpAMP server.

Symptoms:

  • OTEL collector logs showing "connection refused" errors with cluster IP addresses
  • OpAMP connection failures like: dial tcp 34.118.227.30:4320: connect: connection refused

Solution: Use the fully qualified domain name (FQDN) for the OpAMP server URL:

helm install my-hyperdx hyperdx/hdx-oss-v2 \
--set hyperdx.appUrl="http://your-external-ip-or-domain.com" \
--set otel.opampServerUrl="http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"

Other GKE Considerations

# values-gke.yamlhyperdx:
appUrl: "http://34.123.61.99"# Use your LoadBalancer external IPotel:
opampServerUrl: "http://my-hyperdx-hdx-oss-v2-app.default.svc.cluster.local:4320"# Adjust for GKE pod networking if neededclickhouse:
config:
clusterCidrs:
- "10.8.0.0/16"# GKE commonly uses this range
- "10.0.0.0/8"# Fallback for other configurations

Amazon EKS

For EKS deployments, consider these common configurations:

# values-eks.yamlhyperdx:
appUrl: "http://your-alb-domain.com"# EKS typically uses these pod CIDRsclickhouse:
config:
clusterCidrs:
- "192.168.0.0/16"
- "10.0.0.0/8"# Enable ingress for productionhyperdx:
ingress:
enabled: truehost: "hyperdx.yourdomain.com"tls:
enabled: true

Azure AKS

For AKS deployments:

# values-aks.yamlhyperdx:
appUrl: "http://your-azure-lb.com"# AKS pod networkingclickhouse:
config:
clusterCidrs:
- "10.244.0.0/16"# Common AKS pod CIDR
- "10.0.0.0/8"

Production Cloud Deployment Checklist

  • Configure proper appUrl with your external domain/IP
  • Set up ingress with TLS for HTTPS access
  • Override otel.opampServerUrl with FQDN if experiencing connection issues
  • Adjust clickhouse.config.clusterCidrs for your pod network CIDR
  • Configure persistent storage for production workloads
  • Set appropriate resource requests and limits
  • Enable monitoring and alerting

Browser Compatibility Notes

For HTTP-only deployments (development/testing), some browsers may show crypto API errors due to secure context requirements. For production deployments, use HTTPS with proper TLS certificates through ingress configuration.

Troubleshooting

Checking Logs

kubectl logs -l app.kubernetes.io/name=hdx-oss-v2

About

Helm Charts for HyperDX OSS V2

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages