Skip to content

Commit 3049465

Browse files
committed
Merge branch 'main' into getting-started-component
2 parents 0a7fdf1 + 468eb92 commit 3049465

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+3415
-1778
lines changed

.changeset/yellow-files-deny.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@hyperdx/app": patch
3+
---
4+
5+
Update some forms to work better with React 19

docker/hyperdx/Dockerfile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ ENTRYPOINT ["sh", "/etc/local/entry.sh"]
8282

8383
# all-in-one base ############################################################################################
8484
FROM hairyhenderson/gomplate:v4.3.3-alpine AS gomplate
85-
FROM clickhouse/clickhouse-server:${CLICKHOUSE_VERSION}-alpine AS all-in-one-base
85+
FROM clickhouse/clickhouse-server:${CLICKHOUSE_VERSION}-alpine AS all-in-one-base
8686

8787
ARG CODE_VERSION
8888
ARG USER_UID=10001
@@ -110,9 +110,8 @@ COPY --from=hyperdx ./clickhouseConfig.xml /etc/clickhouse-server/config.xml
110110
COPY --from=otel-collector ./config.yaml /etc/otelcol-contrib/config.yaml
111111
COPY --from=otel-collector ./supervisor_docker.yaml.tmpl /etc/otel/supervisor.yaml.tmpl
112112

113-
# Copy otel-collector entrypoint and log rotation scripts
113+
# Copy otel-collector entrypoint script
114114
COPY --from=otel-collector --chmod=755 ./entrypoint.sh /otel-entrypoint.sh
115-
COPY --from=otel-collector --chmod=755 ./log-rotator.sh /log-rotator.sh
116115

117116
# Copy gomplate binary from the gomplate image
118117
COPY --from=gomplate /bin/gomplate /usr/local/bin/gomplate

docker/otel-collector/log-tailer.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#!/bin/sh
22
# Generic log tailer script that follows a log file and echoes new lines to stdout
3-
# Handles file rotation and truncation (e.g., when used with log-rotator.sh)
43
# Usage: log-tailer.sh <log_file_path> [sleep_interval]
54

65
# Parse arguments

packages/api/.env.e2e

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ OPAMP_PORT=24320
1515

