diff --git a/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml b/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml
index 3bb26a3a36..4a6a82b8af 100644
--- a/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml
+++ b/deploy/docker-swarm/clickhouse-setup/clickhouse-config.xml
@@ -22,7 +22,7 @@
[1]: https://github.com/pocoproject/poco/blob/poco-1.9.4-release/Foundation/include/Poco/Logger.h#L105-L114
-->
- trace
+ information
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log
- trace
+ information
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log
-
-
-
- trace
- /var/log/clickhouse-server/clickhouse-server.log
- /var/log/clickhouse-server/clickhouse-server.err.log
-
- 1000M
- 10
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 8123
-
-
- 9000
-
-
- 9004
-
-
- 9005
-
-
-
-
-
-
-
-
-
-
-
- 9009
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 4096
-
-
- 3
-
-
-
-
- false
-
-
- /path/to/ssl_cert_file
- /path/to/ssl_key_file
-
-
- false
-
-
- /path/to/ssl_ca_cert_file
-
-
- none
-
-
- 0
-
-
- -1
- -1
-
-
- false
-
-
-
-
-
-
- /etc/clickhouse-server/server.crt
- /etc/clickhouse-server/server.key
-
-
- none
- true
- true
- sslv2,sslv3
- true
-
-
-
- true
- true
- sslv2,sslv3
- true
-
-
-
- RejectCertificateHandler
-
-
-
-
-
-
-
-
- 100
-
-
- 0
-
-
-
- 10000
-
-
-
-
-
- 0.9
-
-
- 4194304
-
-
- 0
-
-
-
-
-
- 8589934592
-
-
- 5368709120
-
-
-
- 1000
-
-
- 134217728
-
-
- 10000
-
-
- /var/lib/clickhouse/
-
-
- /var/lib/clickhouse/tmp/
-
-
-
- `
-
-
-
-
-
- /var/lib/clickhouse/user_files/
-
-
-
-
-
-
-
-
-
-
-
-
- users.xml
-
-
-
- /var/lib/clickhouse/access/
-
-
-
-
-
-
- default
-
-
-
-
-
-
-
-
-
-
-
- default
-
-
-
-
-
-
-
-
- true
-
-
- false
-
- ' | sed -e 's|.*>\(.*\)<.*|\1|')
- wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge_$PKG_VER-1_all.deb
- apt install --no-install-recommends -f ./clickhouse-jdbc-bridge_$PKG_VER-1_all.deb
- clickhouse-jdbc-bridge &
-
- * [CentOS/RHEL]
- export MVN_URL=https://repo1.maven.org/maven2/ru/yandex/clickhouse/clickhouse-jdbc-bridge
- export PKG_VER=$(curl -sL $MVN_URL/maven-metadata.xml | grep '' | sed -e 's|.*>\(.*\)<.*|\1|')
- wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm
- yum localinstall -y clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm
- clickhouse-jdbc-bridge &
-
- Please refer to https://github.com/ClickHouse/clickhouse-jdbc-bridge#usage for more information.
- ]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- localhost
- 9000
-
-
-
-
-
-
-
- false
-
- 127.0.0.1
- 9000
-
-
- 127.0.0.2
- 9000
-
-
- 127.0.0.3
- 9000
-
-
-
-
-
-
-
- localhost
- 9000
-
-
-
-
- localhost
- 9000
-
-
-
-
-
-
- 127.0.0.1
- 9000
-
-
-
-
- 127.0.0.2
- 9000
-
-
-
-
-
- true
-
- 127.0.0.1
- 9000
-
-
-
- true
-
- 127.0.0.2
- 9000
-
-
-
-
-
-
- localhost
- 9440
- 1
-
-
-
-
-
-
- localhost
- 9000
-
-
-
-
- localhost
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3600
-
-
-
- 3600
-
-
- 60
-
-
-
-
-
-
-
-
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
-
-
-
-
-
- 7500
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
- system
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
-
-
- system
-
- 7500
- 1000
-
-
-
-
- system
-
-
- 7000
-
-
-
-
-
-
- engine MergeTree
- partition by toYYYYMM(finish_date)
- order by (finish_date, finish_time_us, trace_id)
-
- system
-
- 7500
-
-
-
-
-
- system
-
-
-
- 1000
-
-
-
-
-
-
-
- system
-
-
- toYYYYMM(event_date)
- 7500
-
-
-
-
-
-
-
-
-
- *_dictionary.xml
-
-
- *_function.xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /clickhouse/task_queue/ddl
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- click_cost
- any
-
- 0
- 3600
-
-
- 86400
- 60
-
-
-
- max
-
- 0
- 60
-
-
- 3600
- 300
-
-
- 86400
- 3600
-
-
-
-
-
- /var/lib/clickhouse/format_schemas/
-
-
-
-
- hide encrypt/decrypt arguments
- ((?:aes_)?(?:encrypt|decrypt)(?:_mysql)?)\s*\(\s*(?:'(?:\\'|.)+'|.*?)\s*\)
-
- \1(???)
-
-
-
-
-
-
-
-
-
- false
-
- false
-
-
- https://6f33034cfe684dd7a3ab9875e57b1c8d@o388870.ingest.sentry.io/5226277
-
-
-
-
-
-
-
-
-
-
- 268435456
- true
-
-
diff --git a/deploy/docker/clickhouse-setup/docker-compose.yaml b/deploy/docker/clickhouse-setup/docker-compose.yaml
index 5a47b6a461..3b3403a480 100644
--- a/deploy/docker/clickhouse-setup/docker-compose.yaml
+++ b/deploy/docker/clickhouse-setup/docker-compose.yaml
@@ -39,7 +39,7 @@ services:
# Notes for Maintainers/Contributors who will change Line Numbers of Frontend & Query-Section. Please Update Line Numbers in `./scripts/commentLinesForSetup.sh` & `./CONTRIBUTING.md`
query-service:
- image: signoz/query-service:0.9.2
+ image: signoz/query-service:0.10.0
container_name: query-service
command: ["-config=/root/config/prometheus.yml"]
# ports:
@@ -66,7 +66,7 @@ services:
condition: service_healthy
frontend:
- image: signoz/frontend:0.9.2
+ image: signoz/frontend:0.10.0
container_name: frontend
restart: on-failure
depends_on:
@@ -78,7 +78,7 @@ services:
- ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf
otel-collector:
- image: signoz/otelcontribcol:0.45.1-1.0
+ image: signoz/otelcontribcol:0.45.1-1.1
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
@@ -103,7 +103,7 @@ services:
condition: service_healthy
otel-collector-metrics:
- image: signoz/otelcontribcol:0.45.1-1.0
+ image: signoz/otelcontribcol:0.45.1-1.1
command: ["--config=/etc/otel-collector-metrics-config.yaml"]
volumes:
- ./otel-collector-metrics-config.yaml:/etc/otel-collector-metrics-config.yaml
diff --git a/frontend/public/locales/en-GB/alerts.json b/frontend/public/locales/en-GB/alerts.json
new file mode 100644
index 0000000000..e67bd35273
--- /dev/null
+++ b/frontend/public/locales/en-GB/alerts.json
@@ -0,0 +1,85 @@
+{
+ "preview_chart_unexpected_error": "An unexpeced error occurred updating the chart, please check your query.",
+ "preview_chart_threshold_label": "Threshold",
+ "placeholder_label_key_pair": "Click here to enter a label (key value pairs)",
+ "button_yes": "Yes",
+ "button_no": "No",
+ "remove_label_confirm": "This action will remove all the labels. Do you want to proceed?",
+ "remove_label_success": "Labels cleared",
+ "alert_form_step1": "Step 1 - Define the metric",
+ "alert_form_step2": "Step 2 - Define Alert Conditions",
+ "alert_form_step3": "Step 3 - Alert Configuration",
+ "metric_query_max_limit": "Can not create query. You can create maximum of 5 queries",
+ "confirm_save_title": "Save Changes",
+ "confirm_save_content_part1": "Your alert built with",
+ "confirm_save_content_part2": "query will be saved. Press OK to confirm.",
+ "unexpected_error": "Sorry, an unexpected error occurred. Please contact your admin",
+ "rule_created": "Rule created successfully",
+ "rule_edited": "Rule edited successfully",
+ "expression_missing": "expression is missing in {{where}}",
+ "metricname_missing": "metric name is missing in {{where}}",
+ "condition_required": "at least one metric condition is required",
+ "alertname_required": "alert name is required",
+ "promql_required": "promql expression is required when query format is set to PromQL",
+ "button_savechanges": "Save Rule",
+ "button_createrule": "Create Rule",
+ "button_returntorules": "Return to rules",
+ "button_cancelchanges": "Cancel",
+ "button_discard": "Discard",
+ "text_condition1": "Send a notification when the metric is",
+ "text_condition2": "the threshold",
+ "text_condition3": "during the last",
+ "option_5min": "5 mins",
+ "option_10min": "10 mins",
+ "option_15min": "15 mins",
+ "option_60min": "60 mins",
+ "option_4hours": "4 hours",
+ "option_24hours": "24 hours",
+ "field_threshold": "Alert Threshold",
+ "option_allthetimes": "all the times",
+ "option_atleastonce": "at least once",
+ "option_onaverage": "on average",
+ "option_intotal": "in total",
+ "option_above": "above",
+ "option_below": "below",
+ "option_equal": "is equal to",
+ "option_notequal": "not equal to",
+ "button_query": "Query",
+ "button_formula": "Formula",
+ "tab_qb": "Query Builder",
+ "tab_promql": "PromQL",
+ "title_confirm": "Confirm",
+ "button_ok": "Yes",
+ "button_cancel": "No",
+ "field_promql_expr": "PromQL Expression",
+ "field_alert_name": "Alert Name",
+ "field_alert_desc": "Alert Description",
+ "field_labels": "Labels",
+ "field_severity": "Severity",
+ "option_critical": "Critical",
+ "option_error": "Error",
+ "option_warning": "Warning",
+ "option_info": "Info",
+ "user_guide_headline": "Steps to create an Alert",
+ "user_guide_qb_step1": "Step 1 - Define the metric",
+ "user_guide_qb_step1a": "Choose a metric which you want to create an alert on",
+ "user_guide_qb_step1b": "Filter it based on WHERE field or GROUPBY if needed",
+ "user_guide_qb_step1c": "Apply an aggregatiion function like COUNT, SUM, etc. or choose NOOP to plot the raw metric",
+ "user_guide_qb_step1d": "Create a formula based on Queries if needed",
+ "user_guide_qb_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_qb_step2a": "Select the evaluation interval, threshold type and whether you want to alert above/below a value",
+ "user_guide_qb_step2b": "Enter the Alert threshold",
+ "user_guide_qb_step3": "Step 3 -Alert Configuration",
+ "user_guide_qb_step3a": "Set alert severity, name and descriptions",
+ "user_guide_qb_step3b": "Add tags to the alert in the Label field if needed",
+ "user_guide_pql_step1": "Step 1 - Define the metric",
+ "user_guide_pql_step1a": "Write a PromQL query for the metric",
+ "user_guide_pql_step1b": "Format the legends based on labels you want to highlight",
+ "user_guide_pql_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_pql_step2a": "Select the threshold type and whether you want to alert above/below a value",
+ "user_guide_pql_step2b": "Enter the Alert threshold",
+ "user_guide_pql_step3": "Step 3 -Alert Configuration",
+ "user_guide_pql_step3a": "Set alert severity, name and descriptions",
+ "user_guide_pql_step3b": "Add tags to the alert in the Label field if needed",
+ "user_tooltip_more_help": "More details on how to create alerts"
+}
\ No newline at end of file
diff --git a/frontend/public/locales/en-GB/rules.json b/frontend/public/locales/en-GB/rules.json
index 0602d7393c..e67bd35273 100644
--- a/frontend/public/locales/en-GB/rules.json
+++ b/frontend/public/locales/en-GB/rules.json
@@ -59,5 +59,27 @@
"option_critical": "Critical",
"option_error": "Error",
"option_warning": "Warning",
- "option_info": "Info"
+ "option_info": "Info",
+ "user_guide_headline": "Steps to create an Alert",
+ "user_guide_qb_step1": "Step 1 - Define the metric",
+ "user_guide_qb_step1a": "Choose a metric which you want to create an alert on",
+ "user_guide_qb_step1b": "Filter it based on WHERE field or GROUPBY if needed",
+ "user_guide_qb_step1c": "Apply an aggregatiion function like COUNT, SUM, etc. or choose NOOP to plot the raw metric",
+ "user_guide_qb_step1d": "Create a formula based on Queries if needed",
+ "user_guide_qb_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_qb_step2a": "Select the evaluation interval, threshold type and whether you want to alert above/below a value",
+ "user_guide_qb_step2b": "Enter the Alert threshold",
+ "user_guide_qb_step3": "Step 3 -Alert Configuration",
+ "user_guide_qb_step3a": "Set alert severity, name and descriptions",
+ "user_guide_qb_step3b": "Add tags to the alert in the Label field if needed",
+ "user_guide_pql_step1": "Step 1 - Define the metric",
+ "user_guide_pql_step1a": "Write a PromQL query for the metric",
+ "user_guide_pql_step1b": "Format the legends based on labels you want to highlight",
+ "user_guide_pql_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_pql_step2a": "Select the threshold type and whether you want to alert above/below a value",
+ "user_guide_pql_step2b": "Enter the Alert threshold",
+ "user_guide_pql_step3": "Step 3 -Alert Configuration",
+ "user_guide_pql_step3a": "Set alert severity, name and descriptions",
+ "user_guide_pql_step3b": "Add tags to the alert in the Label field if needed",
+ "user_tooltip_more_help": "More details on how to create alerts"
}
\ No newline at end of file
diff --git a/frontend/public/locales/en/alerts.json b/frontend/public/locales/en/alerts.json
new file mode 100644
index 0000000000..e67bd35273
--- /dev/null
+++ b/frontend/public/locales/en/alerts.json
@@ -0,0 +1,85 @@
+{
+ "preview_chart_unexpected_error": "An unexpeced error occurred updating the chart, please check your query.",
+ "preview_chart_threshold_label": "Threshold",
+ "placeholder_label_key_pair": "Click here to enter a label (key value pairs)",
+ "button_yes": "Yes",
+ "button_no": "No",
+ "remove_label_confirm": "This action will remove all the labels. Do you want to proceed?",
+ "remove_label_success": "Labels cleared",
+ "alert_form_step1": "Step 1 - Define the metric",
+ "alert_form_step2": "Step 2 - Define Alert Conditions",
+ "alert_form_step3": "Step 3 - Alert Configuration",
+ "metric_query_max_limit": "Can not create query. You can create maximum of 5 queries",
+ "confirm_save_title": "Save Changes",
+ "confirm_save_content_part1": "Your alert built with",
+ "confirm_save_content_part2": "query will be saved. Press OK to confirm.",
+ "unexpected_error": "Sorry, an unexpected error occurred. Please contact your admin",
+ "rule_created": "Rule created successfully",
+ "rule_edited": "Rule edited successfully",
+ "expression_missing": "expression is missing in {{where}}",
+ "metricname_missing": "metric name is missing in {{where}}",
+ "condition_required": "at least one metric condition is required",
+ "alertname_required": "alert name is required",
+ "promql_required": "promql expression is required when query format is set to PromQL",
+ "button_savechanges": "Save Rule",
+ "button_createrule": "Create Rule",
+ "button_returntorules": "Return to rules",
+ "button_cancelchanges": "Cancel",
+ "button_discard": "Discard",
+ "text_condition1": "Send a notification when the metric is",
+ "text_condition2": "the threshold",
+ "text_condition3": "during the last",
+ "option_5min": "5 mins",
+ "option_10min": "10 mins",
+ "option_15min": "15 mins",
+ "option_60min": "60 mins",
+ "option_4hours": "4 hours",
+ "option_24hours": "24 hours",
+ "field_threshold": "Alert Threshold",
+ "option_allthetimes": "all the times",
+ "option_atleastonce": "at least once",
+ "option_onaverage": "on average",
+ "option_intotal": "in total",
+ "option_above": "above",
+ "option_below": "below",
+ "option_equal": "is equal to",
+ "option_notequal": "not equal to",
+ "button_query": "Query",
+ "button_formula": "Formula",
+ "tab_qb": "Query Builder",
+ "tab_promql": "PromQL",
+ "title_confirm": "Confirm",
+ "button_ok": "Yes",
+ "button_cancel": "No",
+ "field_promql_expr": "PromQL Expression",
+ "field_alert_name": "Alert Name",
+ "field_alert_desc": "Alert Description",
+ "field_labels": "Labels",
+ "field_severity": "Severity",
+ "option_critical": "Critical",
+ "option_error": "Error",
+ "option_warning": "Warning",
+ "option_info": "Info",
+ "user_guide_headline": "Steps to create an Alert",
+ "user_guide_qb_step1": "Step 1 - Define the metric",
+ "user_guide_qb_step1a": "Choose a metric which you want to create an alert on",
+ "user_guide_qb_step1b": "Filter it based on WHERE field or GROUPBY if needed",
+ "user_guide_qb_step1c": "Apply an aggregatiion function like COUNT, SUM, etc. or choose NOOP to plot the raw metric",
+ "user_guide_qb_step1d": "Create a formula based on Queries if needed",
+ "user_guide_qb_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_qb_step2a": "Select the evaluation interval, threshold type and whether you want to alert above/below a value",
+ "user_guide_qb_step2b": "Enter the Alert threshold",
+ "user_guide_qb_step3": "Step 3 -Alert Configuration",
+ "user_guide_qb_step3a": "Set alert severity, name and descriptions",
+ "user_guide_qb_step3b": "Add tags to the alert in the Label field if needed",
+ "user_guide_pql_step1": "Step 1 - Define the metric",
+ "user_guide_pql_step1a": "Write a PromQL query for the metric",
+ "user_guide_pql_step1b": "Format the legends based on labels you want to highlight",
+ "user_guide_pql_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_pql_step2a": "Select the threshold type and whether you want to alert above/below a value",
+ "user_guide_pql_step2b": "Enter the Alert threshold",
+ "user_guide_pql_step3": "Step 3 -Alert Configuration",
+ "user_guide_pql_step3a": "Set alert severity, name and descriptions",
+ "user_guide_pql_step3b": "Add tags to the alert in the Label field if needed",
+ "user_tooltip_more_help": "More details on how to create alerts"
+}
\ No newline at end of file
diff --git a/frontend/public/locales/en/rules.json b/frontend/public/locales/en/rules.json
index 0602d7393c..e67bd35273 100644
--- a/frontend/public/locales/en/rules.json
+++ b/frontend/public/locales/en/rules.json
@@ -59,5 +59,27 @@
"option_critical": "Critical",
"option_error": "Error",
"option_warning": "Warning",
- "option_info": "Info"
+ "option_info": "Info",
+ "user_guide_headline": "Steps to create an Alert",
+ "user_guide_qb_step1": "Step 1 - Define the metric",
+ "user_guide_qb_step1a": "Choose a metric which you want to create an alert on",
+ "user_guide_qb_step1b": "Filter it based on WHERE field or GROUPBY if needed",
+ "user_guide_qb_step1c": "Apply an aggregatiion function like COUNT, SUM, etc. or choose NOOP to plot the raw metric",
+ "user_guide_qb_step1d": "Create a formula based on Queries if needed",
+ "user_guide_qb_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_qb_step2a": "Select the evaluation interval, threshold type and whether you want to alert above/below a value",
+ "user_guide_qb_step2b": "Enter the Alert threshold",
+ "user_guide_qb_step3": "Step 3 -Alert Configuration",
+ "user_guide_qb_step3a": "Set alert severity, name and descriptions",
+ "user_guide_qb_step3b": "Add tags to the alert in the Label field if needed",
+ "user_guide_pql_step1": "Step 1 - Define the metric",
+ "user_guide_pql_step1a": "Write a PromQL query for the metric",
+ "user_guide_pql_step1b": "Format the legends based on labels you want to highlight",
+ "user_guide_pql_step2": "Step 2 - Define Alert Conditions",
+ "user_guide_pql_step2a": "Select the threshold type and whether you want to alert above/below a value",
+ "user_guide_pql_step2b": "Enter the Alert threshold",
+ "user_guide_pql_step3": "Step 3 -Alert Configuration",
+ "user_guide_pql_step3a": "Set alert severity, name and descriptions",
+ "user_guide_pql_step3b": "Add tags to the alert in the Label field if needed",
+ "user_tooltip_more_help": "More details on how to create alerts"
}
\ No newline at end of file
diff --git a/frontend/src/container/AllError/utils.ts b/frontend/src/container/AllError/utils.ts
index 747c75cf58..239d404b1c 100644
--- a/frontend/src/container/AllError/utils.ts
+++ b/frontend/src/container/AllError/utils.ts
@@ -74,10 +74,10 @@ export const getDefaultOrder = (
return undefined;
};
-export const getNanoSeconds = (date: string): number => {
+export const getNanoSeconds = (date: string): string => {
return (
- parseInt((new Date(date).getTime() / 1e3).toString(), 10) * 1e9 +
- Timestamp.fromString(date).getNano()
+ Math.floor(new Date(date).getTime() / 1e3).toString() +
+ Timestamp.fromString(date).getNano().toString()
);
};
diff --git a/frontend/src/container/ErrorDetails/index.tsx b/frontend/src/container/ErrorDetails/index.tsx
index a200744890..d42d2e4a3e 100644
--- a/frontend/src/container/ErrorDetails/index.tsx
+++ b/frontend/src/container/ErrorDetails/index.tsx
@@ -40,7 +40,7 @@ function ErrorDetails(props: ErrorDetailsProps): JSX.Element {
getNextPrevId({
errorID: errorId || idPayload.errorId,
groupID: idPayload.groupID,
- timestamp: timestamp || getNanoSeconds(idPayload.timestamp).toString(),
+ timestamp: timestamp || getNanoSeconds(idPayload.timestamp),
}),
},
);
@@ -79,7 +79,7 @@ function ErrorDetails(props: ErrorDetailsProps): JSX.Element {
const onClickErrorIdHandler = async (
id: string,
- timespamp: string,
+ timestamp: string,
): Promise => {
try {
if (id.length === 0) {
@@ -92,7 +92,7 @@ function ErrorDetails(props: ErrorDetailsProps): JSX.Element {
history.replace(
`${history.location.pathname}?&groupId=${
idPayload.groupID
- }×tamp=${getNanoSeconds(timespamp)}&errorId=${id}`,
+ }×tamp=${getNanoSeconds(timestamp)}&errorId=${id}`,
);
} catch (error) {
notification.error({
diff --git a/frontend/src/container/FormAlertRules/BasicInfo.tsx b/frontend/src/container/FormAlertRules/BasicInfo.tsx
index 2d1ce5eac4..c977c82a4e 100644
--- a/frontend/src/container/FormAlertRules/BasicInfo.tsx
+++ b/frontend/src/container/FormAlertRules/BasicInfo.tsx
@@ -22,7 +22,7 @@ interface BasicInfoProps {
function BasicInfo({ alertDef, setAlertDef }: BasicInfoProps): JSX.Element {
// init namespace for translations
- const { t } = useTranslation('rules');
+ const { t } = useTranslation('alerts');
return (
<>
diff --git a/frontend/src/container/FormAlertRules/ChartPreview/index.tsx b/frontend/src/container/FormAlertRules/ChartPreview/index.tsx
index d3634d8da1..b6f51227da 100644
--- a/frontend/src/container/FormAlertRules/ChartPreview/index.tsx
+++ b/frontend/src/container/FormAlertRules/ChartPreview/index.tsx
@@ -33,7 +33,7 @@ function ChartPreview({
headline,
threshold,
}: ChartPreviewProps): JSX.Element | null {
- const { t } = useTranslation('rules');
+ const { t } = useTranslation('alerts');
const staticLine: StaticLineProps | undefined =
threshold && threshold > 0
? {
diff --git a/frontend/src/container/FormAlertRules/QuerySection.tsx b/frontend/src/container/FormAlertRules/QuerySection.tsx
index e58cdc3ace..b34247e265 100644
--- a/frontend/src/container/FormAlertRules/QuerySection.tsx
+++ b/frontend/src/container/FormAlertRules/QuerySection.tsx
@@ -31,7 +31,7 @@ function QuerySection({
setPromQueries,
}: QuerySectionProps): JSX.Element {
// init namespace for translations
- const { t } = useTranslation('rules');
+ const { t } = useTranslation('alerts');
const handleQueryCategoryChange = (s: string): void => {
if (
diff --git a/frontend/src/container/FormAlertRules/RuleOptions.tsx b/frontend/src/container/FormAlertRules/RuleOptions.tsx
index 8bc87c483d..d9aff8bfb1 100644
--- a/frontend/src/container/FormAlertRules/RuleOptions.tsx
+++ b/frontend/src/container/FormAlertRules/RuleOptions.tsx
@@ -25,7 +25,7 @@ function RuleOptions({
queryCategory,
}: RuleOptionsProps): JSX.Element {
// init namespace for translations
- const { t } = useTranslation('rules');
+ const { t } = useTranslation('alerts');
const handleMatchOptChange = (value: string | unknown): void => {
const m = (value as string) || alertDef.condition?.matchType;
diff --git a/frontend/src/container/FormAlertRules/UserGuide/index.tsx b/frontend/src/container/FormAlertRules/UserGuide/index.tsx
new file mode 100644
index 0000000000..1cf5dac163
--- /dev/null
+++ b/frontend/src/container/FormAlertRules/UserGuide/index.tsx
@@ -0,0 +1,132 @@
+import { Col, Row, Typography } from 'antd';
+import TextToolTip from 'components/TextToolTip';
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { EQueryType } from 'types/common/dashboard';
+
+import {
+ StyledList,
+ StyledListItem,
+ StyledMainContainer,
+ StyledTopic,
+} from './styles';
+
+function UserGuide({ queryType }: UserGuideProps): JSX.Element {
+ // init namespace for translations
+ const { t } = useTranslation('alerts');
+
+ const renderStep1QB = (): JSX.Element => {
+ return (
+ <>
+ {t('user_guide_qb_step1')}
+
+ {t('user_guide_qb_step1a')}
+ {t('user_guide_qb_step1b')}
+ {t('user_guide_qb_step1c')}
+ {t('user_guide_qb_step1d')}
+
+ >
+ );
+ };
+ const renderStep2QB = (): JSX.Element => {
+ return (
+ <>
+ {t('user_guide_qb_step2')}
+
+ {t('user_guide_qb_step2a')}
+ {t('user_guide_qb_step2b')}
+
+ >
+ );
+ };
+
+ const renderStep3QB = (): JSX.Element => {
+ return (
+ <>
+ {t('user_guide_qb_step3')}
+
+ {t('user_guide_qb_step3a')}
+ {t('user_guide_qb_step3b')}
+
+ >
+ );
+ };
+
+ const renderGuideForQB = (): JSX.Element => {
+ return (
+ <>
+ {renderStep1QB()}
+ {renderStep2QB()}
+ {renderStep3QB()}
+ >
+ );
+ };
+ const renderStep1PQL = (): JSX.Element => {
+ return (
+ <>
+ {t('user_guide_pql_step1')}
+
+ {t('user_guide_pql_step1a')}
+ {t('user_guide_pql_step1b')}
+
+ >
+ );
+ };
+ const renderStep2PQL = (): JSX.Element => {
+ return (
+ <>
+ {t('user_guide_pql_step2')}
+
+ {t('user_guide_pql_step2a')}
+ {t('user_guide_pql_step2b')}
+
+ >
+ );
+ };
+
+ const renderStep3PQL = (): JSX.Element => {
+ return (
+ <>
+ {t('user_guide_pql_step3')}
+
+ {t('user_guide_pql_step3a')}
+ {t('user_guide_pql_step3b')}
+
+ >
+ );
+ };
+
+ const renderGuideForPQL = (): JSX.Element => {
+ return (
+ <>
+ {renderStep1PQL()}
+ {renderStep2PQL()}
+ {renderStep3PQL()}
+ >
+ );
+ };
+
+ return (
+
+
+
+ {t('user_guide_headline')}
+
+
+
+
+
+ {queryType === EQueryType.QUERY_BUILDER && renderGuideForQB()}
+ {queryType === EQueryType.PROM && renderGuideForPQL()}
+
+ );
+}
+
+interface UserGuideProps {
+ queryType: EQueryType;
+}
+
+export default UserGuide;
diff --git a/frontend/src/container/FormAlertRules/UserGuide/styles.ts b/frontend/src/container/FormAlertRules/UserGuide/styles.ts
new file mode 100644
index 0000000000..d4292f32d8
--- /dev/null
+++ b/frontend/src/container/FormAlertRules/UserGuide/styles.ts
@@ -0,0 +1,17 @@
+import { Card, Typography } from 'antd';
+import styled from 'styled-components';
+
+export const StyledMainContainer = styled(Card)``;
+
+export const StyledTopic = styled(Typography.Paragraph)`
+ font-weight: 600;
+`;
+
+export const StyledList = styled.ul`
+ padding-left: 18px;
+`;
+
+export const StyledListItem = styled.li`
+ font-style: italic;
+ padding-bottom: 0.5rem;
+`;
diff --git a/frontend/src/container/FormAlertRules/index.tsx b/frontend/src/container/FormAlertRules/index.tsx
index 1a1615fe52..38fcaad04d 100644
--- a/frontend/src/container/FormAlertRules/index.tsx
+++ b/frontend/src/container/FormAlertRules/index.tsx
@@ -25,8 +25,16 @@ import BasicInfo from './BasicInfo';
import ChartPreview from './ChartPreview';
import QuerySection from './QuerySection';
import RuleOptions from './RuleOptions';
-import { ActionButton, ButtonContainer, MainFormContainer } from './styles';
+import {
+ ActionButton,
+ ButtonContainer,
+ MainFormContainer,
+ PanelContainer,
+ StyledLeftContainer,
+ StyledRightContainer,
+} from './styles';
import useDebounce from './useDebounce';
+import UserGuide from './UserGuide';
import {
prepareBuilderQueries,
prepareStagedQuery,
@@ -41,7 +49,7 @@ function FormAlertRules({
ruleId,
}: FormAlertRuleProps): JSX.Element {
// init namespace for translations
- const { t } = useTranslation('rules');
+ const { t } = useTranslation('alerts');
// use query client
const ruleCache = useQueryClient();
@@ -309,50 +317,57 @@ function FormAlertRules({
return (
<>
{Element}
-
- {queryCategory === EQueryType.QUERY_BUILDER && renderQBChartPreview()}
- {queryCategory === EQueryType.PROM && renderPromChartPreview()}
-
-
-
-
- {renderBasicInfo()}
-
- }
+
+
+
- {ruleId > 0 ? t('button_savechanges') : t('button_createrule')}
-
-
- {ruleId === 0 && t('button_cancelchanges')}
- {ruleId > 0 && t('button_discard')}
-
-
-
+ {queryCategory === EQueryType.QUERY_BUILDER && renderQBChartPreview()}
+ {queryCategory === EQueryType.PROM && renderPromChartPreview()}
+
+
+
+
+ {renderBasicInfo()}
+
+ }
+ >
+ {ruleId > 0 ? t('button_savechanges') : t('button_createrule')}
+
+
+ {ruleId === 0 && t('button_cancelchanges')}
+ {ruleId > 0 && t('button_discard')}
+
+
+
+
+
+
+
+
>
);
}
diff --git a/frontend/src/container/FormAlertRules/labels/index.tsx b/frontend/src/container/FormAlertRules/labels/index.tsx
index 1ce72d306c..98fd564cbd 100644
--- a/frontend/src/container/FormAlertRules/labels/index.tsx
+++ b/frontend/src/container/FormAlertRules/labels/index.tsx
@@ -28,7 +28,7 @@ function LabelSelect({
onSetLabels,
initialValues,
}: LabelSelectProps): JSX.Element | null {
- const { t } = useTranslation('rules');
+ const { t } = useTranslation('alerts');
const { isDarkMode } = useSelector((state) => state.app);
const [currentVal, setCurrentVal] = useState('');
const [staging, setStaging] = useState([]);
diff --git a/frontend/src/container/FormAlertRules/styles.ts b/frontend/src/container/FormAlertRules/styles.ts
index 1626becfa6..3c64414cbe 100644
--- a/frontend/src/container/FormAlertRules/styles.ts
+++ b/frontend/src/container/FormAlertRules/styles.ts
@@ -1,11 +1,24 @@
-import { Button, Card, Form, Input, InputNumber, Select } from 'antd';
+import { Button, Card, Col, Form, Input, InputNumber, Row, Select } from 'antd';
import TextArea from 'antd/lib/input/TextArea';
import styled from 'styled-components';
-export const MainFormContainer = styled(Form)`
- max-width: 900px;
+export const PanelContainer = styled(Row)`
+ flex-wrap: nowrap;
`;
+export const StyledRightContainer = styled(Col)`
+ &&& {
+ }
+`;
+
+export const StyledLeftContainer = styled(Col)`
+ &&& {
+ margin-right: 1rem;
+ }
+`;
+
+export const MainFormContainer = styled(Form)``;
+
export const ButtonContainer = styled.div`
&&& {
display: flex;
diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/EllipsedButton.tsx b/frontend/src/container/TraceDetail/SelectedSpanDetails/EllipsedButton.tsx
new file mode 100644
index 0000000000..56ef64e4ee
--- /dev/null
+++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/EllipsedButton.tsx
@@ -0,0 +1,53 @@
+import { StyledButton } from 'components/Styled';
+import React from 'react';
+
+import { styles } from './styles';
+
+function EllipsedButton({
+ onToggleHandler,
+ setText,
+ value,
+ event,
+ buttonText,
+}: Props): JSX.Element {
+ const isFullValueButton = buttonText === 'View full value';
+
+ const style = [styles.removePadding];
+
+ if (!isFullValueButton) {
+ style.push(styles.removeMargin);
+ } else {
+ style.push(styles.selectedSpanDetailsContainer);
+ style.push(styles.buttonContainer);
+ }
+
+ return (
+ {
+ onToggleHandler(true);
+ setText({
+ subText: value,
+ text: event,
+ });
+ }}
+ type="link"
+ >
+ {buttonText}
+
+ );
+}
+
+interface Props {
+ onToggleHandler: (isOpen: boolean) => void;
+ setText: (text: { subText: string; text: string }) => void;
+ value: string;
+ event: string;
+ buttonText?: string;
+}
+
+EllipsedButton.defaultProps = {
+ buttonText: 'View full log event message',
+};
+
+export default EllipsedButton;
diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx b/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx
index 2a663387a5..69b51b3cd8 100644
--- a/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx
+++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/ErrorTag.tsx
@@ -1,29 +1,22 @@
-import { Collapse, Modal } from 'antd';
-import Editor from 'components/Editor';
-import { StyledButton } from 'components/Styled';
+import { Collapse } from 'antd';
import useThemeMode from 'hooks/useThemeMode';
import keys from 'lodash-es/keys';
import map from 'lodash-es/map';
-import React, { useState } from 'react';
+import React from 'react';
import { ITraceTree } from 'types/api/trace/getTraceItem';
-import { CustomSubText, CustomSubTitle, styles } from './styles';
+import EllipsedButton from './EllipsedButton';
+import { CustomSubText, CustomSubTitle } from './styles';
const { Panel } = Collapse;
-function ErrorTag({ event }: ErrorTagProps): JSX.Element {
- const [isOpen, setIsOpen] = useState(false);
+function ErrorTag({
+ event,
+ onToggleHandler,
+ setText,
+}: ErrorTagProps): JSX.Element {
const { isDarkMode } = useThemeMode();
- const [text, setText] = useState({
- text: '',
- subText: '',
- });
-
- const onToggleHandler = (state: boolean): void => {
- setIsOpen(state);
- };
-
return (
<>
{map(event, ({ attributeMap, name }) => {
@@ -45,23 +38,23 @@ function ErrorTag({ event }: ErrorTagProps): JSX.Element {
return (
<>
{event}
-
+
{value}
{isEllipsed && (
- {
- onToggleHandler(true);
- setText({
- subText: value,
- text: event,
- });
+
- View full log event message
-
+ />
)}
>
@@ -71,31 +64,14 @@ function ErrorTag({ event }: ErrorTagProps): JSX.Element {
);
})}
-
- onToggleHandler(false)}
- title="Log Message"
- visible={isOpen}
- destroyOnClose
- footer={[]}
- width="70vw"
- >
- {text.text}
-
- {text.text === 'exception.stacktrace' ? (
- {}} readOnly value={text.subText} />
- ) : (
-
- {text.subText}
-
- )}
-
>
);
}
interface ErrorTagProps {
event: ITraceTree['event'];
+ onToggleHandler: (isOpen: boolean) => void;
+ setText: (text: { subText: string; text: string }) => void;
}
export default ErrorTag;
diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx b/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx
index 08d6c057a9..49596d14d0 100644
--- a/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx
+++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/index.tsx
@@ -1,9 +1,11 @@
-import { Tabs, Tooltip, Typography } from 'antd';
+import { Modal, Tabs, Tooltip, Typography } from 'antd';
+import Editor from 'components/Editor';
import { StyledSpace } from 'components/Styled';
import useThemeMode from 'hooks/useThemeMode';
-import React, { useMemo } from 'react';
+import React, { useMemo, useState } from 'react';
import { ITraceTree } from 'types/api/trace/getTraceItem';
+import EllipsedButton from './EllipsedButton';
import ErrorTag from './ErrorTag';
import {
CardContainer,
@@ -12,6 +14,7 @@ import {
CustomText,
CustomTitle,
styles,
+ SubTextContainer,
} from './styles';
const { TabPane } = Tabs;
@@ -26,6 +29,17 @@ function SelectedSpanDetails(props: SelectedSpanDetailsProps): JSX.Element {
tree?.serviceName,
]);
+ const [isOpen, setIsOpen] = useState(false);
+
+ const [text, setText] = useState({
+ text: '',
+ subText: '',
+ });
+
+ const onToggleHandler = (state: boolean): void => {
+ setIsOpen(state);
+ };
+
if (!tree) {
return ;
}
@@ -52,18 +66,60 @@ function SelectedSpanDetails(props: SelectedSpanDetailsProps): JSX.Element {
+ onToggleHandler(false)}
+ title={text.text}
+ visible={isOpen}
+ destroyOnClose
+ footer={[]}
+ width="70vw"
+ centered
+ >
+ {text.text === 'exception.stacktrace' ? (
+ {}} readOnly value={text.subText} />
+ ) : (
+
+ {text.subText}
+
+ )}
+
+
{tags.length !== 0 ? (
tags.map((tags) => {
+ const value = tags.key === 'error' ? 'true' : tags.value;
+ const isEllipsed = value.length > 24;
+
return (
{tags.value && (
<>
{tags.key}
-
- {tags.key === 'error' ? 'true' : tags.value}
-
+
+ value}>
+
+ {value}
+
+
+ {isEllipsed && (
+
+ )}
+
+
>
)}
@@ -75,7 +131,11 @@ function SelectedSpanDetails(props: SelectedSpanDetailsProps): JSX.Element {
{tree.event && Object.keys(tree.event).length !== 0 ? (
-
+
) : (
No events data in selected span
)}
diff --git a/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts b/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts
index d8bae86ba7..3c9180dc94 100644
--- a/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts
+++ b/frontend/src/container/TraceDetail/SelectedSpanDetails/styles.ts
@@ -18,7 +18,8 @@ export const CustomText = styled(Paragraph)`
export const CustomSubTitle = styled(Title)`
&&& {
font-size: 14px;
- margin-bottom: 8px;
+ margin-bottom: 0.1rem;
+ margin-top: 0.5rem;
}
`;
@@ -26,13 +27,19 @@ interface CustomSubTextProps {
isDarkMode: boolean;
}
+export const SubTextContainer = styled.div`
+ &&& {
+ background: ${({ isDarkMode }): string => (isDarkMode ? '#444' : '#ddd')};
+ }
+`;
+
export const CustomSubText = styled(Paragraph)`
&&& {
background: ${({ isDarkMode }): string => (isDarkMode ? '#444' : '#ddd')};
font-size: 12px;
- padding: 6px 8px;
+ padding: 4px 8px;
word-break: break-all;
- margin-bottom: 16px;
+ margin-bottom: 0rem;
}
`;
@@ -81,10 +88,15 @@ const overflow = css`
}
`;
+const buttonContainer = css`
+ height: 1.5rem;
+`;
+
export const styles = {
removeMargin,
removePadding,
selectedSpanDetailsContainer,
spanEventsTabsContainer,
overflow,
+ buttonContainer,
};
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 93373097a1..f2d9ad04ad 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -4093,6 +4093,11 @@ chartjs-adapter-date-fns@^2.0.0:
resolved "https://registry.yarnpkg.com/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-2.0.0.tgz#5e53b2f660b993698f936f509c86dddf9ed44c6b"
integrity sha512-rmZINGLe+9IiiEB0kb57vH3UugAtYw33anRiw5kS2Tu87agpetDDoouquycWc9pRsKtQo5j+vLsYHyr8etAvFw==
+chartjs-plugin-annotation@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/chartjs-plugin-annotation/-/chartjs-plugin-annotation-1.4.0.tgz#4c84cec1ec838bc09712f3686237866e6c3f4798"
+ integrity sha512-OC0eGoVvdxTtGGi8mV3Dr+G1YmMhtYYQWqGMb2uWcgcnyiBslaRKPofKwAYWPbh7ABnmQNsNDQLIKPH+XiaZLA==
+
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
diff --git a/pkg/query-service/tests/test-deploy/clickhouse-config.xml b/pkg/query-service/tests/test-deploy/clickhouse-config.xml
index 3bb26a3a36..4a6a82b8af 100644
--- a/pkg/query-service/tests/test-deploy/clickhouse-config.xml
+++ b/pkg/query-service/tests/test-deploy/clickhouse-config.xml
@@ -22,7 +22,7 @@
[1]: https://github.com/pocoproject/poco/blob/poco-1.9.4-release/Foundation/include/Poco/Logger.h#L105-L114
-->
- trace
+ information
/var/log/clickhouse-server/clickhouse-server.log
/var/log/clickhouse-server/clickhouse-server.err.log