diff --git a/deploy/docker-swarm/clickhouse-setup/data/clickhouse-2/.gitkeep b/deploy/docker-swarm/clickhouse-setup/data/clickhouse-2/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker-swarm/clickhouse-setup/data/clickhouse-3/.gitkeep b/deploy/docker-swarm/clickhouse-setup/data/clickhouse-3/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker-swarm/clickhouse-setup/data/zookeeper-1/.gitkeep b/deploy/docker-swarm/clickhouse-setup/data/zookeeper-1/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker-swarm/clickhouse-setup/data/zookeeper-2/.gitkeep b/deploy/docker-swarm/clickhouse-setup/data/zookeeper-2/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker-swarm/clickhouse-setup/data/zookeeper-3/.gitkeep b/deploy/docker-swarm/clickhouse-setup/data/zookeeper-3/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml b/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml index f7506fa8fb..268b5df1b5 100644 --- a/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml +++ b/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml @@ -35,7 +35,6 @@ x-clickhouse-depend: &clickhouse-depend services: zookeeper-1: image: bitnami/zookeeper:3.7.0 - container_name: zookeeper-1 hostname: zookeeper-1 user: root ports: @@ -52,7 +51,6 @@ services: # zookeeper-2: # image: bitnami/zookeeper:3.7.0 - # container_name: zookeeper-2 # hostname: zookeeper-2 # user: root # ports: @@ -69,7 +67,6 @@ services: # zookeeper-3: # image: bitnami/zookeeper:3.7.0 - # container_name: zookeeper-3 # hostname: zookeeper-3 # user: root # ports: @@ -86,7 +83,6 @@ services: clickhouse: <<: *clickhouse-defaults - container_name: clickhouse hostname: clickhouse # ports: # - "9000:9000" @@ -101,7 +97,6 @@ services: # clickhouse-2: # <<: *clickhouse-defaults - # container_name: clickhouse-2 # hostname: clickhouse-2 # ports: # - "9001:9000" @@ -116,7 +111,6 @@ services: # clickhouse-3: # <<: *clickhouse-defaults - # container_name: clickhouse-3 # hostname: clickhouse-3 # ports: # - "9002:9000" @@ -143,7 +137,7 @@ services: condition: on-failure query-service: - image: signoz/query-service:0.12.0 + image: signoz/query-service:0.13.0 command: ["-config=/root/config/prometheus.yml"] # ports: # - "6060:6060" # pprof port @@ -172,7 +166,7 @@ services: <<: *clickhouse-depend frontend: - image: signoz/frontend:0.12.0 + image: signoz/frontend:0.13.0 deploy: restart_policy: condition: on-failure @@ -185,7 +179,7 @@ services: - ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf otel-collector: - image: signoz/signoz-otel-collector:0.66.0 + image: signoz/signoz-otel-collector:0.66.1 command: ["--config=/etc/otel-collector-config.yaml"] user: root # required for reading docker container logs volumes: @@ -213,7 +207,7 @@ services: <<: *clickhouse-depend otel-collector-metrics: - image: signoz/signoz-otel-collector:0.66.0 + image: signoz/signoz-otel-collector:0.66.1 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-swarm/clickhouse-setup/otel-collector-config.yaml b/deploy/docker-swarm/clickhouse-setup/otel-collector-config.yaml index c198c2f57c..0636b518cf 100644 --- a/deploy/docker-swarm/clickhouse-setup/otel-collector-config.yaml +++ b/deploy/docker-swarm/clickhouse-setup/otel-collector-config.yaml @@ -78,7 +78,7 @@ processors: signozspanmetrics/prometheus: metrics_exporter: prometheus latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s ] - dimensions_cache_size: 10000 + dimensions_cache_size: 100000 dimensions: - name: service.namespace default: default diff --git a/deploy/docker-swarm/common/nginx-config.conf b/deploy/docker-swarm/common/nginx-config.conf index 738805f89f..a8673496a2 100644 --- a/deploy/docker-swarm/common/nginx-config.conf +++ b/deploy/docker-swarm/common/nginx-config.conf @@ -30,6 +30,8 @@ server { location /api { proxy_pass http://query-service:8080/api; + # connection will be closed if no data is read for 600s between successive read operations + proxy_read_timeout 600s; } # redirect server error pages to the static page /50x.html diff --git a/deploy/docker/clickhouse-setup/data/clickhouse-2/.gitkeep b/deploy/docker/clickhouse-setup/data/clickhouse-2/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker/clickhouse-setup/data/clickhouse-3/.gitkeep b/deploy/docker/clickhouse-setup/data/clickhouse-3/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker/clickhouse-setup/data/zookeeper-1/.gitkeep b/deploy/docker/clickhouse-setup/data/zookeeper-1/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker/clickhouse-setup/data/zookeeper-2/.gitkeep b/deploy/docker/clickhouse-setup/data/zookeeper-2/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker/clickhouse-setup/data/zookeeper-3/.gitkeep b/deploy/docker/clickhouse-setup/data/zookeeper-3/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/deploy/docker/clickhouse-setup/docker-compose-core.yaml b/deploy/docker/clickhouse-setup/docker-compose-core.yaml index 791d3695f8..ea8960b40f 100644 --- a/deploy/docker/clickhouse-setup/docker-compose-core.yaml +++ b/deploy/docker/clickhouse-setup/docker-compose-core.yaml @@ -41,7 +41,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` otel-collector: container_name: otel-collector - image: signoz/signoz-otel-collector:0.66.0 + image: signoz/signoz-otel-collector:0.66.1 command: ["--config=/etc/otel-collector-config.yaml"] # user: root # required for reading docker container logs volumes: @@ -67,7 +67,7 @@ services: otel-collector-metrics: container_name: otel-collector-metrics - image: signoz/signoz-otel-collector:0.66.0 + image: signoz/signoz-otel-collector:0.66.1 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 a0948f1895..55f9d210f7 100644 --- a/deploy/docker/clickhouse-setup/docker-compose.yaml +++ b/deploy/docker/clickhouse-setup/docker-compose.yaml @@ -146,7 +146,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.12.0 + image: signoz/query-service:0.13.0 container_name: query-service command: ["-config=/root/config/prometheus.yml"] # ports: @@ -174,7 +174,7 @@ services: <<: *clickhouse-depend frontend: - image: signoz/frontend:0.12.0 + image: signoz/frontend:0.13.0 container_name: frontend restart: on-failure depends_on: @@ -186,7 +186,7 @@ services: - ../common/nginx-config.conf:/etc/nginx/conf.d/default.conf otel-collector: - image: signoz/signoz-otel-collector:0.66.0 + image: signoz/signoz-otel-collector:0.66.1 command: ["--config=/etc/otel-collector-config.yaml"] user: root # required for reading docker container logs volumes: @@ -211,7 +211,7 @@ services: <<: *clickhouse-depend otel-collector-metrics: - image: signoz/signoz-otel-collector:0.66.0 + image: signoz/signoz-otel-collector:0.66.1 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/otel-collector-config.yaml b/deploy/docker/clickhouse-setup/otel-collector-config.yaml index 2829bf966f..c6773d187d 100644 --- a/deploy/docker/clickhouse-setup/otel-collector-config.yaml +++ b/deploy/docker/clickhouse-setup/otel-collector-config.yaml @@ -74,7 +74,7 @@ processors: signozspanmetrics/prometheus: metrics_exporter: prometheus latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s ] - dimensions_cache_size: 10000 + dimensions_cache_size: 100000 dimensions: - name: service.namespace default: default diff --git a/deploy/docker/common/nginx-config.conf b/deploy/docker/common/nginx-config.conf index 738805f89f..a8673496a2 100644 --- a/deploy/docker/common/nginx-config.conf +++ b/deploy/docker/common/nginx-config.conf @@ -30,6 +30,8 @@ server { location /api { proxy_pass http://query-service:8080/api; + # connection will be closed if no data is read for 600s between successive read operations + proxy_read_timeout 600s; } # redirect server error pages to the static page /50x.html diff --git a/frontend/public/locales/en/translation.json b/frontend/public/locales/en/translation.json index c37480259b..a563ce92cb 100644 --- a/frontend/public/locales/en/translation.json +++ b/frontend/public/locales/en/translation.json @@ -6,7 +6,7 @@ "release_notes": "Release Notes", "read_how_to_upgrade": "Read instructions on how to upgrade", "latest_version_signoz": "You are running the latest version of SigNoz.", - "stale_version": "You are on an older version and may be losing out on the latest features we have shipped. We recommend to upgrade to the latest version", + "stale_version": "You are on an older version and may be missing out on the latest features we have shipped. We recommend to upgrade to the latest version", "oops_something_went_wrong_version": "Oops.. facing issues with fetching updated version information", "n_a": "N/A", "routes": { diff --git a/frontend/src/api/logs/livetail.ts b/frontend/src/api/logs/livetail.ts index f1cec5472a..150f63d193 100644 --- a/frontend/src/api/logs/livetail.ts +++ b/frontend/src/api/logs/livetail.ts @@ -4,14 +4,16 @@ import { ENVIRONMENT } from 'constants/env'; import { LOCALSTORAGE } from 'constants/localStorage'; import { EventSourcePolyfill } from 'event-source-polyfill'; -export const LiveTail = (queryParams: string): EventSourcePolyfill => { - const dict = { - headers: { - Authorization: `Bearer ${getLocalStorageKey(LOCALSTORAGE.AUTH_TOKEN)}`, - }, - }; - return new EventSourcePolyfill( +// 10 min in ms +const TIMEOUT_IN_MS = 10 * 60 * 1000; + +export const LiveTail = (queryParams: string): EventSourcePolyfill => + new EventSourcePolyfill( `${ENVIRONMENT.baseURL}${apiV1}logs/tail?${queryParams}`, - dict, + { + headers: { + Authorization: `Bearer ${getLocalStorageKey(LOCALSTORAGE.AUTH_TOKEN)}`, + }, + heartbeatTimeout: TIMEOUT_IN_MS, + }, ); -}; diff --git a/frontend/src/components/Logs/AddToQueryHOC.tsx b/frontend/src/components/Logs/AddToQueryHOC.tsx index 3978ca5948..ea517fa003 100644 --- a/frontend/src/components/Logs/AddToQueryHOC.tsx +++ b/frontend/src/components/Logs/AddToQueryHOC.tsx @@ -1,46 +1,21 @@ import { Button, Popover } from 'antd'; -import getStep from 'lib/getStep'; import { generateFilterQuery } from 'lib/logs/generateFilterQuery'; import React, { memo, useCallback, useMemo } from 'react'; -import { connect, useDispatch, useSelector } from 'react-redux'; -import { bindActionCreators, Dispatch } from 'redux'; -import { ThunkDispatch } from 'redux-thunk'; -import { getLogs } from 'store/actions/logs/getLogs'; -import { getLogsAggregate } from 'store/actions/logs/getLogsAggregate'; +import { useDispatch, useSelector } from 'react-redux'; import { AppState } from 'store/reducers'; -import AppActions from 'types/actions'; -import { SET_SEARCH_QUERY_STRING, TOGGLE_LIVE_TAIL } from 'types/actions/logs'; -import { GlobalReducer } from 'types/reducer/globalTime'; +import { SET_SEARCH_QUERY_STRING } from 'types/actions/logs'; import { ILogsReducer } from 'types/reducer/logs'; -interface AddToQueryHOCProps { - fieldKey: string; - fieldValue: string; - children: React.ReactNode; - getLogs: (props: Parameters[0]) => ReturnType; - getLogsAggregate: ( - props: Parameters[0], - ) => ReturnType; -} function AddToQueryHOC({ fieldKey, fieldValue, children, - getLogs, - getLogsAggregate, }: AddToQueryHOCProps): JSX.Element { const { searchFilter: { queryString }, - logLinesPerPage, - idStart, - idEnd, - liveTail, } = useSelector((store) => store.logs); const dispatch = useDispatch(); - const { maxTime, minTime } = useSelector( - (state) => state.globalTime, - ); const generatedQuery = useMemo( () => generateFilterQuery({ fieldKey, fieldValue, type: 'IN' }), [fieldKey, fieldValue], @@ -58,69 +33,14 @@ function AddToQueryHOC({ type: SET_SEARCH_QUERY_STRING, payload: updatedQueryString, }); - if (liveTail === 'STOPPED') { - getLogs({ - q: updatedQueryString, - limit: logLinesPerPage, - orderBy: 'timestamp', - order: 'desc', - timestampStart: minTime, - timestampEnd: maxTime, - ...(idStart ? { idGt: idStart } : {}), - ...(idEnd ? { idLt: idEnd } : {}), - }); - getLogsAggregate({ - timestampStart: minTime, - timestampEnd: maxTime, - step: getStep({ - start: minTime, - end: maxTime, - inputFormat: 'ns', - }), - q: updatedQueryString, - ...(idStart ? { idGt: idStart } : {}), - ...(idEnd ? { idLt: idEnd } : {}), - }); - } else if (liveTail === 'PLAYING') { - dispatch({ - type: TOGGLE_LIVE_TAIL, - payload: 'PAUSED', - }); - setTimeout( - () => - dispatch({ - type: TOGGLE_LIVE_TAIL, - payload: liveTail, - }), - 0, - ); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ - dispatch, - generatedQuery, - getLogs, - idEnd, - idStart, - logLinesPerPage, - maxTime, - minTime, - queryString, + }, [dispatch, generatedQuery, queryString]); + + const popOverContent = useMemo(() => Add to query: {fieldKey}, [ + fieldKey, ]); - const popOverContent = ( - Add to query: {fieldKey} - ); return ( - ); } +interface Props { + text?: string; +} + +NotFound.defaultProps = { + text: defaultText, +}; + export default NotFound; diff --git a/frontend/src/container/AllError/constant.ts b/frontend/src/container/AllError/constant.ts new file mode 100644 index 0000000000..268f3ff89c --- /dev/null +++ b/frontend/src/container/AllError/constant.ts @@ -0,0 +1,9 @@ +const DEFAULT_FILTER_VALUE = ''; +const EXCEPTION_TYPE_FILTER_NAME = 'exceptionType'; +const SERVICE_NAME_FILTER_NAME = 'serviceName'; + +export { + DEFAULT_FILTER_VALUE, + EXCEPTION_TYPE_FILTER_NAME, + SERVICE_NAME_FILTER_NAME, +}; diff --git a/frontend/src/container/AllError/index.tsx b/frontend/src/container/AllError/index.tsx index 6db945b9bc..5d4a6367b3 100644 --- a/frontend/src/container/AllError/index.tsx +++ b/frontend/src/container/AllError/index.tsx @@ -17,6 +17,7 @@ import getAll from 'api/errors/getAll'; import getErrorCounts from 'api/errors/getErrorCounts'; import ROUTES from 'constants/routes'; import dayjs from 'dayjs'; +import useUrlQuery from 'hooks/useUrlQuery'; import createQueryParams from 'lib/createQueryParams'; import history from 'lib/history'; import React, { useCallback, useEffect, useMemo } from 'react'; @@ -30,7 +31,11 @@ import { Exception, PayloadProps } from 'types/api/errors/getAll'; import { GlobalReducer } from 'types/reducer/globalTime'; import { + extractFilterValues, + getDefaultFilterValue, getDefaultOrder, + getFilterString, + getFilterValues, getNanoSeconds, getOffSet, getOrder, @@ -43,15 +48,27 @@ function AllErrors(): JSX.Element { const { maxTime, minTime, loading } = useSelector( (state) => state.globalTime, ); - const { search, pathname } = useLocation(); - const params = useMemo(() => new URLSearchParams(search), [search]); - + const { pathname } = useLocation(); + const params = useUrlQuery(); const { t } = useTranslation(['common']); - - const updatedOrder = getOrder(params.get(urlKey.order)); - const getUpdatedOffset = getOffSet(params.get(urlKey.offset)); - const getUpdatedParams = getOrderParams(params.get(urlKey.orderParam)); - const getUpdatedPageSize = getUpdatePageSize(params.get(urlKey.pageSize)); + const { + updatedOrder, + getUpdatedOffset, + getUpdatedParams, + getUpdatedPageSize, + getUpdatedExceptionType, + getUpdatedServiceName, + } = useMemo( + () => ({ + updatedOrder: getOrder(params.get(urlKey.order)), + getUpdatedOffset: getOffSet(params.get(urlKey.offset)), + getUpdatedParams: getOrderParams(params.get(urlKey.orderParam)), + getUpdatedPageSize: getUpdatePageSize(params.get(urlKey.pageSize)), + getUpdatedExceptionType: getFilterString(params.get(urlKey.exceptionType)), + getUpdatedServiceName: getFilterString(params.get(urlKey.serviceName)), + }), + [params], + ); const updatedPath = useMemo( () => @@ -60,6 +77,8 @@ function AllErrors(): JSX.Element { offset: getUpdatedOffset, orderParam: getUpdatedParams, pageSize: getUpdatedPageSize, + exceptionType: getUpdatedExceptionType, + serviceName: getUpdatedServiceName, })}`, [ pathname, @@ -67,6 +86,8 @@ function AllErrors(): JSX.Element { getUpdatedOffset, getUpdatedParams, getUpdatedPageSize, + getUpdatedExceptionType, + getUpdatedServiceName, ], ); @@ -81,6 +102,8 @@ function AllErrors(): JSX.Element { limit: getUpdatedPageSize, offset: getUpdatedOffset, orderParam: getUpdatedParams, + exceptionType: getUpdatedExceptionType, + serviceName: getUpdatedServiceName, }), enabled: !loading, }, @@ -108,14 +131,43 @@ function AllErrors(): JSX.Element { const filterIcon = useCallback(() => , []); - const handleSearch = ( - confirm: (param?: FilterConfirmProps) => void, - ): VoidFunction => (): void => { - confirm(); - }; + const handleSearch = useCallback( + ( + confirm: (param?: FilterConfirmProps) => void, + filterValue: string, + filterKey: string, + ): VoidFunction => (): void => { + const { exceptionFilterValue, serviceFilterValue } = getFilterValues( + getUpdatedServiceName || '', + getUpdatedExceptionType || '', + filterKey, + filterValue || '', + ); + history.replace( + `${pathname}?${createQueryParams({ + order: updatedOrder, + offset: getUpdatedOffset, + orderParam: getUpdatedParams, + pageSize: getUpdatedPageSize, + exceptionType: exceptionFilterValue, + serviceName: serviceFilterValue, + })}`, + ); + confirm(); + }, + [ + getUpdatedExceptionType, + getUpdatedOffset, + getUpdatedPageSize, + getUpdatedParams, + getUpdatedServiceName, + pathname, + updatedOrder, + ], + ); const filterDropdownWrapper = useCallback( - ({ setSelectedKeys, selectedKeys, confirm, placeholder }) => { + ({ setSelectedKeys, selectedKeys, confirm, placeholder, filterKey }) => { return ( @@ -126,11 +178,16 @@ function AllErrors(): JSX.Element { setSelectedKeys(e.target.value ? [e.target.value] : []) } allowClear - onPressEnter={handleSearch(confirm)} + defaultValue={getDefaultFilterValue( + filterKey, + getUpdatedServiceName, + getUpdatedExceptionType, + )} + onPressEnter={handleSearch(confirm, selectedKeys[0], filterKey)} />