1616
# Auto-create default connections and sources for new teams
1717
# Uses public demo ClickHouse instance with pre-populated data
18-
DEFAULT_CONNECTIONS='[{"name":"Demo ClickHouse","host":"https://sql-clickhouse.clickhouse.com","username":"otel_demo","password":""}]'
19-
DEFAULT_SOURCES='[{"from":{"databaseName":"otel_v2","tableName":"otel_logs"},"kind":"log","timestampValueExpression":"TimestampTime","name":"Demo Logs","displayedTimestampValueExpression":"Timestamp","implicitColumnExpression":"Body","serviceNameExpression":"ServiceName","eventAttributesExpression":"LogAttributes","resourceAttributesExpression":"ResourceAttributes","defaultTableSelectExpression":"Timestamp,ServiceName,SeverityText,Body","severityTextExpression":"SeverityText","traceIdExpression":"TraceId","spanIdExpression":"SpanId","connection":"Demo ClickHouse","traceSourceId":"Traces","metricSourceId":"Demo Metrics"},{"from":{"databaseName":"otel_v2","tableName":"otel_traces"},"kind":"trace","timestampValueExpression":"Timestamp","name":"Demo Traces","displayedTimestampValueExpression":"Timestamp","implicitColumnExpression":"SpanName","serviceNameExpression":"ServiceName","eventAttributesExpression":"SpanAttributes","resourceAttributesExpression":"ResourceAttributes","defaultTableSelectExpression":"Timestamp,ServiceName,StatusCode,round(Duration/1e6),SpanName","traceIdExpression":"TraceId","spanIdExpression":"SpanId","durationExpression":"Duration","durationPrecision":9,"parentSpanIdExpression":"ParentSpanId","spanNameExpression":"SpanName","spanKindExpression":"SpanKind","statusCodeExpression":"StatusCode","statusMessageExpression":"StatusMessage","connection":"Demo ClickHouse","logSourceId":"Demo Logs","metricSourceId":"Demo Metrics"},{"from":{"databaseName":"otel_v2","tableName":""},"kind":"metric","timestampValueExpression":"TimeUnix","name":"Demo Metrics","resourceAttributesExpression":"ResourceAttributes","serviceNameExpression":"ServiceName","metricTables":{"gauge":"otel_metrics_gauge","histogram":"otel_metrics_histogram","sum":"otel_metrics_sum","summary":"otel_metrics_summary","exponential histogram":"otel_metrics_exponential_histogram"},"connection":"Demo ClickHouse","logSourceId":"Demo Logs","traceSourceId":"Demo Traces"}]'
18+
DEFAULT_CONNECTIONS='[{"name":"local","host":"https://sql-clickhouse.clickhouse.com","username":"otel_demo","password":""}]'
19+
DEFAULT_SOURCES='[{"kind":"log","name":"Demo Logs","connection":"local","from":{"databaseName":"otel_v2","tableName":"otel_logs"},"timestampValueExpression":"TimestampTime","defaultTableSelectExpression":"Timestamp, ServiceName, SeverityText, Body","serviceNameExpression":"ServiceName","severityTextExpression":"SeverityText","eventAttributesExpression":"LogAttributes","resourceAttributesExpression":"ResourceAttributes","traceIdExpression":"TraceId","spanIdExpression":"SpanId","implicitColumnExpression":"Body","displayedTimestampValueExpression":"Timestamp","sessionSourceId":"Demo Sessions","traceSourceId":"Demo Traces","metricSourceId":"Demo Metrics"},{"kind":"trace","name":"Demo Traces","connection":"local","from":{"databaseName":"otel_v2","tableName":"otel_traces"},"timestampValueExpression":"Timestamp","defaultTableSelectExpression":"Timestamp, ServiceName, StatusCode, round(Duration / 1e6), SpanName","serviceNameExpression":"ServiceName","eventAttributesExpression":"SpanAttributes","resourceAttributesExpression":"ResourceAttributes","traceIdExpression":"TraceId","spanIdExpression":"SpanId","implicitColumnExpression":"SpanName","durationExpression":"Duration","durationPrecision":9,"parentSpanIdExpression":"ParentSpanId","spanKindExpression":"SpanKind","spanNameExpression":"SpanName","logSourceId":"Demo Logs","statusCodeExpression":"StatusCode","statusMessageExpression":"StatusMessage","spanEventsValueExpression":"Events","metricSourceId":"Demo Metrics","sessionSourceId":"Demo Sessions"},{"kind":"metric","name":"Demo Metrics","connection":"local","from":{"databaseName":"otel_v2","tableName":""},"timestampValueExpression":"TimeUnix","serviceNameExpression":"ServiceName","metricTables":{"gauge":"otel_metrics_gauge","histogram":"otel_metrics_histogram","sum":"otel_metrics_sum","summary":"otel_metrics_summary","exponential histogram":"otel_metrics_exponential_histogram"},"resourceAttributesExpression":"ResourceAttributes","logSourceId":"Demo Logs"},{"kind":"session","name":"Demo Sessions","connection":"local","from":{"databaseName":"otel_v2","tableName":"hyperdx_sessions"},"timestampValueExpression":"TimestampTime","defaultTableSelectExpression":"Timestamp, ServiceName, Body","serviceNameExpression":"ServiceName","severityTextExpression":"SeverityText","eventAttributesExpression":"LogAttributes","resourceAttributesExpression":"ResourceAttributes","traceSourceId":"Demo Traces","traceIdExpression":"TraceId","spanIdExpression":"SpanId","implicitColumnExpression":"Body"},{"kind":"trace","name":"ClickPy Traces","connection":"local","from":{"databaseName":"otel_clickpy","tableName":"otel_traces"},"timestampValueExpression":"Timestamp","defaultTableSelectExpression":"Timestamp, ServiceName, StatusCode, round(Duration / 1e6), SpanName","serviceNameExpression":"ServiceName","eventAttributesExpression":"SpanAttributes","resourceAttributesExpression":"ResourceAttributes","traceIdExpression":"TraceId","spanIdExpression":"SpanId","implicitColumnExpression":"SpanName","durationExpression":"Duration","durationPrecision":9,"parentSpanIdExpression":"ParentSpanId","spanKindExpression":"SpanKind","spanNameExpression":"SpanName","statusCodeExpression":"StatusCode","statusMessageExpression":"StatusMessage","spanEventsValueExpression":"Events","highlightedTraceAttributeExpressions":[{"sqlExpression":"if((SpanAttributes['http.route']) LIKE '%dashboard%', concat('https://clickpy.clickhouse.com', path(SpanAttributes['http.target'])), '')","alias":"clickpy_link"}],"sessionSourceId":"ClickPy Sessions"},{"kind":"session","name":"ClickPy Sessions","connection":"local","from":{"databaseName":"otel_clickpy","tableName":"hyperdx_sessions"},"timestampValueExpression":"TimestampTime","defaultTableSelectExpression":"Timestamp, ServiceName, Body","serviceNameExpression":"ServiceName","severityTextExpression":"SeverityText","eventAttributesExpression":"LogAttributes","resourceAttributesExpression":"ResourceAttributes","traceSourceId":"ClickPy Traces","traceIdExpression":"TraceId","spanIdExpression":"SpanId","implicitColumnExpression":"Body"}]'
20+

