diff --git a/frontend/src/container/NewDashboard/DashboardDescription/Description.styles.scss b/frontend/src/container/NewDashboard/DashboardDescription/Description.styles.scss
index 0f4b2dcc9565..f2b20f0d37cc 100644
--- a/frontend/src/container/NewDashboard/DashboardDescription/Description.styles.scss
+++ b/frontend/src/container/NewDashboard/DashboardDescription/Description.styles.scss
@@ -57,14 +57,14 @@
border-bottom: 1px solid var(--bg-slate-400);
display: flex;
justify-content: space-between;
+ gap: 16px;
align-items: center;
- margin-right: 16px;
+ padding: 0 8px;
box-sizing: border-box;
.dashboard-breadcrumbs {
width: 100%;
height: 48px;
- padding: 16px;
display: flex;
gap: 6px;
align-items: center;
diff --git a/frontend/src/container/NewDashboard/DashboardDescription/index.tsx b/frontend/src/container/NewDashboard/DashboardDescription/index.tsx
index 287cf1219ca8..154c63674962 100644
--- a/frontend/src/container/NewDashboard/DashboardDescription/index.tsx
+++ b/frontend/src/container/NewDashboard/DashboardDescription/index.tsx
@@ -12,6 +12,7 @@ import {
Typography,
} from 'antd';
import logEvent from 'api/common/logEvent';
+import HeaderRightSection from 'components/HeaderRightSection/HeaderRightSection';
import { QueryParams } from 'constants/query';
import { PANEL_GROUP_TYPES, PANEL_TYPES } from 'constants/queryBuilder';
import ROUTES from 'constants/routes';
@@ -321,6 +322,12 @@ function DashboardDescription(props: DashboardDescriptionProps): JSX.Element {
{title}
+
+
diff --git a/frontend/src/container/NewWidget/RightContainer/index.tsx b/frontend/src/container/NewWidget/RightContainer/index.tsx
index 4a374d977d07..8e1d3586f5fa 100644
--- a/frontend/src/container/NewWidget/RightContainer/index.tsx
+++ b/frontend/src/container/NewWidget/RightContainer/index.tsx
@@ -300,6 +300,7 @@ function RightContainer({
style={{ width: '100%' }}
className="panel-type-select"
data-testid="panel-change-select"
+ data-stacking-state={stackedBarChart ? 'true' : 'false'}
>
{graphTypes.map((item) => (
diff --git a/frontend/src/container/NewWidget/__test__/NewWidget.test.tsx b/frontend/src/container/NewWidget/__test__/NewWidget.test.tsx
index 3548583a5090..f66eddd662da 100644
--- a/frontend/src/container/NewWidget/__test__/NewWidget.test.tsx
+++ b/frontend/src/container/NewWidget/__test__/NewWidget.test.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable sonarjs/no-duplicate-string */
// This test suite covers several important scenarios:
// - Empty layout - widget should be placed at origin (0,0)
// - Empty layout with custom dimensions
@@ -6,13 +7,20 @@
// - Handling multiple rows correctly
// - Handling widgets with different heights
+import { screen } from '@testing-library/react';
import { PANEL_TYPES } from 'constants/queryBuilder';
import { DashboardProvider } from 'providers/Dashboard/Dashboard';
import { PreferenceContextProvider } from 'providers/preferences/context/PreferenceContextProvider';
import { I18nextProvider } from 'react-i18next';
import { useSearchParams } from 'react-router-dom-v5-compat';
import i18n from 'ReactI18';
-import { render } from 'tests/test-utils';
+import {
+ fireEvent,
+ getByText as getByTextUtil,
+ render,
+ userEvent,
+ within,
+} from 'tests/test-utils';
import NewWidget from '..';
import {
@@ -21,6 +29,28 @@ import {
placeWidgetBetweenRows,
} from '../utils';
+// Helper function to check stack series state
+const checkStackSeriesState = (
+ container: HTMLElement,
+ expectedChecked: boolean,
+): HTMLElement => {
+ expect(getByTextUtil(container, 'Stack series')).toBeInTheDocument();
+
+ const stackSeriesSection = container.querySelector(
+ 'section > .stack-chart',
+ ) as HTMLElement;
+ expect(stackSeriesSection).toBeInTheDocument();
+
+ const switchElement = within(stackSeriesSection).getByRole('switch');
+ if (expectedChecked) {
+ expect(switchElement).toBeChecked();
+ } else {
+ expect(switchElement).not.toBeChecked();
+ }
+
+ return switchElement;
+};
+
const MOCK_SEARCH_PARAMS =
'?graphType=bar&widgetId=b473eef0-8eb5-4dd3-8089-c1817734084f&compositeQuery=%7B"id"%3A"f026c678-9abf-42af-a3dc-f73dc8cbb810"%2C"builder"%3A%7B"queryData"%3A%5B%7B"dataSource"%3A"metrics"%2C"queryName"%3A"A"%2C"aggregateOperator"%3A"count"%2C"aggregateAttribute"%3A%7B"id"%3A"----"%2C"dataType"%3A""%2C"key"%3A""%2C"type"%3A""%7D%2C"timeAggregation"%3A"rate"%2C"spaceAggregation"%3A"sum"%2C"filter"%3A%7B"expression"%3A""%7D%2C"aggregations"%3A%5B%7B"metricName"%3A""%2C"temporality"%3A""%2C"timeAggregation"%3A"count"%2C"spaceAggregation"%3A"sum"%2C"reduceTo"%3A"avg"%7D%5D%2C"functions"%3A%5B%5D%2C"filters"%3A%7B"items"%3A%5B%5D%2C"op"%3A"AND"%7D%2C"expression"%3A"A"%2C"disabled"%3Afalse%2C"stepInterval"%3Anull%2C"having"%3A%5B%5D%2C"limit"%3Anull%2C"orderBy"%3A%5B%5D%2C"groupBy"%3A%5B%5D%2C"legend"%3A""%2C"reduceTo"%3A"avg"%2C"source"%3A""%7D%5D%2C"queryFormulas"%3A%5B%5D%2C"queryTraceOperator"%3A%5B%5D%7D%2C"clickhouse_sql"%3A%5B%7B"name"%3A"A"%2C"legend"%3A""%2C"disabled"%3Afalse%2C"query"%3A""%7D%5D%2C"promql"%3A%5B%7B"name"%3A"A"%2C"query"%3A""%2C"legend"%3A""%2C"disabled"%3Afalse%7D%5D%2C"queryType"%3A"builder"%7D&relativeTime=30m';
// Mocks
@@ -279,7 +309,7 @@ describe('Stacking bar in new panel', () => {
jest.fn(),
]);
- const { container, getByText, getByRole } = render(
+ const { container, getByText } = render(
@@ -305,7 +335,83 @@ describe('Stacking bar in new panel', () => {
expect(switchBtn).toBeInTheDocument();
expect(switchBtn).toHaveClass('ant-switch-checked');
- // (Optional) More semantic: verify by role
- expect(getByRole('switch')).toBeChecked();
+ // Check that stack series is present and checked
+ checkStackSeriesState(container, true);
+ });
+});
+
+const STACKING_STATE_ATTR = 'data-stacking-state';
+
+describe('when switching to BAR panel type', () => {
+ jest.setTimeout(10000);
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+
+ // Mock useSearchParams to return the expected values
+ (useSearchParams as jest.Mock).mockReturnValue([
+ new URLSearchParams(MOCK_SEARCH_PARAMS),
+ jest.fn(),
+ ]);
+ });
+
+ it('should preserve saved stacking value of true', async () => {
+ const { getByTestId, getByText, container } = render(
+
+
+ ,
+ );
+
+ expect(getByTestId('panel-change-select')).toHaveAttribute(
+ STACKING_STATE_ATTR,
+ 'true',
+ );
+
+ await userEvent.click(getByText('Bar')); // Panel Type Selected
+
+ // find dropdown with - .ant-select-dropdown
+ const panelDropdown = document.querySelector(
+ '.ant-select-dropdown',
+ ) as HTMLElement;
+ expect(panelDropdown).toBeInTheDocument();
+
+ // Select TimeSeries from dropdown
+ const option = within(panelDropdown).getByText('Time Series');
+ fireEvent.click(option);
+
+ expect(getByTestId('panel-change-select')).toHaveAttribute(
+ STACKING_STATE_ATTR,
+ 'false',
+ );
+
+ // Since we are on timeseries panel, stack series should be false
+ expect(screen.queryByText('Stack series')).not.toBeInTheDocument();
+
+ // switch back to Bar panel
+ const panelTypeDropdown2 = getByTestId('panel-change-select') as HTMLElement;
+ expect(panelTypeDropdown2).toBeInTheDocument();
+
+ expect(getByTextUtil(panelTypeDropdown2, 'Time Series')).toBeInTheDocument();
+ fireEvent.click(getByTextUtil(panelTypeDropdown2, 'Time Series'));
+
+ // find dropdown with - .ant-select-dropdown
+ const panelDropdown2 = document.querySelector(
+ '.ant-select-dropdown',
+ ) as HTMLElement;
+ // // Select BAR from dropdown
+ const BarOption = within(panelDropdown2).getByText('Bar');
+ fireEvent.click(BarOption);
+
+ // Stack series should be true
+ checkStackSeriesState(container, true);
+
+ expect(getByTestId('panel-change-select')).toHaveAttribute(
+ STACKING_STATE_ATTR,
+ 'true',
+ );
});
});
diff --git a/frontend/src/container/NewWidget/__test__/__mocks__/uplotChartData.ts b/frontend/src/container/NewWidget/__test__/__mocks__/uplotChartData.ts
new file mode 100644
index 000000000000..31a2d6638244
--- /dev/null
+++ b/frontend/src/container/NewWidget/__test__/__mocks__/uplotChartData.ts
@@ -0,0 +1,134 @@
+import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
+
+export const BarNonStackedChartData = {
+ apiResponse: {
+ data: {
+ result: [
+ {
+ metric: {
+ 'service.name': 'recommendationservice',
+ },
+ values: [
+ [1758713940, '33.933'],
+ [1758715020, '31.767'],
+ ],
+ queryName: 'A',
+ metaData: {
+ alias: '__result_0',
+ index: 0,
+ queryName: 'A',
+ },
+ legend: '',
+ },
+ {
+ metric: {
+ 'service.name': 'frontend',
+ },
+ values: [
+ [1758713940, '20.0'],
+ [1758715020, '25.0'],
+ ],
+ queryName: 'B',
+ metaData: {
+ alias: '__result_1',
+ index: 1,
+ queryName: 'B',
+ },
+ legend: '',
+ },
+ ],
+ resultType: 'time_series',
+ newResult: {
+ data: {
+ resultType: 'time_series',
+ result: [
+ {
+ queryName: 'A',
+ legend: '',
+ series: [
+ {
+ labels: {
+ 'service.name': 'recommendationservice',
+ },
+ labelsArray: [
+ {
+ 'service.name': 'recommendationservice',
+ },
+ ],
+ values: [
+ {
+ timestamp: 1758713940000,
+ value: '33.933',
+ },
+ {
+ timestamp: 1758715020000,
+ value: '31.767',
+ },
+ ],
+ metaData: {
+ alias: '__result_0',
+ index: 0,
+ queryName: 'A',
+ },
+ },
+ ],
+ predictedSeries: [],
+ upperBoundSeries: [],
+ lowerBoundSeries: [],
+ anomalyScores: [],
+ list: null,
+ },
+ {
+ queryName: 'B',
+ legend: '',
+ series: [
+ {
+ labels: {
+ 'service.name': 'frontend',
+ },
+ labelsArray: [
+ {
+ 'service.name': 'frontend',
+ },
+ ],
+ values: [
+ {
+ timestamp: 1758713940000,
+ value: '20.0',
+ },
+ {
+ timestamp: 1758715020000,
+ value: '25.0',
+ },
+ ],
+ metaData: {
+ alias: '__result_1',
+ index: 1,
+ queryName: 'B',
+ },
+ },
+ ],
+ predictedSeries: [],
+ upperBoundSeries: [],
+ lowerBoundSeries: [],
+ anomalyScores: [],
+ list: null,
+ },
+ ],
+ },
+ },
+ },
+ } as MetricRangePayloadProps,
+ fillSpans: false,
+ stackedBarChart: false,
+};
+
+export const BarStackedChartData = {
+ ...BarNonStackedChartData,
+ stackedBarChart: true,
+};
+
+export const TimeSeriesChartData = {
+ ...BarNonStackedChartData,
+ stackedBarChart: false,
+};
diff --git a/frontend/src/container/NewWidget/__test__/getUplotChartData.test.ts b/frontend/src/container/NewWidget/__test__/getUplotChartData.test.ts
new file mode 100644
index 000000000000..26b4def4462f
--- /dev/null
+++ b/frontend/src/container/NewWidget/__test__/getUplotChartData.test.ts
@@ -0,0 +1,50 @@
+import { getUPlotChartData } from '../../../lib/uPlotLib/utils/getUplotChartData';
+import {
+ BarNonStackedChartData,
+ BarStackedChartData,
+ TimeSeriesChartData,
+} from './__mocks__/uplotChartData';
+
+describe('getUplotChartData', () => {
+ it('should return the correct chart data for non-stacked bar chart', () => {
+ const result = getUPlotChartData(
+ BarNonStackedChartData.apiResponse,
+ BarNonStackedChartData.fillSpans,
+ BarNonStackedChartData.stackedBarChart,
+ );
+ expect(result).toEqual([
+ [1758713940, 1758715020],
+ [33.933, 31.767],
+ [20.0, 25.0],
+ ]);
+ });
+
+ it('should return the correct chart data for stacked bar chart', () => {
+ const result = getUPlotChartData(
+ BarStackedChartData.apiResponse,
+ BarStackedChartData.fillSpans,
+ BarStackedChartData.stackedBarChart,
+ );
+ // For stacked charts, the values should be cumulative
+ // First series: [33.933, 31.767] + [20.0, 25.0] = [53.933, 56.767]
+ // Second series: [20.0, 25.0] (unchanged)
+ expect(result).toHaveLength(3);
+ expect(result[0]).toEqual([1758713940, 1758715020]);
+ expect(result[1][0]).toBeCloseTo(53.933, 3);
+ expect(result[1][1]).toBeCloseTo(56.767, 3);
+ expect(result[2]).toEqual([20.0, 25.0]);
+ });
+
+ it('should return the correct chart data for time series chart', () => {
+ const result = getUPlotChartData(
+ TimeSeriesChartData.apiResponse,
+ TimeSeriesChartData.fillSpans,
+ TimeSeriesChartData.stackedBarChart,
+ );
+ expect(result).toEqual([
+ [1758713940, 1758715020],
+ [33.933, 31.767],
+ [20.0, 25.0],
+ ]);
+ });
+});
diff --git a/frontend/src/container/NewWidget/index.tsx b/frontend/src/container/NewWidget/index.tsx
index 290b8d359b23..d00f97ec3c60 100644
--- a/frontend/src/container/NewWidget/index.tsx
+++ b/frontend/src/container/NewWidget/index.tsx
@@ -595,6 +595,13 @@ function NewWidget({
selectedGraph,
);
setGraphType(type);
+
+ // with a single source of truth for stacking, we can use the saved stacking value as a default value
+ const savedStackingValue = getWidget()?.stackedBarChart;
+ setStackedBarChart(
+ type === PANEL_TYPES.BAR ? savedStackingValue || false : false,
+ );
+
redirectWithQueryBuilderData(
updatedQuery,
{ [QueryParams.graphType]: type },
diff --git a/frontend/src/container/NewWidget/utils.ts b/frontend/src/container/NewWidget/utils.ts
index 918324b22bab..10c08cf4852d 100644
--- a/frontend/src/container/NewWidget/utils.ts
+++ b/frontend/src/container/NewWidget/utils.ts
@@ -553,7 +553,7 @@ export const getDefaultWidgetData = (
timePreferance: 'GLOBAL_TIME',
softMax: null,
softMin: null,
- stackedBarChart: true,
+ stackedBarChart: name === PANEL_TYPES.BAR,
selectedLogFields: defaultLogsSelectedColumns.map((field) => ({
...field,
type: field.fieldContext ?? '',
diff --git a/frontend/src/container/OnboardingQuestionaire/AboutSigNozQuestions/AboutSigNozQuestions.tsx b/frontend/src/container/OnboardingQuestionaire/AboutSigNozQuestions/AboutSigNozQuestions.tsx
index 2124e995150f..913da1ec351d 100644
--- a/frontend/src/container/OnboardingQuestionaire/AboutSigNozQuestions/AboutSigNozQuestions.tsx
+++ b/frontend/src/container/OnboardingQuestionaire/AboutSigNozQuestions/AboutSigNozQuestions.tsx
@@ -2,14 +2,14 @@
import '../OnboardingQuestionaire.styles.scss';
import { Color } from '@signozhq/design-tokens';
-import { Button, Input, Typography } from 'antd';
+import { Button, Checkbox, Input, Typography } from 'antd';
import TextArea from 'antd/lib/input/TextArea';
import logEvent from 'api/common/logEvent';
import { ArrowLeft, ArrowRight, CheckCircle } from 'lucide-react';
import { useEffect, useState } from 'react';
export interface SignozDetails {
- interestInSignoz: string | null;
+ interestInSignoz: string[] | null;
otherInterestInSignoz: string | null;
discoverSignoz: string | null;
}
@@ -22,9 +22,12 @@ interface AboutSigNozQuestionsProps {
}
const interestedInOptions: Record = {
- savingCosts: 'Saving costs',
- otelNativeStack: 'Interested in Otel-native stack',
- allInOne: 'All in one (Logs, Metrics & Traces)',
+ loweringCosts: 'Lowering observability costs',
+ otelNativeStack: 'Interested in OTel-native stack',
+ deploymentFlexibility: 'Deployment flexibility (Cloud/Self-Host) in future',
+ singleTool:
+ 'Single Tool (logs, metrics & traces) to reduce operational overhead',
+ correlateSignals: 'Correlate signals for faster troubleshooting',
};
export function AboutSigNozQuestions({
@@ -33,8 +36,8 @@ export function AboutSigNozQuestions({
onNext,
onBack,
}: AboutSigNozQuestionsProps): JSX.Element {
- const [interestInSignoz, setInterestInSignoz] = useState(
- signozDetails?.interestInSignoz || null,
+ const [interestInSignoz, setInterestInSignoz] = useState(
+ signozDetails?.interestInSignoz || [],
);
const [otherInterestInSignoz, setOtherInterestInSignoz] = useState(
signozDetails?.otherInterestInSignoz || '',
@@ -47,8 +50,8 @@ export function AboutSigNozQuestions({
useEffect((): void => {
if (
discoverSignoz !== '' &&
- interestInSignoz !== null &&
- (interestInSignoz !== 'Others' || otherInterestInSignoz !== '')
+ interestInSignoz.length > 0 &&
+ (!interestInSignoz.includes('Others') || otherInterestInSignoz !== '')
) {
setIsNextDisabled(false);
} else {
@@ -56,6 +59,14 @@ export function AboutSigNozQuestions({
}
}, [interestInSignoz, otherInterestInSignoz, discoverSignoz]);
+ const handleInterestChange = (option: string, checked: boolean): void => {
+ if (checked) {
+ setInterestInSignoz((prev) => [...prev, option]);
+ } else {
+ setInterestInSignoz((prev) => prev.filter((item) => item !== option));
+ }
+ };
+
const handleOnNext = (): void => {
setSignozDetails({
discoverSignoz,
@@ -108,50 +119,45 @@ export function AboutSigNozQuestions({
What got you interested in SigNoz?
-
+
{Object.keys(interestedInOptions).map((option: string) => (
-
setInterestInSignoz(option)}
- >
- {interestedInOptions[option]}
- {interestInSignoz === option && (
-
- )}
-
+
+ handleInterestChange(option, e.target.checked)}
+ >
+ {interestedInOptions[option]}
+
+
))}
- {interestInSignoz === 'Others' ? (
-
- ) : (
- ''
- )
+
+
+ handleInterestChange('Others', e.target.checked)
}
- onChange={(e): void => setOtherInterestInSignoz(e.target.value)}
- />
- ) : (
- setInterestInSignoz('Others')}
>
Others
-
- )}
+
+ {interestInSignoz.includes('Others') && (
+
+ ) : (
+ ''
+ )
+ }
+ onChange={(e): void => setOtherInterestInSignoz(e.target.value)}
+ />
+ )}
+
diff --git a/frontend/src/container/OnboardingQuestionaire/OnboardingQuestionaire.styles.scss b/frontend/src/container/OnboardingQuestionaire/OnboardingQuestionaire.styles.scss
index 70f68070f862..e266e450dbca 100644
--- a/frontend/src/container/OnboardingQuestionaire/OnboardingQuestionaire.styles.scss
+++ b/frontend/src/container/OnboardingQuestionaire/OnboardingQuestionaire.styles.scss
@@ -94,6 +94,7 @@
border-radius: 4px;
font-size: 14px;
padding: 12px;
+ font-weight: 400;
&::placeholder {
color: var(--bg-vanilla-400);
@@ -290,6 +291,37 @@
gap: 10px;
}
+ .checkbox-grid {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ margin-top: 12px;
+ }
+
+ .checkbox-item {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ .ant-checkbox-wrapper {
+ color: var(--bg-vanilla-400);
+ font-size: 14px;
+ font-weight: 400;
+
+ .ant-checkbox {
+ .ant-checkbox-inner {
+ border-color: var(--bg-slate-100);
+ background-color: var(--bg-ink-200);
+ }
+
+ &.ant-checkbox-checked .ant-checkbox-inner {
+ background-color: var(--bg-robin-500);
+ border-color: var(--bg-robin-500);
+ }
+ }
+ }
+ }
+
.onboarding-questionaire-button,
.add-another-member-button,
.remove-team-member-button {
@@ -466,6 +498,7 @@
border: 1px solid var(--bg-vanilla-300);
background: var(--bg-vanilla-100);
color: var(--text-ink-300);
+ font-weight: 400;
&::placeholder {
color: var(--bg-slate-400);
@@ -527,6 +560,24 @@
color: var(--bg-slate-300);
}
+ .checkbox-item {
+ .ant-checkbox-wrapper {
+ color: var(--bg-ink-300);
+
+ .ant-checkbox {
+ .ant-checkbox-inner {
+ border-color: var(--bg-vanilla-300);
+ background-color: var(--bg-vanilla-100);
+ }
+
+ &.ant-checkbox-checked .ant-checkbox-inner {
+ background-color: var(--bg-robin-500);
+ border-color: var(--bg-robin-500);
+ }
+ }
+ }
+ }
+
input[type='text'] {
border: 1px solid var(--bg-vanilla-300);
background: var(--bg-vanilla-100);
diff --git a/frontend/src/container/OnboardingQuestionaire/OrgQuestions/OrgQuestions.tsx b/frontend/src/container/OnboardingQuestionaire/OrgQuestions/OrgQuestions.tsx
index 71c8aa2f2e82..6cd6e224d156 100644
--- a/frontend/src/container/OnboardingQuestionaire/OrgQuestions/OrgQuestions.tsx
+++ b/frontend/src/container/OnboardingQuestionaire/OrgQuestions/OrgQuestions.tsx
@@ -38,6 +38,7 @@ const observabilityTools = {
AzureAppMonitor: 'Azure App Monitor',
GCPNativeO11yTools: 'GCP-native o11y tools',
Honeycomb: 'Honeycomb',
+ None: 'None/Starting fresh',
};
function OrgQuestions({
@@ -53,9 +54,6 @@ function OrgQuestions({
const [organisationName, setOrganisationName] = useState(
orgDetails?.organisationName || '',
);
- const [usesObservability, setUsesObservability] = useState(
- orgDetails?.usesObservability || null,
- );
const [observabilityTool, setObservabilityTool] = useState(
orgDetails?.observabilityTool || null,
);
@@ -83,7 +81,7 @@ function OrgQuestions({
orgDetails.organisationName === organisationName
) {
logEvent('Org Onboarding: Answered', {
- usesObservability,
+ usesObservability: !observabilityTool?.includes('None'),
observabilityTool,
otherTool,
usesOtel,
@@ -91,7 +89,7 @@ function OrgQuestions({
onNext({
organisationName,
- usesObservability,
+ usesObservability: !observabilityTool?.includes('None'),
observabilityTool,
otherTool,
usesOtel,
@@ -114,7 +112,7 @@ function OrgQuestions({
});
logEvent('Org Onboarding: Answered', {
- usesObservability,
+ usesObservability: !observabilityTool?.includes('None'),
observabilityTool,
otherTool,
usesOtel,
@@ -122,7 +120,7 @@ function OrgQuestions({
onNext({
organisationName,
- usesObservability,
+ usesObservability: !observabilityTool?.includes('None'),
observabilityTool,
otherTool,
usesOtel,
@@ -152,16 +150,16 @@ function OrgQuestions({
};
const isValidUsesObservability = (): boolean => {
- if (usesObservability === null) {
- return false;
- }
-
- if (usesObservability && (!observabilityTool || observabilityTool === '')) {
+ if (!observabilityTool || observabilityTool === '') {
return false;
}
// eslint-disable-next-line sonarjs/prefer-single-boolean-return
- if (usesObservability && observabilityTool === 'Others' && otherTool === '') {
+ if (
+ !observabilityTool?.includes('None') &&
+ observabilityTool === 'Others' &&
+ otherTool === ''
+ ) {
return false;
}
@@ -177,13 +175,7 @@ function OrgQuestions({
setIsNextDisabled(true);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [
- organisationName,
- usesObservability,
- usesOtel,
- observabilityTool,
- otherTool,
- ]);
+ }, [organisationName, usesOtel, observabilityTool, otherTool]);
const handleOnNext = (): void => {
handleOrgNameUpdate();
@@ -217,99 +209,57 @@ function OrgQuestions({
- {usesObservability && (
-
-
- Which observability tool do you currently use?
-
-
- {Object.keys(observabilityTools).map((tool) => (
- setObservabilityTool(tool)}
- >
- {observabilityTools[tool as keyof typeof observabilityTools]}
-
- {observabilityTool === tool && (
-
- )}
-
- ))}
-
- {observabilityTool === 'Others' ? (
-
- ) : (
- ''
- )
- }
- onChange={(e): void => setOtherTool(e.target.value)}
- />
- ) : (
- setObservabilityTool('Others')}
- >
- Others
-
- )}
-
-
- )}
-
Do you already use OpenTelemetry?
diff --git a/frontend/src/container/OnboardingQuestionaire/index.tsx b/frontend/src/container/OnboardingQuestionaire/index.tsx
index 57832e28c2c5..435902511f8d 100644
--- a/frontend/src/container/OnboardingQuestionaire/index.tsx
+++ b/frontend/src/container/OnboardingQuestionaire/index.tsx
@@ -46,7 +46,7 @@ const INITIAL_ORG_DETAILS: OrgDetails = {
};
const INITIAL_SIGNOZ_DETAILS: SignozDetails = {
- interestInSignoz: '',
+ interestInSignoz: [],
otherInterestInSignoz: '',
discoverSignoz: '',
};
@@ -145,6 +145,9 @@ function OnboardingQuestionaire(): JSX.Element {
},
onError: (error) => {
showErrorNotification(notifications, error as AxiosError);
+
+ // Allow user to proceed even if API fails
+ setCurrentStep(4);
},
},
);
@@ -174,10 +177,16 @@ function OnboardingQuestionaire(): JSX.Element {
? (orgDetails?.otherTool as string)
: (orgDetails?.observabilityTool as string),
where_did_you_discover_signoz: signozDetails?.discoverSignoz as string,
- reasons_for_interest_in_signoz:
- signozDetails?.interestInSignoz === 'Others'
- ? (signozDetails?.otherInterestInSignoz as string)
- : (signozDetails?.interestInSignoz as string),
+ reasons_for_interest_in_signoz: signozDetails?.interestInSignoz?.includes(
+ 'Others',
+ )
+ ? ([
+ ...(signozDetails?.interestInSignoz?.filter(
+ (item) => item !== 'Others',
+ ) || []),
+ signozDetails?.otherInterestInSignoz,
+ ] as string[])
+ : (signozDetails?.interestInSignoz as string[]),
logs_scale_per_day_in_gb: optimiseSignozDetails?.logsPerDay as number,
number_of_hosts: optimiseSignozDetails?.hostsPerDay as number,
number_of_services: optimiseSignozDetails?.services as number,
diff --git a/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx b/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx
index 9385c0a68c76..d54cc1c9be45 100644
--- a/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx
+++ b/frontend/src/container/PanelWrapper/UplotPanelWrapper.tsx
@@ -124,15 +124,23 @@ function UplotPanelWrapper({
queryResponse.data.payload.data.result = sortedSeriesData;
}
+ const stackedBarChart = useMemo(
+ () =>
+ (selectedGraph
+ ? selectedGraph === PANEL_TYPES.BAR
+ : widget?.panelTypes === PANEL_TYPES.BAR) && widget?.stackedBarChart,
+ [selectedGraph, widget?.panelTypes, widget?.stackedBarChart],
+ );
+
const chartData = getUPlotChartData(
queryResponse?.data?.payload,
widget.fillSpans,
- widget?.stackedBarChart,
+ stackedBarChart,
hiddenGraph,
);
useEffect(() => {
- if (widget.panelTypes === PANEL_TYPES.BAR && widget?.stackedBarChart) {
+ if (widget.panelTypes === PANEL_TYPES.BAR && stackedBarChart) {
const graphV = cloneDeep(graphVisibility)?.slice(1);
const isSomeSelectedLegend = graphV?.some((v) => v === false);
if (isSomeSelectedLegend) {
@@ -145,7 +153,7 @@ function UplotPanelWrapper({
}
}
}
- }, [graphVisibility, hiddenGraph, widget.panelTypes, widget?.stackedBarChart]);
+ }, [graphVisibility, hiddenGraph, widget.panelTypes, stackedBarChart]);
const { timezone } = useTimezone();
@@ -221,7 +229,7 @@ function UplotPanelWrapper({
setGraphsVisibilityStates: setGraphVisibility,
panelType: selectedGraph || widget.panelTypes,
currentQuery,
- stackBarChart: widget?.stackedBarChart,
+ stackBarChart: stackedBarChart,
hiddenGraph,
setHiddenGraph,
customTooltipElement,
@@ -261,6 +269,7 @@ function UplotPanelWrapper({
enableDrillDown,
onClickHandler,
widget,
+ stackedBarChart,
],
);
@@ -274,14 +283,14 @@ function UplotPanelWrapper({
items={menuItemsConfig.items}
onClose={onClose}
/>
- {widget?.stackedBarChart && isFullViewMode && (
+ {stackedBarChart && isFullViewMode && (
)}
- {isFullViewMode && setGraphVisibility && !widget?.stackedBarChart && (
+ {isFullViewMode && setGraphVisibility && !stackedBarChart && (
{
updateTimeInterval(relativeTime as Time);
- setIsValidteRelativeTime(true);
setRefreshButtonHidden(false);
},
[updateTimeInterval],
@@ -625,8 +608,6 @@ function DateTimeSelection({
const updatedTime = getCustomOrIntervalTime(time, currentRoute);
- setIsValidteRelativeTime(updatedTime !== 'custom');
-
const [preStartTime = 0, preEndTime = 0] = getTime() || [];
setRefreshButtonHidden(updatedTime === 'custom');
@@ -654,95 +635,6 @@ function DateTimeSelection({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [location.pathname, updateTimeInterval, globalTimeLoading]);
- // eslint-disable-next-line sonarjs/cognitive-complexity
- const shareModalContent = (): JSX.Element => {
- let currentUrl = window.location.href;
-
- const startTime = urlQuery.get(QueryParams.startTime);
- const endTime = urlQuery.get(QueryParams.endTime);
- const isCustomTime = !!(startTime && endTime && selectedTime === 'custom');
-
- if (enableAbsoluteTime || isCustomTime) {
- if (selectedTime === 'custom') {
- if (searchStartTime && searchEndTime) {
- urlQuery.set(QueryParams.startTime, searchStartTime.toString());
- urlQuery.set(QueryParams.endTime, searchEndTime.toString());
- }
- } else {
- const { minTime, maxTime } = GetMinMax(selectedTime);
-
- urlQuery.set(QueryParams.startTime, minTime.toString());
- urlQuery.set(QueryParams.endTime, maxTime.toString());
- }
-
- urlQuery.delete(QueryParams.relativeTime);
-
- currentUrl = `${window.location.origin}${
- location.pathname
- }?${urlQuery.toString()}`;
- } else {
- urlQuery.delete(QueryParams.startTime);
- urlQuery.delete(QueryParams.endTime);
-
- urlQuery.set(QueryParams.relativeTime, selectedTime);
- currentUrl = `${window.location.origin}${
- location.pathname
- }?${urlQuery.toString()}`;
- }
-
- return (
-
-
-
- {(selectedTime === 'custom' || !isValidteRelativeTime) && (
-
- )}
- {
- setEnableAbsoluteTime(!enableAbsoluteTime);
- }}
- />
-
-
-
Enable Absolute Time
-
-
- {(selectedTime === 'custom' || !isValidteRelativeTime) && (
-
- Please select / enter valid relative time to toggle.
-
- )}
-
-
-
- {currentUrl}
-
-
- {
- handleCopyToClipboard(currentUrl);
- setIsURLCopied(true);
- setTimeout(() => {
- setIsURLCopied(false);
- }, 1000);
- }}
- icon={
- isURLCopied ? (
-
- ) : (
-
- )
- }
- />
-
-
- );
- };
-
const { timezone } = useTimezone();
const getSelectedValue = (): string => {
@@ -814,9 +706,6 @@ function DateTimeSelection({
onValidCustomDateChange={(dateTime): void => {
onValidCustomDateHandler(dateTime.timeStr as CustomTimeType);
}}
- onCustomTimeStatusUpdate={(isValid: boolean): void => {
- setIsValidteRelativeTime(isValid);
- }}
selectedValue={getSelectedValue()}
data-testid="dropDown"
items={options}
@@ -843,24 +732,6 @@ function DateTimeSelection({
)}
-
- {!hideShareModal && (
-
- }
- >
- Share
-
-
- )}
diff --git a/frontend/src/container/TopNav/TopNav.styles.scss b/frontend/src/container/TopNav/TopNav.styles.scss
index e2fd2d2f37e6..125d900048e4 100644
--- a/frontend/src/container/TopNav/TopNav.styles.scss
+++ b/frontend/src/container/TopNav/TopNav.styles.scss
@@ -1,4 +1,17 @@
.top-nav-container {
- padding: 0px 8px;
- margin-bottom: 16px;
+ padding: 8px;
+ border-bottom: 1px solid var(--bg-slate-500);
+
+ display: flex;
+ align-items: center;
+ justify-content: end;
+ gap: 16px;
+
+ margin-bottom: 8px;
+}
+
+.lightMode {
+ .top-nav-container {
+ border-bottom: 1px solid var(--bg-vanilla-300);
+ }
}
diff --git a/frontend/src/container/TopNav/index.tsx b/frontend/src/container/TopNav/index.tsx
index 4aeeadd9f0c7..50a046366990 100644
--- a/frontend/src/container/TopNav/index.tsx
+++ b/frontend/src/container/TopNav/index.tsx
@@ -1,6 +1,6 @@
import './TopNav.styles.scss';
-import { Col, Row, Space } from 'antd';
+import HeaderRightSection from 'components/HeaderRightSection/HeaderRightSection';
import ROUTES from 'constants/routes';
import { useMemo } from 'react';
import { matchPath, useHistory } from 'react-router-dom';
@@ -46,16 +46,9 @@ function TopNav(): JSX.Element | null {
return !isRouteToSkip ? (
-
-
-
-
-
-
-
-
-
-
+
+
+
) : null;
}
diff --git a/frontend/src/pages/AlertList/AlertList.styles.scss b/frontend/src/pages/AlertList/AlertList.styles.scss
index 0d1c58f36b28..e91325c37b6a 100644
--- a/frontend/src/pages/AlertList/AlertList.styles.scss
+++ b/frontend/src/pages/AlertList/AlertList.styles.scss
@@ -1,5 +1,5 @@
.alerts-container {
- .ant-tabs-nav-wrap:first-of-type {
- padding-left: 16px;
+ .ant-tabs-nav {
+ padding: 0 8px;
}
}
diff --git a/frontend/src/pages/AlertList/index.tsx b/frontend/src/pages/AlertList/index.tsx
index 8df082d995b1..c2d54f8cd698 100644
--- a/frontend/src/pages/AlertList/index.tsx
+++ b/frontend/src/pages/AlertList/index.tsx
@@ -3,6 +3,7 @@ import './AlertList.styles.scss';
import { Tabs } from 'antd';
import { TabsProps } from 'antd/lib';
import ConfigureIcon from 'assets/AlertHistory/ConfigureIcon';
+import HeaderRightSection from 'components/HeaderRightSection/HeaderRightSection';
import ROUTES from 'constants/routes';
import AllAlertRules from 'container/ListAlertRules';
import { PlannedDowntime } from 'container/PlannedDowntime/PlannedDowntime';
@@ -28,7 +29,7 @@ function AllAlertList(): JSX.Element {
{
label: (
-
+
Triggered Alerts
),
@@ -38,7 +39,7 @@ function AllAlertList(): JSX.Element {
{
label: (
),
@@ -52,7 +53,7 @@ function AllAlertList(): JSX.Element {
{
label: (
-
+
Configuration
),
@@ -82,6 +83,13 @@ function AllAlertList(): JSX.Element {
className={`alerts-container ${
isAlertHistory || isAlertOverview ? 'alert-details-tabs' : ''
}`}
+ tabBarExtraContent={
+
+ }
/>
);
}
diff --git a/frontend/src/pages/AllErrors/AllErrors.styles.scss b/frontend/src/pages/AllErrors/AllErrors.styles.scss
index 07e953a2a7d4..ebc8ad2f8091 100644
--- a/frontend/src/pages/AllErrors/AllErrors.styles.scss
+++ b/frontend/src/pages/AllErrors/AllErrors.styles.scss
@@ -7,7 +7,12 @@
}
.all-errors-right-section {
- padding: 0 10px;
+ .right-toolbar-actions-container {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ justify-content: flex-end;
+ }
}
.ant-tabs {
diff --git a/frontend/src/pages/AllErrors/index.tsx b/frontend/src/pages/AllErrors/index.tsx
index d2f048c4a66e..6b4e0749501b 100644
--- a/frontend/src/pages/AllErrors/index.tsx
+++ b/frontend/src/pages/AllErrors/index.tsx
@@ -5,6 +5,7 @@ import { Button, Tooltip } from 'antd';
import getLocalStorageKey from 'api/browser/localstorage/get';
import setLocalStorageApi from 'api/browser/localstorage/set';
import cx from 'classnames';
+import HeaderRightSection from 'components/HeaderRightSection/HeaderRightSection';
import QuickFilters from 'components/QuickFilters/QuickFilters';
import { QuickFiltersSource, SignalType } from 'components/QuickFilters/types';
import RouteTab from 'components/RouteTab';
@@ -74,10 +75,24 @@ function AllErrors(): JSX.Element {
) : undefined
}
- rightActions={ }
+ rightActions={
+
+
+
+
+ }
/>
-
+
>
diff --git a/frontend/src/pages/DashboardsListPage/DashboardsListPage.styles.scss b/frontend/src/pages/DashboardsListPage/DashboardsListPage.styles.scss
index af36aadaac2d..a2b7ccde5828 100644
--- a/frontend/src/pages/DashboardsListPage/DashboardsListPage.styles.scss
+++ b/frontend/src/pages/DashboardsListPage/DashboardsListPage.styles.scss
@@ -2,11 +2,18 @@
.dashboard-header {
display: flex;
align-items: center;
- padding: 16px;
+ justify-content: space-between;
+ padding: 0 8px;
gap: 8px;
height: 48px;
border-bottom: 1px solid var(--bg-slate-500);
+ .dashboard-header-left {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ }
+
.icon {
color: var(--bg-vanilla-400);
}
diff --git a/frontend/src/pages/DashboardsListPage/DashboardsListPage.tsx b/frontend/src/pages/DashboardsListPage/DashboardsListPage.tsx
index 6779fd945ae8..f66da0abc2a8 100644
--- a/frontend/src/pages/DashboardsListPage/DashboardsListPage.tsx
+++ b/frontend/src/pages/DashboardsListPage/DashboardsListPage.tsx
@@ -1,6 +1,7 @@
import './DashboardsListPage.styles.scss';
import { Space, Typography } from 'antd';
+import HeaderRightSection from 'components/HeaderRightSection/HeaderRightSection';
import ListOfAllDashboard from 'container/ListOfDashboard';
import { LayoutGrid } from 'lucide-react';
@@ -13,8 +14,16 @@ function DashboardsListPage(): JSX.Element {
className="dashboard-list-page"
>
-
-
Dashboards
+
+
+ Dashboards
+
+
+
diff --git a/frontend/src/pages/Settings/Settings.styles.scss b/frontend/src/pages/Settings/Settings.styles.scss
index ae31384c0e6b..936ff20c1c19 100644
--- a/frontend/src/pages/Settings/Settings.styles.scss
+++ b/frontend/src/pages/Settings/Settings.styles.scss
@@ -33,7 +33,6 @@
height: calc(100vh - 48px);
border-right: 1px solid var(--Slate-500, #161922);
background: var(--Ink-500, #0b0c0e);
- padding: 10px 8px;
}
.settings-page-content {
diff --git a/frontend/src/pages/Support/Support.styles.scss b/frontend/src/pages/Support/Support.styles.scss
index e298f74d8a54..4d63414a9089 100644
--- a/frontend/src/pages/Support/Support.styles.scss
+++ b/frontend/src/pages/Support/Support.styles.scss
@@ -4,7 +4,7 @@
padding-right: 48px;
max-width: 1400px;
- margin: 0 auto;
+ margin: 64px auto;
}
.support-channels {
@@ -19,6 +19,7 @@
flex: 0 0 calc(33.333% - 32px);
min-height: 200px;
position: relative;
+ border: none !important;
.support-channel-title {
width: 100%;
diff --git a/frontend/src/pages/Support/Support.tsx b/frontend/src/pages/Support/Support.tsx
index 7e8415bde637..0b3dad39fff1 100644
--- a/frontend/src/pages/Support/Support.tsx
+++ b/frontend/src/pages/Support/Support.tsx
@@ -205,6 +205,7 @@ export default function Support(): JSX.Element {
handleChannelClick(channel)}
>
{channel.btnText}
@@ -240,7 +241,7 @@ export default function Support(): JSX.Element {
loading={isLoadingBilling}
disabled={isLoadingBilling}
onClick={handleAddCreditCard}
- className="add-credit-card-btn"
+ className="add-credit-card-btn periscope-btn primary"
>
Add Credit Card
,
diff --git a/frontend/src/types/api/onboarding/types.ts b/frontend/src/types/api/onboarding/types.ts
index 9827f7fa415a..f33b8d679b2e 100644
--- a/frontend/src/types/api/onboarding/types.ts
+++ b/frontend/src/types/api/onboarding/types.ts
@@ -1,5 +1,5 @@
export interface UpdateProfileProps {
- reasons_for_interest_in_signoz: string;
+ reasons_for_interest_in_signoz: string[];
uses_otel: boolean;
has_existing_observability_tool: boolean;
existing_observability_tool: string;
diff --git a/go.mod b/go.mod
index 042661cbbf63..9dac960add84 100644
--- a/go.mod
+++ b/go.mod
@@ -5,7 +5,7 @@ go 1.24.0
require (
dario.cat/mergo v1.0.1
github.com/AfterShip/clickhouse-sql-parser v0.4.11
- github.com/ClickHouse/clickhouse-go/v2 v2.36.0
+ github.com/ClickHouse/clickhouse-go/v2 v2.40.1
github.com/DATA-DOG/go-sqlmock v1.5.2
github.com/SigNoz/govaluate v0.0.0-20240203125216-988004ccc7fd
github.com/SigNoz/signoz-otel-collector v0.129.4
@@ -66,16 +66,16 @@ require (
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0
go.opentelemetry.io/otel v1.37.0
go.opentelemetry.io/otel/metric v1.37.0
- go.opentelemetry.io/otel/sdk v1.36.0
+ go.opentelemetry.io/otel/sdk v1.37.0
go.opentelemetry.io/otel/trace v1.37.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
- golang.org/x/crypto v0.39.0
+ golang.org/x/crypto v0.40.0
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
- golang.org/x/net v0.41.0
+ golang.org/x/net v0.42.0
golang.org/x/oauth2 v0.30.0
golang.org/x/sync v0.16.0
- golang.org/x/text v0.26.0
+ golang.org/x/text v0.27.0
google.golang.org/protobuf v1.36.6
gopkg.in/yaml.v2 v2.4.0
gopkg.in/yaml.v3 v3.0.1
@@ -91,11 +91,11 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
- github.com/ClickHouse/ch-go v0.66.0 // indirect
+ github.com/ClickHouse/ch-go v0.67.0 // indirect
github.com/Masterminds/squirrel v1.5.4 // indirect
github.com/Yiling-J/theine-go v0.6.1 // indirect
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
- github.com/andybalholm/brotli v1.1.1 // indirect
+ github.com/andybalholm/brotli v1.2.0 // indirect
github.com/armon/go-metrics v0.4.1 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go v1.55.7 // indirect
diff --git a/go.sum b/go.sum
index 812cb8ce2cf7..383be578088d 100644
--- a/go.sum
+++ b/go.sum
@@ -87,10 +87,10 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJ
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/ClickHouse/ch-go v0.66.0 h1:hLslxxAVb2PHpbHr4n0d6aP8CEIpUYGMVT1Yj/Q5Img=
-github.com/ClickHouse/ch-go v0.66.0/go.mod h1:noiHWyLMJAZ5wYuq3R/K0TcRhrNA8h7o1AqHX0klEhM=
-github.com/ClickHouse/clickhouse-go/v2 v2.36.0 h1:FJ03h8VdmBUhvR9nQEu5jRLdfG0c/HSxUjiNdOxRQww=
-github.com/ClickHouse/clickhouse-go/v2 v2.36.0/go.mod h1:aijX64fKD1hAWu/zqWEmiGk7wRE8ZnpN0M3UvjsZG3I=
+github.com/ClickHouse/ch-go v0.67.0 h1:18MQF6vZHj+4/hTRaK7JbS/TIzn4I55wC+QzO24uiqc=
+github.com/ClickHouse/ch-go v0.67.0/go.mod h1:2MSAeyVmgt+9a2k2SQPPG1b4qbTPzdGDpf1+bcHh+18=
+github.com/ClickHouse/clickhouse-go/v2 v2.40.1 h1:PbwsHBgqXRydU7jKULD1C8CHmifczffvQqmFvltM2W4=
+github.com/ClickHouse/clickhouse-go/v2 v2.40.1/go.mod h1:GDzSBLVhladVm8V01aEB36IoBOVLLICfyeuiIp/8Ezc=
github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU=
github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
@@ -116,8 +116,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
-github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
-github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
+github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
+github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
@@ -1201,8 +1201,8 @@ go.opentelemetry.io/otel/log/logtest v0.0.0-20250526142609-aa5bd0e64989 h1:4JF7o
go.opentelemetry.io/otel/log/logtest v0.0.0-20250526142609-aa5bd0e64989/go.mod h1:NToOxLDCS1tXDSB2dIj44H9xGPOpKr0csIN+gnuihv4=
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0=
go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY=
go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:uqxdywfHqqCl6LmZzI3pUnXT1RGFYyUgxj0AkWPFxi0=
@@ -1245,8 +1245,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
-golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
+golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1337,8 +1337,8 @@ golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su
golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
-golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
+golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
+golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1468,8 +1468,8 @@ golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
-golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
+golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1480,8 +1480,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
-golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
+golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/pkg/instrumentation/sdk.go b/pkg/instrumentation/sdk.go
index 89e03fb27a8c..1228136d473a 100644
--- a/pkg/instrumentation/sdk.go
+++ b/pkg/instrumentation/sdk.go
@@ -11,7 +11,7 @@ import (
contribsdkconfig "go.opentelemetry.io/contrib/config"
sdkmetric "go.opentelemetry.io/otel/metric"
sdkresource "go.opentelemetry.io/otel/sdk/resource"
- semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
+ semconv "go.opentelemetry.io/otel/semconv/v1.34.0"
sdktrace "go.opentelemetry.io/otel/trace"
)
diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py
index 9f6de991b01f..c4c04fbd599c 100644
--- a/tests/integration/conftest.py
+++ b/tests/integration/conftest.py
@@ -45,7 +45,7 @@ def pytest_addoption(parser: pytest.Parser):
parser.addoption(
"--clickhouse-version",
action="store",
- default="24.1.2-alpine",
+ default="25.5.6",
help="clickhouse version",
)
parser.addoption(
@@ -57,6 +57,6 @@ def pytest_addoption(parser: pytest.Parser):
parser.addoption(
"--schema-migrator-version",
action="store",
- default="v0.128.2",
+ default="v0.129.6",
help="schema migrator version",
)
diff --git a/tests/integration/fixtures/logs.py b/tests/integration/fixtures/logs.py
index 479189401dd7..c12567d54a51 100644
--- a/tests/integration/fixtures/logs.py
+++ b/tests/integration/fixtures/logs.py
@@ -29,7 +29,7 @@ class LogsResource(ABC):
self.seen_at_ts_bucket_start = seen_at_ts_bucket_start
def np_arr(self) -> np.array:
- return np.array([self.labels, self.fingerprint, self.seen_at_ts_bucket_start])
+ return np.array([self.labels, self.fingerprint, self.seen_at_ts_bucket_start, np.uint64(10),np.uint64(15)])
class LogsResourceOrAttributeKeys(ABC):
@@ -317,6 +317,9 @@ class Logs(ABC):
self.scope_name,
self.scope_version,
self.scope_string,
+ np.uint64(10),
+ np.uint64(15),
+ self.resources_string,
]
)
@@ -378,7 +381,7 @@ def insert_logs(
table="distributed_logs_resource_keys",
data=[resource_key.np_arr() for resource_key in resource_keys],
)
-
+
clickhouse.conn.insert(
database="signoz_logs",
table="distributed_logs_v2",
diff --git a/tests/integration/fixtures/traces.py b/tests/integration/fixtures/traces.py
index 4d0f025bd4a2..62fa209a6074 100644
--- a/tests/integration/fixtures/traces.py
+++ b/tests/integration/fixtures/traces.py
@@ -593,6 +593,7 @@ class Traces(ABC):
self.db_operation,
self.has_error,
self.is_remote,
+ self.resources_string,
],
dtype=object,
)
@@ -681,6 +682,7 @@ def insert_traces(
"db_operation",
"has_error",
"is_remote",
+ "resource",
],
data=[trace.np_arr() for trace in traces],
)