diff --git a/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml b/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml index 18e11f17f4..425dbde5a3 100644 --- a/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml +++ b/deploy/docker-swarm/clickhouse-setup/docker-compose.yaml @@ -29,7 +29,7 @@ services: condition: on-failure query-service: - image: signoz/query-service:0.7.2 + image: signoz/query-service:0.7.3 command: ["-config=/root/config/prometheus.yml"] ports: - "8080:8080" @@ -51,7 +51,7 @@ services: - clickhouse frontend: - image: signoz/frontend:0.7.2 + image: signoz/frontend:0.7.3 depends_on: - query-service ports: diff --git a/deploy/docker/clickhouse-setup/docker-compose.arm.yaml b/deploy/docker/clickhouse-setup/docker-compose.arm.yaml index eeca2a87c2..2d5a638fd9 100644 --- a/deploy/docker/clickhouse-setup/docker-compose.arm.yaml +++ b/deploy/docker/clickhouse-setup/docker-compose.arm.yaml @@ -24,7 +24,7 @@ services: - '--storage.path=/data' query-service: - image: signoz/query-service:0.7.2 + image: signoz/query-service:0.7.3 container_name: query-service command: ["-config=/root/config/prometheus.yml"] volumes: @@ -44,7 +44,7 @@ services: condition: service_healthy frontend: - image: signoz/frontend:0.7.2 + image: signoz/frontend:0.7.3 container_name: frontend depends_on: - query-service diff --git a/deploy/docker/clickhouse-setup/docker-compose.yaml b/deploy/docker/clickhouse-setup/docker-compose.yaml index b360cfe715..ac69884ff6 100644 --- a/deploy/docker/clickhouse-setup/docker-compose.yaml +++ b/deploy/docker/clickhouse-setup/docker-compose.yaml @@ -27,7 +27,7 @@ services: query-service: - image: signoz/query-service:0.7.2 + image: signoz/query-service:0.7.3 container_name: query-service command: ["-config=/root/config/prometheus.yml"] volumes: @@ -47,7 +47,7 @@ services: condition: service_healthy frontend: - image: signoz/frontend:0.7.2 + image: signoz/frontend:0.7.3 container_name: frontend depends_on: - query-service diff --git a/deploy/install.sh b/deploy/install.sh index 27f80d4331..569394bee5 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -158,7 +158,9 @@ install_docker() { echo # yum install docker # service docker start - $sudo_cmd amazon-linux-extras install docker + $sudo_cmd yum install -y amazon-linux-extras + $sudo_cmd amazon-linux-extras enable docker + $sudo_cmd yum install -y docker else yum_cmd="$sudo_cmd yum --assumeyes --quiet" @@ -195,16 +197,16 @@ install_docker_compose() { start_docker() { echo -e "🐳 Starting Docker ...\n" - if [ $os = "Mac" ]; then + if [[ $os == "Mac" ]]; then open --background -a Docker && while ! docker system info > /dev/null 2>&1; do sleep 1; done else if ! $sudo_cmd systemctl is-active docker.service > /dev/null; then echo "Starting docker service" $sudo_cmd systemctl start docker.service fi - if [ -z $sudo_cmd ]; then + if [[ -z $sudo_cmd ]]; then docker ps > /dev/null && true - if [ $? -ne 0 ]; then + if [[ $? -ne 0 ]]; then request_sudo fi fi @@ -230,7 +232,7 @@ wait_for_containers_start() { } bye() { # Prints a friendly good bye message and exits the script. - if [ "$?" -ne 0 ]; then + if [[ "$?" -ne 0 ]]; then set +o errexit echo "šŸ”“ The containers didn't seem to start correctly. Please run the following command to check containers that may have errored out:" @@ -266,17 +268,17 @@ bye() { # Prints a friendly good bye message and exits the script. request_sudo() { if hash sudo 2>/dev/null; then - sudo_cmd="sudo" echo -e "\n\nšŸ™‡ We will need sudo access to complete the installation." - if ! $sudo_cmd -v && (( $EUID != 0 )); then - echo -e "Please enter your sudo password now:" - - if ! $sudo_cmd -v; then + if (( $EUID != 0 )); then + sudo_cmd="sudo" + echo -e "Please enter your sudo password, if prompt." + $sudo_cmd -l | grep -e "NOPASSWD: ALL" > /dev/null + if [[ $? -ne 0 ]] && ! $sudo_cmd -v; then echo "Need sudo privileges to proceed with the installation." exit 1; fi - echo -e "Thanks! šŸ™\n" + echo -e "Got it! Thanks!! šŸ™\n" echo -e "Okay! We will bring up the SigNoz cluster from here šŸš€\n" fi fi @@ -291,9 +293,6 @@ sudo_cmd="" # Check sudo permissions if (( $EUID != 0 )); then echo "🟔 Running installer with non-sudo permissions." - if ! is_command_present docker; then - $sudo_cmd docker ps - fi echo " In case of any failure or prompt, please consider running the script with sudo privileges." echo "" else @@ -309,7 +308,7 @@ check_os # Obtain unique installation id sysinfo="$(uname -a)" -if [ $? -ne 0 ]; then +if [[ $? -ne 0 ]]; then uuid="$(uuidgen)" uuid="${uuid:-$(cat /proc/sys/kernel/random/uuid)}" sysinfo="${uuid:-$(cat /proc/sys/kernel/random/uuid)}" @@ -324,7 +323,7 @@ elif hash openssl 2>/dev/null; then digest_cmd="openssl dgst -sha256" fi -if [ -z $digest_cmd ]; then +if [[ -z $digest_cmd ]]; then SIGNOZ_INSTALLATION_ID="$sysinfo" else SIGNOZ_INSTALLATION_ID=$(echo "$sysinfo" | $digest_cmd | grep -E -o '[a-zA-Z0-9]{64}') @@ -407,7 +406,7 @@ send_event() { ;; esac - if [ "$error" != "" ]; then + if [[ "$error" != "" ]]; then error='"error": "'"$error"'", ' fi diff --git a/frontend/src/components/Editor/index.tsx b/frontend/src/components/Editor/index.tsx index 790b99c9f9..51a024f607 100644 --- a/frontend/src/components/Editor/index.tsx +++ b/frontend/src/components/Editor/index.tsx @@ -9,6 +9,12 @@ function Editor({ value }: EditorProps): JSX.Element { value={value.current} options={{ fontSize: 16, automaticLayout: true }} height="40vh" + onChange={(newValue): void => { + if (value.current && newValue) { + // eslint-disable-next-line no-param-reassign + value.current = newValue; + } + }} /> ); } diff --git a/frontend/src/container/GridGraphComponent/index.tsx b/frontend/src/container/GridGraphComponent/index.tsx index 7c1572fae1..3ca7f4f544 100644 --- a/frontend/src/container/GridGraphComponent/index.tsx +++ b/frontend/src/container/GridGraphComponent/index.tsx @@ -1,6 +1,7 @@ import { Typography } from 'antd'; import { ChartData } from 'chart.js'; import Graph, { graphOnClickHandler } from 'components/Graph'; +import { getYAxisFormattedValue } from 'components/Graph/yAxisConfig'; import ValueGraph from 'components/ValueGraph'; import { GRAPH_TYPES } from 'container/NewDashboard/ComponentsSlider'; import history from 'lib/history'; @@ -57,7 +58,11 @@ function GridGraphComponent({ {title} - + ); diff --git a/frontend/src/container/MetricsApplication/Tabs/Application.tsx b/frontend/src/container/MetricsApplication/Tabs/Application.tsx index 09370793ab..bc072d5c97 100644 --- a/frontend/src/container/MetricsApplication/Tabs/Application.tsx +++ b/frontend/src/container/MetricsApplication/Tabs/Application.tsx @@ -15,7 +15,7 @@ import MetricReducer from 'types/reducer/metrics'; import { Card, Col, GraphContainer, GraphTitle, Row } from '../styles'; import TopEndpointsTable from '../TopEndpointsTable'; -import { Button } from './styles'; +import { Button, TableContainerCard } from './styles'; function Application({ getWidget }: DashboardProps): JSX.Element { const { servicename } = useParams<{ servicename?: string }>(); @@ -232,9 +232,9 @@ function Application({ getWidget }: DashboardProps): JSX.Element { - + - + diff --git a/frontend/src/container/MetricsApplication/Tabs/styles.ts b/frontend/src/container/MetricsApplication/Tabs/styles.ts index 017ab95419..500e2b9b74 100644 --- a/frontend/src/container/MetricsApplication/Tabs/styles.ts +++ b/frontend/src/container/MetricsApplication/Tabs/styles.ts @@ -1,6 +1,8 @@ import { Button as ButtonComponent } from 'antd'; import styled from 'styled-components'; +import { Card } from '../styles'; + export const Button = styled(ButtonComponent)` &&& { position: absolute; @@ -8,3 +10,6 @@ export const Button = styled(ButtonComponent)` display: none; } `; +export const TableContainerCard = styled(Card)` + overflow-x: scroll; +`; diff --git a/frontend/src/container/MetricsTable/index.tsx b/frontend/src/container/MetricsTable/index.tsx index 9f0630d54e..ce39047593 100644 --- a/frontend/src/container/MetricsTable/index.tsx +++ b/frontend/src/container/MetricsTable/index.tsx @@ -5,6 +5,7 @@ import { SKIP_ONBOARDING } from 'constants/onboarding'; import ROUTES from 'constants/routes'; import React, { useState } from 'react'; import { useSelector } from 'react-redux'; +import { Link } from 'react-router-dom'; import { servicesListItem } from 'store/actions/MetricsActions/metricsInterfaces'; import { AppState } from 'store/reducers'; import MetricReducer from 'types/reducer/metrics'; @@ -46,9 +47,9 @@ function Metrics(): JSX.Element { key: 'serviceName', // eslint-disable-next-line react/display-name render: (text: string): JSX.Element => ( -
onClickHandler(`${ROUTES.APPLICATION}/${text}`)}> + {text} -
+ ), }, { diff --git a/frontend/src/container/NewWidget/RightContainer/YAxisUnitSelector.tsx b/frontend/src/container/NewWidget/RightContainer/YAxisUnitSelector.tsx index d8202d6fdb..1af32aff45 100644 --- a/frontend/src/container/NewWidget/RightContainer/YAxisUnitSelector.tsx +++ b/frontend/src/container/NewWidget/RightContainer/YAxisUnitSelector.tsx @@ -9,7 +9,7 @@ const findCategoryById = (searchValue) => const findCategoryByName = (searchValue) => find(flattenedCategories, (option) => option.name == searchValue); -function YAxisUnitSelector({ defaultValue, onSelect }): JSX.Element { +function YAxisUnitSelector({ defaultValue, onSelect, fieldLabel }): JSX.Element { const onSelectHandler = (selectedValue: string): void => { onSelect(findCategoryByName(selectedValue)?.id); }; @@ -19,7 +19,7 @@ function YAxisUnitSelector({ defaultValue, onSelect }): JSX.Element { return (
- Y Axis Unit + {fieldLabel}
- + ); } diff --git a/frontend/src/container/Trace/TraceTable/index.tsx b/frontend/src/container/Trace/TraceTable/index.tsx index a305009cc8..8d7e19f6dd 100644 --- a/frontend/src/container/Trace/TraceTable/index.tsx +++ b/frontend/src/container/Trace/TraceTable/index.tsx @@ -1,11 +1,11 @@ -import { TableProps, Tag } from 'antd'; +import { TableProps, Tag, Typography } from 'antd'; import Table, { ColumnsType } from 'antd/lib/table'; import ROUTES from 'constants/routes'; import dayjs from 'dayjs'; import duration from 'dayjs/plugin/duration'; -import history from 'lib/history'; import React from 'react'; import { connect, useSelector } from 'react-redux'; +import { Link } from 'react-router-dom'; import { bindActionCreators } from 'redux'; import { ThunkDispatch } from 'redux-thunk'; import { @@ -35,59 +35,99 @@ function TraceTable({ getSpansAggregate }: TraceProps): JSX.Element { type TableType = FlatArray; + const getLink = (record: TableType): string => { + return `${ROUTES.TRACE}/${record.traceID}?spanId=${record.spanID}`; + }; + const columns: ColumnsType = [ { title: 'Date', dataIndex: 'timestamp', key: 'timestamp', sorter: true, - render: (value: TableType['timestamp']): JSX.Element => { + render: (value: TableType['timestamp'], record): JSX.Element => { const day = dayjs(value); - return
{day.format('YYYY/MM/DD HH:mm:ss')}
; + return ( + + {day.format('YYYY/MM/DD HH:mm:ss')} + + ); }, }, { title: 'Service', dataIndex: 'serviceName', key: 'serviceName', + render: (value, record): JSX.Element => { + return ( + + {value} + + ); + }, }, { title: 'Operation', dataIndex: 'operation', key: 'operation', + render: (value, record): JSX.Element => { + return ( + + {value} + + ); + }, }, { title: 'Duration', dataIndex: 'durationNano', key: 'durationNano', - render: (value: TableType['durationNano']): JSX.Element => ( -
- {`${dayjs - .duration({ milliseconds: value / 1000000 }) - .asMilliseconds()} ms`} -
+ render: (value: TableType['durationNano'], record): JSX.Element => ( + + + {`${dayjs + .duration({ milliseconds: value / 1000000 }) + .asMilliseconds()} ms`} + + ), }, { title: 'Method', dataIndex: 'httpMethod', key: 'httpMethod', - render: (value: TableType['httpMethod']): JSX.Element => { + render: (value: TableType['httpMethod'], record): JSX.Element => { if (value.length === 0) { - return
-
; + return ( + + - + + ); } - return {value}; + return ( + + {value} + + ); }, }, { title: 'Status Code', dataIndex: 'httpCode', key: 'httpCode', - render: (value: TableType['httpCode']): JSX.Element => { + render: (value: TableType['httpMethod'], record): JSX.Element => { if (value.length === 0) { - return
-
; + return ( + + - + + ); } - return {value}; + return ( + + {value} + + ); }, }, ]; @@ -118,12 +158,6 @@ function TraceTable({ getSpansAggregate }: TraceProps): JSX.Element { dataSource={spansAggregate.data} loading={loading || filterLoading} columns={columns} - onRow={(record) => ({ - onClick: (): void => { - window.open(`${ROUTES.TRACE}/${record.traceID}?spanId=${record.spanID}`); - }, - })} - size="middle" rowKey="timestamp" style={{ cursor: 'pointer',