packages/app/eslint.config.mjs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import reactHooksPlugin from 'eslint-plugin-react-hooks';
77
import prettierConfig from 'eslint-config-prettier';
88
import simpleImportSort from 'eslint-plugin-simple-import-sort';
99
import prettierPlugin from 'eslint-plugin-prettier/recommended';
10+
import playwrightPlugin from 'eslint-plugin-playwright';
11+
import reactHookFormPlugin from 'eslint-plugin-react-hook-form';
12+
import { fixupPluginRules } from '@eslint/compat';
1013

1114
export default [
1215
js.configs.recommended,
@@ -38,6 +41,7 @@ export default [
3841
react: reactPlugin,
3942
'react-hooks': reactHooksPlugin,
4043
'simple-import-sort': simpleImportSort,
44+
'react-hook-form': fixupPluginRules(reactHookFormPlugin), // not compatible with eslint 9 yet
4145
},
4246
rules: {
4347
...nextPlugin.configs.recommended.rules,
@@ -80,6 +84,7 @@ export default [
8084
],
8185
'react-hooks/exhaustive-deps': 'error',
8286
'no-console': ['error', { allow: ['warn', 'error'] }],
87+
'react-hook-form/no-use-watch': 'error',
8388
},
8489
languageOptions: {
8590
parser: tseslint.parser,
@@ -116,11 +121,14 @@ export default [
116121
},
117122
{
118123
files: ['tests/e2e/**/*.{ts,js}'],
124+
...playwrightPlugin.configs['flat/recommended'],
119125
rules: {
126+
...playwrightPlugin.configs['flat/recommended'].rules,
120127
'no-console': 'off',
121128
'no-empty': 'off',
122129
'@typescript-eslint/no-explicit-any': 'off',
123130
'@next/next/no-html-link-for-pages': 'off',
131+
'playwright/no-networkidle': 'off', // temporary until we have a better way to deal with react re-renders
124132
},
125133
},
126134
...storybook.configs['flat/recommended'],

packages/app/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
},
105105
"devDependencies": {
106106
"@chromatic-com/storybook": "^4.1.3",
107+
"@eslint/compat": "^2.0.0",
107108
"@hookform/devtools": "^4.3.1",
108109
"@jedmao/location": "^3.0.0",
109110
"@playwright/test": "^1.57.0",
@@ -134,6 +135,8 @@
134135
"@types/react-table": "^7.7.14",
135136
"@types/sqlstring": "^2.3.2",
136137
"eslint-config-next": "^16.0.10",
138+
"eslint-plugin-playwright": "^2.4.0",
139+
"eslint-plugin-react-hook-form": "^0.3.1",
137140
"eslint-plugin-storybook": "10.1.4",
138141
"identity-obj-proxy": "^3.0.0",
139142
"jest": "^30.2.0",
@@ -144,7 +147,7 @@
144147
"postcss": "^8.4.38",
145148
"postcss-preset-mantine": "^1.15.0",
146149
"prettier": "^3.3.2",
147-
"storybook": "^10.1.4",
150+
"storybook": "^10.1.10",
148151
"stylelint": "^16.26.1",
149152
"stylelint-config-standard-scss": "^16.0.0",
150153
"stylelint-prettier": "^5.0.3",

packages/app/src/AppNav.components.tsx

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,8 @@ export const AppNavCloudBanner = () => {
4747
<div className="my-3 bg-muted rounded p-2 text-center">
4848
<span className="fs-8">Ready to deploy on ClickHouse Cloud?</span>
4949
<div className="mt-2 mb-2">
50-
<Link
51-
href="https://clickhouse.com/docs/use-cases/observability/clickstack/getting-started#deploy-with-clickhouse-cloud"
52-
passHref
53-
legacyBehavior
54-
>
55-
<Button
56-
variant="light"
57-
size="xs"
58-
component="a"
59-
className="hover-color-white"
60-
>
50+
<Link href="https://clickhouse.com/docs/use-cases/observability/clickstack/getting-started#deploy-with-clickhouse-cloud">
51+
<Button variant="light" size="xs" className="hover-color-white">
6152
Get Started for Free
6253
</Button>
6354
</Link>

packages/app/src/AuthPage.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Link from 'next/link';
55
import { useRouter } from 'next/router';
66
import { NextSeo } from 'next-seo';
77
import cx from 'classnames';
8-
import { SubmitHandler, useForm } from 'react-hook-form';
8+
import { SubmitHandler, useForm, useWatch } from 'react-hook-form';
99
import {
1010
Button,
1111
Notification,
@@ -45,7 +45,7 @@ export default function AuthPage({ action }: { action: 'register' | 'login' }) {
4545
handleSubmit,
4646
formState: { errors, isSubmitting },
4747
setError,
48-
watch,
48+
control,
4949
} = useForm<FormData>({
5050
reValidateMode: 'onSubmit',
5151
});
@@ -67,8 +67,16 @@ export default function AuthPage({ action }: { action: 'register' | 'login' }) {
6767
}
6868
}, [installation, isRegister, router]);
6969

70-
const currentPassword = watch('password', '');
71-
const confirmPassword = watch('confirmPassword', '');
70+
const currentPassword = useWatch({
71+
control,
72+
name: 'password',
73+
defaultValue: '',
74+
});
75+
const confirmPassword = useWatch({
76+
control,
77+
name: 'confirmPassword',
78+
defaultValue: '',
79+
});
7280

7381
const confirmPass = () => {
7482
return currentPassword === confirmPassword;

packages/app/src/ClickhousePage.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { useMemo, useState } from 'react';
1+
import { useEffect, useMemo, useState } from 'react';
22
import dynamic from 'next/dynamic';
33
import {
44
parseAsFloat,
55
parseAsStringEnum,
66
useQueryState,
77
useQueryStates,
88
} from 'nuqs';
9-
import { useForm } from 'react-hook-form';
9+
import { useForm, useWatch } from 'react-hook-form';
1010
import { sql } from '@codemirror/lang-sql';
1111
import { format as formatSql } from '@hyperdx/common-utils/dist/sqlFormatter';
1212
import { DisplayType } from '@hyperdx/common-utils/dist/types';
@@ -436,17 +436,19 @@ function ClickhousePage() {
436436

437437
const connection = _connection ?? connections?.[0]?.id ?? '';
438438

439-
const { control, watch } = useForm({
439+
const { control } = useForm({
440440
values: {
441441
connection,
442442
},
443443
});
444444

445-
watch((data, { name, type }) => {
446-
if (name === 'connection' && type === 'change') {
447-
setConnection(data.connection ?? null);
445+
const watchedConnection = useWatch({ control, name: 'connection' });
446+
447+
useEffect(() => {
448+
if (watchedConnection !== connection) {
449+
setConnection(watchedConnection ?? null);
448450
}
449-
});
451+
}, [watchedConnection, connection, setConnection]);
450452
const DEFAULT_INTERVAL = 'Past 1h';
451453
const [displayedTimeInputValue, setDisplayedTimeInputValue] =
452454
useState(DEFAULT_INTERVAL);

packages/app/src/DBChartPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useCallback, useRef, useState } from 'react';
22
import dynamic from 'next/dynamic';
33
import Head from 'next/head';
44
import { parseAsJson, parseAsStringEnum, useQueryState } from 'nuqs';
5-
import { useForm } from 'react-hook-form';
5+
import { useForm, useWatch } from 'react-hook-form';
66
import { useHotkeys } from 'react-hotkeys-hook';
77
import { SavedChartConfig, SourceKind } from '@hyperdx/common-utils/dist/types';
88
import {
@@ -57,7 +57,7 @@ function AIAssistant({
5757
'ai-assistant-alert-dismissed',
5858
false,
5959
);
60-
const { control, watch, setValue, handleSubmit } = useForm<{
60+
const { control, setValue, handleSubmit } = useForm<{
6161
text: string;
6262
source: string;
6363
}>({

0 commit comments

Comments
 (0)