From 799789077c42890962caca5b2f98a37244afc1ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Fr=C3=B6mbgen?= <23717573+mfroembgen@users.noreply.github.com> Date: Thu, 13 Aug 2026 10:24:35 +0200 Subject: [PATCH] fix(otel): make ClickHouse exporter timeout configurable --- .../configurable-clickhouse-exporter-timeout.md | 8 ++++++++ docker/otel-collector/config.standalone.yaml | 12 ++++++------ .../controllers/__tests__/opampController.test.ts | 15 +++++++++++++++ .../api/src/opamp/controllers/opampController.ts | 4 ++-- 4 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 .changeset/configurable-clickhouse-exporter-timeout.md diff --git a/.changeset/configurable-clickhouse-exporter-timeout.md b/.changeset/configurable-clickhouse-exporter-timeout.md new file mode 100644 index 0000000000..f21f328bd1 --- /dev/null +++ b/.changeset/configurable-clickhouse-exporter-timeout.md @@ -0,0 +1,8 @@ +--- +'@hyperdx/api': patch +'@hyperdx/otel-collector': patch +--- + +Allow the ClickHouse exporter request timeout to be configured with +`HYPERDX_OTEL_EXPORTER_TIMEOUT` in both OpAMP-managed and standalone collector +modes. The default remains 5 seconds. diff --git a/docker/otel-collector/config.standalone.yaml b/docker/otel-collector/config.standalone.yaml index 2d642301a6..81eb44173e 100644 --- a/docker/otel-collector/config.standalone.yaml +++ b/docker/otel-collector/config.standalone.yaml @@ -6,13 +6,13 @@ receivers: protocols: grpc: include_metadata: true - endpoint: "0.0.0.0:4317" + endpoint: '0.0.0.0:4317' http: cors: - allowed_origins: ["*"] - allowed_headers: ["*"] + allowed_origins: ['*'] + allowed_headers: ['*'] include_metadata: true - endpoint: "0.0.0.0:4318" + endpoint: '0.0.0.0:4318' connectors: routing/logs: @@ -31,7 +31,7 @@ exporters: username: ${env:CLICKHOUSE_USER} ttl: 720h logs_table_name: hyperdx_sessions - timeout: 5s + timeout: ${env:HYPERDX_OTEL_EXPORTER_TIMEOUT:-5s} create_schema: ${env:HYPERDX_OTEL_EXPORTER_CREATE_LEGACY_SCHEMA:-false} json: ${env:HYPERDX_OTEL_EXPORTER_CLICKHOUSE_JSON_ENABLE:-false} retry_on_failure: @@ -45,7 +45,7 @@ exporters: password: ${env:CLICKHOUSE_PASSWORD} username: ${env:CLICKHOUSE_USER} ttl: 720h - timeout: 5s + timeout: ${env:HYPERDX_OTEL_EXPORTER_TIMEOUT:-5s} create_schema: ${env:HYPERDX_OTEL_EXPORTER_CREATE_LEGACY_SCHEMA:-false} json: ${env:HYPERDX_OTEL_EXPORTER_CLICKHOUSE_JSON_ENABLE:-false} retry_on_failure: diff --git a/packages/api/src/opamp/controllers/__tests__/opampController.test.ts b/packages/api/src/opamp/controllers/__tests__/opampController.test.ts index f86baa8039..1d0c5fa5db 100644 --- a/packages/api/src/opamp/controllers/__tests__/opampController.test.ts +++ b/packages/api/src/opamp/controllers/__tests__/opampController.test.ts @@ -46,6 +46,21 @@ describe('opampController', () => { resetConfig(); }); + describe('buildOtelCollectorConfig ClickHouse exporters', () => { + it('allows both exporter timeouts to be configured from the collector environment', () => { + const cfg = buildOtelCollectorConfig([]); + + expect(cfg.exporters).toMatchObject({ + clickhouse: { + timeout: '${env:HYPERDX_OTEL_EXPORTER_TIMEOUT:-5s}', + }, + 'clickhouse/rrweb': { + timeout: '${env:HYPERDX_OTEL_EXPORTER_TIMEOUT:-5s}', + }, + }); + }); + }); + describe('buildOtelCollectorConfig datadog receiver', () => { it('omits the datadog receiver when the flag is off (default)', () => { configState.ENABLE_DATADOG_RECEIVER = false; diff --git a/packages/api/src/opamp/controllers/opampController.ts b/packages/api/src/opamp/controllers/opampController.ts index 6dfb5f989c..1e7049567a 100644 --- a/packages/api/src/opamp/controllers/opampController.ts +++ b/packages/api/src/opamp/controllers/opampController.ts @@ -253,7 +253,7 @@ export const buildOtelCollectorConfig = ( password: '${env:CLICKHOUSE_PASSWORD}', ttl: '${env:HYPERDX_OTEL_EXPORTER_TABLES_TTL:-720h}', logs_table_name: 'hyperdx_sessions', - timeout: '5s', + timeout: '${env:HYPERDX_OTEL_EXPORTER_TIMEOUT:-5s}', create_schema: '${env:HYPERDX_OTEL_EXPORTER_CREATE_LEGACY_SCHEMA:-false}', json: '${env:HYPERDX_OTEL_EXPORTER_CLICKHOUSE_JSON_ENABLE:-false}', @@ -270,7 +270,7 @@ export const buildOtelCollectorConfig = ( username: '${env:CLICKHOUSE_USER}', password: '${env:CLICKHOUSE_PASSWORD}', ttl: '${env:HYPERDX_OTEL_EXPORTER_TABLES_TTL:-720h}', - timeout: '5s', + timeout: '${env:HYPERDX_OTEL_EXPORTER_TIMEOUT:-5s}', create_schema: '${env:HYPERDX_OTEL_EXPORTER_CREATE_LEGACY_SCHEMA:-false}', json: '${env:HYPERDX_OTEL_EXPORTER_CLICKHOUSE_JSON_ENABLE:-false}',