Merge pull request #901 from SigNoz/release/v0.7.3

Release/v0.7.3
This commit is contained in:
Ankit Nayan 2022-03-24 01:22:42 +05:30 committed by GitHub
commit 0426bf06eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 108 additions and 54 deletions

View File

@ -29,7 +29,7 @@ services:
condition: on-failure condition: on-failure
query-service: query-service:
image: signoz/query-service:0.7.2 image: signoz/query-service:0.7.3
command: ["-config=/root/config/prometheus.yml"] command: ["-config=/root/config/prometheus.yml"]
ports: ports:
- "8080:8080" - "8080:8080"
@ -51,7 +51,7 @@ services:
- clickhouse - clickhouse
frontend: frontend:
image: signoz/frontend:0.7.2 image: signoz/frontend:0.7.3
depends_on: depends_on:
- query-service - query-service
ports: ports:

View File

@ -24,7 +24,7 @@ services:
- '--storage.path=/data' - '--storage.path=/data'
query-service: query-service:
image: signoz/query-service:0.7.2 image: signoz/query-service:0.7.3
container_name: query-service container_name: query-service
command: ["-config=/root/config/prometheus.yml"] command: ["-config=/root/config/prometheus.yml"]
volumes: volumes:
@ -44,7 +44,7 @@ services:
condition: service_healthy condition: service_healthy
frontend: frontend:
image: signoz/frontend:0.7.2 image: signoz/frontend:0.7.3
container_name: frontend container_name: frontend
depends_on: depends_on:
- query-service - query-service

View File

@ -27,7 +27,7 @@ services:
query-service: query-service:
image: signoz/query-service:0.7.2 image: signoz/query-service:0.7.3
container_name: query-service container_name: query-service
command: ["-config=/root/config/prometheus.yml"] command: ["-config=/root/config/prometheus.yml"]
volumes: volumes:
@ -47,7 +47,7 @@ services:
condition: service_healthy condition: service_healthy
frontend: frontend:
image: signoz/frontend:0.7.2 image: signoz/frontend:0.7.3
container_name: frontend container_name: frontend
depends_on: depends_on:
- query-service - query-service

View File

