diff --git a/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml b/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml index 45b4137d1110..4f2736087620 100644 --- a/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml +++ b/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml @@ -39,7 +39,7 @@ services: condition: on-failure query-service: - image: signoz/query-service:0.8.2 + image: signoz/query-service:0.9.0 command: ["-config=/root/config/prometheus.yml"] # ports: # - "6060:6060" # pprof port @@ -67,7 +67,7 @@ services: - clickhouse frontend: - image: signoz/frontend:0.8.2 + image: signoz/frontend:0.9.0 deploy: restart_policy: condition: on-failure @@ -80,7 +80,7 @@ services: - ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf otel-collector: - image: signoz/otelcontribcol:0.45.1-0.3 + image: signoz/otelcontribcol:0.45.1-1.0 command: ["--config=/etc/otel-collector-config.yaml"] volumes: - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml @@ -106,7 +106,7 @@ services: - clickhouse otel-collector-metrics: - image: signoz/otelcontribcol:0.45.1-0.3 + image: signoz/otelcontribcol:0.45.1-1.0 command: ["--config=/etc/otel-collector-metrics-config.yaml"] volumes: - ./otel-collector-metrics-config.yaml:/etc/otel-collector-metrics-config.yaml diff --git a/deploy/docker/clickhouse-setup/docker-compose.yaml b/deploy/docker/clickhouse-setup/docker-compose.yaml index 166a2096e342..8ce015e298ad 100644 --- a/deploy/docker/clickhouse-setup/docker-compose.yaml +++ b/deploy/docker/clickhouse-setup/docker-compose.yaml @@ -38,7 +38,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.8.2 + image: signoz/query-service:0.9.0 container_name: query-service command: ["-config=/root/config/prometheus.yml"] # ports: @@ -65,7 +65,7 @@ services: condition: service_healthy frontend: - image: signoz/frontend:0.8.2 + image: signoz/frontend:0.9.0 container_name: frontend restart: on-failure depends_on: @@ -77,7 +77,7 @@ services: - ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf otel-collector: - image: signoz/otelcontribcol:0.45.1-0.3 + image: signoz/otelcontribcol:0.45.1-1.0 command: ["--config=/etc/otel-collector-config.yaml"] volumes: - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml @@ -98,7 +98,7 @@ services: condition: service_healthy otel-collector-metrics: - image: signoz/otelcontribcol:0.45.1-0.3 + image: signoz/otelcontribcol:0.45.1-1.0 command: ["--config=/etc/otel-collector-metrics-config.yaml"] volumes: - ./otel-collector-metrics-config.yaml:/etc/otel-collector-metrics-config.yaml diff --git a/deploy/install.sh b/deploy/install.sh index 12814c898040..492336a56619 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -36,9 +36,9 @@ is_mac() { [[ $OSTYPE == darwin* ]] } -is_arm64(){ - [[ `uname -m` == 'arm64' ]] -} +# is_arm64(){ +# [[ `uname -m` == 'arm64' ]] +# } check_os() { if is_mac; then @@ -237,11 +237,7 @@ bye() { # Prints a friendly good bye message and exits the script. echo "🔴 The containers didn't seem to start correctly. Please run the following command to check containers that may have errored out:" echo "" - if is_arm64; then - echo -e "$sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.arm.yaml ps -a" - else - echo -e "$sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml ps -a" - fi + echo -e "$sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml ps -a" # echo "Please read our troubleshooting guide https://signoz.io/docs/deployment/docker#troubleshooting" echo "or reach us for support in #help channel in our Slack Community https://signoz.io/slack" @@ -466,22 +462,14 @@ start_docker echo "" echo -e "\n🟡 Pulling the latest container images for SigNoz.\n" -if is_arm64; then - $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.arm.yaml pull -else - $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml pull -fi +$sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml pull echo "" echo "🟡 Starting the SigNoz containers. It may take a few minutes ..." echo # The docker-compose command does some nasty stuff for the `--detach` functionality. So we add a `|| true` so that the # script doesn't exit because this command looks like it failed to do it's thing. -if is_arm64; then - $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.arm.yaml up --detach --remove-orphans || true -else - $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml up --detach --remove-orphans || true -fi +$sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml up --detach --remove-orphans || true wait_for_containers_start 60 echo "" @@ -510,11 +498,7 @@ else echo -e "🟢 Your frontend is running on http://localhost:3301" echo "" - if is_arm64; then - echo "ℹ️ To bring down SigNoz and clean volumes : $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.arm.yaml down -v" - else - echo "ℹ️ To bring down SigNoz and clean volumes : $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml down -v" - fi + echo "ℹ️ To bring down SigNoz and clean volumes : $sudo_cmd docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml down -v" echo "" echo "+++++++++++++++++++++++++++++++++++++++++++++++++" diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 82f4bdc010b9..b59a224cdca2 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -102,6 +102,11 @@ export const AxiosAlertManagerInstance = axios.create({ export const ApiV2Instance = axios.create({ baseURL: `${ENVIRONMENT.baseURL}${apiV2}`, }); +ApiV2Instance.interceptors.response.use( + interceptorsResponse, + interceptorRejected, +); +ApiV2Instance.interceptors.request.use(interceptorsRequestResponse); AxiosAlertManagerInstance.interceptors.response.use( interceptorsResponse, diff --git a/frontend/src/components/Graph/yAxisConfig.ts b/frontend/src/components/Graph/yAxisConfig.ts index 44377b6fc52e..5d1eeb5da787 100644 --- a/frontend/src/components/Graph/yAxisConfig.ts +++ b/frontend/src/components/Graph/yAxisConfig.ts @@ -7,17 +7,13 @@ export const getYAxisFormattedValue = ( let decimalPrecision: number | undefined; const parsedValue = getValueFormat(format)( parseFloat(value), - 12, - 12, + undefined, + undefined, undefined, ); - try { const decimalSplitted = parsedValue.text.split('.'); - if ( - decimalSplitted.length === 1 || - parseFloat(parsedValue.text) === parseInt(parsedValue.text, 10) - ) { + if (decimalSplitted.length === 1) { decimalPrecision = 0; } else { const decimalDigits = decimalSplitted[1].split(''); diff --git a/frontend/src/components/TextToolTip/index.tsx b/frontend/src/components/TextToolTip/index.tsx index 06802b475f97..60032ab5c904 100644 --- a/frontend/src/components/TextToolTip/index.tsx +++ b/frontend/src/components/TextToolTip/index.tsx @@ -24,8 +24,11 @@ function TextToolTip({ text, url }: TextToolTipProps): JSX.Element { ); } +TextToolTip.defaultProps = { + url: '', +}; interface TextToolTipProps { - url: string; + url?: string; text: string; } diff --git a/frontend/src/container/GridGraphLayout/index.tsx b/frontend/src/container/GridGraphLayout/index.tsx index 8f7ea56c15aa..d80b12f7a141 100644 --- a/frontend/src/container/GridGraphLayout/index.tsx +++ b/frontend/src/container/GridGraphLayout/index.tsx @@ -113,20 +113,21 @@ function GridGraph(props: Props): JSX.Element { errorMessage: '', loading: true, })); - + const updatedDashboard: Dashboard = { + ...selectedDashboard, + data: { + title: data.title, + description: data.description, + name: data.name, + tags: data.tags, + widgets: data.widgets, + layout, + }, + uuid: selectedDashboard.uuid, + }; // Save layout only when users has the has the permission to do so. if (saveLayoutPermission) { - const response = await updateDashboardApi({ - data: { - title: data.title, - description: data.description, - name: data.name, - tags: data.tags, - widgets: data.widgets, - layout, - }, - uuid: selectedDashboard.uuid, - }); + const response = await updateDashboardApi(updatedDashboard); if (response.statusCode === 200) { setSaveLayoutState((state) => ({ ...state, @@ -134,6 +135,10 @@ function GridGraph(props: Props): JSX.Element { errorMessage: '', loading: false, })); + dispatch({ + type: UPDATE_DASHBOARD, + payload: updatedDashboard, + }); } else { setSaveLayoutState((state) => ({ ...state, @@ -153,8 +158,9 @@ function GridGraph(props: Props): JSX.Element { data.tags, data.title, data.widgets, + dispatch, saveLayoutPermission, - selectedDashboard.uuid, + selectedDashboard, ], ); diff --git a/frontend/src/container/GridGraphLayout/utils.ts b/frontend/src/container/GridGraphLayout/utils.ts index c2c762e1f7d1..0d7320f6f50b 100644 --- a/frontend/src/container/GridGraphLayout/utils.ts +++ b/frontend/src/container/GridGraphLayout/utils.ts @@ -36,18 +36,17 @@ export const UpdateDashboard = async ({ nullZeroValues: '', opacity: '', panelTypes: graphType, - queryType: 0, query: { queryType: EQueryType.QUERY_BUILDER, promQL: [ { - name: GetQueryName([]), + name: GetQueryName([]) || '', ...PromQLQueryTemplate, }, ], clickHouse: [ { - name: GetQueryName([]), + name: GetQueryName([]) || '', ...ClickHouseQueryTemplate, }, ], @@ -55,14 +54,14 @@ export const UpdateDashboard = async ({ formulas: [], queryBuilder: [ { - name: GetQueryName([]), + name: GetQueryName([]) || '', ...QueryBuilderQueryTemplate, }, ], }, }, queryData: { - data: [], + data: { queryData: [] }, error: false, errorMessage: '', loading: false, diff --git a/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx b/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx index 99f5fb0eeb18..021a5f9805cd 100644 --- a/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx +++ b/frontend/src/container/ListOfDashboard/ImportJSON/index.tsx @@ -73,10 +73,7 @@ function ImportJSON({ ...e, queryData: { ...e.queryData, - data: e.queryData.data.map((queryData) => ({ - ...queryData, - queryData: [], - })), + data: e.queryData.data, error: false, errorMessage: '', loading: false, diff --git a/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx b/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx index b5466f2b0267..60441b78766a 100644 --- a/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/DBCall.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; import { AppState } from 'store/reducers'; -import { PromQLWidgets, Widgets } from 'types/api/dashboard/getAll'; +import { PromQLWidgets } from 'types/api/dashboard/getAll'; import MetricReducer from 'types/reducer/metrics'; import { Card, GraphContainer, GraphTitle, Row } from '../styles'; diff --git a/frontend/src/container/MetricsApplication/Tabs/External.tsx b/frontend/src/container/MetricsApplication/Tabs/External.tsx index 2974ba3f38cd..9811e2f26903 100644 --- a/frontend/src/container/MetricsApplication/Tabs/External.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/External.tsx @@ -29,7 +29,7 @@ function External({ getWidget }: ExternalProps): JSX.Element { widget={getWidget([ { query: `max((sum(rate(signoz_external_call_latency_count{service_name="${servicename}", status_code="STATUS_CODE_ERROR"${resourceAttributePromQLQuery}}[1m]) OR rate(signoz_external_call_latency_count{service_name="${servicename}", http_status_code=~"5.."${resourceAttributePromQLQuery}}[1m]) OR vector(0)) by (http_url))*100/sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[1m])) by (http_url)) < 1000 OR vector(0)`, - legend, + legend: 'External Call Error Percentage', }, ])} yAxisUnit="%" diff --git a/frontend/src/container/MetricsApplication/Tabs/Overview.tsx b/frontend/src/container/MetricsApplication/Tabs/Overview.tsx index a24e67aeb73f..a53714d05d1d 100644 --- a/frontend/src/container/MetricsApplication/Tabs/Overview.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/Overview.tsx @@ -42,7 +42,8 @@ function Application({ getWidget }: DashboardProps): JSX.Element { urlParams.set(METRICS_PAGE_QUERY_PARAM.endTime, tPlusOne.toString()); history.replace( - `${ROUTES.TRACE + `${ + ROUTES.TRACE }?${urlParams.toString()}&selected={"serviceName":["${servicename}"]}&filterToFetchData=["duration","status","serviceName"]&spanAggregateCurrentPage=1&selectedTags=${selectedTraceTags}&&isFilterExclude={"serviceName":false}&userSelectedFilter={"status":["error","ok"],"serviceName":["${servicename}"]}&spanAggregateCurrentPage=1&spanAggregateOrder=ascend`, ); }; @@ -93,7 +94,8 @@ function Application({ getWidget }: DashboardProps): JSX.Element { urlParams.set(METRICS_PAGE_QUERY_PARAM.endTime, tPlusOne.toString()); history.replace( - `${ROUTES.TRACE + `${ + ROUTES.TRACE }?${urlParams.toString()}?selected={"serviceName":["${servicename}"],"status":["error"]}&filterToFetchData=["duration","status","serviceName"]&spanAggregateCurrentPage=1&selectedTags=${selectedTraceTags}&isFilterExclude={"serviceName":false,"status":false}&userSelectedFilter={"serviceName":["${servicename}"],"status":["error"]}&spanAggregateCurrentPage=1&spanAggregateOrder=ascend`, ); }; diff --git a/frontend/src/container/MetricsApplication/index.tsx b/frontend/src/container/MetricsApplication/index.tsx index aeaf4a5664a1..f6305358b3c5 100644 --- a/frontend/src/container/MetricsApplication/index.tsx +++ b/frontend/src/container/MetricsApplication/index.tsx @@ -20,7 +20,7 @@ const getWidget = (query: PromQLWidgets['query']): PromQLWidgets => { panelTypes: 'TIME_SERIES', query, queryData: { - data: [], + data: { queryData: [] }, error: false, errorMessage: '', loading: false, diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/Options.ts b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/Options.ts index 80a14f173bed..38d9094dcc94 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/Options.ts +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/Options.ts @@ -5,7 +5,7 @@ export const AggregateFunctions = Object.keys(EAggregateOperator) .map((key) => { return { label: key, - value: EAggregateOperator[key], + value: EAggregateOperator[key as keyof typeof EAggregateOperator], }; }); diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/QueryHeader.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/QueryHeader.tsx index 9164c532af68..6584cdc39079 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/QueryHeader.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/QueryHeader.tsx @@ -10,13 +10,21 @@ import React, { useState } from 'react'; import { QueryWrapper } from '../styles'; +interface IQueryHeaderProps { + disabled: boolean; + onDisable: VoidFunction; + name: string; + onDelete: VoidFunction; + children: React.ReactNode; +} + function QueryHeader({ disabled, onDisable, name, onDelete, children, -}): JSX.Element { +}: IQueryHeaderProps): JSX.Element { const [collapse, setCollapse] = useState(false); return ( diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/index.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/index.tsx index cabd7470b814..b2712c86ae59 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/index.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/index.tsx @@ -2,23 +2,31 @@ import { PlusOutlined } from '@ant-design/icons'; import { ClickHouseQueryTemplate } from 'constants/dashboard'; import GetQueryName from 'lib/query/GetQueryName'; import React from 'react'; +import { Query } from 'types/api/dashboard/getAll'; import { WIDGET_CLICKHOUSE_QUERY_KEY_NAME } from '../../constants'; import { QueryButton } from '../../styles'; +import { IHandleUpdatedQuery } from '../../types'; import ClickHouseQueryBuilder from './query'; +import { IClickHouseQueryHandleChange } from './types'; +interface IClickHouseQueryContainerProps { + queryData: Query; + updateQueryData: (args: IHandleUpdatedQuery) => void; + clickHouseQueries: Query['clickHouse']; +} function ClickHouseQueryContainer({ queryData, updateQueryData, clickHouseQueries, -}): JSX.Element | null { +}: IClickHouseQueryContainerProps): JSX.Element | null { const handleClickHouseQueryChange = ({ queryIndex, rawQuery, legend, toggleDisable, toggleDelete, - }): void => { + }: IClickHouseQueryHandleChange): void => { const allQueries = queryData[WIDGET_CLICKHOUSE_QUERY_KEY_NAME]; const currentIndexQuery = allQueries[queryIndex]; @@ -40,7 +48,7 @@ function ClickHouseQueryContainer({ }; const addQueryHandler = (): void => { queryData[WIDGET_CLICKHOUSE_QUERY_KEY_NAME].push({ - name: GetQueryName(queryData[WIDGET_CLICKHOUSE_QUERY_KEY_NAME]), + name: GetQueryName(queryData[WIDGET_CLICKHOUSE_QUERY_KEY_NAME]) || '', ...ClickHouseQueryTemplate, }); updateQueryData({ updatedQuery: { ...queryData } }); diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/query.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/query.tsx index f51ffbf08b93..7e9a3df0c263 100644 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/query.tsx +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/query.tsx @@ -1,14 +1,22 @@ import { Input } from 'antd'; import MonacoEditor from 'components/Editor'; import React from 'react'; +import { IClickHouseQuery } from 'types/api/dashboard/getAll'; import QueryHeader from '../QueryHeader'; +import { IClickHouseQueryHandleChange } from './types'; + +interface IClickHouseQueryBuilderProps { + queryData: IClickHouseQuery; + queryIndex: number; + handleQueryChange: (args: IClickHouseQueryHandleChange) => void; +} function ClickHouseQueryBuilder({ queryData, queryIndex, handleQueryChange, -}): JSX.Element | null { +}: IClickHouseQueryBuilderProps): JSX.Element | null { if (queryData === undefined) { return null; } @@ -26,7 +34,6 @@ function ClickHouseQueryBuilder({ > handleQueryChange({ queryIndex, rawQuery: value }) diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/types.ts b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/types.ts new file mode 100644 index 000000000000..6e0d21b206ce --- /dev/null +++ b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/clickHouse/types.ts @@ -0,0 +1,9 @@ +import { IClickHouseQuery } from 'types/api/dashboard/getAll'; + +export interface IClickHouseQueryHandleChange { + queryIndex: number; + rawQuery?: IClickHouseQuery['rawQuery']; + legend?: IClickHouseQuery['legend']; + toggleDisable?: IClickHouseQuery['disabled']; + toggleDelete?: boolean; +} diff --git a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/index.tsx b/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/index.tsx deleted file mode 100644 index ba01fb03893b..000000000000 --- a/frontend/src/container/NewWidget/LeftContainer/QuerySection/QueryBuilder/index.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { - DeleteOutlined, - DownOutlined, - EyeFilled, - RightOutlined, -} from '@ant-design/icons'; -import { Button, Row } from 'antd'; -import MonacoEditor from 'components/Editor'; -import React, { useState } from 'react'; -import { useSelector } from 'react-redux'; -import { AppState } from 'store/reducers'; -import AppReducer from 'types/reducer/app'; - -import { QueryBuilderWrapper, QueryWrapper } from '../styles'; -import { TQueryCategories } from '../types'; -import PromQLQueryBuilder from './promQL/promQL'; -import MetricsBuilder from './queryBuilder/query'; - -function QueryBuilder({ - name, - onDelete, - queryCategory, - queryData, - updateQueryData, -}: QueryBuilderProps): JSX.Element { - const { isDarkMode } = useSelector((state) => state.app); - const [hideFromUI, setHideFromUI] = useState(false); - const handleHideFromUI = (): void => { - setHideFromUI(!hideFromUI); - }; - const handleClickhouseQueryChange = (clickHouseQuery): void => { - if (clickHouseQuery !== null) { - queryData.clickHouseQuery = clickHouseQuery; - } - updateQueryData(queryData); - }; - const handlePromQLQueryChange = ({ query, legend }): void => { - if (query) queryData.promQL.query = query; - if (legend) queryData.promQL.legend = legend; - - updateQueryData(queryData); - }; - - return ( - - - - -