@ -158,7 +158,9 @@ install_docker() {
echo echo
# yum install docker # yum install docker
# service docker start # 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 else
yum_cmd="$sudo_cmd yum --assumeyes --quiet" yum_cmd="$sudo_cmd yum --assumeyes --quiet"
@ -195,16 +197,16 @@ install_docker_compose() {
start_docker() { start_docker() {
echo -e "🐳 Starting Docker ...\n" 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 open --background -a Docker && while ! docker system info > /dev/null 2>&1; do sleep 1; done
else else
if ! $sudo_cmd systemctl is-active docker.service > /dev/null; then if ! $sudo_cmd systemctl is-active docker.service > /dev/null; then
echo "Starting docker service" echo "Starting docker service"
$sudo_cmd systemctl start docker.service $sudo_cmd systemctl start docker.service
fi fi
if [ -z $sudo_cmd ]; then if [[ -z $sudo_cmd ]]; then
docker ps > /dev/null && true docker ps > /dev/null && true
if [ $? -ne 0 ]; then if [[ $? -ne 0 ]]; then
request_sudo request_sudo
fi fi
fi fi
@ -230,7 +232,7 @@ wait_for_containers_start() {
} }
bye() { # Prints a friendly good bye message and exits the script. bye() { # Prints a friendly good bye message and exits the script.
if [ "$?" -ne 0 ]; then if [[ "$?" -ne 0 ]]; then
set +o errexit 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:" 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() { request_sudo() {
if hash sudo 2>/dev/null; then if hash sudo 2>/dev/null; then
sudo_cmd="sudo"
echo -e "\n\n🙇 We will need sudo access to complete the installation." echo -e "\n\n🙇 We will need sudo access to complete the installation."
if ! $sudo_cmd -v && (( $EUID != 0 )); then if (( $EUID != 0 )); then
echo -e "Please enter your sudo password now:" sudo_cmd="sudo"
echo -e "Please enter your sudo password, if prompt."
if ! $sudo_cmd -v; then $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." echo "Need sudo privileges to proceed with the installation."
exit 1; exit 1;
fi fi
echo -e "Thanks! 🙏\n" echo -e "Got it! Thanks!! 🙏\n"
echo -e "Okay! We will bring up the SigNoz cluster from here 🚀\n" echo -e "Okay! We will bring up the SigNoz cluster from here 🚀\n"
fi fi
fi fi
@ -291,9 +293,6 @@ sudo_cmd=""
# Check sudo permissions # Check sudo permissions
if (( $EUID != 0 )); then if (( $EUID != 0 )); then
echo "🟡 Running installer with non-sudo permissions." 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 " In case of any failure or prompt, please consider running the script with sudo privileges."
echo "" echo ""
else else
@ -309,7 +308,7 @@ check_os
# Obtain unique installation id # Obtain unique installation id
sysinfo="$(uname -a)" sysinfo="$(uname -a)"
if [ $? -ne 0 ]; then if [[ $? -ne 0 ]]; then
uuid="$(uuidgen)" uuid="$(uuidgen)"
uuid="${uuid:-$(cat /proc/sys/kernel/random/uuid)}" uuid="${uuid:-$(cat /proc/sys/kernel/random/uuid)}"
sysinfo="${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" digest_cmd="openssl dgst -sha256"
fi fi
if [ -z $digest_cmd ]; then if [[ -z $digest_cmd ]]; then
SIGNOZ_INSTALLATION_ID="$sysinfo" SIGNOZ_INSTALLATION_ID="$sysinfo"
else else
SIGNOZ_INSTALLATION_ID=$(echo "$sysinfo" | $digest_cmd | grep -E -o '[a-zA-Z0-9]{64}') SIGNOZ_INSTALLATION_ID=$(echo "$sysinfo" | $digest_cmd | grep -E -o '[a-zA-Z0-9]{64}')
@ -407,7 +406,7 @@ send_event() {
;; ;;
esac esac
if [ "$error" != "" ]; then if [[ "$error" != "" ]]; then
error='"error": "'"$error"'", ' error='"error": "'"$error"'", '
fi fi

View File

@ -9,6 +9,12 @@ function Editor({ value }: EditorProps): JSX.Element {
value={value.current} value={value.current}
options={{ fontSize: 16, automaticLayout: true }} options={{ fontSize: 16, automaticLayout: true }}
height="40vh" height="40vh"
onChange={(newValue): void => {
if (value.current && newValue) {
// eslint-disable-next-line no-param-reassign
value.current = newValue;
}
}}
/> />
); );
} }

View File

@ -1,6 +1,7 @@
import { Typography } from 'antd'; import { Typography } from 'antd';
import { ChartData } from 'chart.js'; import { ChartData } from 'chart.js';
import Graph, { graphOnClickHandler } from 'components/Graph'; import Graph, { graphOnClickHandler } from 'components/Graph';
import { getYAxisFormattedValue } from 'components/Graph/yAxisConfig';
import ValueGraph from 'components/ValueGraph'; import ValueGraph from 'components/ValueGraph';
import { GRAPH_TYPES } from 'container/NewDashboard/ComponentsSlider'; import { GRAPH_TYPES } from 'container/NewDashboard/ComponentsSlider';
import history from 'lib/history'; import history from 'lib/history';
@ -57,7 +58,11 @@ function GridGraphComponent({
<Typography>{title}</Typography> <Typography>{title}</Typography>
</TitleContainer> </TitleContainer>
<ValueContainer isDashboardPage={isDashboardPage}> <ValueContainer isDashboardPage={isDashboardPage}>
<ValueGraph value={value.toString()} /> <ValueGraph
value={
yAxisUnit ? getYAxisFormattedValue(value, yAxisUnit) : value.toString()
}
/>
</ValueContainer> </ValueContainer>
</> </>
); );

View File

@ -15,7 +15,7 @@ import MetricReducer from 'types/reducer/metrics';
import { Card, Col, GraphContainer, GraphTitle, Row } from '../styles'; import { Card, Col, GraphContainer, GraphTitle, Row } from '../styles';
import TopEndpointsTable from '../TopEndpointsTable'; import TopEndpointsTable from '../TopEndpointsTable';
import { Button } from './styles'; import { Button, TableContainerCard } from './styles';
function Application({ getWidget }: DashboardProps): JSX.Element { function Application({ getWidget }: DashboardProps): JSX.Element {
const { servicename } = useParams<{ servicename?: string }>(); const { servicename } = useParams<{ servicename?: string }>();
@ -232,9 +232,9 @@ function Application({ getWidget }: DashboardProps): JSX.Element {
</Col> </Col>
<Col span={12}> <Col span={12}>
<Card> <TableContainerCard>
<TopEndpointsTable data={topEndPoints} /> <TopEndpointsTable data={topEndPoints} />
</Card> </TableContainerCard>
</Col> </Col>
</Row> </Row>
</> </>

View File

@ -1,6 +1,8 @@
import { Button as ButtonComponent } from 'antd'; import { Button as ButtonComponent } from 'antd';
import styled from 'styled-components'; import styled from 'styled-components';
import { Card } from '../styles';
export const Button = styled(ButtonComponent)` export const Button = styled(ButtonComponent)`
&&& { &&& {
position: absolute; position: absolute;
@ -8,3 +10,6 @@ export const Button = styled(ButtonComponent)`
display: none; display: none;
} }
`; `;
export const TableContainerCard = styled(Card)`
overflow-x: scroll;
`;

View File

@ -5,6 +5,7 @@ import { SKIP_ONBOARDING } from 'constants/onboarding';
import ROUTES from 'constants/routes'; import ROUTES from 'constants/routes';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { Link } from 'react-router-dom';
import { servicesListItem } from 'store/actions/MetricsActions/metricsInterfaces'; import { servicesListItem } from 'store/actions/MetricsActions/metricsInterfaces';
import { AppState } from 'store/reducers'; import { AppState } from 'store/reducers';
import MetricReducer from 'types/reducer/metrics'; import MetricReducer from 'types/reducer/metrics';
@ -46,9 +47,9 @@ function Metrics(): JSX.Element {
key: 'serviceName', key: 'serviceName',
// eslint-disable-next-line react/display-name // eslint-disable-next-line react/display-name
render: (text: string): JSX.Element => ( render: (text: string): JSX.Element => (
<div onClick={(): void => onClickHandler(`${ROUTES.APPLICATION}/${text}`)}> <Link to={`${ROUTES.APPLICATION}/${text}`}>
<Name>{text}</Name> <Name>{text}</Name>
</div> </Link>
), ),
}, },
{ {

View File

@ -9,7 +9,7 @@ const findCategoryById = (searchValue) =>
const findCategoryByName = (searchValue) => const findCategoryByName = (searchValue) =>
find(flattenedCategories, (option) => option.name == 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 => { const onSelectHandler = (selectedValue: string): void => {
onSelect(findCategoryByName(selectedValue)?.id); onSelect(findCategoryByName(selectedValue)?.id);
}; };
@ -19,7 +19,7 @@ function YAxisUnitSelector({ defaultValue, onSelect }): JSX.Element {
return ( return (
<Col style={{ marginTop: '1rem' }}> <Col style={{ marginTop: '1rem' }}>
<div style={{ margin: '0.5rem 0' }}> <div style={{ margin: '0.5rem 0' }}>
<Typography.Text>Y Axis Unit</Typography.Text> <Typography.Text>{fieldLabel}</Typography.Text>
</div> </div>
<AutoComplete <AutoComplete
style={{ width: '100%' }} style={{ width: '100%' }}

View File

@ -148,7 +148,11 @@ function RightContainer({
setSelectedTime, setSelectedTime,
}} }}
/> />
<YAxisUnitSelector defaultValue={yAxisUnit} onSelect={setYAxisUnit} /> <YAxisUnitSelector
defaultValue={yAxisUnit}
onSelect={setYAxisUnit}
fieldLabel={selectedGraphType === 'Value' ? 'Unit' : 'Y Axis Unit'}
/>
</Container> </Container>
); );
} }

View File

@ -1,11 +1,11 @@
import { TableProps, Tag } from 'antd'; import { TableProps, Tag, Typography } from 'antd';
import Table, { ColumnsType } from 'antd/lib/table'; import Table, { ColumnsType } from 'antd/lib/table';
import ROUTES from 'constants/routes'; import ROUTES from 'constants/routes';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import history from 'lib/history';
import React from 'react'; import React from 'react';
import { connect, useSelector } from 'react-redux'; import { connect, useSelector } from 'react-redux';
import { Link } from 'react-router-dom';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import { ThunkDispatch } from 'redux-thunk'; import { ThunkDispatch } from 'redux-thunk';
import { import {
@ -35,59 +35,99 @@ function TraceTable({ getSpansAggregate }: TraceProps): JSX.Element {
type TableType = FlatArray<TraceReducer['spansAggregate']['data'], 1>; type TableType = FlatArray<TraceReducer['spansAggregate']['data'], 1>;
const getLink = (record: TableType): string => {
return `${ROUTES.TRACE}/${record.traceID}?spanId=${record.spanID}`;
};
const columns: ColumnsType<TableType> = [ const columns: ColumnsType<TableType> = [
{ {
title: 'Date', title: 'Date',
dataIndex: 'timestamp', dataIndex: 'timestamp',
key: 'timestamp', key: 'timestamp',
sorter: true, sorter: true,
render: (value: TableType['timestamp']): JSX.Element => { render: (value: TableType['timestamp'], record): JSX.Element => {
const day = dayjs(value); const day = dayjs(value);
return <div>{day.format('YYYY/MM/DD HH:mm:ss')}</div>; return (
<Link to={getLink(record)}>
<Typography>{day.format('YYYY/MM/DD HH:mm:ss')}</Typography>
</Link>
);
}, },
}, },
{ {
title: 'Service', title: 'Service',
dataIndex: 'serviceName', dataIndex: 'serviceName',
key: 'serviceName', key: 'serviceName',
render: (value, record): JSX.Element => {
return (
<Link to={getLink(record)}>
<Typography>{value}</Typography>
</Link>
);
},
}, },
{ {
title: 'Operation', title: 'Operation',
dataIndex: 'operation', dataIndex: 'operation',
key: 'operation', key: 'operation',
render: (value, record): JSX.Element => {
return (
<Link to={getLink(record)}>
<Typography>{value}</Typography>
</Link>
);
},
}, },
{ {
title: 'Duration', title: 'Duration',
dataIndex: 'durationNano', dataIndex: 'durationNano',
key: 'durationNano', key: 'durationNano',
render: (value: TableType['durationNano']): JSX.Element => ( render: (value: TableType['durationNano'], record): JSX.Element => (
<div> <Link to={getLink(record)}>
{`${dayjs <Typography>
.duration({ milliseconds: value / 1000000 }) {`${dayjs
.asMilliseconds()} ms`} .duration({ milliseconds: value / 1000000 })
</div> .asMilliseconds()} ms`}
</Typography>
</Link>
), ),
}, },
{ {
title: 'Method', title: 'Method',
dataIndex: 'httpMethod', dataIndex: 'httpMethod',
key: 'httpMethod', key: 'httpMethod',
render: (value: TableType['httpMethod']): JSX.Element => { render: (value: TableType['httpMethod'], record): JSX.Element => {
if (value.length === 0) { if (value.length === 0) {
return <div>-</div>; return (
<Link to={getLink(record)}>
<Typography>-</Typography>
</Link>
);
} }
return <Tag color="magenta">{value}</Tag>; return (
<Link to={getLink(record)}>
<Tag color="magenta">{value}</Tag>
</Link>
);
}, },
}, },
{ {
title: 'Status Code', title: 'Status Code',
dataIndex: 'httpCode', dataIndex: 'httpCode',
key: 'httpCode', key: 'httpCode',
render: (value: TableType['httpCode']): JSX.Element => { render: (value: TableType['httpMethod'], record): JSX.Element => {
if (value.length === 0) { if (value.length === 0) {
return <div>-</div>; return (
<Link to={getLink(record)}>
<Typography>-</Typography>
</Link>
);
} }
return <Tag color="magenta">{value}</Tag>; return (
<Link to={getLink(record)}>
<Tag color="magenta">{value}</Tag>
</Link>
);
}, },
}, },
]; ];
@ -118,12 +158,6 @@ function TraceTable({ getSpansAggregate }: TraceProps): JSX.Element {
dataSource={spansAggregate.data} dataSource={spansAggregate.data}
loading={loading || filterLoading} loading={loading || filterLoading}
columns={columns} columns={columns}
onRow={(record) => ({
onClick: (): void => {
window.open(`${ROUTES.TRACE}/${record.traceID}?spanId=${record.spanID}`);
},
})}
size="middle"
rowKey="timestamp" rowKey="timestamp"
style={{ style={{
cursor: 'pointer', cursor: 'pointer',